Skip to content

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&param2=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"/>&nbsp;
    <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:

  1. le proprietà della classe associata all'azione che è stata eseguita.
  2. gli attributi della richiesta corrente indicati come <s:property name="#request['key']">
  3. gli attributi della sessione dell'utente, indicati come <s:property name="#session['key']">
  4. gli attributi dell'applicazione stessa, indicati come <s:property name="#application['key']">
  5. i parametri inviati dal browser del client, indicati come <s:property name="#parameters['key']">
  6. 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.