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

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

È 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:

param1="qqchose"
param2="autrechose"

Il metodo execute restituisce la chiave success e la pagina [Action1.JSP]visualizza con i nuovi valori di param1, param2 e [2].