Programmazione Java Avanzata

Transcript

Programmazione Java Avanzata
Programmazione Java Avanzata
Introduzione a Servlet e Struts 2
Ing. Giuseppe D'Aquì
1
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]
2
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
Servlet
●
...
5
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
6
Servlet Container
●
Tomcat è un famoso Servlet Container
●
Implementa le Servlet API
●
Liberamente utilizzabile e gratuito
7
Gestione delle Servlet
8
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)
9
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
10
Esempio Servlet
●
...
11
Esempio Servlet - persistenza
●
●
…
Nota bene: la persistenza qui è intesa come
“dati che permangono tra una http request e
un'altra”
12
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
13
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
●
14
Cookies
●
Scrivere
String userid = createUserID( );
Cookie c = new Cookie("userid", userid);
resp.addCookie(c);
●
Leggere
Cookie[] 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( );
15
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
16
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
17
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
18
JSP: Esempio 1
●
Output data
19
JSP: Esempio 2
●
if
20
JSP compilate come Servlet
●
...
21
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
22
MVC di Struts 2
23
MVC di Struts 2
●
Controller: FilterDispatcher
●
Model: Action
●
View: Result
24
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
25
FilterDispatcher: configurazione
●
Ci sono due modi per configurare il controller:
●
XML
●
Java Annotations
26
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
27
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
28
Una request gestita da Struts 2
29
Una request gestita da Struts 2
●
Intorno ai grossi gestori ci sono componenti
non meno importanti:
●
Interceptors
●
ValueStack
●
OGNL
●
ActionContext
30
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
31
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
32
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
33
OGNL
●
●
Object Graph Navigation Language
È un linguaggio che permette di usare
riferimenti a oggetti sul ValueStack
34
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
35
ActionContext
●
●
Anche se è possibile accedere
all'ActionContext e al ValueStack
direttamente, non si dovrebbe
È considerata buona pratica utilizzare, invece,
OGNL
36
Esempio 1: Hello World
●
...
37
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
38
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à
39
Modularità della Configurazione
●
●
La configurazione è modulare
Si può suddividere la configurazione in più file
XML, richiamandoli con il tag <include>
40
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
41
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()
42
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
43
Componenti della URL
44
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
45
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()..
46
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>)
47
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
48
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
49
Passaggio dei dati
50