Sei sulla pagina 1di 11

Esame Sistemi Web

Carmine Massei Fabrizio Grillo Angelo Saviano

0302/169 0302/152 0302/157

1 Traccia dell'esame
Realizzare una applicazione web che consenta il login di un utente ad essa e, per i soli utenti loggati, il tracciamento di una sessione utente. Vincoli di realizzazione: Utilizzare i cookie per mantenere le informazioni di login. Utilizzare altri componenti tecnologici ("Session" HTTP di Java, ad esempio) per il mantenimento delle informazioni di sessione. Realizzare uno scenario plausibile (form di invio, carrello degli acquisti, ecc.) di registrazione di informazioni riservate e/o sensibili degne di esser mantenute in una sessione utente.

2 Shop on-line
L'applicazione web oggetto dell'esame stata sviluppata utilizzando l'ambiente di sviluppo integrato (IDE) Eclipse, mentre per la gestione delle servlet e delle pagine JSP abbiamo utilizzato il web contanier Apache Tomcat. In particolare abbiamo sviluppato una applicazione che permette di acquistare dei prodotti online (nel nostro caso cd musicali), per fare ci in Eclipse abbiamo creato un nuovo Dynamic Web Project che abbiamo chiamato Shop. Questo progetto tenendo conto dei dettami del modello MVC formato da un package controller in cui ci sono le servlet per la gestione del login, del logout e del carrello, poi c' un altro package model in cui c' una classe Java in cui ci sono i metodi per la gestione dei CD. Invece per quanto riguarda la presentazione dei dati abbiamo scelto di utilizzare delle pagine JSP.

Figura 1: Dynamic Web Project

Nel momento in cui si accede per la prima volta al servizio si apre la pagina (che ci deve essere di default in ogni applicazione web) index.html (listato 1)che presenta semplicemente un link alla pagina di login:

Figura 2: Home page

Cliccando su entra possibile accedere alla pagina di login login.html (listato 2) che in pratica permette il login al negozio, inserendo una username ed una password.

Figura 3: Form di inserimento

Le informazioni inserite in questa pagina vengono poi memorizzate in appositi cookie. La gestione delle operazioni di login effettuata sfruttando la servlet LoginControl (listato 3). Dopo la registrazione al sito si entra nell'e-shop vero e proprio (Figura 4), infatti abbiamo:

Figura 4: E-Shop

Un utente che accede al sito pu anche comprare pi volte lo stesso articolo semplicemente inserendo il numero di articoli che vuole comprare nel campo Aggiungi al Carrello. Inoltre ha anche la possibilit di eliminare un articolo dal proprio carrello semplicemente cliccando sul tasto Elimina. Una volta conclusa la fase di acquisto pu andare alla cassa cliccando sul tasto Cassa dove gli sar fatto un resoconto dei suoi acquisti e gli verr mostrato il totale da pagare.

Figura 5: Resoconto acquisti

Tutte queste operazioni sono gestite tramite la servlet ShoppingServlet (listato 4). Nella pagina di resoconto poi ci sono due possibili scelte, o si pu decidere di comprare altri prodotti oppure si effettua il logout e si esce dal sito, operazione questa gestita tramite la servlet LogoutControl (listato 5). E possibile comunque accedere nuovamente al servizio con il proprio username grazie allutilizzo dei cookies. In questo caso il mantenimento delle informazioni precedenti (ovvero il resoconto degli acquisti fatti dal singolo utente) mantenuto inalterato grazie allutilizzo opportuno delle sessioni HTTP.

3 Analisi dei vari componenti dell'applicazione web


Nel seguito analizzeremo i vari componenti che fanno parte della nostra applicazione web, cio le varie servlet, pagine JSP e pagine HTML.

3.1 LoginControl
La servlet LoginControl effettua il controllo delle informazioni di login, inizializza una nuova sessione e crea i cookie. In particolare nel metodo doPost creiamo una variabile di tipo stringa chiamata url, poi creiamo un vettore di cookie in cui inseriamo tutti i cookie che il client ha inviato con la sua richiesta ci invocando sull'oggetto request il metodo getCookiee(). Dopo tramite il metodo getParameter ricaviamo username e password dalla form di login. Poi sull'oggetto request invochiamo il metodo getSession() che restituisce la sessione HTTP associata alla richiesta. Dopo questa fase di inizializzazione andiamo a controllare se l'utente che ha fatto il login un nuovo utente o meno. Se l'utente proprio il primo a loggarsi (e quindi non ci sono cookie) uso il metodo nuovoUtente altrimenti andiamo a controllare se nei cookie memorizzati i dati corrispondono a quelli di utenti vecchi, ci lo facciamo scorrendo con un ciclo for tutto il vettore di cookie e verificando se il valore del cookie (ottenuto con il metodo getValue()) sia uguale alla password, se il controllo va a buon fine facciamo riferimento alla funzione utenteConosciuto altrimenti facciamo si che l'utente venga mandato in una pagina di errore. Se poi ci sono cookie ma l'utente non era gi registrato creiamo un nuovo utente sempre con la funzione nuovoUtente. A questo punto creiamo un oggetto di tipo ServletContex ed in tale oggetto (cio sc) inseriamo il valore restituito dalla getServletContex ovvero il contesto cio lo stato dell'ambiente all'interno del quale le servlet stanno girando. Dopo creiamo un oggetto di tipo RequestDispatcher (cio rd) in cui inseriamo il valore che otteniamo invocando su sc il metodo getRequestDispatcher(url) che ci permette di ottenere la url verso cui fare la forward verso gli altri elementi. Come detto in precedenza nella gestione degli utenti facciamo a due nuove funzioni nuovoUtente ed utenteConosciuto. In nuovoUtente eseguiamo le operazioni relative alla prima connessione di un utente, infatti creiamo un nuovo cookie , impostiamo l'et massima del cookie in secondi, aggiungiamo il cookie alla risposta ed infine impostiamo la sessione. In utenteConosciuto invece andiamo a caricare i dati personali dell'utente ovvero l'ultima visita (ricavando le informazioni dai cookie), impostiamo poi anche la data corrente ed poi carichiamo l'elenco dei CD che ha precedentemente acquistato tramite la funzione loadCDS.

