6. Esempio 05 – Il modulo di inserimento dati
Introdurremo il concetto di modulo di immissione utilizzando un semplice esempio.
6.1. Il progetto NetBeans
![]() |
In [1], il progetto:
- le viste [Saisie.jsp], [Confirmation.jsp]
- il file di configurazione [struts.xml]
- il file dei messaggi [messages.properties]
- l'azione [Confirm.java]
In [2], la pagina di accesso
6.2. Configurazione
Il file [struts.xml] è il seguente:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- internationalization -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- default package -->
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Saisir</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<!-- equity package -->
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Saisir">
<result name="success">/vues/Saisie.jsp</result>
</action>
<action name="Confirmer" class="actions.Confirmer">
<result name="success">/vues/Confirmation.jsp</result>
</action>
</package>
</struts>
- Riga 20: il pacchetto di azioni per l'URL /actions/Action.
- Righe 21–23: definiscono l'azione [Enter]. Nessuna classe è ad essa associata. La risposta è sempre la vista [/views/Enter.jsp]
- Righe 24–26: definiscono l'azione [Confirm]. Ad essa è associata la classe [actions.Confirm]. La risposta è sempre la vista [/views/Confirmation.jsp]
6.3. L'azione [Conferma]
Il codice è il seguente:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Confirmer extends ActionSupport{
// model
private String nom;
// getters and setters
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
}
La classe ha un solo campo, quello alla riga 8 con i relativi metodi get/set.
6.4. Il file dei messaggi
Il contenuto di [messages.properties] è il seguente:
saisie.texte=Formulaire de saisie
saisie.titre1=Saisie
saisie.titre2=Saisie
saisie.libelle=Tapez votre nom
saisie.valider=Valider
confirm.titre1=Confirmation
confirm.titre2=Confirmation
confirm.texte=Bonjour
confirm.retour=Retour au formulaire de saisie
Queste chiavi di messaggio vengono utilizzate sia nella vista [Entry.jsp] che in quella [Confirmation.jsp].
6.5. Le viste
6.5.1. La vista [Entry.jsp]
Visivamente, appare così:
![]() |
Il suo codice sorgente è il seguente:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="saisie.titre1"/></title>
</head>
<body>
<h1><s:text name="saisie.titre2"/></h1>
<s:form action="Confirmer">
<s:textfield key="saisie.libelle" name="nom"/>
<s:submit key="saisie.valider" action="Confirmer"/>
</s:form>
</body>
</html>
- Riga 7: Visualizza il messaggio per la chiave "saisie.titre1" (Input) [1].
- Riga 10: visualizza il messaggio per la chiave "saisie.titre2" (Inserimento) [2].
- Righe 11, 14: Il tag <s:form> introduce un modulo HTML. Tutti i dati inseriti in questo modulo verranno inviati al server web. Si dice che vengono inviati via POST perché l'operazione HTTP utilizzata per inviare questi dati al server si chiama POST. I dati vengono inviati sotto forma di stringa: param1=value1¶m2=value2&... Abbiamo già incontrato questa stringa nella Sezione 3.5 dell'Esempio 02. In entrambi i casi, la stringa dei parametri viene elaborata allo stesso modo da Struts 2. I valori dei parametri vengono iniettati nell'azione eseguita, in campi che portano gli stessi nomi dei parametri. A chi vengono inviati i dati inviati? Per impostazione predefinita, all'azione che ha visualizzato il modulo, in questo caso l'azione Saisir [5]. È anche possibile utilizzare l'attributo action per specificare un'altra azione, in questo caso l'azione [Confirmer].
- Riga 12: Il tag <s:textfield ...> visualizza il campo di immissione [3]. Il suo attributo key specifica la chiave per l'etichetta da visualizzare a sinistra del campo di immissione. L'etichetta viene quindi ricercata nel file [messages.properties]. L'attributo name è il nome del parametro che verrà inviato. Il valore associato a questo parametro sarà il testo inserito nel campo di immissione.
- Riga 13: Il tag <s:submit ...> visualizza il pulsante [4]. Il suo attributo key specifica la chiave per l'etichetta da visualizzare sul pulsante. L'etichetta viene quindi recuperata dal file [messages.properties]. Un pulsante di invio fa sì che il modulo venga inviato a un'azione. Abbiamo menzionato in precedenza che si trattava dell'azione [Confirm] grazie all'attributo action del tag <s:form>. L'attributo action del tag <s:submit> consente di specificare un'azione diversa, se lo si desidera. In questo caso, abbiamo impostato l'azione su [Confirm]. Il pulsante ha un nome di parametro predefinito: action:action_name, in questo caso action:Confirm. Il valore associato a questo parametro è l'etichetta del pulsante. In definitiva, la stringa del parametro inviata all'azione [Confirm] quando l'utente fa clic sul pulsante [Validate] sarà:
?name=xx&action:Confirm=Validate.
dove xx è il testo inserito dall'utente nel campo di immissione.
6.5.2. La vista [Confirmation.jsp]
Visivamente, appare così:
![]() |
Inseriamo un nome e inviamo la pagina di input. Riceviamo quindi la risposta [1], che è la vista [Confirmation.jsp]. L'URL visualizzato in [2] è quello dell'azione [Confirm]. Nell'esempio sopra, è stata inviata la seguente stringa:
name=bernard&action:Confirm=Validate
Il parametro action:Confirm consente a Struts 2 di instradare la richiesta all'azione corretta, in questo caso l'azione [Confirm]. Il valore del parametro name verrà quindi inserito nel campo name dell'azione [Confirm].
Il codice sorgente dell'azione [Confirmation.jsp] è il seguente:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="confirm.titre1"/></title>
</head>
<body>
<h1><s:text name="confirm.titre2"/></h1>
<s:text name="confirm.texte"/>
<s:property value="nom"/> !
<br/><br/>
<a href="<s:url action="Saisir"/>"><s:text name="confirm.retour"/></a>
</body>
</html>
- riga 7: visualizza l'etichetta della chiave confirm.title1 presente nel file dei messaggi [1]
- riga 10: visualizza l'etichetta della chiave confirm.title2 presente nel file dei messaggi [3]
- riga 12: visualizza la proprietà name dell'azione [Confirm] che è stata eseguita.
- riga 14: crea un link all'azione [Enter]. Il tag <s:url>, che abbiamo già visto in precedenza, verrà generato dall'URL del browser [2]. Il percorso sarà quello di [2] http://localhost:8084/exemple-05/actions e l'azione sarà quella dell'attributo action, in questo caso Enter. L'URL del link sarà quindi http://localhost:8084/exemple-05/actions/Saisir.action. Il testo del link sarà l'etichetta associata alla chiave confirm.retour [4].
6.6. I test
Ecco due richieste:
![]() |
In [1], inserisci un nome e invia. In [2], la pagina di conferma.
![]() |
In [3], seguiamo il link per tornare al modulo. In [4], il risultato. Tutto è stato spiegato, tranne il passaggio da [3] a [4]. Perché non vediamo il nome che abbiamo inserito in [4]?
Il link in [3] rimanda all'URL [http://localhost:8084/exemple-05/actions/Saisir.action]. Viene quindi eseguita l'azione [Invia]. Diamo un'occhiata alla sua configurazione in [struts.xml]:
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Saisir">
<result name="success">/vues/Saisie.jsp</result>
</action>
<action name="Confirmer" class="actions.Confirmer">
<result name="success">/vues/Confirmation.jsp</result>
</action>
</package>
L'azione [Enter] non è associata ad alcuna azione. Pertanto, la vista [Entry.jsp] viene visualizzata immediatamente. Diamo un'occhiata al codice di questa vista:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="saisie.titre1"/></title>
</head>
<body>
<h1><s:text name="saisie.titre2"/></h1>
<s:form>
<s:textfield key="saisie.libelle" name="nom"/>
<s:submit key="saisie.valider" action="Confirmer"/>
</s:form>
</body>
</html>
Alla riga 12 viene visualizzato il campo di immissione. Il suo contenuto viene inizializzato con la proprietà name. Ricordiamo quanto detto in precedenza riguardo al funzionamento del tag <s:property>:
Il tag <s:property name="property"> consente di scrivere il valore di una proprietà di un oggetto denominato ActionContext. Questo oggetto contiene:
- le proprietà della classe associata all'azione che è stata eseguita.
- gli attributi della richiesta corrente indicati come <s:property name="#request['key']">
- gli attributi della sessione dell'utente, indicati come <s:property name="#session['key']">
- gli attributi dell'applicazione stessa, indicati come <s:property name="#application['key']">
- i parametri inviati dal browser del client, indicati come <s:property name="#parameters['key']">
- La notazione <s:property name="#attr['key']"> visualizza il valore di un oggetto cercato nella pagina, nella richiesta, nella sessione e nell'applicazione, in quest'ordine.
Qui ci troviamo nel caso 1. L'azione [Invio] non ha una classe associata. La proprietà name quindi non esiste. Viene quindi visualizzata una stringa vuota nel campo di immissione.
Per visualizzare in [4] il nome inserito in [1], useremo la sessione dell'utente.




