Come abbiamo visto nella lezione precedente, la creazione di oggetti ActionForm
, richiede di definire nell'ActionForm le proprietà che devono essere catturate dal form HTML. Per questo motivo ci potremmo trovare a dover modificare e ricompilare le nostre classi ActionForm ogni volta che aggiungiamom, modifichiamo o togliamo campo dal form.
Per evitare questo inconveniente è stato aggiunto al framework un nuovo tipo di ActionForm dinamico, il DynaActionForm, che permette di evitare la creazione di oggetti ActionForm per la propria applicazione. Questo tipo di ActionForm è implementato dalla classe org.apache.struts.action.DynaActionForm
.
La caratteristica che rende particolarmente interessante DynaActionForm, è quella che ci consente di definire le proprietà nel file di configurazione di Struts. Ciò significa evitare di scrivere nuove classi ed effettuare modifiche semplicemente ridefinendo i tag all'interno dello struts-config.
Vediamo allora come utilizzare DynaActionForm nella nostra applicazione Struts. La differenza sostanziale tra ActionForm e DynaActionForm consiste nell'includere uno o più elementi <form-property>
all'interno del nostro <form-bean>
, nel file di configurazione.
Riprendiamo l'esempio fatto in precedenza, configurando un DynaActionForm:
<form-beans>
<form-bean name="esempioForm" type="org.apache.struts.DynaActionForm">
<form-property name="nome" type="java.lang.String"/>
</form-bean>
<form-beans>
Per quanto riguarda la definizione dell'oggetto DynaActionForm abbiamo finito, basta ricordare che il tipo del form-bean, in questo caso, sarà DynaActionForm
.
Occupiamoci ora della nostra Action e vediamo come modificare il nostro metodo execute
:
public class EsempioAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
String output = null;
// controlliamo che il form non sia vuoto
if (form != null) {
// effetuiamo il cast dal form in ingresso
// che in questo caso è un DynaActionForm
DynaActionForm actionForm = (DynaActionForm) form;
// prendiamo il campo nome sfruttando il metodo get();
output = actionForm.get("nome").toString();
}
// giriamo risultato nella prossima request
request.setAttribute("NOME", output);
return (mapping.findForward("risultato"));
}
}
Facciamo attenzione anzitutto al casting all'oggetto DynaActionForm
del form in ingresso, poi soffermiamoci a riflettere sul fatto che non abbiamo definito alcun metodo getter per ottenere la nostra proprietà, in realtà abbiamo definito semplicemente il nome del campo da trasmettere.
Per ottenere il valore dei campi possiamo utilizzare il metodo get()
della classe DynaActionForm
, che vuole in ingresso il nome del campo che abbiamo definito come proprietà nella dichiarazione del nostro form-bean. Nel nostro caso sarà quindi sufficiente l'istruzione actionForm.get("nome")
, per ottenere il valore della casella di input.
Ricapitolando, i vantaggi nell'usare DynaActionForm
sono:
- Evitare di implementare una nuova classe che gestisca il form perché sarà il framework stesso a creare un istanza della classe DynaActionForm.
- In fase di revisione o modifica del form HTML bisogna intervenire modificando lo struts-config e la Action coinvolta nello scambio di dati