Skip to content

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&param2=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:

[Action1].setParam1("qqchose") ;
[Action1].setParam2("autrechose") ;

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:

param1="qqchose"
param2="autrechose"

Il metodo execute restituisce la chiave di successo e la pagina [Action1.jsp] viene visualizzata con i nuovi valori per param1 e param2 [2].