Skip to content

3. Beispiel 02 – Parameterübergabe an die Aktion

3.1. Das NetBeans-Projekt

  • in [1,2], die Konfigurationsdateien
  • in [3], die Aktion
  • in [4], die Ansicht
  • in [5], die Projektbibliotheken

3.2. Die Konfigurationsdateien

Die Datei [web.xml] sieht wie folgt aus:


<?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>

Wir haben diese Datei bereits kommentiert. Wir werden dies nicht noch einmal tun. Denken Sie einfach daran, dass dadurch sichergestellt wird, dass alle URLs (Zeile 15) den Struts-Filter (Zeile 10) durchlaufen.

Die Datei [struts.xml] sieht wie folgt aus:


<?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>
  • Zeilen 7–15: Definieren das [default]-Paket, das verwendet wird, wenn eine Aktion in keinem anderen Paket gefunden werden kann.
  • Zeile 8: Definiert eine Standardaktion für dieses Paket mit dem Namen index.
  • Zeilen 9–14: Konfigurieren die Aktion namens index. Beachten Sie, dass sie keiner Klasse zugeordnet ist (das class-Attribut fehlt in Zeile 9).
  • Zeile 10: Das Ergebnis bezieht sich auf den Schlüssel „success“ (das Attribut „name“ fehlt). Es handelt sich um den Typ „redirectAction“ (Attribut „type“). Dieser Typ ermöglicht es, eine Aktion zu einer anderen Aktion umzuleiten. Wenn der Client hier die Aktion „/index“ anfordert, wird er zur Aktion „/actions/Action1“ umgeleitet (Zeilen 11–12).
  • Zeilen 16–20: Definieren das Aktionspaket (name), das mit den Aktionen unter der URL /actions/Action (class) verknüpft ist.
  • Zeilen 17–19: Konfigurieren die Aktion /actions/Action1 (name). Wenn diese Aktion aufgerufen wird, instanziiert Struts die Klasse actions.Action1 (class), und anschließend wird die Methode execute dieser Klasse ausgeführt. Diese Methode muss den Schlüssel „success“ zurückgeben, da dies der einzige in Zeile 18 definierte Schlüssel ist.
  • Zeile 18: Für den Schlüssel „success“ ist die anzuzeigende Ansicht die JSP-Seite [vues/Action1.jsp].

Abschließend ist zu beachten, dass das Struts-Projekt die Aktion nur unter der URL [actions/Action1] ausführen kann.

3.3. Die Aktion

Die Aktion Action1 wird durch die folgende Klasse dargestellt:


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;
  }
 
}

  • Zeilen 8–9: zwei Felder, auf die über get/set-Methoden zugegriffen werden kann (Zeilen 18–32)
  • Zeilen 12–14: Die execute-Methode gibt den Schlüssel wie erwartet zurück. Sie führt keine weiteren Aktionen aus.

3.4. Die JSP-Ansicht

Die Ansicht „Action1.jsp“ sieht wie folgt aus:


<%@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>

Diese Ansicht wird angezeigt, nachdem die Methode [Action1].execute ausgeführt wurde. Sie zeigt die Werte der Felder param1 (Zeile 11) und param2 (Zeile 19) der Klasse [Action1] an.

3.5. Tests

Führen wir das Projekt [example-02] aus:

  • in [1], die angeforderte URL. Beachten Sie, dass die ursprünglich angeforderte URL [/example-02] ohne Aktion war. Anschließend wurden die Dateien [web.xml] und [struts.xml] verwendet. Wir haben gesehen, dass die Datei [web.xml] die Verarbeitung aller Anfragen an Struts 2 übertrug. Anschließend wurde die Datei [struts.xml] verwendet:

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

Die URL [/example-02] ohne Aktion wurde durch das Standardpaket in den Zeilen 2–10 verarbeitet. Da die URL keine Aktion enthielt, wurde die Aktion aufgrund von Zeile 3 (Standardaktion) zu „index“. Die Zeilen 4–8 veranlassten Struts, eine Weiterleitungs-URL [/example-02/actions/Action1] an den Client zurückzugeben, wie in [1] gezeigt.

Die Aktion [Action1] wurde dann wie in den Zeilen 12–14 konfiguriert ausgeführt. Ihre execute-Methode wurde ausgeführt. Wir haben gesehen, dass sie den Erfolgscode zurückgab. Zeile 13 von [struts.xml] bewirkte, dass die Seite [/views/Action1.jsp] an den Browser zurückgegeben wurde:


...
<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>

In den Zeilen 9 und 10 wurden die Werte der Felder param1 und param2 aus [Action1] angezeigt. Dies ist in [2] dargestellt.

Lassen Sie uns eine weitere URL aufrufen:

In [1] wird die Aktion [Action1] mit den Parametern param1 und param2 aufgerufen. Kehren wir zum Ausführungsablauf einer Struts-Aktion zurück:

Der [FilterDispatcher]-Controller führt die execute-Methode der Aktion aus. Der Ausführungsablauf durchläuft Interceptors. Einer davon verarbeitet die Parameterzeichenfolge param1=something&param2=somethingelse . Anschließend verwendet er die Methoden setParam1 und setParam2 der Aktion 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;
  }
 
}

Der Params-Interceptor führt die folgenden Methoden aus:

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

Daher müssen sie vorhanden sein. Beachten Sie Folgendes: Um die Parameter aus einer HTTP-Anfrage abzurufen, muss die aufgerufene Struts-Aktion Felder mit denselben Namen wie die Parameter sowie zugehörige get-/set-Methoden enthalten.

Wenn die execute-Methode von [Action1] ausgeführt wird, wurden die Felder param1 und param2 durch den Params-Interceptor initialisiert:

param1="qqchose"
param2="autrechose"

Die „execute“-Methode gibt den Erfolgscode zurück, und die Seite [Action1.jsp] wird mit den neuen Werten für param1 und param2 angezeigt [2].