In genere non è una buona prassi quella di inserire, all'interno di una pagina JSP, dei link diretti ad altre pagine JSP, soprattutto per questioni di ordine e manutenzione: in effetti è all'interno del file di configurazione struts-config.xml
, che fa parte del Controller, che dovremmo descrivere l'intero flusso dell'applicazione.
In alcune occasioni possiamo però avere la necessità di effettuare un forward da una pagina Jsp a un'altra, senza che in realtà ci sia bisogno di passare per una classe Action. Quello che si vuole è un plain link.
Nell'architettura MVC è compito del controller di elaborare tutte le richieste e selezionare la view per il client. Se si utilizza un link diretto, a un'altra pagina JSP, si stanno violando i confini dell'architettura "Model 2" (l'MVC per applicazioni Web).
Se permettessimo alla nostra applicazione di chiamare direttamente la pagina, il controller non sarebbe in grado di portare a termine i compiti per esso stabiliti nell'architettura MVC. Per risolvere questi problemi Struts mette a disposizione la ForwardAction che esegue semplicemente un forward verso un URI configurato nell'attributo parameter dell'action nello struts-config.
Quindi la ForwardAction ci evita la creazione di una classe Action che effettua solamente un semplice forward.
Prima di esaminare un esempio più consistente vediamo una configurazione tipica di ForwardAction
:
<action input="/index.jsp" path="/provaForward"
parameter="/pagina.jsp"
type="org.apache.struts.actions.ForwardAction">
</action>
Quando viene selezionata l'action /provaForward
, viene chiamato l'unico metodo della ForwardAction
, che effettua un forward a pagina.jsp
. La classe ForwardAction
è molto utile quando è necessario integrare Struts con altri framework o più pagine Jsp.
Esempio
Abbiamo detto che ForwardAction
agisce come bridge tra la vista corrente JSP e la pagina alla quale si collega. Utilizza il RequestDispatcher
per effettuare un forward alla risorsa Web specificata. È ciò che permette di collegarsi a un'azione invece che direttamente a una pagina JSP.
Ecco alcuni passi necessari per implementare una ForwardAction
:
- utilizzare
<html:link>
con l'attributoaction
e aggiungere il link alla pagina JSP che punta all'azione - creare un action mapping nel file di configurazione di Struts che utilizza ForwardAction con l'attributo
parameter
che specifica il percorso alla JSP
Supponiamo di avere una pagina JSP, coded.jsp
, che ha un link diretto su un'altra pagina JSP:
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<body>
<html:link page="/index.jsp">Home</html:link>
</body>
</html>
e di volerla convertire secondo la logica dell'architettura MVC/Model2. In questo caso modifichiamo il tag <html:link>
su un'azione. È sufficiente produrre notcoded.jsp
:
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<body>
<html:link action="home">Home</html:link>
</body>
</html>
Infine bisogna aggiungere un action mapping all'azione home
referenziata dal tag html:link
:
<action path="/home"
type="org.apache.struts.actions.ForwardAction"
parameter="/index.jsp">
</action>
Link a forward globali
Da una prospettiva di design, c'è un'ulteriore alternativa all'utilizzo dell'azione ForwardAction
, anziché inserire un link a un azione o a una pagina, ci si potrebbe collegare a un global forward. Ecco un esempio di pagina JSP collegata a un global forward:
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<body>
<html:link forward="home">Home</html:link>
</body>
</html>
Per permettere ora al codice di funzionare dobbiamo aggiungere un global forward al file di configurazione di Struts che mappi l'azione home
:
<global-forwards>
<forward name="home" path="/index.jsp" />
</global-forwards>
È possibile anche modificare il global forward in modo che punti a un action mapping:
<global-forwards>
<forward name="home" path="/home.do" />
</global-forwards>
Questa, solitamente, è la pratica migliore, infatti, è più naturale collegarsi a forward che ad azioni.
Forward Attribute vs. ForwardAction
Struts permette le due dichiarazioni seguenti nel file struts-config.xml, ma la seconda è sicuramente più snella:
<!-- ForwardAction -->
<action path="/home"
type="org.apache.struts.actions.ForwardAction"
parameter="/index.jsp" />
<!-- Forward Attribute -->
<action path="/home" forward="/index.jsp" />