1 titolo presentazione / data / confidenziale / elaborazione di... corso java/j2ee per pm/software...
TRANSCRIPT
1Titolo Presentazione Data Confidenziale Elaborazione di
Corso JavaJ2EE per PMsoftware architect Struts 2Elaborazione di Franco Grivet Chin
Data 16062009
2Titolo Presentazione Data Confidenziale Elaborazione di
Framework
Framework (infrastruttura) egrave una struttura di supporto su cui un software puograve essere organizzato e progettato Ha le seguenti caratteristiche
bull Ersquo una piattaforma che velocizza la costruzione di applicazioni del
dominio a cui si rivolge grazie al riuso della soluzione architetturale
che ne costituisce la strutturabull Risparmiare allo sviluppatore la riscrittura di codice giagrave steso in precedenza per
compiti similibullSi estendono le classi del framerwork eo se ne implementano le interfacce sono i componenti del framework che hanno la responsabilitagrave di controllare il flusso elaborativo bullsono le classi del framework che invocano il nostro codice applicativo e non viceversa come nel caso delle librerie di classi bullUtilizza i design pattern
3Titolo Presentazione Data Confidenziale Elaborazione di
Framework
bull Una libreria contiene funzioni o routine (metodi) che lrsquoapplicazione puograve invocare
bull Framework fornisce componenti generici che collaborano tra loro che possono essere estesi (punti di estensione) per fornire nuove funzionalitagrave
bull Lo sviluppatore non scrive codice per coordinare le componenti Lo
sviluppatore deve determinare le componenti che aderendo alla logica
collaborativa del framework verranno coordinate da questultimo I
framework assumono il controllo della applicazione e non il contrario
4Titolo Presentazione Data Confidenziale Elaborazione di
Open source framework
bull Sono stati tra i principali elementi di innovazione nelle architetture web
negli ultimi annibull Hanno rappresentato il principale veicolo dellrsquoesperienza ldquocollettivardquo
degli sviluppatori in termini di design amp architectural pattern idioms
best practicesbull Rispetto ai framework in-house (realizzati ad hoc) hanno una
contribuzione di sviluppo piugrave ampia e quindi una maggiore velocitagrave di
convergenza alla soluzione ldquomigliorerdquo per il dominio specificobull Aumentano la produttivitagrave nello sviluppobull Supportano la standardizzazione delle soluzionibull Supportano un approccio allo sviluppo architettura-centricobull Per uno sviluppatorearchitetto la competenza su framework e librerie
Open Source egrave fondamentale
5Titolo Presentazione Data Confidenziale Elaborazione di
Vantaggi di un framework
Disegno architetturaleUn framework egrave fondato su un disegno architetturale valido in quanto il suo codice egrave scritto in base alle best-practices della tecnologia in uso
Riduzione dei tempi di progettoLo sviluppatore deve implementare esclusivamente la logica applicativa potendo risparmiare le energie e il tempo necessari alla scrittura di componenti infrastrutturali
Semplificazione dello sviluppoSemplifica lo sviluppo applicativo percheacute fornisce tutta una serie di componenti che risolvono la gran parte dei compiti comuni a tutte le applicazioni web J2EE (controllo del flusso logging gestione messaggi di errore custom tags per la presentation logic internazionalizzazione validazione dei dati etc)
6Titolo Presentazione Data Confidenziale Elaborazione di
Scelta del framework
Maturitagrave del progettoSconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunitagrave degli sviluppatori e quindi poco testato sul campo in progetti reali
DocumentazioneVerificare che la documentazione sia ricca e ben fatta Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dellapplicazione e la comprensione del suo funzionamento
Validitagrave del disegno architetturale Verificare che sia disegnato correttamente e quindi che siano adottati i design-pattern e le best-practises della tecnologia di riferimento
Adozione degli standardUn framework deve essere fondato sui componenti standard della tecnologia di riferimento Evitare framework conuso di specifici tool di sviluppo o un modello troppo indirizzato ad uno specifico caso applicativo
EstensibilitagraveDeve essere possibile estenderne le funzionalitagrave per adattarlo alle alle proprie esigenze
7Titolo Presentazione Data Confidenziale Elaborazione di
Web Application modello 2
Browser
Web Servlet Container
JSP
Richiesta
Risposta
Servlet
dispatch
BusinessModel
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
2Titolo Presentazione Data Confidenziale Elaborazione di
Framework
Framework (infrastruttura) egrave una struttura di supporto su cui un software puograve essere organizzato e progettato Ha le seguenti caratteristiche
bull Ersquo una piattaforma che velocizza la costruzione di applicazioni del
dominio a cui si rivolge grazie al riuso della soluzione architetturale
che ne costituisce la strutturabull Risparmiare allo sviluppatore la riscrittura di codice giagrave steso in precedenza per
compiti similibullSi estendono le classi del framerwork eo se ne implementano le interfacce sono i componenti del framework che hanno la responsabilitagrave di controllare il flusso elaborativo bullsono le classi del framework che invocano il nostro codice applicativo e non viceversa come nel caso delle librerie di classi bullUtilizza i design pattern
3Titolo Presentazione Data Confidenziale Elaborazione di
Framework
bull Una libreria contiene funzioni o routine (metodi) che lrsquoapplicazione puograve invocare
bull Framework fornisce componenti generici che collaborano tra loro che possono essere estesi (punti di estensione) per fornire nuove funzionalitagrave
bull Lo sviluppatore non scrive codice per coordinare le componenti Lo
sviluppatore deve determinare le componenti che aderendo alla logica
collaborativa del framework verranno coordinate da questultimo I
framework assumono il controllo della applicazione e non il contrario
4Titolo Presentazione Data Confidenziale Elaborazione di
Open source framework
bull Sono stati tra i principali elementi di innovazione nelle architetture web
negli ultimi annibull Hanno rappresentato il principale veicolo dellrsquoesperienza ldquocollettivardquo
degli sviluppatori in termini di design amp architectural pattern idioms
best practicesbull Rispetto ai framework in-house (realizzati ad hoc) hanno una
contribuzione di sviluppo piugrave ampia e quindi una maggiore velocitagrave di
convergenza alla soluzione ldquomigliorerdquo per il dominio specificobull Aumentano la produttivitagrave nello sviluppobull Supportano la standardizzazione delle soluzionibull Supportano un approccio allo sviluppo architettura-centricobull Per uno sviluppatorearchitetto la competenza su framework e librerie
Open Source egrave fondamentale
5Titolo Presentazione Data Confidenziale Elaborazione di
Vantaggi di un framework
Disegno architetturaleUn framework egrave fondato su un disegno architetturale valido in quanto il suo codice egrave scritto in base alle best-practices della tecnologia in uso
Riduzione dei tempi di progettoLo sviluppatore deve implementare esclusivamente la logica applicativa potendo risparmiare le energie e il tempo necessari alla scrittura di componenti infrastrutturali
Semplificazione dello sviluppoSemplifica lo sviluppo applicativo percheacute fornisce tutta una serie di componenti che risolvono la gran parte dei compiti comuni a tutte le applicazioni web J2EE (controllo del flusso logging gestione messaggi di errore custom tags per la presentation logic internazionalizzazione validazione dei dati etc)
6Titolo Presentazione Data Confidenziale Elaborazione di
Scelta del framework
Maturitagrave del progettoSconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunitagrave degli sviluppatori e quindi poco testato sul campo in progetti reali
DocumentazioneVerificare che la documentazione sia ricca e ben fatta Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dellapplicazione e la comprensione del suo funzionamento
Validitagrave del disegno architetturale Verificare che sia disegnato correttamente e quindi che siano adottati i design-pattern e le best-practises della tecnologia di riferimento
Adozione degli standardUn framework deve essere fondato sui componenti standard della tecnologia di riferimento Evitare framework conuso di specifici tool di sviluppo o un modello troppo indirizzato ad uno specifico caso applicativo
EstensibilitagraveDeve essere possibile estenderne le funzionalitagrave per adattarlo alle alle proprie esigenze
7Titolo Presentazione Data Confidenziale Elaborazione di
Web Application modello 2
Browser
Web Servlet Container
JSP
Richiesta
Risposta
Servlet
dispatch
BusinessModel
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
3Titolo Presentazione Data Confidenziale Elaborazione di
Framework
bull Una libreria contiene funzioni o routine (metodi) che lrsquoapplicazione puograve invocare
bull Framework fornisce componenti generici che collaborano tra loro che possono essere estesi (punti di estensione) per fornire nuove funzionalitagrave
bull Lo sviluppatore non scrive codice per coordinare le componenti Lo
sviluppatore deve determinare le componenti che aderendo alla logica
collaborativa del framework verranno coordinate da questultimo I
framework assumono il controllo della applicazione e non il contrario
4Titolo Presentazione Data Confidenziale Elaborazione di
Open source framework
bull Sono stati tra i principali elementi di innovazione nelle architetture web
negli ultimi annibull Hanno rappresentato il principale veicolo dellrsquoesperienza ldquocollettivardquo
degli sviluppatori in termini di design amp architectural pattern idioms
best practicesbull Rispetto ai framework in-house (realizzati ad hoc) hanno una
contribuzione di sviluppo piugrave ampia e quindi una maggiore velocitagrave di
convergenza alla soluzione ldquomigliorerdquo per il dominio specificobull Aumentano la produttivitagrave nello sviluppobull Supportano la standardizzazione delle soluzionibull Supportano un approccio allo sviluppo architettura-centricobull Per uno sviluppatorearchitetto la competenza su framework e librerie
Open Source egrave fondamentale
5Titolo Presentazione Data Confidenziale Elaborazione di
Vantaggi di un framework
Disegno architetturaleUn framework egrave fondato su un disegno architetturale valido in quanto il suo codice egrave scritto in base alle best-practices della tecnologia in uso
Riduzione dei tempi di progettoLo sviluppatore deve implementare esclusivamente la logica applicativa potendo risparmiare le energie e il tempo necessari alla scrittura di componenti infrastrutturali
Semplificazione dello sviluppoSemplifica lo sviluppo applicativo percheacute fornisce tutta una serie di componenti che risolvono la gran parte dei compiti comuni a tutte le applicazioni web J2EE (controllo del flusso logging gestione messaggi di errore custom tags per la presentation logic internazionalizzazione validazione dei dati etc)
6Titolo Presentazione Data Confidenziale Elaborazione di
Scelta del framework
Maturitagrave del progettoSconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunitagrave degli sviluppatori e quindi poco testato sul campo in progetti reali
DocumentazioneVerificare che la documentazione sia ricca e ben fatta Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dellapplicazione e la comprensione del suo funzionamento
Validitagrave del disegno architetturale Verificare che sia disegnato correttamente e quindi che siano adottati i design-pattern e le best-practises della tecnologia di riferimento
Adozione degli standardUn framework deve essere fondato sui componenti standard della tecnologia di riferimento Evitare framework conuso di specifici tool di sviluppo o un modello troppo indirizzato ad uno specifico caso applicativo
EstensibilitagraveDeve essere possibile estenderne le funzionalitagrave per adattarlo alle alle proprie esigenze
7Titolo Presentazione Data Confidenziale Elaborazione di
Web Application modello 2
Browser
Web Servlet Container
JSP
Richiesta
Risposta
Servlet
dispatch
BusinessModel
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
4Titolo Presentazione Data Confidenziale Elaborazione di
Open source framework
bull Sono stati tra i principali elementi di innovazione nelle architetture web
negli ultimi annibull Hanno rappresentato il principale veicolo dellrsquoesperienza ldquocollettivardquo
degli sviluppatori in termini di design amp architectural pattern idioms
best practicesbull Rispetto ai framework in-house (realizzati ad hoc) hanno una
contribuzione di sviluppo piugrave ampia e quindi una maggiore velocitagrave di
convergenza alla soluzione ldquomigliorerdquo per il dominio specificobull Aumentano la produttivitagrave nello sviluppobull Supportano la standardizzazione delle soluzionibull Supportano un approccio allo sviluppo architettura-centricobull Per uno sviluppatorearchitetto la competenza su framework e librerie
Open Source egrave fondamentale
5Titolo Presentazione Data Confidenziale Elaborazione di
Vantaggi di un framework
Disegno architetturaleUn framework egrave fondato su un disegno architetturale valido in quanto il suo codice egrave scritto in base alle best-practices della tecnologia in uso
Riduzione dei tempi di progettoLo sviluppatore deve implementare esclusivamente la logica applicativa potendo risparmiare le energie e il tempo necessari alla scrittura di componenti infrastrutturali
Semplificazione dello sviluppoSemplifica lo sviluppo applicativo percheacute fornisce tutta una serie di componenti che risolvono la gran parte dei compiti comuni a tutte le applicazioni web J2EE (controllo del flusso logging gestione messaggi di errore custom tags per la presentation logic internazionalizzazione validazione dei dati etc)
6Titolo Presentazione Data Confidenziale Elaborazione di
Scelta del framework
Maturitagrave del progettoSconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunitagrave degli sviluppatori e quindi poco testato sul campo in progetti reali
DocumentazioneVerificare che la documentazione sia ricca e ben fatta Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dellapplicazione e la comprensione del suo funzionamento
Validitagrave del disegno architetturale Verificare che sia disegnato correttamente e quindi che siano adottati i design-pattern e le best-practises della tecnologia di riferimento
Adozione degli standardUn framework deve essere fondato sui componenti standard della tecnologia di riferimento Evitare framework conuso di specifici tool di sviluppo o un modello troppo indirizzato ad uno specifico caso applicativo
EstensibilitagraveDeve essere possibile estenderne le funzionalitagrave per adattarlo alle alle proprie esigenze
7Titolo Presentazione Data Confidenziale Elaborazione di
Web Application modello 2
Browser
Web Servlet Container
JSP
Richiesta
Risposta
Servlet
dispatch
BusinessModel
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
5Titolo Presentazione Data Confidenziale Elaborazione di
Vantaggi di un framework
Disegno architetturaleUn framework egrave fondato su un disegno architetturale valido in quanto il suo codice egrave scritto in base alle best-practices della tecnologia in uso
Riduzione dei tempi di progettoLo sviluppatore deve implementare esclusivamente la logica applicativa potendo risparmiare le energie e il tempo necessari alla scrittura di componenti infrastrutturali
Semplificazione dello sviluppoSemplifica lo sviluppo applicativo percheacute fornisce tutta una serie di componenti che risolvono la gran parte dei compiti comuni a tutte le applicazioni web J2EE (controllo del flusso logging gestione messaggi di errore custom tags per la presentation logic internazionalizzazione validazione dei dati etc)
6Titolo Presentazione Data Confidenziale Elaborazione di
Scelta del framework
Maturitagrave del progettoSconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunitagrave degli sviluppatori e quindi poco testato sul campo in progetti reali
DocumentazioneVerificare che la documentazione sia ricca e ben fatta Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dellapplicazione e la comprensione del suo funzionamento
Validitagrave del disegno architetturale Verificare che sia disegnato correttamente e quindi che siano adottati i design-pattern e le best-practises della tecnologia di riferimento
Adozione degli standardUn framework deve essere fondato sui componenti standard della tecnologia di riferimento Evitare framework conuso di specifici tool di sviluppo o un modello troppo indirizzato ad uno specifico caso applicativo
EstensibilitagraveDeve essere possibile estenderne le funzionalitagrave per adattarlo alle alle proprie esigenze
7Titolo Presentazione Data Confidenziale Elaborazione di
Web Application modello 2
Browser
Web Servlet Container
JSP
Richiesta
Risposta
Servlet
dispatch
BusinessModel
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
6Titolo Presentazione Data Confidenziale Elaborazione di
Scelta del framework
Maturitagrave del progettoSconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunitagrave degli sviluppatori e quindi poco testato sul campo in progetti reali
DocumentazioneVerificare che la documentazione sia ricca e ben fatta Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dellapplicazione e la comprensione del suo funzionamento
Validitagrave del disegno architetturale Verificare che sia disegnato correttamente e quindi che siano adottati i design-pattern e le best-practises della tecnologia di riferimento
Adozione degli standardUn framework deve essere fondato sui componenti standard della tecnologia di riferimento Evitare framework conuso di specifici tool di sviluppo o un modello troppo indirizzato ad uno specifico caso applicativo
EstensibilitagraveDeve essere possibile estenderne le funzionalitagrave per adattarlo alle alle proprie esigenze
7Titolo Presentazione Data Confidenziale Elaborazione di
Web Application modello 2
Browser
Web Servlet Container
JSP
Richiesta
Risposta
Servlet
dispatch
BusinessModel
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
7Titolo Presentazione Data Confidenziale Elaborazione di
Web Application modello 2
Browser
Web Servlet Container
JSP
Richiesta
Risposta
Servlet
dispatch
BusinessModel
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
8Titolo Presentazione Data Confidenziale Elaborazione di
Web Application Framework
bull un sistema software che fornisce struttura e comportamento generalizzati di task e
workflow tipici delle applicazioni web Es gestione della navigazione (MVC) gestione
dellrsquoaccesso ai dati (DAO) hellip
bull Nella ldquovita realerdquo per la realizzazione di web application egrave tipico
lrsquoutilizzo congiunto di diversi framework open source
specializzati in aspetti specifici
bull Ci concentreremo su alcuni di quelli piugrave diffusi
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
9Titolo Presentazione Data Confidenziale Elaborazione di
Struts storia
STRUTS 1xx
Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE
Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora egrave divenuto un progetto a seacute
Struts estende le Java Servlet aiutando allutilizzo del pattern Model-View-Controller
Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
10Titolo Presentazione Data Confidenziale Elaborazione di
STRUTS 1 e 2
Strutsbull Ersquo un insieme di classi ed interfacce che costituiscono linfrastruttura per costruire web application
Java EE conformi al design pattern Model 2 (MVC)bull Il suo ideatore egrave Craig McClanahan ed egrave stato donato alla Apache Software Foundation nel maggio del 2000 da parte di IBMbull Ersquo uno dei web application framework piugrave diffusi al mondo
Struts 2bull Nonostante il nome Struts 2 non egrave solo una nuova release di Struts egrave un framework completamente nuovo basato su WebWorkbull Sono state introdotte caratteristiche non presenti in Struts grazie ai feedback di migliaia di sviluppatoribull Struts e Struts 2 sono piuttosto diversi egrave importante conoscerli entrambi perchegrave il primo egrave ancora molto diffuso
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
11Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 e 2
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
12Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 class diagram
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
13Titolo Presentazione Data Confidenziale Elaborazione di
Struts 1 sequence diagram
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
14Titolo Presentazione Data Confidenziale Elaborazione di
Struts1 componenti principali
bull Struts-configxml fornisce alla ActionServlet in base ai
parametri della URLbull La Action da invocarebull La pagina JSP a cui inoltrare la richiestabull ActionServlet il controller di Model 2bull Action il Model di Model 2 (Classe base per le classi ldquoactionrdquo )
Le classi action sono responsabili dibull Interfacciarsi con il layer sottostante (es EJB DAO hellip)bull Recuperare i dati da presentare alla View e inserirli in un contesto
Le pagine JSP sono responsabili dibull Recuperare i dati da visualizzare dal contestobull Visualizzare i dati
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
15Titolo Presentazione Data Confidenziale Elaborazione di
Esempio di Struts-config per struts 1
ltstruts-configgt
ltform-beansgt
ltform-bean name=rdquoprojectFormrdquo type=rdquoituniroma2appformProjectListFormrdquogt
ltform-beansgt
ltaction-mappingsgt
ltaction path=rdquotasklistrdquo type=rdquo ituniroma2appactionProduceTaskListActionrdquo
name=rdquoprojectFormrdquo scope=rdquorequestrdquo validate=rdquotruerdquo input=rdquojspProjectjsprdquogt
ltforward name=rdquosuccessrdquo path=rdquojspTaskListjsprdquogt
ltforward name=rdquofailurerdquo path=rdquojspServerErrorsjsprdquogt
ltactiongt
ltaction-mappings
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
16Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
La versione 2 di Struts risulta profondamente rinnovata rispetto alla precedente
In realtagrave il progetto egrave nato con il nome di WebWork che non ha nessun legame particolare con la versione 1 di Struts per poi passare dopo una prima fase di analisi e sviluppo al nome Struts 2 Per questo motivo la migrazione dalla versione 1 alla versione 2 non egrave semplice
Utilizzando il nuovo framework egrave possibile scrivere software facilmente manutenibile solido e aderente al pattern MVC
La versione attualmente stabile egrave la 2014 Il sito ufficiale del progetto egrave strutsapacheorg dal quale egrave possibile scaricare sia le librerie che la documentazione
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
17Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Vediamo in evidenza le differenze principali rispetto alla versione precedente
webxml bull Struts Il controllo viene affidato ad una Servlet Di default alla ActionServlet ma egrave
possibile definire una Action personalizzatabull Struts 2 Il controllo viene affidato ad un Filter Di default al FilterDispatcher ma egrave
possibile definire un Filtro personalizzato
URI pattern bull Struts Di default viene utilizzato il pattern do per identificare una richiesta che la
ActionServlet prenderagrave in caricobull Struts 2 Di default viene utilizzato il pattern action per identificare una richiesta
che il FiltroDispatcher prenderagrave in carico
File di configurazione bull Struts Di default il nome del file di configurazione egrave struts-configxml che va
posizionato allo stesso livello del file webxmlbull Struts 2 Di default il nome del file di configurazione egrave strutsxml che va posizionato
in una directory del classpath
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
18Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Mapping delle Action bull Struts Il mapping di una Action viene definito nel file di configurazione mediante il
tag action-mappingbull Struts 2 Il mapping di una Action viene automaticamente generato dalla
concatenazione package-nome della action entrambi definiti nel file di configurazione
Proprietagrave di una Action bull Struts Le proprietagrave necessarie ad una Action vengono definite in una classe
ActionForm nella quale occorre definire anche i metodi get e setbull Struts 2 Le proprietagrave necessarie vengono definite direttamente nella Action nella
quale occorre definire anche i metodi get e set
Action bull Struts Una Action deve estendere la classe orgapachestrutsactionActionbull Struts 2 Una Action deve implementare linterfaccia
comopensymphonyxwork2Action oppure estendere la classe comopensymphonyxwork2ActionSupport che a sua volta egrave unimplementazione di Action
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
19Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 differenze con Struts 1
Metodo execute bull Struts Il metodo execute di una Action restituisce un ActionForwardbull Struts 2 Il metodo execute di una Action restituisce una stringa Il Controller
stabilisce in base alla stringa restituita qual egrave la vista da richiamare
TagLibrary bull Struts Sono disponibili diverse taglibrary suddivise per tipo di argomento trattato
(logic bean HTML)bull Struts 2 Egrave disponibile ununica taglibrary che mette a disposizione sia operazioni di
logica che di rendering HTML
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
20Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
21Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Prima di tutto aggiungiamo le seguenti librerie al nostro progetto incluse nello zip completo scaricabile dal sito ufficiale del progetto
commons-logging-104jar
freemarker-238jar
ognl-2611jar
struts2-core-2012jar
xwork-206jar
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
22Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
Nel file webxml oltre alle usuali dichiarazioni egrave necessario definire un filtro al quale vengono affidate tutte le richieste
Questo filtro rappresenta il Controller dellapplicazione
Naturalmente egrave necessario indicare anche lURL al quale esso risponde
Nel nostro esempio utilizziamo la classe di default messa a disposizione dal framework orgapachestruts2dispatcherFilterDispatcher
Nel nostro esempio il filtro viene invocato su tutte le URL () che hanno come suffisso lestensione action (default) Egrave possibile comunque configurare diversamente il filtro indicando un pattern diverso da quello di default
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
23Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltxml version=10 encoding=UTF-8gtltweb-app version=24 xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsdgt ltfiltergt ltfilter-namegtstrutsltfilter-namegt ltfilter-classgt orgapachestruts2dispatcherFilterDispatcher ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtstrutsltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt ltwelcome-file-listgt ltwelcome-filegtindexjspltwelcome-filegt ltwelcome-file-listgtltweb-appgt
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
24Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Ogni richiesta intercettata dal Controller viene inoltrata ad una Action una classe Java che implementa linterfaccia comopensymphonyxwork2Action bull Lunico metodo da dover implementare egrave execute() che viene invocato automaticamente dal framerwork nel momento in cui il Controller inoltra la richiesta alla Action bullEgrave possibile anche estendere la classe comopensymphonyxworkActionSupport unimplementazione di Action dalla quale egrave possibile ereditare un insieme di metodi e attributi di grande utilitagrave nello sviluppo quali gestione degli errori dei messaggi e cosigrave viabullAnche la versione 2 di Struts cosigrave come il suo predecessore prevede un file di configurazione strutsxmlbull Il file deve essere posizionato nel classpath della webapp Il posto piugrave appropriato ove inserirlo egrave in WEB-INFclassesstrutsxml bullTale file contiene la definizione di tutte le Action disponibili nel sistema Ciascuna Action egrave identificata da un package da un nome univoco e da uno o piugrave destinazioni (result)bullIl result verragrave utilizzato dal Controller per decidere qual egrave la vista appropriata da richiamare
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
25Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
ltDOCTYPE struts PUBLIC -Apache Software FoundationDTD Struts Configuration 20EN httpstrutsapacheorgdtdsstruts-20dtdgt
ltstrutsgt
ltpackage name=html extends=struts-defaultgt
ltaction name=HtmlAction class=ithtmlactionHtmlActiongt ltresult name=giornogtjspgiornojspltresultgt
ltresult name=nottegtjspnottejspltresultgt
ltactiongt
ltpackagegt
ltstrutsgt
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
26Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 in pratica
bull Il nostro file strutsxml contiene soltanto la Action HtmlAction il cui package egrave HTMLbull La Action prevede due possibili comandi di uscita (result) giorno e nottebull Se il metodo execute restituisce la stringa giorno verragrave caricata la pagina giornojsp se il metodo execute restituisce la stringa notte verragrave caricata la pagina nottejsp bullSaragrave possibile richiamare la Action mediante il seguente URL htmlHtmlAction che corrisponde alla concatenazione package-nome
package ithtmlaction
import javautilCalendar
import comopensymphonyxwork2ActionSupport
public class HtmlAction extends ActionSupport
public String execute() throws Exception
Calendar cal = CalendargetInstance()
int ora = calget(CalendarHOUR_OF_DAY)
if (ora gt 16 || ora lt 5) return notte else return giorno
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
27Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Uno dei concetti nuovi di Struts 2 egrave rappresentato dagli Interceptor classi stateless (che non mantengono uno stato tra invocazioni successive) che possono essere invocate prima e dopo una Action o un insieme qualunque di Action
bull Gli interceptors svolgono lo stesso compito dei filtri infatti entrambi implementano il pattern interceptor
bull Usando questi interceptors egrave possibile per esempio validare linput intercettare eccezioni e cosigrave via
bull Il framework dispone di numerosi interceptor predefiniti ciascuno dei quali puograve essere inserito in uno stack
bull Lordine di esecuzione dei diversi interceptors egrave dato dal loro ordine di dichiarazione nello stack La filosofia utilizzata egrave quella FIFO chi egrave dicharato per primo viene eseguito per primo
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
28Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor
bull Di default Struts 2 prevede un gruppo di interceptor che vengono richiamati prima di invocare qualsiasi action Il cosiddetto stack di default prevede ben 17 interceptor che lavorano dietro le quinte per offrire vari servizi I principali sono i seguenti
Exception permette di mappare una particolare eccezione ad una vista
Prepare permette di richiamamare un metodo di inizializzazione della Action nel caso questa implementi una determinata interfaccia
I18n gestisce la memorizzazione del locale per lutente corrente
Debugging permette di attivare il debug delle viste
FileUpload permette di gestire lupload dei file
Validation permette di eseguire la validazione dei dati forniti nella form congruentemente al contenuto dei relativi file xml di definizione dei controlli
Oltre agli interceptor inclusi nello stack di default struts 2 permette di configurare ulteriori interceptor disponibili utili soltanto in situazioni particolari
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
29Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Vediamo come esempio come utilizzare uno degli interceptor waitAndExecute che permette di fornire allutente un messaggio di attesa qualora i dati non siano caricati
bull Si pensi ad uno scenario in cui lutente debba effettuare una ricerca allinterno del nostro portale
bull Qualora il sistema per estrapolare tutti i dati corrispondenti ai filtri di ricerca impostati necessiti di un po di tempo di elaborazione sarebbe carino far apparire un messaggio di attenzione che informi lutente che la ricerca egrave in corso
bull Linterceptor executeAndWait di Struts 2 egrave proprio stato pensato per risolvere questo tipo di problema
bull Sostanzialmente questo interceptor esegue una action in background e attende per un certo tempo che la stessa termini
bull Se la action termina subito linterceptor risulta ininfluente ma se la action richiede tempi lunghi di elaborazione viene caricata la vista wait
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
30Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
Definiamo la nostra action nel file strutsxml nel seguente modo
ltstrutsgt ltpackage name=html extends=struts-defaultgt ltaction name=RicercaAction class=ithtmlactionRicercaActiongt ltinterceptor-ref name=execAndWaitgt ltparam name=delaygt1000ltparamgt ltinterceptor-refgt ltresult name=successgtrisultatijspltresultgt ltresult name=inputgtindexjspltresultgt ltresult name=waitgtattenderejspltresultgt ltactiongt ltpackagegtltstrutsgt
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
31Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Linterceptor execAndWait prevede il parametro delay che rappresenta il tempo in millisecondi che linterceptor attenderagrave prima di richiamare la vista wait
bull Naturalmente egrave necessario fornire i due forward success e wait che redirigono rispettivamente alla pagina dei risultati e alla pagina di attesa
bull Il form di ricerca saragrave semplicissimo includiamo un semplice campo di testo destinazione
ltsform action=RicercaActionaction method=POSTgt ltsactionerror gt ltstextfield key=destinazione name=destinazione gt ltssubmit key=ricerca gtltsformgt
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
32Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
public class RicercaAction extends ActionSupport private String destinazione
public String execute() throws Exception for (int i=0 ilt 40 i++) try Threadsleep(400) catch (InterruptedException e) eprintStackTrace() return ActionSupportSUCCESS
public String getDestinazione() return destinazione
public void setDestinazione(String destinazione) thisdestinazione = destinazione
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
33Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Interceptor in pratica
bull Se laction impiega piugrave di 1000 millisecondi per completare loperazione linterceptor chiameragrave la vista wait
bull Nella pagina JSP corrispondente egrave necessario richiamare la action ogni n secondi Per fare ciograve utilizziamo il meta tag refresh che permette di richiamare automaticamente dopo n secondi un URL specificata
ltsi18n name=Messaggigtlthtmlgtltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8 gt ltmeta http-equiv=refresh content=5url=ltsurl includeParams=allgt gt lttitlegtltstext name=titolo gtlttitlegtltheadgtltbodygt ltstext name=attenderePrego gt ltbodygtlthtmlgtltsi18ngt
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
34Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull La Servlet API a partire dalla versione 23 mette a disposizione i Servlet
Filtersbull Possono essere utilizzati per moltissimi scopi alcuni esempi tracciatura e
Logging delle attivitagrave utente localizzazione compressione dati autenticazionebull Sono delle particolari classi Java che consentono di filtrare le richieste del
browser verso le Servlets di una web applications e la risposta della
Servlet al browserbull La ldquofiltraturardquo avviene intercettando la richiesta HTTP in modo da poterla
manipolare prima che questa arrivi alla Servlet destinataria o modificando
la risposta prima di essere ritornata al browserbull Una classe per poter essere utilizzata come filtro deve implementare
lrsquointerfaccia javaxservletFilter che definisce tre metodi di base
init(FilterConfig fc)
doFilter(ServletRequest req ServletResponse res FilterChain
chain)
destroy()
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
35Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Nei Servlet Filters esiste il concetto di ldquocatenardquo per ogni web application possono essere configurati piugrave filtri a formare una catena invocata in sequenza in base alla mappatura dei singoli filtri che la compongono sulle risorse (ServletJSP) della web applications
bull Ogni Servlet Filter deve essere configurato e mappato nel deployment descriptor della web application (webxml) mediante lrsquouso dei tag xml ltfiltergt e ltfilter-mappinggt
bull Il tag ltfiltergt consente di specificare un nome logico assegnato al filtro la classe che lo implementa i sui eventuali parametri di inizializzazione questo il formato
ltfiltergt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
ltfilter-classgt[package]FilterClass1ltfilter-classgt
ltinit-paramgt
ltparam-namegtparam1ltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
ltinit-paramgt
ltparam-namegtparamNltparam-namegt
ltparam-valuegtvalueltparam-valuegt
ltinit-paramgt
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
36Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Servlet Filter
bull Il tag ltfilter-mappinggt consente di mappare il filtro attraverso il
suo nome logico su le risorse per cui deve filtrare le richieste questo
il formato
ltfilter-mappinggt
ltfilter-namegtLogicalFilterName1ltfilter-namegt
lturl-patterngtWebResourceURL(es)lturl-patterngt
ltfilter-mappinggt
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
37Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2 diagramma di sequenza
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
38Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull La classe che gestisce tutte le richieste egrave la FilterDispatcher (Front Controller)bull Startup vengono create le classi
bullConfigurationManagerbullActionMapper
ObjectFactorybull Ricezione della request (es httplocalhost8080appindexaction )
1 Si determina lrsquoazione relativa alla request tramite i componenti
ConfigurationManager e ActionMapper (per default le azioni hanno
estensione action per es
2 Viene creato lrsquo ActionContext poichegrave le azioni sono generiche e non devono
essere dipendenti dal protocollo HTTP lrsquoinformazione contenuta nella web
request egrave convertita in un formato indipendente da HTTP (si estraggono idati da
HttpServletRequest e HttpSession
3 Viene creato lrsquoActionProxy che contiene tutte le configurazioni e informazioni
di contesto per elaborare la request compreso il risultato una volta reso
disponibile
4 Esegue il cleanup per assicurare che non ci siano memory leak il filtro
automaticamente esegue il cleanup dellrsquooggetto ActionContext
5 Il metodo execute di ActionProxy viene eseguiti iniziano la vera e propria
esecuzione della Action
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
39Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- WorkFlow
bull Invocazione della actionbull Lrsquooggetto ActionInvocation (il core della classe ActionProxy) gestisce
lrsquordquoambiente di esecuzionerdquo Questo egrave costituito dabullActionsbull InterceptorbullResult
Actions
In base alle informazioni presenti nel ActionProxy viene creata una istanza
dellrsquooggetto Action Lrsquooggetto Action deve avere un metodo a zero argomenti
che restituisce un oggettor di tipo Result o di tipo String
Interceptor
Permettono di inserire logica di elaborazione che devono essere eseguite prima
e dopo ogni action Possono essere configurati diversi interceptor che vengono
eseguiti nellrsquoordine di configurazione Dopo lrsquoesecuzione della action si
eseguono gli interceptor in ordine inverso
Result
Lrsquoesecuzione della request restituisce un oggetto di tipo Result (Result egrave un
interfaccia) Questrsquoultimo possiede un unico metodo che restituisce il risultato
vero e proprio che cambia con il dominio (un immagine una collazione una stringa)
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
40Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
1048708 Nessun obbligo di implementare interfacce o ereditare da classi Sono perograve fornite due helper classes
1048708 Lrsquointerfaccia Action
1048708 La classe di supporto ActionSupportpublic interface Action
public static final String SUCCESS = success
public static final String NONE = none
public static final String ERROR = error
public static final String INPUT = input
public static final String LOGIN = login
public String execute() throws Exception
public class ActionSupport
implements Action Validateable ValidationAware TextProvider LocaleProvider Serializable
hellip
public String execute() throws Exception
return SUCCESS
Supporto per la validazione dei datiapplicativa annotation-based XML b
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
41Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Action
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
42Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
Fornisce un ldquopunto di estendibilitagraverdquo del framework per inserire nel workflow logica di pre-processing (es recupero di Spring-Object per la Action) e post-processing
(es rendering multi-device)bull Molti Interceptor sono giagrave forniti (vedi slidesucc) singolarmente ed egrave possibile usare
degli ldquostackrdquo giagrave preparati di Interceptor per problemi specifici (esi18nStack)bull Ersquo possibile realizzare i propri Interceptor implementando la seguente interfaccia o
ereditare dalla classe astratta AbstractInterceptor ( fornisce init() e destroy() ldquovuotirdquo
ed il metodo abstract intercept)
public interface Interceptor extends Serializable
void init()
void destroy()
String intercept(ActionInvocation invocation) throws Exception
Attivitagrave di creazione (init) e distruzione (destroy) one-shot a deploy-time
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
43Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
44Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Componenti core - Interceptors
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
45Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
46Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Value Stack e OGNL
Value Stack e OGNL (Object Graph Navigational Language)
1048708 Temporary objects
1048708 Model object
1048708 Action object
1048708 Named objects (oggetti ldquocustomrdquo con un identificatore)
1048708 Per navigare nel Value Stack egrave possibile utilizzare il
linguaggio OGNL Es
1048708 addresspostcode Restituisce ll valore della chiamata
getAddress()getPostcode()
1048708 session[user] restituisce lrsquooggetto user da HTTP session
1048708 top Restituisce lrsquooggetto in posizione ldquotoprdquo nello Stack
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
47Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Result Type
1048708 La restituzione del risultato egrave suddivisa in due
1048708 Result Type Ersquo il tipo di risultato (in basso i tipi predefiniti) egrave possibile creare un proprio tipo di risultato implementando lrsquointerfaccia Result
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
48Titolo Presentazione Data Confidenziale Elaborazione di
Struts 2- Tag Library
1048708 Control tags (gestione collezioni hellip)
1048708 Data tags (render dinamico di informazioni internazionalizzazionehellip)
1048708 Form tags HTML form widgets (option group date e time pickers
1048708 check box)
1048708 Nonform tags message displays tabbed panels e tree views
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-
49Titolo Presentazione Data Confidenziale Elaborazione di
wwwaltranit
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
- Slide 32
- Slide 33
- Slide 34
- Slide 35
- Slide 36
- Slide 37
- Slide 38
- Slide 39
- Slide 40
- Slide 41
- Slide 42
- Slide 43
- Slide 44
- Slide 45
- Slide 46
- Slide 47
- Slide 48
- Slide 49
-