Le Action sono gli strumenti grazie ai quali il Controller di Struts gestisce le attività. Ogni Action rappresenta una funzione dell'applicazione, quindi è qui che scriviamo la logica applicativa dei nostri progetti.
La classe Action disaccoppia le richieste del client dall'applicazione. In altre parole un oggetto di tipo Action è un'estensione del controller e fa da ponte tra le azioni client-side dell'utente e le operazioni della logica applicativa.
Ogni Action, come abbiamo già detto, deve essere dichiarata e configurata nel file struts-config.xml
e non nel web.xml
. Il suo nome deve terminare con .do
, è questo che permette alla richiesta di essere processata da Struts e non come una semplice servlet Java.
Le Action servono ad esempio a ricevere le richieste dai form, ad elaborare i dati e a lanciare le View per la visualizzazione delle informazioni. Per realizzare le Action, è necessario:
- Creare una classe che estenda
org.apache.struts.action.Action
- Implementare il metodo execute() aggiungengo la logica di business della nostra applicazione
- Compilare la nuova Action e spostarla nel classpath dell'applicazione Web
- Aggiungere un elemento <action> al file struts-config.xml all'applicazione che descrive la nuova azione
Esaminiamo più in dettaglio alcuni di questi passi.
Creare una Action
Dichiarare una nuova Action è molto semplice, è sufficiente estendere la classe base e ricordare di importare tutti i namespace necessari (se utilizziamo un IDE ci saranno comunque suggeriti):
import java.io.IOException;
import javax.servlet.ServletException;
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.ActionForward;
import org.apache.struts.action.ActionMapping;
public class EsempioAction extends Action {
// Qui scriviamo la Action
}
Il metodo execute()
La classe base Action
ci da l'opportunità e il compito di effettuare l'override del metodo execute()
, riscrivendo questo metodo, possiamo indicare le operazioni che vogliamo far compiere alla nostra azione. In altre parole è qui che inseriamo la "logica di business".
Il metodo execute()
viene invocato dal controller quando viene ricevuta una richiesta. Da non sottovalutare, per il buon funzionamento dell'applicazione, che una classe Action viene istanziata una sola volta, all'avvio dell'applicazione, quindi occorre garantire che tutte le Action
operino correttemente in un ambiente multithread, proprio come si fa quando si sviluppa una servlet.
Le funzioni principali di execute()
sono:
- compiere la logica dell'applicazione
- instradare la richiesta indicando al Framework il passo successivo da eseguire
Azioni HTTP e Custom
Struts contempla due definizioni per execute().
La prima serve a dichiarare azioni custom che non sono specificatamente HTTP. Questa implementazione del metodo è analoga alla classe javax.http.servlet.GenericServlet
; e la sua signature è la seguente:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
ServletRequest request,
ServletResponse response
) throws IOException, ServletException
La seconda implementazione viene utilizzata invece per dichiarare azioni HTTP. Ecco la sua signature:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response
) throws IOException, ServletException
Campo | Descrizione |
---|---|
ActionMapping | Contiene le informazioni di deployment per un particolare Action bean |
ActionForm | Rappresenta gli input del Form contenente i parametri della richiesta |
HttpServletRequest | È un riferimento all'oggetto HTTP Request |
HttpServletResponse | È un riferimento all'oggetto HTTP Response |
Dopo aver esaminato i parametri passati al metodo execute()
, bisogna dare un'occhiata al suo tipo di ritorno.
ActionForward
Questo oggetto viene utilizzato dal RequestProcessor per determinare la destinazione successiva della richiesta. Qui si può determinare ad esempio, se sarà lanciata una vista JSP o un'altra azione.
// Esempio di execute()
public class EsempioAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
if (form!=null) {
// 1. Creazione del form
// (effetuiamo il cast dal form in ingresso)
SkeletonForm actionForm = (SkeletonForm) form;
// 2. Aggiungere qui la Business Logic
// 3. return con un appropriato ActionForward
return mapping.findForward("success");
}
}
}
Nella costruzione delle Action, si segue una procedura comune:
- effettuare un cast dell'
ActionForm
referenziato - aggiungere la specifica logica di business
- utilizzare il metodo
ActionMapping.findForward()
per trovare l'oggettoActionForward
che effettua un match con il sottoelemento <forward> nella definizione di <action> (nel filestruts-config.xml
) - restituire l'oggetto
ActionForward
trovato
Configurazione della classe Action
Le classi Action si configurano nel file struts-config.xml, poiché si tratta di oggetti specifici di Struts.
L'elemento che viene utilizzato per descrivere un'azione Struts è <action>. e la classe che definisce gli attributi dell'elemento <action>
è org.apache.struts.action.ActionMapping.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<!-- qui dichiariamo che il form 'lookupForm' sarà inviato-->
<!-- all'action 'esempio' nel campo ActionForm -->
<form-bean name="lookupForm" type="esempio.LookupForm" />
</form-beans>
<action-mappings>
<!-- la location /Lookup lancerà il nostro form -->
<action path="/Lookup" type="esempio.LookupAction" name="lookupForm" >
<!-- le viste da collegare all'esito dell'action -->
<forward name="success" path="/quote.jsp" />
<forward name="failure" path="/index.jsp" />
</action>
</action-mappings>
</struts-config>
Vedremo in seguito come estendere il mapping per definire attributi <action> addizionali.