Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Le Action

I componenti attraverso i quali realizzare la logica delle applicazioni Struts
I componenti attraverso i quali realizzare la logica delle applicazioni Struts
Link copiato negli appunti

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:

  1. effettuare un cast dell'ActionForm referenziato
  2. aggiungere la specifica logica di business
  3. utilizzare il metodo ActionMapping.findForward() per trovare l'oggetto ActionForward che effettua un match con il sottoelemento <forward> nella definizione di <action> (nel file struts-config.xml)
  4. 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.

Ti consigliamo anche