Programmazione Java Avanzata Introduzione a Servlet e Struts 2 Ing. Giuseppe D'Aquì 1
Testi Consigliati Java Enterprise in a nutshell, 3 rd 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