02 Struts Actions

40
Slides © Marty Hall, http://www.coreservlets.com, books © Sun Microsystems Press Jakarta Struts: Processare le richieste con gli Action Objects Struts Versione 1.2 Core Servlets & JSP book: www.coreservlets.com More Servlets & JSP book: www.moreservlets.com Servlet/JSP/Struts/JSF Training: courses.coreservlets.com Traduzione a cura di JavaStaff.com

description

Struts Actions

Transcript of 02 Struts Actions

Page 1: 02  Struts  Actions

Slides © Marty Hall, http://www.coreservlets.com, books © Sun Microsystems Press

Jakarta Struts:Processare le richieste con gli Action Objects

Struts Versione 1.2Core Servlets & JSP book: www.coreservlets.comMore Servlets & JSP book: www.moreservlets.com

Servlet/JSP/Struts/JSF Training: courses.coreservlets.comTraduzione a cura di JavaStaff.com

Page 2: 02  Struts  Actions

Apache Struts: Actions2 www.coreservlets.com

Agenda

• Flusso di controllo di Struts• I sei passi base per l’utilizzo di Struts

– Per implementare il flusso di controllo• Esempi

Page 3: 02  Struts  Actions

Apache Struts: Actions3 www.coreservlets.com

Il flusso di controllo di Struts

JSP

FormDeterminala Action

ActionSceglie

la pagina JSP

JSP

richiesta

.../SomeForm

.jsp

Invio formrichiesta .../blah.do

invocaesegue

unmetodo

Ritorna condizione

Forward verso

Ritorna risultato finale

struts-config.xml

Page 4: 02  Struts  Actions

Apache Struts: Actions4 www.coreservlets.com

Il flusso di controllo di Struts

• L’utente richiede un form– Per ora utilizziamo il semplice HTML per costruire la form

• Successivamente utilizzeremo il tag Struts html:form• Il form è inviato ad un URL della forma blah.do.

– Questo indirizzo è mappato ad un Action class nel file di configurazione struts-config.xml

• Il metodo execute dell’oggetto Action viene invocato – Uno degli argomenti è un form bean che è automaticamente creato e le cui

proprietà sono popolate automaticamente con i dati che arrivano dal form– L’oggetto Action dopo invoca la business logic e la data-access logic,

mettendo i risultati in dei bean che vengono salvati in uno scope di request, session o application.

– L’Action utilizza mapping.findForward per ritornare una condizione, e le condizioni sono mappate nel file struts-config.xml per effettuare il forward verso diverse pagine JSP.

• Struts ridirige le richieste verso la pagina JSP appropriata– La pagina può utilizzare bean:write o l’EL di JSP 2.0 per stampare le

proprietà dei bean– La pagina può utilizzare bean:message per stampare determinate stringhe

Page 5: 02  Struts  Actions

Apache Struts: Actions5 www.coreservlets.com

I sei passi base per utilizzare Struts

1. Modificare struts-config.xml. Si utilizza WEB-INF/struts-config.xml per: – Mappare gli indirizzi in entrata.do verso le classi Action– Mappare le condizioni di ritorno della pagine JSP– Dichiarare i form beans che devono essere usati. – Riavviate il server una volta modificato il file

struts-config.xml. 2. Definire un form bean.

– Questo bean è una classe che estende ActionForm e rappresenterà i dati inviati dall’utente. E’ automaticamente valorizzato quando la form di input viene inviata. La definizione dei bean è rinviata alla prossima lezione.

Page 6: 02  Struts  Actions

Apache Struts: Actions6 www.coreservlets.com

I sei passi base per utilizzare Struts

3. Creare i bean per il risultato.– Nell’architettura MVC architecture, il codice relativo alla business-

logic e data-access crea i risultati e le pagine JSP li presentano. Per trasferire i risultati da un layer all’altro si utilizzano dei bean dove vengono memorizzati questi valori. Questi bean differiscono dai form bean perchè non hanno bisogno di estendere alcuna classe particolare e rappresentano l’output del processo computazionale, non l’input. I bean verranno discussi nella prossima lezione.

4. Definire una classe Action per gestire le richieste.– Il file struts-config.xml definisce le classi Action classes che

