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 di nuovo. Ricordate solo che garantisce che tutti gli URL (riga 15) passino attraverso il filtro 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], che viene utilizzato quando un'azione non può essere trovata in un altro pacchetto.
- Riga 8: definisce un'azione predefinita per questo pacchetto denominata index.
- Righe 9–14: configurano l'azione denominata index. Si noti che non è associata a una classe (l'attributo class manca alla riga 9).
- riga 10: il risultato è per la chiave success (manca l'attributo name). È di tipo redirectAction (attributo type). Questo tipo consente a un'azione di essere reindirizzata a un'altra azione. Qui, quando il client richiede l'azione /index, verrà reindirizzato all'azione /actions/Action1 (righe 11-12).
- Righe 16–20: definiscono il pacchetto delle azioni (name) associato alle azioni all'URL /actions/Action (class).
- Righe 17–19: configurano l'azione /actions/Action1 (name). Quando questa azione viene invocata, Struts istanzierà la classe actions.Action1 (class), quindi verrà eseguito il metodo execute di tale classe. Questo metodo deve 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].
Infine, va notato che il progetto Struts può eseguire l'azione solo all'URL [actions/Action1].
3.3. L'azione
L'azione Action1 è rappresentata dalla seguente classe:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// action model
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// getters and setters
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 i metodi get/set (righe 18-32)
- righe 12–14: il metodo execute restituisce la chiave come previsto. Non fa nient'altro.
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. Mostra i valori dei campi param1 (riga 11) e param2 (riga 19) della classe [Action1].
3.5. Test
Eseguiamo il progetto [example-02]:
![]() |
- in [1], l'URL richiesto. Si noti che l'URL inizialmente richiesto era [/example-02] senza un'azione. Sono stati quindi utilizzati i file [web.xml] e [struts.xml]. Abbiamo visto che il file [web.xml] affidava l'elaborazione di tutte le richieste a Struts 2. È stato quindi utilizzato 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>
L'URL [/example-02] senza un'azione è stato gestito dal pacchetto predefinito nelle righe 2–10. Poiché nell'URL non era presente alcuna azione, l'azione è diventata "index" in base alla riga 3 (azione predefinita). Le righe 4–8 hanno fatto sì che Struts restituisse un URL di reindirizzamento [/example-02/actions/Action1] al client, come mostrato in [1].
L'azione [Action1] è stata quindi eseguita come configurato nelle righe 12-14. È stato eseguito il suo metodo execute. Abbiamo visto che ha restituito il codice di successo. La riga 13 di [struts.xml] ha fatto sì che la pagina [/views/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 visualizzavano i valori dei campi param1 e param2 da [Action1]. Ciò è mostrato in [2].
Richiediamo un altro URL:
![]() |
In [1], l'azione [Action1] viene richiesta con i parametri param1 e param2. Torniamo al flusso di esecuzione di un'azione Struts:
![]() |
Il controller [FilterDispatcher] esegue il metodo execute dell'azione. Il flusso di esecuzione passa attraverso gli intercettatori. Uno di essi elabora la stringa di parametri param1=something¶m2=somethingelse . Quindi utilizza i metodi setParam1 e setParam2 dell'azione Action1:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// action model
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// getters and setters
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:
Pertanto, devono esistere. Nota quanto segue: per recuperare i parametri da una richiesta HTTP, l'azione Struts chiamata deve avere campi con gli stessi nomi dei parametri e metodi get/set associati.
Quando viene eseguito il metodo execute di [Action1], i campi param1 e param2 sono stati inizializzati dall'intercettatore params:
Il metodo execute restituisce la chiave di successo e la pagina [Action1.jsp] viene visualizzata con i nuovi valori per param1 e param2 [2].



