60
Struts

Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Embed Size (px)

Citation preview

Page 1: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts

Page 2: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts

Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE.

Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora è divenuto un progetto a sé.

Struts estende le Java Servlet, aiutando all'utilizzo del pattern Model-View-Controller

Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000.

Page 3: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts

Framework (infrastruttura) è una struttura di supporto su cui un software può essere organizzato e progettato. Ha le seguenti caratteristiche

Risparmiare allo sviluppatore la riscrittura di codice già steso in precedenza per compiti simili

Si estendono le classi del framerwork e/o se ne implementano le interfacce; sono i componenti del framework che hanno la responsabilità di controllare il flusso elaborativo.

sono le classi del framework che invocano il nostro codice applicativo e non viceversa come nel caso delle librerie di classi

Utilizza i design pattern

Una libreria contiene funzioni o routine (metodi) che l’applicazione può invocare

Framework fornisce componenti generici che collaborano tra loro che possono essere estesi (punti di estensione) per fornire nuove funzionalità

Page 4: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Vantaggi di un framework

1. Disegno architetturaleUn framework è fondato su un disegno architetturale valido, in quanto il suo codice è scritto in base alle best-practices della tecnologia in uso.

2. 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 perché 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..)

Page 5: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Scelta del Framework1. Maturità del progetto

Sconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunità degli sviluppatori e quindi poco testato sul campo in progetti reali.

2. DocumentazioneVerificare che la documentazione sia ricca e ben fatta. Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dell'applicazione e la comprensione del suo funzionamento.

3. Validità 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

EstensibilitàDeve essere possibile estenderne le funzionalità per adattarlo alle alle proprie esigenze.

Page 6: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Web application: Modello 1

Browser

Web / Servlet Container

JSPJava

Beans

Richiestadell’utente

Rispostadel sistema

DB

Page 7: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Pattern Model-View-Controller

Controller

Business ModelUtenteUtente

Azione Modifica stato

View

Scelta rappresentazione

dello stato

Notifica variazionedello stato

Page 8: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Web application: Modello 2

Browser

Web / Servlet Container

JSP

Richiesta

Risposta

Servlet

dispatch

BusinessModel

Page 9: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts e Modello 2

Client

Web / Servlet Container

view

Richiesta

Risposta

Servlet

dispatch

BusinessModel

Servlet

Struts

Extension point

Page 10: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

I componenti di Struts

ActionServlet: servlet di controllo che gestisce tutte le richieste dell'applicazione; estende la classe javax.servlet.http.HttppServlet e quindi implementa tutti i metodi di lifecycle, incluso init(), doGet(), doPost() ed il destroy.

struts-config.xml: cuore di tutta l'applicazione. In tale file XML si vanno a settare ed a definire i vari elementi della nostra applicazione e le loro associazioni. Tale file viene letto in fase di start-up dell'applicazione dalla ActionServlet.

Action: Le Action sono le classi alle quali le ActionServlet delega l'elaborazione della richiesta.

ActionMapping: Contiene gli oggetti associati ad una Action nello struts-config come ad esempio gli ActionForward.

ActionForm: Sono dei veri contenitori di dati. Fanno riferimento ad uno specifico form e vengono popolati automaticamente dal framework con i dati contenuti nella request http.

ActionForward: Contengono i path ai quali la servlet di Struts inoltra il flusso in base alla logica dell'applicazione.

Custom-tags: Sono tag particolari forniti dal framework Struts per assolvere a molti dei più comuni compiti delle pagine JSP.

Page 11: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache
Page 12: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Caratteristiche di Struts

1. DP FrontController :Esiste una sola servlet di controllo centralizzata e tutte le richieste sono mappate sulla ActionServlet nel web.xml dell'applicazione. Unico punto di gestione del flusso applicativo permette di implementare in modo univoco e centralizzato funzioni quali sicurezza, logging, filtri etc.

2. I livelli logici dell'applicazione sono disaccoppiati. Le viste dell'applicazione non contengono al loro interno il riferimento al flusso dell'applicazione e non contengono logica applicativa.

