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] lautet wie folgt:


<?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 erläutert. Wir werden darauf nicht noch einmal eingehen. Man muss sich lediglich merken, dass sie dafür sorgt, dass alle URLs (Zeile 15) durch den Struts-Filter (Zeile 10) geleitet werden.

Die Datei „[struts.xml]“ lautet wie folgt:


<?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 Paket [default], das verwendet wird, wenn eine Aktion in einem anderen Paket nicht gefunden werden konnte.
  • Zeile 8: Definiert eine Standardaktion für dieses Paket mit dem Namen index.
  • Zeilen 9–14: Konfigurieren die Aktion mit dem Namen index. Es ist ersichtlich, dass sie keiner Klasse zugeordnet ist (das Attribut class fehlt in Zeile 9).
  • Zeile 10: Das Ergebnis bezieht sich auf den Schlüssel success (das Attribut name fehlt). Es ist vom Typ redirectAction (Attribut type). Dieser Typ ermöglicht es, eine Aktion auf eine andere Aktion umzuleiten. Wenn der Client hier die Aktion /index anfordert, wird er auf die Aktion /actions/Action1 umgeleitet (Zeilen 11–12).
  • Zeilen 16–20: Definieren das Aktionspaket (name), das den URL-Aktionen /actions/Action (class) zugeordnet ist.
  • Zeilen 17–19: Konfigurieren die Aktion /actions/Action1 (name). Auf Aufruf dieser Aktion hin instanziiert Struts die Klasse actions.Action1 (class), woraufhin die Methode execute dieser Klasse ausgeführt wird. Diese 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].

Zusammenfassend lässt sich festhalten, dass das Struts-Projekt nur die Aktion der URL [actions/Action1] ausführen kann.

3.3. L'action

Die Aktion Action1 wird durch die folgende Klasse dargestellt:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // Aktionsvorlage
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // Getter und 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;
  }
  
}
  • Zeilen 8–9: zwei Felder, auf die über get/set zugegriffen werden kann (Zeilen 18–32)
  • Zeilen 12–14: Die Methode execute gibt den Schlüssel success 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 nach der Ausführung der Methode [Action1].execute angezeigt. Sie zeigt die Werte der Felder param1 (Zeile 11) und param2 (Zeile 19) der Klasse [Action1] an.

3.5. Die Tests

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

  • in [1], die angeforderte URL. Zu beachten ist, dass die ursprünglich angeforderte URL [/exemple-02] ohne Aktion war. Die Dateien [web.xml] und [struts.xml] wurden daraufhin verwendet. Es zeigte sich, dass die Datei [web.xml] die Verarbeitung aller Anfragen an Struts 2 übertrug. Daraufhin wurde die Datei [struts.xml] ausgenutzt:

<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 „[/exemple-02]“ ohne Aktion wurde vom Paket „default“ in den Zeilen 2–10 verarbeitet. Da in der URL keine Aktion angegeben war, wurde die Aktion aufgrund von Zeile 3 (Standardaktion). Die Zeilen 4–8 führten dazu, dass Struts dem Client eine Umleitungs-URL [/exemple-02/actions/Action1] zurücksendete, wie in [1] angezeigt.

Die Aktion „[Action1]“ wurde daraufhin wie in den Zeilen 12–14 konfiguriert ausgeführt. Ihre Methode „execute“ wurde ausgeführt. Wie wir gesehen haben, gab sie den Code success zurück. Zeile 13 von [struts.xml] sorgte dafür, dass die Seite [/vues/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 geht aus [2] hervor.

Fordern wir eine weitere URL an:

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

Der Controller [FilterDispatcher] lässt die Methode execute der Aktion ausführen. Der Ausführungsfluss durchläuft Interceptoren. Einer davon verarbeitet die Parameterkette “ param1=qqchose&param2=autrechose. Dabei nutzt er die Methoden setParam1 und setParam2 der Aktion Action1:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // Aktionsvorlage
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // Getter und 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;
  }
  
}

Der Interceptor params führt die folgenden Methoden aus:

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

Sie müssen also vorhanden sein. Man sollte Folgendes beachten: Um die Parameter parami 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 Methode execute von [Action1] ausgeführt wird, wurden die Felder param1 und param2 vom Parameter-Interceptor initialisiert:

param1="qqchose"
param2="autrechose"

Die Methode execute gibt den Schlüssel success zurück, und die Seite [Action1.jsp] wirdmit den neuen Werten von param1, param2 und [2] an.