In questa lezione esaminiamo tutti i componenti necessari a creare e gestire un form per l'inserimento dei dati con Struts. Iniziamo schematizzando brevemente tutti i passi da compiere:
- Creare una view che contenga il form sfruttando la taglib HTML
- Creare un oggetto ActionForm, che funga da contenitore per i dati e definire le proprietà, ovvero i campi del form
- Creare una Action che per utilizzare ed instradare i dati del form
- Modificare il file struts-config, per inserire la nostra
Action
, il form e il nostro contenitoreActionForm
all'interno dell'applicazione
Creare la vista e il form sfruttando la HTML taglib
Nella lezione precedente abbiamo elencato rapidamente alcuni dei tag più importanti per realizzare l'output delle nostre pagine HTML. Ora vediamo come utilizzarli per creare il nostro primo form.
Creiamo dunque una semplice view dal nome esempio.jsp
e al suo interno un form che richiede di inserire un nome:
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:html>
<head><title>Inserisci il nome</title><html:base/></head>
<body>
Ciao, inserisci il tuo nome.<br/><br/>
<html:form action="/esempio">
Nome: <html:text property="nome" />
<html:submit title="Invia" />
</html:form>
</body>
</html:html>
Creiamo anche la view di arrivo, risultato.jsp
, in cui mostreremo poi il nome inserito nel form:
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:html>
<head><title>risultato</title><html:base/></head>
<body>
Ciao <%= request.getAttribute("NOME") %>
</body>
</html:html>
La classe ActionForm
Come accennato all'inizio della guida, la classe ActionForm
(org.apache.struts.action.ActionForm
) è quella che ci permette di catturare i dati in ingresso da un form HTML e trasferirli al controller (ad una classe Action
).
All'interno dell'ActionForm dovremo definire quali siano le proprietà che il form scambia con il controller. Queste proprietà, dette anche 'data member' o 'property' in inglese, sono effettivamente i campi che definiamo nel form.
Per definire le proprietà all'interno dei nostri oggetti ActionForm
creiamo dei metodi public
detti "getter" e "setter" per ciascun campo. Ad esempio, quando il framework trova una coppia di metodi scritti in questo modo:
public String getCampo() { return ...}
public void setCampo() { ... }
li interpreta come la definizione di una proprietà (la proprietà Campo
in questo caso). È importante notare che i prefissi 'get' e 'set' sono sempre scritti in minuscolo e che la prima lettera della proprietà è scritta in maiuscolo. Inoltre, come è logico, un metodo getter ritorna sempre un valore mentre un setter no.
Creare un ActionForm
Per realizzare il nostro semplice esempio, creiamo l'oggetto ActionForm in cui memorizzare la variabile 'nome' inserita da un utente nella nostra View esempio.jsp
.
import org.apache.struts.action.ActionForm;
public class EsempioForm extends ActionForm {
private String nome=null;
// definisce le proprietà da scambiare con il form
public void setNome(String nome) { this.nome=nome; }
public String getNome() { return(this.nome); }
}
Scrivere la Action
Predisponiamo ora il controller a gestire la nostra pagina con il form, definendo la nostra action EsempioAction
:
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 {
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
EsempioForm actionForm = (EsempioForm) form;
output = actionForm.getNome();
}
// giriamo risultato nella prossima request
request.setAttribute("NOME", output);
return (mapping.findForward("risultato"));
}
}
Configurare il form nel file struts-config
Una volta definito il nostro oggetto EsempioForm
dobbiamo inserirlo all'interno dell'applicazione. Per far questo dobbiamo:
1. associarlo ad un form-bean, creando una entry nella sezione <form-beans>
:
<form-bean name="esempioForm" type="EsempioForm"/>
2. associare ad esso una azione ed il relativo percorso (URL o path). Aggiungiamo il seguente elemento alla sezione <action-mapping>
:
<action path="/esempio" scope="request" <!-- o session -->
name="esempioForm" <!-- nome del form bean collegato all'ActionForm -->
valdate="true" <!-- o false -->
input="/pages/esempio.jsp" <!-- la vista che contiene il form -->
type="action.EsempioAction"> <!-- l'oggetto Action che elabora l'azione -->
<forward name="risultato" path="/pages/risultato.jsp" />
</action>
Scope
Per scope si intende il contesto in cui far "sopravvivere" un'istanza dell'ActionForm, quindi dei dati che esso contiene:
- con
session
, opzione di default, manteniamo i dati per tutta la durata della sessione, cosa molto utile se i dati ci servono su più pagine - con
request
l'ActionForm è disponibile solo fino alla fine del ciclo request/response
Validazione
Tutti i dati forniti da un utente necessitano di una validazione e sicuramente di elaborazione. La classe ActionForm opera come "firewall" per la propria applicazione dal momento che contribuisce a tenere dati in ingresso sospetti o non validi fuori dallo strato applicativo fino alla loro effettiva validazione ad opera delle regole definite.
Una volta passata la validazione dell'input, ActionForm è trasmesso nel metodo execute()
della classe Action.