3. Le viste sono mappate con nomi logici definiti nel file di configurazione struts-config.xml. Nel codice Java non è presente alcun riferimento a nomi di pagine JSP il che rende molto più semplice variare il flusso applicativo.

4. Configurazione dell'applicazione in un file XML: consente di modificare le associazioni tra le richieste http e le classi ad essa associate in modo molto semplice.

Page 13: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Controller e Model in Struts

Struts è un framework model-neutral, ovvero che implementa esclusivamente i livelli di controller e view.

E’ possibile realizzare il livello di business logic in base alle proprie scelte

con semplici classi Java DAO (quindi implementando la logica applicativa nel web-container)

ricorrendo agli EJB quindi sfruttando i servizi del EJB-container

Page 14: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

ActionServlet e RequestProcessor

org.apache.struts.action.ActionServlet è la servlet di controllo di Struts: gestisce tutte le richieste http che provengono dai client e indirizza il flusso applicativo in base alla configurazione presente nel file XML struts-config.xml.

estende la javax.servlet.http.HttpServlet; i suoi metodi doGet() e doPost() chiamano entrambi un metodo process()

La ActionServlet esegue l'elaborazione che prevede:

1. I metodi doGet() e doPost() invocano il metodo process() della ActionServlet

2. Nel process() la ActionServlet ottiene l'istanza del RequestProcessor, configurato per l'applicazione nel tag <controller> dello struts.config.xml, e ne esegue il metodo process().

3. Nel metodo process() del RequestProcessor viene eseguita l'elaborazione vera e propria, ed in output al metodo viene fornito un oggetto ActionForward che consente alla ActionServlet di inoltrare l'elaborazione in base alla configurazione presente nello struts-config.xml.

Page 15: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

ActionServlet e RequestProcessor

<!-Configurazione standard della Action Servlet --><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><load-on-startup>1</load-on-startup></servlet> <!- Mapping della Action Servlet --><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*. do</url-pattern></servlet-mapping>

Page 16: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

ActionServlet e RequestProcessor

la org.apache.struts.action.RequestProcessor è la classe alla quale la ActionServlet delega l'elaborazione delle richieste.

RequestProcessor viene configurato mediante il tag <controller> dello struts-config.xml

E’ possibile utilizzarne uno proprio scrivendo una classe che estende la org.apache.struts.action.RequestProcessor e ne implementa i metodi

Di uso comune fare l'override del metodo processPreprocess() che viene eseguito dal RequestProcessor prima dell'elaborazione di ogni richiesta. Punto ottimale per inserire controlli di validità della sessione, dell'utente o simili.

Page 17: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

ActionServlet e RequestProcessor

Il RequestProcessor esegue i seguenti step:

1. Legge il file struts-config.xml per trovate un un elemento XML <action> corrispondente al path della richiesta.

2. Trovato l'elemento <action> verifica se è presente l'attributo name che corrisponde al nome dell'ActionForm. Reperire una istanza dell'ActionForm e ne popola gli attributi con i valori presenti nella request http, facendo una corrispondenza tra nome parametro e nome attributo.

3. Se nell'elemento <action> è presente l'attributo validate al valore true chiama il metodo validate() dell'ActionForm per il controllo dei dati forniti dalla request.

4. Se il controllo è ok a questo punto il RequestProcessor chiama il metodo execute() dell'Action configurata nell'elemento <action> delegandole l'elaborazione della richiesta.

5. Il metodo execute() dell'Action al termine dell'elaborazione restituisce un oggetto ActionForward che consente al RequestProcessor di inoltrare il flusso elaborativo.

Page 18: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts-config

<!-definizione del ActionForm --><form-beans> <form-bean name="startForm" type="it.prove..MenuForm" /></form-beans>

<action-mappings><!-definizione del Action --><action path="/start“input=“start.jsp” name="startForm" scope="request" type="it.prove.StartAction" validate="true"> <forward name="ok" path="/pagina1.jsp"/> <forward name="ko" path="/errorpage.jsp"/> </action></action-mappings>

Page 19: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Classe Action