gestiscono le richieste per differenti URL. Gli oggetti Action hanno bisogno di fare il vero lavoro: invocare la business-logic (e/o data-access-logic), salvare dei risultati in dei bean e definisce il tipo di situazione appropriata in base ai risultati (dati mancanti, errore sul database, categoria di successo 1, categoria di successo 2 etc. etc.). Il file struts-config.xml dopo decide quale pagina JSP deve essere applicata a questa situazione.

Page 7: 02  Struts  Actions

Apache Struts: Actions7 www.coreservlets.com

I sei passi base per utilizzare Struts

5. Creare il form che invoca blah.do.– Creare un form di input la cui ACTION corrisponde ad uno degli

indirizzi contenuti nel file struts-config.xml. – In una lezione successiva si parlerà dei vantaggi dell’utilizzo del

tag html:form di Struts per costruire i form di input. 6. Display dei risultati nelle JSP.

– Visto che Struts è costruito sul pattern MVC, queste pagine JSP dovrebbero evitare elementi di scripting ove possibile. Si può usare il tag bean:write, ma anche l’EL di JSP 2.0 è alternativa possibile.

– Nella maggior parte dei casi, le pagine JSP hanno senso solo quando la richiesta è inviata attraverso una Action.

– Se le pagine JSP hanno senso indipendentemente dalla Action, allora queste pagine dovrebbero essere poste in una sottodirectory della Web application e le entry di forward entries nel file struts-config.xml dovrebbero riportare<forward ... redirect="true"/>.

Page 8: 02  Struts  Actions

Apache Struts: Actions8 www.coreservlets.com

Esempio 1: Mapping di un risultato

• URL – http://hostname/StrutsActions/register1.do

• Action Class– RegisterAction1

• RegisterAction1 estende Action ed è presente nel package di com.javastaff.strutsaction.

• Il metodo execute di RegisterAction1 ritorna sempre "success"

• Pagina dei risultati– /WEB-INF/results/confirm.jsp

• L’URL mostrato sarà sempre register1.do

Page 9: 02  Struts  Actions

Apache Struts: Actions9 www.coreservlets.com

Passo 1A (Modificare struts-config.xml)

• Mappare gli indirizzi in arrivo .do con delle classi Action– In questo caso abbiamo deciso che la classe RegisterAction1 deve

gestire le richieste per l’indirizzo register1.do. Per assolvere a questo compito, dobbiamo aggiungere una entry action al tag action-mappings, dove la action deve avere i seguenti attributi.

• path: il path relativo che deve essere mappato sulla Action, tranne l’estensione .do. Così il path="/register1" si riferisce all’URL http://hostname/webAppName/register1.do.

• type: il nome completo della classe Action che deve essere invocato per gestire la richiesta.

<action-mappings> <!-- .do implied automatically --> <action path="/register1"

type="com.javastaff.strutsaction.RegisterAction1"> ... </action> </action-mappings>

Page 10: 02  Struts  Actions

Apache Struts: Actions10 www.coreservlets.com

Passo 1B (Modificare struts-config.xml)

• Mappare le condizioni di ritorno con delle pagine JSP– In questo caso utilizziamo l’elemento forward per dire

che la pagina confirm.jsp viene applicata quando il metodo execute di RegisterAction1 ritorna "success", come segue :

<forward name="success" path="/WEB-INF/results/confirm.jsp"/>

– Nota: se lo stesso forward è utilizzato da azioni multiple, è possibile inserirlo in una sezione global-forwards section (prima di action-mappings) invece che metterlo dentro la action.

<global-forwards> <forward name="success" path="/WEB-INF/results/confirm.jsp"/>

</global-forwards>

Page 11: 02  Struts  Actions

Apache Struts: Actions11 www.coreservlets.com

Passo 1 (Modificare struts-config.xml) – Il file struts-config.xml finale<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE struts-config PUBLIC ... ><struts-config> <action-mappings> <action path="/register1"

type="com.javastaff.strutsaction.RegisterAction1">

<forward name="success" path="/WEB-INF/results/confirm.jsp"/> </action> </action-mappings></struts-config>

Page 12: 02  Struts  Actions

Apache Struts: Actions12 www.coreservlets.com

Passo 2 e 3

• Definire un form bean.– I bean sono rimandati alla prossima lezione, quindi

questo step è omesso per il momento. • Creare dei result bean.

– I bean sono rimandati alla prossima lezione, quindi questo step è omesso per il momento.

Page 13: 02  Struts  Actions

Apache Struts: Actions13 www.coreservlets.com

