6. Esempio 05 – Il modulo di inserimento dati
Introduciamo il concetto di modulo di inserimento dati con 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 [Confirmer.java]
In [2], la pagina di inserimento dati
6.2. Configuration
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>
<!-- internazionalizzazione -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- pacchetto predefinito -->
<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>
<!-- pacchetto azioni -->
<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 delle azioni di URL /actions/Action.
- righe 21-23: definiscono l'azione [Saisir]. Non vi è alcuna classe ad essa associata. La risposta è sempre la vista [/vues/Saisie.JSP]
- righe 24-26: definiscono l'azione [Confirmer]. Ad essa è associata la classe [actions.Confirmer]. La risposta è sempre la vista [/vues/Confirmation.JSP]
6.3. L'azione [Confirmer]
Il suo codice è il seguente:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Confirmer extends ActionSupport{
// modello
private String nom;
// getter e setter
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
}
La classe ha un solo campo, quello della riga 8 con i relativi 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 sono utilizzate nelle due viste [Saisie.JSP] e [Confirmation.JSP].
6.5. Le viste
6.5.1. La vista [Saisie.JSP]
Visivamente si presenta come segue:
![]() |
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 della chiave saisie.titre1 (Inserimento) [1].
- riga 10: visualizza il messaggio relativo alla chiave saisie.titre2 (Inserimento) [2].
- righe 11, 14: il tag <s:form> introduce un modulo HTML. Tutti i dati inseriti all’interno di questo modulo saranno inviati al server web. Si dice che siano postées, poiché l’operazione HTTP che interviene in questo invio di dati al server si chiama POST. I dati inviati assumono la forma di una stringa di caratteri param1=valeur1¶m2=valeur2&... Abbiamo già incontrato questa stringa nel paragrafo 3.5 dell’esempio 02. In entrambi i casi, la stringa dei parametri viene elaborata allo stesso modo da Struts 2. I valori valeuri dei parametri parami vengono inseriti nell’azione eseguita, in campi che riportano gli stessi nomi dei parametri parami. A chi vengono inviati i dati inviati tramite POST? 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 indica la chiave dell'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 indica la chiave della dicitura da visualizzare sul pulsante. La dicitura viene quindi ricercata nel file [messages.properties]. Un pulsante di tipo submit innesca l’invio del modulo (POST) verso un’azione. Abbiamo detto in precedenza che quest’ultima era l’azione [Confirmer] a causa dell’attributo action del tag <s:form>. L'attributo action del tag <s:submit> consente di specificare eventualmente un'altra azione. In questo caso abbiamo reimpostato l'azione [Confirmer]. Il pulsante ha un nome di parametro predefinito: action:nom_action, in questo caso action:Confirmer. Il valore associato a questo parametro è il testo del pulsante. Alla fine, la stringa di parametri inviata all’azione [Confirmer] quando l’utente cliccherà sul pulsante [Valider] sarà:
?nom=xx&action:Confirmer=Valider.
dove xx è il testo inserito dall’utente nel campo di immissione.
6.5.2. La vista [Confirmation.JSP]
È visivamente la seguente:
![]() |
Inseriamo un nome e confermiamo la pagina di inserimento. Otteniamo quindi la risposta [1], corrispondente alla vista [Confirmation.JSP]. Il codice URL visualizzato in [2] corrisponde all’azione [Confirmer]. Nell’esempio sopra riportato, è stata inviata la seguente stringa di caratteri:
Il parametro action:Confirmer consente a Struts 2 di indirizzare la richiesta verso l'azione corretta, in questo caso l'azione [Confirmer]. Il valore del parametro nom verrà quindi iniettato nel campo nom dell'azione [Confirmer].
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 la denominazione della chiave confirm.titre1 presente nel file dei messaggi [1]
- riga 10: visualizza la descrizione della chiave confirm.titre2 presente nel file dei messaggi [3]
- riga 12: visualizza la proprietà nom dell'azione [Confirmer] che è stata eseguita.
- riga 14: crea un collegamento all'azione [Saisir]. Il tag <s:url>,, già incontrato, verrà generato a partire da URL [2] del browser. Il percorso sarà quello di [2] http://localhost:8084/exemple-05/actions e l’azione quella dell’attributo action, in questo caso Saisir. L'URL del link sarà quindi http://localhost:8084/exemple-05/actions/Saisir.action. Il testo del link sarà la denominazione associata alla chiave confirm.retour [4].
6.6. I test
Ecco due query:
![]() |
In [1], si inserisce un nome e si conferma. In [2], la pagina di conferma.
![]() |
In [3] si segue il link di ritorno al modulo. In [4] il risultato. È stato spiegato tutto, tranne il passaggio da [3] a [4]. Perché in [4] non si ritrova il nome che era stato inserito?
Il link in [3] rimanda a URL e [http://localhost:8084/exemple-05/actions/Saisir.action]. Viene quindi eseguita l’azione [Saisir]. 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 [Saisir] non è associata ad alcuna azione. Pertanto, la vista [Saisie.JSP] viene visualizzata immediatamente. Esaminiamo il 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à nom (name). Ricordiamo quanto scritto in precedenza sul funzionamento del tag <s:property>:
Il tag <s:property name="proprietà"> consente di scrivere il valore di una proprietà di un oggetto denominato ActionContext. In questo oggetto si trovano:
- le proprietà della classe associata all’azione che è stata eseguita.
- gli attributi della richiesta corrente indicati con <s:property name="#request['clé']">
- gli attributi della sessione dell'utente indicati con <s:property name="#session['clé']">
- gli attributi dell'applicazione stessa contrassegnati con <s:property name="#application['clé']">
- i parametri inviati dal browser client indicati con <s:property name="#parameters['clé']">
- la notazione <s:property name="#attr['clé']"> visualizza il valore di un oggetto ricercato nella pagina, nella richiesta, nella sessione e nell'applicazione, in quest'ordine.
In questo caso si tratta del caso 1. L'azione [Saisir] non ha una classe associata. La proprietà nom quindi non esiste. Nel campo di immissione viene quindi visualizzata una stringa vuota.
Per visualizzare in [4] il nome che è stato inserito in [1], utilizzeremo la sessione dell’utente.




