1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software...

49
1 Titolo Presentazione / Data / Confidenziale / Elaborazione di ... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin Data 16/06/2009

Transcript of 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software...

Page 1: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 2: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 3: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 4: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 5: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 6: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 7: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 8: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 9: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 10: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 11: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 12: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 13: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 14: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 15: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 16: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 17: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 18: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 19: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 20: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 21: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 22: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 23: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 24: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 25: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 26: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 27: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 28: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 29: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 30: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 31: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 32: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 33: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 34: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 35: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 36: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 37: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 38: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 39: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 40: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 41: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 42: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 43: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 44: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 45: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 46: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 47: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 48: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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
Page 49: 1 Titolo Presentazione / Data / Confidenziale / Elaborazione di... Corso Java/J2EE per PM/software architect Struts 2 Elaborazione di Franco Grivet Chin.

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