3. Esempio 02 – Iniezione di parametri nell’azione
3.1. Il progetto NetBeans
![]() |
- in [1,2], i file di configurazione
- in [3], l'azione
- in [4], la vista
- in [5], le librerie del progetto
3.2. I file di configurazione
Il file [web.xml] è il seguente:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Struts tuto-001</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<URL-pattern>/*</URL-pattern>
</filter-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
Abbiamo già commentato questo file. Non lo faremo più. Basta ricordare che fa sì che tutti i URL (riga 15) vengano sottoposti al filtro di Struts (riga 10).
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>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Action1</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Action1" class="actions.Action1">
<result name="success">/vues/Action1.JSP</result>
</action>
</package>
</struts>
- righe 7-15: definiscono il pacchetto [default], quello utilizzato quando non è stato possibile trovare un’azione in un altro pacchetto.
- riga 8: definisce un'azione predefinita per questo pacchetto denominata index.
- righe 9-14: configurano l’azione denominata index. Si nota che non è associata a una classe (assenza dell’attributo class alla riga 9).
- riga 10: il risultato si riferisce alla chiave success (assenza dell’attributo name). È di tipo redirectAction (attributo type). Questo tipo consente di reindirizzare un'azione verso un'altra azione. In questo caso, quando il cliente richiederà l'azione /index, verrà reindirizzato all'azione /actions/Action1 (righe 11-12).
- righe 16-20: definiscono il pacchetto azioni (name) associato alle azioni URL e /actions/Action (class).
- righe 17-19: configurano l’azione /actions/Action1 (name). Su richiesta di questa azione, Struts istanzierà la classe actions.Action1 (class), quindi verrà eseguito il metodo execute di tale classe. Quest’ultimo dovrà restituire la chiave success, poiché è l’unica chiave definita alla riga 18.
- riga 18: per la chiave success, la vista da visualizzare sarà la pagina JSP [vues/Action1.JSP].
In definitiva, si ricorderà che il progetto Struts è in grado di eseguire solo l’azione di URL [actions/Action1].
3.3. L'action
L'azione Action1 è rappresentata dalla seguente classe:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// modello dell'azione
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// getter e setter
public String getParam1() {
return param1;
}
public void setParam1(String param1) {
this.param1 = param1;
}
public String getParam2() {
return param2;
}
public void setParam2(String param2) {
this.param2 = param2;
}
}
- righe 8-9: due campi accessibili tramite get / set (righe 18-32)
- righe 12-14: il metodo execute restituisce la chiave success come previsto. Non esegue nessun'altra operazione.
3.4. La vista JSP
La vista Action1.JSP è la 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>Action1</title>
</head>
<body>
<h1>Action1</h1>
param1=<s:property value="param1"/><br/>
param2=<s:property value="param2"/><br/>
</body>
</html>
Questa vista viene visualizzata dopo l’esecuzione del metodo [Action1].execute. Visualizza i valori dei campi param1 (riga 11) e param2 (riga 19) della classe [Action1].
3.5. I test
Eseguiamo il progetto [exemple-02]:
![]() |
- in [1], il file URL richiesto. Da notare che il file URL inizialmente richiesto era [/exemple-02] senza alcuna azione. Sono stati quindi utilizzati i file [web.xml] e [struts.xml]. Si è constatato che il file [web.xml] affidava l’elaborazione di ogni richiesta a Struts 2. È stato quindi sfruttato il file [struts.xml]:
<struts>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Action1</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Action1" class="actions.Action1">
<result name="success">/vues/Action1.JSP</result>
</action>
</package>
</struts>
Il file URL, privo di azione, è stato elaborato dal pacchetto default nelle righe 2-10. In assenza di un'azione nel URL, l'azione è diventata index a causa della riga 3 (azione predefinita). Le righe da 4 a 8 hanno fatto sì che Struts restituisse al client un URL di reindirizzamento a [/exemple-02/actions/Action1], come visualizzato in [1].
L'azione [Action1] è stata quindi eseguita come configurato nelle righe 12-14. È stato eseguito il suo metodo execute. Si è visto che restituiva il codice success. La riga 13 di [struts.xml] ha fatto sì che la pagina [/vues/Action1.JSP] venisse restituita al browser:
...
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Action1</title>
</head>
<body>
<h1>Action1</h1>
param1=<s:property value="param1"/><br/>
param2=<s:property value="param2"/><br/>
</body>
</html>
Le righe 9 e 10 hanno visualizzato i valori dei campi param1 e param2 di [Action1]. È quanto mostra [2].
Richiediamo un altro URL:
![]() |
In [1], l’azione [Action1] viene richiesta con i parametri param1 e param2. Torniamo allo schema di esecuzione di un’azione Struts:
![]() |
Il controller [FilterDispatcher] fa eseguire il metodo execute dell’azione. Il flusso di esecuzione passa attraverso gli intercettatori. Uno di essi elabora la stringa di parametri param1=qqchose¶m2=autrechose. A questo punto utilizza i metodi setParam1 e setParam2 dell’azione Action1:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// modello dell'azione
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// getter e setter
public String getParam1() {
return param1;
}
public void setParam1(String param1) {
this.param1 = param1;
}
public String getParam2() {
return param2;
}
public void setParam2(String param2) {
this.param2 = param2;
}
}
L'intercettatore params esegue i seguenti metodi:
È quindi necessario che esistano. È importante tenere presente quanto segue: per recuperare i parametri parami da una richiesta HTTP, è necessario che l’azione Struts chiamata disponga di campi con gli stessi nomi dei parametri e dei relativi metodi get/set.
Quando viene eseguito il metodo execute di [Action1], i campi param1 e param2 sono stati inizializzati dall’intercettore params:
Il metodo execute restituisce la chiave success e la pagina [Action1.JSP]visualizza con i nuovi valori di param1, param2 e [2].