La classe Action :creare una propria classe che la estende e ne implementa il metodo execute()

public ActionForward execute(ActionMapping mapping, ActionForm form,                      HttpServletRequest request, HttpServletResponse response)                      throws Exception{

Il metodo execute() riceve in input request e response http, un'istanzadell'oggetto ActionForm prima descritto, e un oggetto ActionMapping che contiene le infornazioni configurate nell'elemento <action> tra le quali i forward, ovvero i percorsi a cui inoltrare in uscita l'elaborazione.

Restituisce un oggetto ActionForward che contiene il path di inoltro dell'elaborazione.

Page 20: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Classe Action

Le Action costituiscono il 'ponte' applicativo tra lo strato di Controller e di Model di un aapplicazione scritta con Struts

Le Action vengono gestite come delle servlet logica multithread delle servlet codice scritto nelle Action deve essere thread-safe per un corretto funzionamento delle stesse.

Le Action fanno parte del Controller e non del Model. La logica applicativa non deve essere scritta nella Action, ma questa deve delegare allo strato di Model l'elaborazione della business-logic.

Page 21: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Classe Action

Compiti della Action

Acquisire i dati della request dal form

Delegare l'elaborazione della business-logic alle classi del Model

Acquisire i risultati dell'elaborazione e prepararli per la vista da inviare all'utente mettendoli nello scope opportuno (se necessario).

Inoltrare il flusso elaborativo in base alla logica applicativa.

Page 22: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Classi Action Pronte

ForwardActionquando è necessario fare il forward da una pagina jsp a un’altra senza bisogno di passare per un’Action

<action input="/index.jsp" name=“loginForm" path=“/viewLogin" parameter=“/sevurity/signin.jsp”type=“org.apache.struts.actions.ForwardAction" validate=“false"> </action>

Page 23: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Classi Action Pronte

DispatchActionconsentire che risiedano su una singola classe operazioni multiple

<action path=“/cart" input="/order/shoppingcart.jsp" parameter=“method”name=“loginForm" type=“org.apache.struts.actions.EstendiDispatchAction" validate=“false"> <forward name=“....” path=“....”

</action>

Page 24: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Classi Action Pronte

LookupDispatchActionconsentire di invocare metodi multipli invocati sulla base del valore di uno speciale parametro di request indicato nel file di configurazione. Viene fatto poi un reverseLookup sul resourse bundle.

Occorre creare una classe che estenda LookupDispatchAction e implementi il metodo getKeyMethodMap()

Protected Map getKeyMethodMap(){Map map= new HashMap();map.put(“button.checkout”,”checkout”); map.put(“button.saveorder”,” saveorder”);}

Nel resource bundle si ha:button.checkout= Checkout button.saveorder= Save Order

Page 25: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Classi Action pronte

<action path=“/processcheckout" input="/checkout.jsp" name=“checkoutForm“parameter=“action”scope=“request”type=“...ProcessCheckoutAction" > <forward name=“....” path=“....”

</action>

Nella Jsp

<html:form action=“/processcheckout”><html:submit property=“action”><bean:message key=“button.checkout” /></html:submit></html:form>

Page 26: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

ActionForm

org.apache.struts.action.ActionForm. I form (come sono chiamate nella terminologia Struts le classi che estendono la org.apache.struts.action.ActionForm) sono sostanzialmente dei bean contenenti dati, che il framework popola automaticamente con i dati della request svincolando lo sviluppatore dal doverlo fare con proprio codice applicativo

la struttura è esattamente quella di un JavaBean a parte l'estensione della classe ActionForm

hanno attributi privati e corrispondenti metodi get e set pubblici. due metodi particolari: reset() e validate()

Page 27: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

ActionForm

public ActionErrors validate(ActionMappings mapping,HttpServletRequest request) Il tipo di ritorno del metodo è un oggetto della classe ActionErrors che è un contenitore di oggetti della classeorg.apache.struts.action.ActionError Ogni oggetto della classe ActionError rappresenta un errore verificatosi nella validazione dei dati

Con un opportuno custom tag (<html:errors>) posto nella pagina stessa sarà possibile visualizzare i messaggi di errore associati agli errori verificatisi senza scrittura di codice aggiuntivo.Il messaggio di errore viene reperito automaticamente dal framework dal resouce bundle dell'applicazione

ActionErrors errors = new ActionErrors();

 if ((username == null) || (username.length() < 1))    errors.add ("username",new ActionError("errore.username.obbligatorio")); return errors; }