Passo 4 (Definire una classe Action per gestire le richieste)

• Le sottoclassi Action dovrebbero… essere in un package.– In questo caso abbiamo

package com.javastaff.strutsaction;• Questo significa che il file class dovrebbe andare in

web_app/WEB-INF/classes/com/javastaff/strutsaction. • Le sottoclassi Action dovrebbero… aggiungere

gli import specifici per Struts o qualsiasi altro importo necessario. – In questo caso abbiamo

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionForward;

Page 14: 02  Struts  Actions

Apache Struts: Actions14 www.coreservlets.com

Passo 4 (Definire una classe Action per gestire le richieste)

• Le sottoclassi Action dovrebbero... estendere Action

• Le sottoclassi Action dovrebbero... effettuare l’override del metodo execute– In questo caso abbiamo

public class RegisterAction1 extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ... }}

Page 15: 02  Struts  Actions

Apache Struts: Actions15 www.coreservlets.com

Passo 4 (Definire una classe Action per gestire le richieste)

• Le sottoclassi Action dovrebbero... Ritornate mapping.findForward. – Il metodo execute dovrebbe avere uno o più valori di

ritorno. – Questi valori corrisponderanno a specifiche pagine JSP

definite nelle entry forward del file struts-config.xml. In questo caso ritorniamo semplicemente "success" in ogni situazione.

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return(mapping.findForward("success")); }

Page 16: 02  Struts  Actions

Apache Struts: Actions16 www.coreservlets.com

Passo 4 (Definire una classe Action per gestire le richieste) – Codice finale

package com.javastaff.strutsaction;

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionForward;

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

return mapping.findForward("success");}

}

Page 17: 02  Struts  Actions

Apache Struts: Actions17 www.coreservlets.com

Passo 5 (Creare il form che richiama register1.do)

• Abbiamo bisogno di un form HTML che richiama http://hostname/struts-actions/register1.do.

<!DOCTYPE ...><HTML><HEAD><TITLE>New Account Registration</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><CENTER><H1>New Account Registration</H1><FORM ACTION="register1.do" METHOD="POST"> Email address: <INPUT TYPE="TEXT" NAME="email"><BR> Password: <INPUT TYPE="PASSWORD" NAME="password"><BR> <INPUT TYPE="SUBMIT" VALUE="Sign Me Up!"></FORM></CENTER></BODY></HTML>

Page 18: 02  Struts  Actions

Apache Struts: Actions18 www.coreservlets.com

Passo 6 (Display dei risultati nella JSP)

• In generale, a questo punto possono esserci diverse pagine– Ogni pagina può corrispondere ai diversi valori che

vengono ritornati dal metodo execute della Action invocata.

• Nel file struts-config.xml, ogni pagina JSP è dichiarata in una entry forward con la relativa action. – In questo semplice caso l’unico valore di ritorno è

"success", così /WEB-INF/results/confirm.jsp è usata in tutti i casi.

• Questa pagina JSP mostrerà un semplice messaggio (come potete vedere nella prossima slide)

Page 19: 02  Struts  Actions

Apache Struts: Actions19 www.coreservlets.com

Passo 6 (Display dei risultati nella JSP) – Codice finale<!DOCTYPE ...><HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><CENTER><H1>You have registered successfully.</H1>Congratulations</CENTER></BODY></HTML>

Page 20: 02  Struts  Actions

Apache Struts: Actions20 www.coreservlets.com

Esempio 1: Risultati

• Il form HTML viene invocato con l’URL http://localhost/StrutsAction/form.html

Page 21: 02  Struts  Actions

Apache Struts: Actions21 www.coreservlets.com

Esempio 1: Risultati

• Questo form viene riempito ed in seguito inviato– L’ ACTION del form è register1.do

• Questo indirizzo è mappato nel file di configurazione struts-config.xml – E’ associato alla classe RegisterAction1, della quale viene

invocato il metodo execute. • Questo metodo ritorna mapping.findForward

– Con il valore "success“, definito staticamente• Questo valore è mappato in struts-config.xml

– Gestisce il forward verso /WEB-INF/results/confirm.jsp, • Che è il risultato finale mostrato all’utente. • Tuttavia visto che la pagina è invocata con

RequestDispatcher.forward, e non response.sendRedirect, l’URL mostrato all’utente è register1.do, non confirm.jsp.

