7. Esempio 05B – Navigazione in un modulo di inserimento dati
Stiamo esaminando un modulo con diversi pulsanti per inviare i dati inseriti a un'azione.

7.1. Il progetto NetBeans
Il progetto NetBeans è il seguente:

I componenti del progetto sono i seguenti:
- [DoSomething.jsp]: l'unica vista dell'applicazione, che mostra i tre pulsanti di navigazione e un link.
- [DoSomething.java] e [DoSomethingElse.java]: le due azioni del progetto
- [messages.properties]: il file dei messaggi internazionalizzati
- [struts.xml]: il file di configurazione di Struts 2
7.2. Configurazione
Il seguente file [struts.xml] configura l'applicazione:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messages" />
<package name="actions" namespace="/actions" extends="struts-default">
<action name="DoSomething" class="actions.DoSomething">
<result name="success">/vues/DoSomething.jsp</result>
</action>
<action name="DoSomethingElse" class="actions.DoSomethingElse">
<result name="success">/vues/DoSomething.jsp</result>
</action>
</package>
</struts>
- L'azione [/actions/DoSomething] istanzierà la classe [actions.DoSomething] e il suo metodo execute verrà eseguito per impostazione predefinita. Questo comportamento predefinito può essere sovrascritto se i parametri passati all'azione [DoSomething] specificano un metodo diverso. Indipendentemente dal metodo eseguito, esso deve restituire la chiave di navigazione "success", poiché è stata definita solo questa chiave. Verrà quindi visualizzata la vista [DoSomething.jsp].
- La configurazione dell'azione [/actions/DoSomethingElse] è identica.
7.3. Il file dei messaggi
Il file dei messaggi [messages.properties] è il seguente:
formulaire.titre1=Actions et M\u00e9thodes
formulaire.titre2=Actions et M\u00e9thodes
formulaire.execute=DoSomething.execute
formulaire.action1=DoSomething.action1
formulaire.action2=DoSomethingElse.action2
formulaire.action3=DoSomething.action3
7.4. La vista [DoSomething.jsp]
La vista [DoSomething.jsp] è la seguente:

Il codice è 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="formulaire.titre1"/></title>
</head>
<body>
<h1><s:text name="formulaire.titre2"/></h1>
<s:form action="DoSomething">
<s:submit key="formulaire.execute"/>
<s:submit key="formulaire.action1" method="action1"/>
<s:submit key="formulaire.action2" action="DoSomethingElse" method="action2"/>
</s:form>
<s:url id="url" action="DoSomething" method="action3"/>
<s:a href="%{url}"><s:text name="formulaire.action3"/></s:a>
</body>
</html>
- Riga 11: il modulo verrà inviato all'azione [DoSomething]. Ciò non significa necessariamente che questa azione verrà attivata. Dipende dal pulsante di invio utilizzato per il POST.
- Riga 12: il pulsante di invio non specifica né un'azione né un metodo. Verrà istanziata l'azione [DoSomething] specificata dal tag <form>. Il metodo eseguito sarà quello definito nel file [struts.xml], ovvero il metodo execute.
- Riga 13: Il pulsante di invio specifica un metodo. Verrà istanziata l'azione [DoSomething] specificata dal tag <form>. Il metodo eseguito sarà il metodo action1.
- Riga 14: il pulsante di invio specifica un'azione e un metodo. Verrà istanziata l'azione [DoSomethingElse]. Il metodo eseguito sarà action2.
- Righe 16–17: un collegamento all'azione [DoSomething] e al metodo action3. L'azione [DoSomething] verrà istanziata e il suo metodo action3 verrà eseguito. A differenza dei pulsanti di invio, facendo clic sul collegamento si attiva una richiesta GET anziché una richiesta POST. Pertanto, non vengono inviati parametri.
Il codice HTML generato da questo codice, quando viene richiesto l'URL [http://localhost:8084/exemple-05B/actions/DoSomething.action], è il seguente:
- Riga 9: Il tag form per il modulo HTML. L'attributo action specifica l'URL a cui verranno inviati i parametri del modulo. Questo URL è quello dell'azione [DoSomething].
- Righe 11, 13, 15: Gli attributi name dei pulsanti verranno inviati all'azione di destinazione del pulsante di invio. Questo è ciò che permette a Struts di determinare quale azione istanziare e quale metodo eseguire.
- Riga 13: L'attributo name=method:action1 indica che deve essere eseguito il metodo DoSomething.action1.
- Riga 15: L'attributo name=action:DoSomethingElse!action2 indica che deve essere eseguito il metodo DoSomethingElse.action2.
- Riga 11: L'attributo name="form.execute" non specifica né un'azione né un metodo. Pertanto, verrà eseguito il metodo DoSomething.execute.
- Riga 19: il link richiede esplicitamente l'esecuzione del metodo DoSomething.action3
7.5. Azioni
L'azione [DoSomething] è la seguente:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomething extends ActionSupport {
public DoSomething() {
System.out.println("DoSomething");
}
@Override
public String execute() {
System.out.println("DoSomething.execute");
return SUCCESS;
}
public String action1() {
System.out.println("DoSomething.action1");
return SUCCESS;
}
public String action3() {
System.out.println("DoSomething.action3");
return SUCCESS;
}
}
- I metodi execute, action1 e action3 scrivono sulla console del server web e restituiscono la chiave di navigazione success.
- Riga 8: Anche il costruttore scrive sulla console del server web
I vari output della console consentono di vedere quali metodi vengono eseguiti durante una richiesta.
L'azione [DoSomethingElse] è simile:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomethingElse extends ActionSupport {
public DoSomethingElse() {
System.out.println("DoSomethingElse");
}
@Override
public String execute() {
System.out.println("DoSomethingElse.execute");
return SUCCESS;
}
public String action2() {
System.out.println("DoSomethingElse.action2");
return SUCCESS;
}
}
7.6. I test
I test mostrano i seguenti risultati (sulla console del server web):
- Quando si fa clic sul pulsante [DoSomething.execute], l'azione [DoSomething] viene istanziata e il suo metodo execute viene eseguito.
- Quando si fa clic sul pulsante [DoSomething.action1], l'azione [DoSomething] viene istanziata e viene eseguito il suo metodo action1.
- Quando si fa clic sul pulsante [DoSomethingElse.action2], l'azione [DoSomethingElse] viene istanziata e viene eseguito il suo metodo action2.
- Quando si fa clic sul collegamento [DoSomething.action3], l'azione [DoSomething] viene istanziata e viene eseguito il suo metodo action3.