Page 28: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Sezioni global

<global-exceptions>  <exception key="label.eccezione"     type="it.esempi.MiaException"     handler="it.esempi.ExceptionHandler"/></global-exceptions>

<global-forwards>  <forward name=“SystemFailure"     path=“/systemerror.jsp"/> <forward name=“SystemFailure"     path=“/sessiontimeout.jsp"/></global-forwards>

Page 29: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Librerie custom-tag

1. html Tag per la generazione di form HTML che interagiscono con gli ActionForm e degli altri elementi HTML di una pagina JSP

2. bean Tag usati per accedere a proprietà di JavaBeans e per creare istanze di bean

3. logic Tag usati per logica condizionale, iterazioni e controllo di flusso

4. Template

5. nested Tag che estendono le funzionalità dei tag base

Page 30: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Librerie di tag <html:form action="/login" >

<TABLE><TR><TH>Username:</TH><TD><html:text property="username"/></TD></TR><TR><TH>Password:</TH><TD><html:password property="password"/></TD></TR><TR><TD><html:submit/></TD></TR></TABLE></html:form>

Nella libreria logic esistono numerosi tag per eseguire logica condizionale quali <logic:empty> <logic:notEmpty> <logic:equal> <logic:notEqual> <logic:greaterThan> ed altri., tag per eseguire iterazioni su array e collection quali <logic:iterate>, e tag per eseguire controllo di flusso come il <logic:redirect>.

Nella libreria bean sono presenti tag per la definizione di variabili di scripting utilizzabili all'interno della pagina quali <bean:define> , tag per la scrittura in output del valore di attributi di un <bean: write> e così via.

Page 31: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

I due approcci possibili nella gestione delle situazioni di eccezione, così come nella gestione di molte altre problematiche sono quello programmatico e quello dichiarativo.

l'approccio programmatico consiste nello scrivere all'interno della propria applicazione codice specifico per la gestione di una determinata problematica

l'approccio dichiarativo consiste nel configurare all'esterno dell'applicazione le modalità di gestione del problema stesso

Page 32: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

Una Action contenente gestione programmatica delle eccezioni potrebbe avere un aspetto simile:

