Introduction à STRUTS2 par l'exemple


précédentsommairesuivant

III. Exemple 02 - Injection de paramètres dans l'action

III-A. Le projet Netbeans

Image non disponible
  • en [1,2], les fichiers de configuration
  • en [3], l'action
  • en [4], la vue
  • en [5], les bibliothèques du projet

III-B. Les fichiers de configuration

Le fichier [web.xml] est le suivant :

<?xml version="1.0" encoding="UTF-8"?>

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<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>

Nous avons déjà commenté ce fichier. Nous ne le ferons plus. Il faut simplement se rappeler qu'il fait en sorte que toutes les Url (ligne 13) sont passées au filtre de Struts (ligne 12).

Le fichier [struts.xml] est le suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?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>
  • lignes 7-15 : définissent le package [default], celui qui est utilisé lorsqu'une action n'a pu être trouvée dans un autre package.
  • ligne 8 : définit une action par défaut pour ce package nommé index.
  • lignes 9-14 : configurent l'action nommée index. On voit qu'elle n'est pas associée à une classe (absence de l'attribut class ligne 9).
  • ligne 10 : le résultat est pour la clé success (absence de l'attribut name). Il est de type redirectAction (attribut type). Ce type permet de rediriger une action vers une autre action. Ici lorsque le client demandera l'action /index, il sera redirigé vers l'action /actions/Action1 (lignes 11-12).
  • lignes 16-20 : définissent le package actions (name) associé aux actions d'Url /actions/Action (class).
  • lignes 17-19 : configurent l'action /actions/Action1 (name). Sur demande de cette action, Struts instanciera la classe actions.Action1 (class), puis la méthode execute de cette classe sera exécutée. Celle-ci devra rendre la clé success, car c'est la seule clé définie ligne 18.
  • ligne 18 : pour la clé success, la vue à afficher sera la page Jsp [vues/Action1.jsp].

Au final, on retiendra que le projet Struts ne sait exécuter que l'action d'Url [actions/Action1].

III-C. L'action

L'action Action1 est représentée par la classe suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // modèle de l'action
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // getters et 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;
  }
  
}
  • lignes 8-9 : deux champs accessibles via des get / set (lignes 18-32)
  • lignes 12-14 : la méthode execute rend la clé success comme il était attendu. Elle ne fait rien d'autre.

III-D. La vue Jsp

La vue Action1.jsp est la suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<%@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>

Cette vue est affichée après l'exécution de la méthode [Action1].execute. Elle affiche les valeurs des champs param1 (ligne 11) et param2 (ligne 19) de la classe [Action1].

III-E. Les tests

Exécutons le projet [exemple-02] :

Image non disponible
  • en [1], l'Url demandée. A noter que l'Url initiale demandée était [/exemple-02] sans action. Les fichiers [web.xml] [struts.xml] ont alors été exploités. On a vu que le fichier [web.xml] confiait le traitement de toute requête à Struts 2. Le fichier [struts.xml] a alors été exploité :
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<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 [/exemple-02] sans action a été traitée par le package default des lignes 2-10. En l'absence d'action dans l'Url, l'action est devenue index à cause de la ligne 3 (action par défaut). Les lignes 4-8 ont fait que Struts a renvoyé au client une Url de redirection [/exemple-02/actions/Action1] comme il est affiché en [1].

L'action [Action1] s'est alors exécutée comme configurée lignes 12-14. Sa méthode execute a été exécutée. On a vu qu'elle renvoyait la cé success. La ligne 13 de [struts.xml] a fait que la page [/vues/Action1.jsp] a été renvoyée au navigateur :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...
<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>

Les lignes 9 et 10 ont affiché les valeurs des champs param1 et param2 de [Action1]. C'est ce que montre [2].

Demandons une autre Url :

Image non disponible

En [1], l'action [Action1] est demandée avec des paramètres param1 et param2. Revenons au schéma d'exécution d'une action Struts :

Image non disponible

Le contrôleur [FilterDispatcher] fait exécuter la méthode execute de l'action. Le flux d'exécution passe au-travers d'intercepteurs. L'un d'entre-eux traite la chaîne de paramètres param1=qqchose&param2=autrechose. Il utilise alors les méthodes setParam1 et setParam2 de l'action Action1 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // modèle de l'action
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // getters et 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'intercepteurs params exécute les méthodes suivantes :

 
Sélectionnez
[Action1].setParam1("qqchose")&#160;;
[Action1].setParam2("autrechose")&#160;;

Il faut donc qu'elles existent. On retiendra la chose suivante : pour récupérer les paramètres parami d'une requête Http, il faut que l'action Struts appelée ait des champs portant les mêmes noms que les paramètres et des méthodes get / set associées.

Lorsque la méthode execute de [Action1] s'exécute, les champs param1 et param2 ont été initialisés par l'intercepteur params :

 
Sélectionnez
param1="qqchose"
param2="autrechose"

La méthode execute rend la clé success et la page [Action1.jsp] s'affiche avec les nouvelles valeurs de param1 et param2 [2].


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2012 Serge Tahe. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.