Page 22: 02  Struts  Actions

Apache Struts: Actions22 www.coreservlets.com

Esempio 1: Risultati

Page 23: 02  Struts  Actions

Apache Struts: Actions23 www.coreservlets.com

Esempio 2: Mapping multipli per il risultato

• URL– http://hostname/StrutsAction/register2.do

• Action Class– RegisterAction2.

• Il metodo execute di RegisterAction2 ritorna "success", "bad-address", o "bad-password"

• Pagine dei risultati – /WEB-INF/results/confirm.jsp, – /WEB-INF/results/bad-address.jsp, e – /WEB-INF/results/bad-password.jsp

• Nuova feature di questo esempio– L’uso di forward multipli in un elemento action.

Page 24: 02  Struts  Actions

Apache Struts: Actions24 www.coreservlets.com

Passo 1 (Modificare struts-config.xml)

• Mappare gli indirizzi .do con le classi Action– In questo caso utilizziamo RegisterAction2 per gestire le

richieste relative a register2.do (come prima, notare che il .do è implicito).

• Mappare le condizioni ritornate con delle pagine JSP– In questo caso utilizziamo degli elementi forward

multipli, uno per ogni possibile valore di ritorno del metodo execute di RegisterAction2.

• Dichiarare tutti i form bean che devono essere usati.– I Bean sono rimandati alla prossima lezione quindi per il

momento sono omessi.

Page 25: 02  Struts  Actions

Apache Struts: Actions25 www.coreservlets.com

Passo 1 (Modificare struts-config.xml) – Codice finale

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE struts-config PUBLIC ... ><struts-config> <action-mappings> ... <action path="/register2"

type="com.javastaff.strutsaction.RegisterAction2"> <forward name="bad-address" path="/WEB-INF/results/errorEmail.jsp"/> <forward name="bad-password" path="/WEB-INF/results/errorPassword.jsp"/> <forward name="success" path="/WEB-INF/results/confirm.jsp"/> </action> </action-mappings></struts-config>

Page 26: 02  Struts  Actions

Apache Struts: Actions26 www.coreservlets.com

Passi 2 e 3

• Definire un form bean.– I Bean sono rimandati alla prossima lezione quindi per il

momento sono omessi. • Creare i bean dei risultati.

– I Bean sono rimandati alla prossima lezione quindi per il momento sono omessi.

Page 27: 02  Struts  Actions

Apache Struts: Actions27 www.coreservlets.com

Passo 4 (Definire una classe Action per gestire le richieste)

• Simile al precedente esempio tranne per il fatto che ora inseriamo diverse entry nel mapping.findForward– Ritorniamo un "bad-address" se l’email non è presente

nel form, se è più piccola di 3 caratteri o se manca il carattere "@".

– Ritorniamo "bad-password" se la password è mancante o se è più piccola di 6 caratteri.

– Altrimenti ritorniamo "success". • In questo semplice esempio utilizziamo

esplicitamente request.getParameter.– Nelle lezioni successive vedremo come Struts popola

automaticamente un bean a partire dai dati della request HTTP.

Page 28: 02  Struts  Actions

Apache Struts: Actions28 www.coreservlets.com

Passo 4 (Definire una classe Action per gestire le richieste) – Codice finalepublic class RegisterAction2 extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String email = request.getParameter("email"); String password = request.getParameter("password"); if ((email == null) || (email.trim().length() < 3) || (email.indexOf("@") == -1)) { return(mapping.findForward("bad-address")); } else if ((password == null) || (password.trim().length() < 6)) { return(mapping.findForward("bad-password")); } else { return(mapping.findForward("success"));}}}

Page 29: 02  Struts  Actions

Apache Struts: Actions29 www.coreservlets.com

Passo 5 (Creare il form che invoca blah.do)

• Abbiamo bisogno di un form che invoca http://hostname/StrutsAction/register2.do.

<!DOCTYPE ...><HTML><HEAD><TITLE>New Account Registration</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><CENTER><H1>New Account Registration</H1><FORM ACTION="register2.do" METHOD="POST"> Email address: <INPUT TYPE="TEXT"

NAME="email"><BR> Password: <INPUT TYPE="PASSWORD"

NAME="password"><BR> <INPUT TYPE="SUBMIT" VALUE="Sign Me Up!"></FORM></CENTER></BODY></HTML>

