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

ActionForm

Come creare tutti i componenti di un form gestito tramite ActionForm
Come creare tutti i componenti di un form gestito tramite ActionForm
Link copiato negli appunti

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:

  1. Creare una view che contenga il form sfruttando la taglib HTML
  2. Creare un oggetto ActionForm, che funga da contenitore per i dati e definire le proprietà, ovvero i campi del form
  3. Creare una Action che per utilizzare ed instradare i dati del form
  4. Modificare il file struts-config, per inserire la nostra Action, il form e il nostro contenitore ActionForm all'interno dell'applicazione
Figura 6. Schema della richiesta tramite ActionForm
Schema della richiesta tramite ActionForm

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.

Ti consigliamo anche