50
1 Programmazione Java Avanzata Introduzione a Servlet e Struts 2 Ing. Giuseppe D'Aquì

Programmazione Java Avanzata - UNIRC

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmazione Java Avanzata - UNIRC

1

Programmazione Java Avanzata

Introduzione a Servlet e Struts 2

Ing. Giuseppe D'Aquì

Page 2: Programmazione Java Avanzata - UNIRC

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]

Page 3: Programmazione Java Avanzata - UNIRC

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

Page 4: Programmazione Java Avanzata - UNIRC

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

Page 5: Programmazione Java Avanzata - UNIRC

5

Servlet● ...

Page 6: Programmazione Java Avanzata - UNIRC

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

Page 7: Programmazione Java Avanzata - UNIRC

7

Servlet Container● Tomcat è un famoso Servlet Container● Implementa le Servlet API● Liberamente utilizzabile e gratuito

Page 8: Programmazione Java Avanzata - UNIRC

8

Gestione delle Servlet

Page 9: Programmazione Java Avanzata - UNIRC

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)

Page 10: Programmazione Java Avanzata - UNIRC

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

Page 11: Programmazione Java Avanzata - UNIRC

11

Esempio Servlet● ...

Page 12: Programmazione Java Avanzata - UNIRC

12

Esempio Servlet - persistenza● …● Nota bene: la persistenza qui è intesa come

“dati che permangono tra una http request e un'altra”

Page 13: Programmazione Java Avanzata - UNIRC

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

Page 14: Programmazione Java Avanzata - UNIRC

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

Page 15: Programmazione Java Avanzata - UNIRC

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( );

Page 16: Programmazione Java Avanzata - UNIRC

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

Page 17: Programmazione Java Avanzata - UNIRC

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

Page 18: Programmazione Java Avanzata - UNIRC

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

Page 19: Programmazione Java Avanzata - UNIRC

19

JSP: Esempio 1● Output data

Page 20: Programmazione Java Avanzata - UNIRC

20

JSP: Esempio 2● if

Page 21: Programmazione Java Avanzata - UNIRC

21

JSP compilate come Servlet● ...

Page 22: Programmazione Java Avanzata - UNIRC

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

Page 23: Programmazione Java Avanzata - UNIRC

23

MVC di Struts 2

Page 24: Programmazione Java Avanzata - UNIRC

24

MVC di Struts 2● Controller: FilterDispatcher● Model: Action● View: Result

Page 25: Programmazione Java Avanzata - UNIRC

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

Page 26: Programmazione Java Avanzata - UNIRC

26

FilterDispatcher: configurazione● Ci sono due modi per configurare il controller:

● XML● Java Annotations

Page 27: Programmazione Java Avanzata - UNIRC

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

Page 28: Programmazione Java Avanzata - UNIRC

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

Page 29: Programmazione Java Avanzata - UNIRC

29

Una request gestita da Struts 2

Page 30: Programmazione Java Avanzata - UNIRC

30

Una request gestita da Struts 2● Intorno ai grossi gestori ci sono componenti

non meno importanti:● Interceptors● ValueStack● OGNL● ActionContext

Page 31: Programmazione Java Avanzata - UNIRC

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

Page 32: Programmazione Java Avanzata - UNIRC

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

Page 33: Programmazione Java Avanzata - UNIRC

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

Page 34: Programmazione Java Avanzata - UNIRC

34

OGNL● Object Graph Navigation Language● È un linguaggio che permette di usare

riferimenti a oggetti sul ValueStack

Page 35: Programmazione Java Avanzata - UNIRC

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

Page 36: Programmazione Java Avanzata - UNIRC

36

ActionContext● Anche se è possibile accedere

all'ActionContext e al ValueStack direttamente, non si dovrebbe

● È considerata buona pratica utilizzare, invece, OGNL

Page 37: Programmazione Java Avanzata - UNIRC

37

Esempio 1: Hello World● ...

Page 38: Programmazione Java Avanzata - UNIRC

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

Page 39: Programmazione Java Avanzata - UNIRC

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à

Page 40: Programmazione Java Avanzata - UNIRC

40

Modularità della Configurazione● La configurazione è modulare● Si può suddividere la configurazione in più file

XML, richiamandoli con il tag <include>

Page 41: Programmazione Java Avanzata - UNIRC

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

Page 42: Programmazione Java Avanzata - UNIRC

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()

Page 43: Programmazione Java Avanzata - UNIRC

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

Page 44: Programmazione Java Avanzata - UNIRC

44

Componenti della URL

Page 45: Programmazione Java Avanzata - UNIRC

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

Page 46: Programmazione Java Avanzata - UNIRC

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()..

Page 47: Programmazione Java Avanzata - UNIRC

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>)

Page 48: Programmazione Java Avanzata - UNIRC

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

Page 49: Programmazione Java Avanzata - UNIRC

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

Page 50: Programmazione Java Avanzata - UNIRC

50

Passaggio dei dati