1
Programmazione Java Avanzata
Introduzione a Servlet e Struts 2
Ing. Giuseppe D'Aquì
2
Testi Consigliati● Java Enterprise in a nutshell, 3rd edition
(O'Reilly)● Struts 2 in Action – Brown, Davis, Stanlick
(Manning)● Capitolo 2 di “Struts 2 in Action”:
● [http://www.manning-source.com/books/dbrown/ch02Sample.pdf]
Servlet● Le Servlet sono classi Java che rispondono ad
HTTP Request● Definiscono delle modalità di risposta (ad
esempio, in caso di GET o POST) e poi gestiscono in modo automatico il resto● Per esempio, viene mantenuto lo stato nelle
variabili di sessione senza che lo sviluppatore debba preoccuparsi
Servlet● Una Servlet restituisce, in genere, HTML
● Anche se può restituire XML o altro● Una Servlet viene inizializzata dal server, e, a
questo punto, gestisce ogni request in un thread a parte
● Le Servlet sono definite nella libreria di JavaEE
5
Servlet● ...
6
Servlet Container● Per eseguire una Servlet è necessario un
servlet container ● Un servlet container usa una Java Virtual
Machine per eseguire il codice contenuto in una servlet, su richiesta di un web server
● Il servlet container ha anche altre responsabilità: ● Gestisce le sessioni utente ● Gestisce il caricamento delle classi corrette● Configurazione delle servlet
7
Servlet Container● Tomcat è un famoso Servlet Container● Implementa le Servlet API● Liberamente utilizzabile e gratuito
8
Gestione delle Servlet
9
Tomcat-Eclipse● Per semplificare lo sviluppo, ci sono diversi
modi per controllare Tomcat attraverso Eclipse● Tomcat Plugin
– [http://www.eclipsetotale.com/tomcatPlugin.html]
● Eclipse Plugins– JST (J2ee Standard Tools)– WTP (Web Tools Platform)
10
Deployment WAR● L'installazione di una applicazione in un servlet
container prevede la copia dei file compilati e della configurazione in una specifica directory● Operazione detta “Deployment”
● Si possono creare dei pacchetti che contengono l'intera applicazione: sono chiamati WAR (Web Archive)
● Copiando solo il WAR, il servlet container si occupa di decomprimerlo e installare i file
11
Esempio Servlet● ...
12
Esempio Servlet - persistenza● …● Nota bene: la persistenza qui è intesa come
“dati che permangono tra una http request e un'altra”
13
Struttura di una web application● Una directory molto importante è WEB-INF● Contiene:
● le nostre classi compilate (WEB-INF/classes)● Eventuali librerie aggiuntive (WEB-INF/lib)● Eventuale codice sorgente (WEB-INF/src)● La configurazione (WEB-INF/web.xml)
● Tutte le altre directory rappresentano la document root del server web● Cioè i file sono direttamente raggiungibili
14
Servlet Context● Un servlet context è semplicemente il
percorso in cui sono installate una o più servlet
● Le servlet in un context hanno un ambiente che è “isolato” dalle operazioni delle servlet di altri context
●
15
Cookies● Scrivere
String userid = createUserID( );
Cookie c = new Cookie("userid", userid);
resp.addCookie(c);
● LeggereCookie[] cookies;
cookies = req.getCookies( );
String userid = null;
for (int i = 0; i < cookies.length; i++)
if (cookies[i].getName( ).equals("userid"))
userid = cookies[i].getAttribute( );
16
JavaServer Pages● Scrivere una pagina HTML tramite output di
una servlet è complicato e fa perdere tempo● Soprattutto può farlo solo uno sviluppatore
● Si usano in genere dei Templating Engine (vedi Template View)
● JSP è uno di questi
17
JSP e Server● Un file JSP viene compilato come servlet alla
prima richiesta● Le richieste successive verranno gestite dalla
servlet appena compilata● Posizione dei file● Come richiamarli da url
18
JSP e Tomcat● Posizione dei file
● I file JSP vanno nella document root (/) del servlet context, o in una sottodirectory
● Vengono mappate come URL in base alla loro posizione fisica
19
JSP: Esempio 1● Output data
20
JSP: Esempio 2● if
21
JSP compilate come Servlet● ...
22
Struts 2● Struts 2 è un framework per lo sviluppo di
applicazioni web in Java● Implementa il pattern MVC● È stato completamente riscritto nella versione
2, a partire da un framework chiamato WebWorks
● Possiede concetti tipici di altri cosiddetti “lightweight framework”● Convention over configuration● Gestione dei cross-cutting concerns
23
MVC di Struts 2
24
MVC di Struts 2● Controller: FilterDispatcher● Model: Action● View: Result
25
FilterDispatcher● È un Front Controller● Associa ad ogni request una Action● È una servlet che fa da filtro ad ogni request,
“smistando” l'esecuzione delle azioni● È necessario configurarlo, mappando le URL
alle Action corrispondenti
26
FilterDispatcher: configurazione● Ci sono due modi per configurare il controller:
● XML● Java Annotations
27
Action● Il Model è una “scatola vuota” che contiene la
logica del dominio e i dati, ma la Action è il punto di accesso
● Il FilterDispatcher la invoca, passandole i dati della request
● Alla fine delle operazioni di business logic, i risultati vengono inviati al componente View
28
Result● La View in una web application è una pagina
web● Struts supporta una gerarchia di View possibili,
che implementano l'interfaccia Result● JSP, Velocity, Freemarker, XSLT...
● Ogni Action può scegliere tra diverse result
29
Una request gestita da Struts 2
30
Una request gestita da Struts 2● Intorno ai grossi gestori ci sono componenti
non meno importanti:● Interceptors● ValueStack● OGNL● ActionContext
31
Interceptors● Gli interceptor modificano il comportamento
del controller● Aggiungono funzionalità generali, per l'intera
applicazione● Sono in serie, funzionano da filtro o, meglio,
da Decorators● Vengono eseguiti prima del processing della
request, e subito dopo● Non tutti gli interceptor svolgono funzioni sia
in un verso che nell'altro
32
Interceptors● Esempio: Logging
● È una funzionalità che vale per ogni Action, ma non vogliamo reimplementarla ogni volta
● Altri esempi:● Conversione di tipo● Data validation● File upload
● Struts 2 Ha già una grossa libreria di Interceptors standard
33
ValueStack● È un'area usata come interscambio di dati tra i
vari componenti che gestiscono una request● Invece di passare i dati da un oggetto all'altro,
si usa il ValueStack come deposito centralizzato
● I dati vengono trasferiti qui durante l'inizio della request, manipolati dalla Action e infine letti dalla Result
34
OGNL● Object Graph Navigation Language● È un linguaggio che permette di usare
riferimenti a oggetti sul ValueStack
35
ActionContext● Contiene tutti i dati riguardanti il processing di
una request● ValueStack e un certo numero di oggetti usati
internamente da Struts● È implementato tramite ThreadLocal, ovvero
sono dati locali per un certo thread (invisibili per gli altri)
● Ogni request è gestita da un thread a sé, dall'inizio alla fine, quindi ActionContext è sempre presente
36
ActionContext● Anche se è possibile accedere
all'ActionContext e al ValueStack direttamente, non si dovrebbe
● È considerata buona pratica utilizzare, invece, OGNL
37
Esempio 1: Hello World● ...
38
Configurazione del web.xml● Il FilterDispatcher deve essere impostato
tramite il tag <filter>● Il tag <filter> ha una funzionalità simile a
<servlet>, ma permette di filtrare le url, ad esempio per estensione
● In questo modo possono esistere più servlet/filter che cooperano
39
Configurazione: struts.xml● Contiene la configurazione del framework
● Si possono settare proprietà● Si possono definire le Action e le corrispondenti
Result● La configurazione può essere in parte gestita
da file di proprietà
40
Modularità della Configurazione● La configurazione è modulare● Si può suddividere la configurazione in più file
XML, richiamandoli con il tag <include>
41
La classe Action● Praticamente non c'è codice Java, eccettuato
quello nei file JSP● Struts in automatico crea un oggetto Action
vuoto per ogni <action> che non ha oggetti associati
● L'esecuzione della Action in questo caso si limita a passare il controllo al JSP predefinito
42
Creare una nuova Action● Le Action vuote sono rare, perché non
contengono business logic● Si possono creare action implementando
l'interface Action, oppure rispettando dei vincoli di convenzione
● Si deve implementare il metodo astratto execute()
43
Scelta della Result View● Come si sceglie quale sarà la View da
renderizzare dopo la Action?● Il metodo execute() restituisce una stringa● Struts confronta la stringa con quelle definite
nella configurazione XML, associate a pagine JSP
44
Componenti della URL
45
Dati della request nella Action● Struts sposta in automatico i parametri della
request, ad esempio i dati inseriti in una form, alla Action
● Tutto avviene tramite JavaBeans Properties
46
JavaBeans● Sono normali classi che rispettano una
determinata convenzione:● Hanno un costruttore senza argomenti● Sono serializzabili● Le variabili membro (proprietà) devono essere
accessibili tramite funzioni di get() e set(), con nomi convenzionali– getName(), setName(), getRealName(), setRealName()..
47
Dati della request nella Action (2)● Ogni Action è un JavaBean che mantiene
dentro sé:● Dati della logica applicativa● Dati provenienti da una http request
● Il riempimento dei secondi lo fa in automatico Struts, se seguiamo le convenzioni● la proprietà deve avere lo stesso nome definito
nella casella di input (<s:textfield>)
48
Dati della Action nella View● Il passaggio dei dati alla View avviene allo
stesso modo● Usiamo il tag <s:property> per accedere a una
proprietà della nostra Action
49
E il ValueStack?● Come già detto, non usiamo il ValueStack
direttamente● La Action con tutti i suoi dati viene copiata nel
ValueStack● Accediamo alle sue proprietà tramite
espressioni OGNL● Nel nostro caso sono semplici nomi
50
Passaggio dei dati