Page 30: 02  Struts  Actions

Apache Struts: Actions30 www.coreservlets.com

Passo 6 (Visualizzare i risultati in una JSP)Prima possibile pagina<!DOCTYPE ...><HTML><HEAD><TITLE>Illegal Email Address</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><CENTER><H1>Illegal Email Address</H1>Address must be of the form [email protected] <A HREF=“form2.html">try again</A>.</CENTER></BODY></HTML>

Page 31: 02  Struts  Actions

Apache Struts: Actions31 www.coreservlets.com

Passo 6 (Visualizzare i risultati in una JSP)Seconda possibile pagina<!DOCTYPE ...><HTML><HEAD><TITLE>Illegal Password</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><CENTER><H1>Illegal Password</H1>Password must contain at least six characters.Please <A HREF=“form2.html">try again</A>.</CENTER></BODY></HTML>

Page 32: 02  Struts  Actions

Apache Struts: Actions32 www.coreservlets.com

Passo 6 (Visualizzare i risultati in una JSP)confirm.jsp già utilizzata <!DOCTYPE ...><HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><CENTER><H1>You have registered successfully.</H1>Congratulations</CENTER></BODY></HTML>

Page 33: 02  Struts  Actions

Apache Struts: Actions33 www.coreservlets.com

Esempio 2: Risultati (Form iniziale)

Page 34: 02  Struts  Actions

Apache Struts: Actions34 www.coreservlets.com

Esempio 2: Risultati (Indirizzo sbagliato)

Page 35: 02  Struts  Actions

Apache Struts: Actions35 www.coreservlets.com

Esempio 2: Risultati (Password sbagliata)

Page 36: 02  Struts  Actions

Apache Struts: Actions36 www.coreservlets.com

Esempio 2: Risultati (Successo)

Page 37: 02  Struts  Actions

Apache Struts: Actions37 www.coreservlets.com

Combinare condizioni condivise per i vari mapping

• Idea– Se la stessa condizione è mappata sulla stessa pagina JSP

in diverse azioni, è possibile muovere questo forward in una sezione global-forwards per evitare inutili ripetizioni

• Sintassi– La sezione global-forwards precede action-mappings– Le entry di forward in global-forwards hanno la stessa

sintassi e lo stesso comportamento delle entry di forward nelle action

• Esempio<global-forwards> <forward name="success"

path="/WEB-INF/results/confirm.jsp"/></global-forwards>

Page 38: 02  Struts  Actions

Apache Struts: Actions38 www.coreservlets.com

Combinare condizioni condivise per i vari mapping: vecchia configurazione

<action-mappings> <action path="/register1"

type="com.javastaff.strutsaction.RegisterAction1"> <forward name="success" path="/WEB-INF/results/confirm.jsp"/> </action> <action path="/register2"

type="com.javastaff.strutsaction.RegisterAction2"> <forward name="bad-address" path="/WEB-INF/results/errorEmail.jsp"/> <forward name="bad-password" path="/WEB-INF/results/errorPassword.jsp"/> <forward name="success" path="/WEB-INF/results/confirm.jsp"/> </action> ... </action-mappings>

Page 39: 02  Struts  Actions

Apache Struts: Actions39 www.coreservlets.com

Combinare condizioni condivise per i vari mapping: nuova configurazione

<global-forwards> <forward name="success" path="/WEB-INF/results/confirm.jsp"/> </global-forwards> <action-mappings> <action path="/register1"

type="com.javastaff.strutsaction.RegisterAction1"> </action> <action path="/register2"

type="com.javastaff.strutsaction.RegisterAction2"> <forward name="bad-address" path="/WEB-INF/results/errorEmail.jsp"/> <forward name="bad-password" path="/WEB-INF/results/errorPassword.jsp"/> </action> ... </action-mappings>

Page 40: 02  Struts  Actions

Apache Struts: Actions40 www.coreservlets.com

Sommario

• Modificare struts-config.xml– Mappare indirizzi blah.do su delle classi che estendono

Action– Mappare le condizioni di return su delle pagine JSP– Dichiarare tutti i form bean che devono essere utilizzati.

• Definire un form bean• Creare un bean dei risultati• Definire una classe Action che gestisce le

richieste– Estendere Action– Effettuare l’override di execute()– Ritornare mapping.findForward

• Creare un form che invoca blah.do• Mostrare i risultati in una JSP