try{  //codice che può generare eccezioni}catch(Exception e){  ActionErrors errors = new ActionErrors();  erorrs.add("eccezione", new ActionErorrs("eccezione"));  saveErrors(request,errors);  return mapping.findForward("eccezione"); }

costringe comunque lo sviluppatore a scrivere codice ad hoc, spesso ridondante, per gestire queste situazioni.

Se si vuole modificare il comportamento dell'applicazione al verificarsi di una eccezione è necessario intervenire nel codice.

Page 33: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

Più elegante ed efficiente sfruttare la possibilità offerta da Struts di gestire in modo dichiarativo le eccezioni nel file XML di configurazione struts-config.xml, è possibile descrivere mediante opportune sezioni XML il comportamento che l'applicazione deve avere a fronte di una particolare eccezione

può essere fatta a livello di singola Action o a livello globale per tutta l'applicazione.

Per configurare la gestione a livello di singola action si utilizza il tag <exception> all'interno della configurazione della Action stessa.

Page 34: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

Nel tag <exception> si dichiara la classe dell'eccezione da gestire, la risorsa a cui verrà inoltrato il flusso elaborativo ed una chiave per acquisire dal resource bundle dell'applicazione un messaggio di errore

<action path"/esempio"   type="it.esempi.EsempioAction"   input="input.jsp"   scope="request"   name="myForm" >  <exception key="label.eccezione.esempio"     type="it.esempi.MiaException"     path="errorpage.jsp" /></action>

Page 35: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

E' anche possibile definire un comportamento globale utilizzando il tag <global-exception>. In tal caso si presuppone la definizione di una o più classi handler per le eccezioni da gestire, ovvero delle classi che estendono org.apache.struts.action.ExceptionHandler ed il cui metodo execute() viene eseguito dal framework al verificarsi della corrispondente eccezione.

<global-exceptions>  <exception key="label.eccezione"     type="it.esempi.MiaException"     handler="it.esempi.ExceptionHandler"/></global-exceptions>

Page 36: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

it.esempi.ExceptionHandler , che estende org.apache.struts.action.ExceptionHandler, gestisce le eccezioni di tipo it.esempi.MiaException al verificarsi di una eccezione di questo tipo il framework manderà in esecuzione il metodo execute() della classe handler così dichiarata.

In questo metodo in genere è opportuno inserire del codice per effettuare il log dell'eccezione, memorizzando tutte le informazioni utili alla comprensione del problema che la ha generata, quali il messaggio associato all'eccezione, lo stack-trace etc. Il metodo restituisce in output un oggetto della classe ActionForward che consente di effettuare il forward alla risorsa desiderata

Page 37: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

Suggerimenti pratici

preferibile dichiarare delle global exceptions almeno per quelle eccezioni comuni a tutte le Action, lasciando alla dichiarazione della singola Action solo i casi particolari di eccezioni possibili solo in quel contesto

Se non è necessaria una gestione estremamente particolareggiata è possibile dichiarare una classe handler per la java.lang.Exception che gestirà quindi in maniera centralizzata tutte le possibili eccezioni.

Page 38: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Gestione delle eccezioni

casi in cui non è possibile non inserire blocchi try/catch all'interno del codice. Basti pensare al caso di codice che esegue in modo programmatico una transazione su un database e che necessita di gestire le situazioni di eccezione per effettuare correttamente il commit o il rollback della transazione stessa. In tal caso lo sviluppatore è obbligato ad inserire uno o più blocchi catch al cui interno eseguire l'operazione di rollback per annullare la transazione corrente.

Page 39: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di struts

Validazione dei dati immessi in un form HTML metodo validate() della classe org.apache.struts.action. ActionForm costituisce il punto nel quale vengono effettuati i controlli lato server sui dati immessi

Problemi:

codice di validazione è spesso duplicato

cambiamento delle regole di validazione implica una modifica ai sorgenti.

Page 40: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Validator è un framework che fornisce gli strumenti per effettuare in modo automatico e dichiarativo i controlli formali sui campi digitati in un form HTML.

Il Validator costituito da un insieme di classi predisposte per eseguire tutti i più comuni controlli di validazione in genere usati nelle applicazione

possibile di creare routine di validazione non fornite dal Validator

supporta sia la validazione server-side che quella client-side mediante opportune funzioni JavaScript, non fornita dal meccanismo standard degli ActionForm di Struts.

Page 41: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Nel file validator-rules.xml vengono dichiarate tutte le routine di validazione disponibili, i loro nomi logici e il codice JavaScript corrispondente a ciascuna routine di validazione per l'esecuzione dei controlli client-side

Nel file validation.xml si specifica come queste routine vengano applicate ai vari campi di input dei form dell'applicazione, ai quali si fa riferimento mediante i nomi dei form beans dichiarati nello struts-config.xml

step:

1. Abilitare il Validator plug-in

2. Configurare i due file XML appena citati, validator-rules.xml e validation.xml

3. Creare form bean che estendano gli ActionForm del Validator.

Page 42: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Il Validator viene configurato come un plug-in di Struts. Per abilitare il Validator bisogna aggiungere nello struts-config.xml le seguenti righe;<plug-in className="org.apache.struts.validator.ValidatorPlugIn"><set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/></plug-in>

In questo modo Struts all'avvio dell'applicazione carica e inizializza il Validator; si può notare come vengano definiti i percorsi dei due file XML di configurazione del Validator.

Page 43: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Sono già presenti gran parte delle comuni esigenze per ciò che riguarda i controlli formali da eseguire sui campi di input di un form

<form-validation>

<global>

<validator name="required"

classname="org.apache.struts.validator.FieldChecks"

method="validateRequired"

methodParams="java.lang.Object,

org.apache.commons.validator.ValidatorAction,

org.apache.commons.validator.Field,

org.apache.struts.action.ActionErrors,

javax.servlet.http.HttpServletRequest"

msg="errors.required">

<javascript>

<![CDATA[

function validateRequired(form) {……

Page 44: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Come già accennato per utilizzare il Validator i form bean dell'applicazione non devono estendere la classe ActionForm standard di Struts ma la classe org.apache.struts.validator.ValidatorForm che fornisce l'implementazione del metodo validate(). In questo caso non è più necessario scrivere il codice di validazione perché è il Validator che lo fa per noi; non bisogna implementare neanche il reset()

public class LogonForm extends ValidatorForm {…

<form-beans><form-bean name="logonForm“ type="it.prove.LogonForm"/></form-beans>

Page 45: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Il nome dato al form bean nello struts-config.xml è usato nel validation.xml per far riferimento al form in questione. Il validation.xml viene usato per dichiarare i controlli che verranno effettuati sui campi di input di un form dell'applicazione

<form-validation><formset><form name="logonForm">

<field property="username“ depends="required"><arg0 key="label.username"/></field><field property="password“ depends="required"><arg0 key="label.password"/>

</field></form></formset></form-validation>

Page 46: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Per i messaggi di errore associati a ciascuna routine di validazione il Validator utilizza il file ApplicationResource.properties di Struts. In questo file vengono definiti i messaggi di errore associati a ciascun criterio di validazione definito nel validator-rules.xml :

errors.required={0} is requirederrors.minlength={0} cannot be less than {1} characters.

Page 47: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Validator di Struts

Il Validator foirnisce anche il supporto alla validazione client-side dei form dell'applicazione. Le funzioni JavaSctipt associate ai diversi criteri di validazione sono definite nel file validator-rules.xml come già visto. Per abilitare la validazione client-side è sufficiente inserire nelle pagine JSP dell'applicazione il seguente tag:

<html:javascript formName="logonForm"/>

Nel nostro caso genererà la funzione validateLogonForm() che effettuerà la validazione del form purchè la si colleghi al submit dello stesso come segue:<html:form action="logonAction" onsubmit="return validateLogonForm (this)">

Chiaramente il submit del form non avverrà se i controlli sui campi non hanno successo

Page 48: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Esempio di validazione

<form name="nomeForm"> <!-- definiamo il nome del Form --> <field property="nome" depends="minlength"> <arg0 key="nomeForm.nome" /> <arg1 key="${var:minlength}"

<!-- definiamo arg1 come minlenght --> name="minlength" resource="false" />

<var> <var-name>minlength</var-name><!--dichiariamo che la lunghezza minima deve essere di 5 car --> <var-value>5</var-value> </var> </field> </form>

Nel resource bundleerrors.minlength={0} non può essere meno di {1} caratteri.#{0} fa riferimento ad arg0 mentre {1} ad arg1

Page 49: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Regole già presenti nel validator

required: controlla se il campo non è vuoto validwhen: il campo è valido quando la condizione specificata si verifica minlength: il campo deve avere minimo un certo numero di caratteri maxlength: il campo deve avere massimo un certo numero di caratteri mask: il campo deve contenere certi tipi di caratteri byte: vede se il valore del campo è un byte short: vede se il valore del campo è uno short integer: vede se il valore del campo è un intero long: vede se il valore del campo è un long float: vede se il valore del campo è un float double: vede se il valore del campo è un double date: vede se il valore del campo è una data email: vede se il campo è un indirizzo mail url: vede se il campo è un url

Page 50: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Creazione di una propria regola di validazione

Creare una classe che contenga i metodi di validazione del tipopublic static boolean validateXXX (Object,org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, org.apache.commons.validator.Validator, javax.servlet.http.HttpServletRequest)

Page 51: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Esempio di regola di validazione

public class MyValidator implements Serializable

{

public static boolean validateDistretto(Object bean, ValidatorAction va, Field field,

ActionMessages errors,Validator vl, HttpServletRequest request)

{

String value = null;

if((field.getProperty()!=null)&&(field.getProperty().length()>0))

{

value = ValidatorUtils.getValueAsString(bean, field.getProperty());

if((value.equals(""))||(value.equals("0")))

{

errors.add(field.getKey(), Resources.getActionMessage(request, va, field));

}

}

return errors.isEmpty();

}

}

Page 52: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts Tag Library

Sono

HTML (ex Form)

BEAN

LOGIC

TEMPLATE

NESTED

Page 53: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts Tag Library

Modalità di accesso alle proprietà del bean

Proprietà semplici

user.address

Proprietà annidate

user.address.city

Proprietà indicizzate

user.address[2]

Page 54: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts tag library

HTML esempi

<html:base/>crea il tag html base che punte alla colocazione della pagina assoluta che lo contiene per gestiere poi src e simili<base href=“http://localhost:8080/appl/index.jsp”>

Page 55: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts tag library

<html:form

Action :url dell’action Enctype: codifica del contenuto (multipart/form-data per upload) Focus: nome del campo con focus Method: metodo http Name: nome dell’actionForm, se non specificato si guarda il name

del tag action in struts-config Onreset, onsubmit: gestore Javascript Scope: scope dell’action form Style, styleClass, styleId:stile, classe e id HTML Target: frame target a cui inviare i dati della form Type: nome completo della classe dell’actionForm

Page 56: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts tag library

<html: messages e <html:errors

Page 57: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

empty Evaluate the nested body content of this tag if the requested variable is either null or an empty string.

equal Evaluate the nested body content of this tag if the requested variable is equal to the specified value.

forward Forward control to the page specified by the specified ActionForward entry.

greaterEqual Evaluate the nested body content of this tag if the requested variable is greater than or equal to the specified value.

greaterThan Evaluate the nested body content of this tag if the requested variable is greater than the specified value.

iterate Repeat the nested body content of this tag over a specified collection.

lessEqual Evaluate the nested body content of this tag if the requested variable is less than or equal to the specified value.

lessThan Evaluate the nested body content of this tag if the requested variable is less than the specified value.

Page 58: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

match Evaluate the nested body content of this tag if the specified value is an appropriate substring of the requested variable.

messagesNotPresent Generate the nested body content of this tag if the specified message is not present in this request.

messagesPresent Generate the nested body content of this tag if the specified message is present in this request.

notEmpty Evaluate the nested body content of this tag if the requested variable is neither null, nor an empty string, nor an empty java.util.Collection (tested by the .isEmpty() method on the java.util.Collection interface).

notEqual Evaluate the nested body content of this tag if the requested variable is not equal to the specified value.

notMatch Evaluate the nested body content of this tag if the specified value is not an appropriate substring of the requested variable.

notPresent Generate the nested body content of this tag if the specified value is not present in this request.

present Generate the nested body content of this tag if the specified value is present in this request.

redirect Render an HTTP Redirect

Page 59: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

Struts Tag library

base - renders an HTML base element

button - renders a button input fiels

cancel - renders a cancel button

checkbox - renders a checkbox input field

errors - conditionnaly renders a set of accumulated error messages

file - renders a file select input field

form - defines an HTML form element

frame - renders an HTML frame element

hidden - renders a hidden field

html - renders an HTMl html element

image - renders an input tag of type "image"

img - renders an HTMl img tag

javascript - renderts JavaScript validation rules loaded by ValidationPlugin

link - renders an HTML anchoror hyperlink

messages - Conditionally displays a set of accumulated messages

Page 60: Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache

multibox -renders multiple checkbox input fields

option - renders a select option

options - renders a collection of select options

options Collection - render a collection of select options

password -renders apassword input field

radio -renders a radio button input field

reset -renders a rest button input field

rewrite - renders a URI

select -renders a select element

submit -renders a submi button

text -renders an input field of type "text"

textarea -renders an textarea input field