Quest'ultima funzione sfruttando i metodi della classe CD setta i cd e poi settiamo anche la sessione con il carrello del visitatore.

3.2 LogoutControl
La servlet LogoutControl si occupa della gestione del logout di un utente dal sito. In particolare effettua il logout sfruttando i metodi getSession() e getAttribute , aggiorna la lista dei cd utilizzando il metodo updateCookie e poi termina la sessione HTTP tramite il metodo session.invalidate(). La lista dei cd viene aggiornata tramite il metodo updateCookie in cui andiamo a creare la lista dei cd e la memorizziamo. Anche in questa servlet gestiamo il contesto della servlet come fatto anche nell'altra servlet di login.

3.3 ShoppingServelt
La servlet ShoppingServlet quella che ha in pratica tutta la logica dell'applicazione, infatti ogni volta che un utente aggiunge un oggetto con EShop.jsp, la richiesta assegnata al controller della servlet. La servlet determina le azioni appropriate, e processa i parametri di richiesta per tutti gli oggetti aggiunti. Poi istanzia un nuovo CD bean che rappresenta la selezione e carica il carrello di oggetti. In particolare se un utente sbaglia a fare il login viene reindirizzato ad una apposita pagina di errore. Invece poi se il login andato a buon fine, se l'azione dell'utente non quella di avere il resoconto degli acquisti andiamo a controllare se vuole eliminare qualche Cd che ha acquistato. Invece se l'azione dell'utente quella di comprare un Cd allora controlla se il Cd scelto era gi stato acquistato ed in tal caso aumenta solo la quantit, in caso contrario aggiungiamo il Cd alla lista degli acquisti e poi gestiamo il contesto della servlet. Se invece l'azione che sceglie l'utente quella di avere il resoconto dei suoi acquisti andiamo a calcolare il totale speso e poi anche in tal caso facciamo la gestione del contesto della servlet. Come si vede dal listato 4 presente anche il metodo getCD tramite il quale associamo alla richiesta il particolare CD richiesto dall'utente.

3.4 Index.html
La pagina index.html (listato 1; figura 2) deve essere presente di default in ogni applicazione web, nel nostro caso presenta semplicemente un link alla successiva pagina di login.

3.5 Login.html
In questa pagina (listato 2; figura 3) presente il form di inserimento dei dati dell'utente dati che poi saranno gestiti dalla apposita servlet di login.

3.6 Error.html
Questa pagina HTML (listato 6), che anche in tal caso presenta semplicemente un link alla pagina di login, viene richiamata tutte quelle volte che un utente sbaglia password. Questo controllo come detto in precedenza effettuata dalla servlet ShoppingServlet.

Figura 6: Error.html

3.7 Eshop.jsp
Questa pagina JSP (listato 7; figura 4) permette la visualizzazione dei CD presenti in

negozio, poi permette di settare la quantit di Cd che si vogliono acquistare e poi permette l'acquisto vero e proprio. Inoltre unaltra pagina JSP, Cart.jsp inclusa nella pagina EShop.jsp tramite la direttiva <jsp:include page="Cart.jsp" flush="true" /> dove l'attributo flush assicura che la pagina HTML appena generata dalla pagina includente sia inviata al client prima che esegua la pagina inclusa. 3.8 Cart.jsp La pagina Cart.jsp (listato 8) si occupa della presentazione del carrello. Osserviamo il codice allinizio di Cart.jsp: <% Vectorbuylist=(Vector)session.getValue("shopping.shoppingcart"); if(buylist!=null&&(buylist.size()>0)){ %> Il codice estrae il carrello dalla sessione. Se il carrello vuoto o non stato ancora creato non mostra niente (ovvero siamo nella condizione di figura 4). Se il carrello non vuoto, allora gli oggetti selezionati sono estratti dal carrello, come si pu vedere da questo codice: <% for(intindex=0;index<buylist.size();index++){ CDanOrder=(CD)buylist.elementAt(index); %> Una volta che le variabili che descrivono un oggetto sono state create,vengono inserite nel modello statico HTML usando espressioni JSP. La figura seguente mostra il carrello dopo che sono stati inseriti alcuni oggetti:

Figura 7: Acquisti

3.9 Checkout.jsp
La pagina Checkout.jsp (listato 9) semplicemente estrae il carrello dalla sessione, visualizza il conto totale e mostra gli oggetti selezionati. La figura 5 mostra la vista dellutente dopo il checkout. Lutente a questo punto pu riacquistare oppure uscire. Nel caso in cui dovesse tornare in un secondo momento allora troverebbe la sua vecchia lista di articoli gi comprati.

3.10 CD.java
Questa classe Java (listato10) fa parte del package model e contiene i metodi per la gestione dei CD, infatti ci sono metodi quali setAlbum che permette di settare il nome di un album, oppure il metodo getAlbum che restituisce il nome di un album. Metodi analoghi ci sono per l'artista, il prezzo e la quantit.