Skip to content

7. Beispiel 05B – Navigation in einem Dateneingabeformular

Wir betrachten ein Formular mit mehreren Schaltflächen, um die eingegebenen Daten an eine Aktion zu übermitteln.

Image

7.1. Das NetBeans-Projekt

Das NetBeans-Projekt sieht wie folgt aus:

Image

Die Projektkomponenten sind wie folgt:

  • [DoSomething.jsp]: die einzige Ansicht der Anwendung, die die drei Navigationsschaltflächen und einen Link anzeigt.
  • [DoSomething.java] und [DoSomethingElse.java]: die beiden Aktionen des Projekts
  • [messages.properties]: die Datei mit den internationalisierten Meldungen
  • [struts.xml]: die Struts-2-Konfigurationsdatei

7.2. Konfiguration

Die folgende [struts.xml]-Datei konfiguriert die Anwendung:


<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
 <constant name="struts.custom.i18n.resources" value="messages" />
 <package name="actions" namespace="/actions" extends="struts-default">
    <action name="DoSomething" class="actions.DoSomething">
      <result name="success">/vues/DoSomething.jsp</result>
    </action>  
    <action name="DoSomethingElse" class="actions.DoSomethingElse">
      <result name="success">/vues/DoSomething.jsp</result>
    </action>  
  </package>
</struts>
  • Die Aktion [/actions/DoSomething] instanziiert die Klasse [actions.DoSomething], und ihre Methode „execute“ wird standardmäßig ausgeführt. Dieses Standardverhalten kann überschrieben werden, wenn die an die Aktion [DoSomething] übergebenen Parameter eine andere Methode angeben. Unabhängig davon, welche Methode ausgeführt wird, muss sie den Navigationsschlüssel „success“ zurückgeben, da nur dieser Schlüssel definiert wurde. Die Ansicht [DoSomething.jsp] wird dann angezeigt.
  • Die Konfiguration der Aktion [/actions/DoSomethingElse] ist identisch.

7.3. Die Nachrichtendatei

Die Meldungsdatei [messages.properties] sieht wie folgt aus:


formulaire.titre1=Actions et M\u00e9thodes
formulaire.titre2=Actions et M\u00e9thodes
formulaire.execute=DoSomething.execute
formulaire.action1=DoSomething.action1
formulaire.action2=DoSomethingElse.action2
formulaire.action3=DoSomething.action3

7.4. Die Ansicht [DoSomething.jsp]

Die Ansicht [DoSomething.jsp] sieht wie folgt aus:

Image

Der Code lautet wie folgt:


<%@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><s:text name="formulaire.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="formulaire.titre2"/></h1>
    <s:form action="DoSomething">
      <s:submit key="formulaire.execute"/>
      <s:submit key="formulaire.action1" method="action1"/>
      <s:submit key="formulaire.action2" action="DoSomethingElse" method="action2"/>
    </s:form>
    <s:url id="url" action="DoSomething" method="action3"/>
    <s:a href="%{url}"><s:text name="formulaire.action3"/></s:a>
  </body>
</html>
  • Zeile 11: Das Formular wird an die Aktion [DoSomething] übermittelt. Dies bedeutet nicht zwangsläufig, dass diese Aktion ausgelöst wird. Es hängt von der für den POST-Befehl verwendeten Absenden-Schaltfläche ab.
  • Zeile 12: Die Absenden-Schaltfläche gibt weder eine Aktion noch eine Methode an. Die durch das <form>-Tag angegebene [DoSomething]-Aktion wird instanziiert. Die ausgeführte Methode ist die in der Datei [struts.xml] definierte Methode „execute“.
  • Zeile 13: Die Absenden-Schaltfläche gibt eine Methode an. Die durch das <form>-Tag angegebene [DoSomething]-Aktion wird instanziiert. Die ausgeführte Methode ist die action1-Methode.
  • Zeile 14: Die Schaltfläche „Submit“ gibt eine Aktion und eine Methode an. Die Aktion [DoSomethingElse] wird instanziiert. Die ausgeführte Methode ist action2.
  • Zeilen 16–17: Ein Link zur Aktion [DoSomething] und zur Methode action3. Die Aktion [DoSomething] wird instanziiert und ihre Methode action3 ausgeführt. Im Gegensatz zu den Absenden-Schaltflächen löst das Klicken auf den Link eine GET-Anfrage statt einer POST-Anfrage aus. Daher werden keine Parameter gesendet.

Der durch diesen Code generierte HTML-Code, wenn die URL [http://localhost:8084/exemple-05B/actions/DoSomething.action] aufgerufen wird, lautet wie folgt:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Actions et Méthodes</title>
  </head>
  <body>
    <h1>Actions et Méthodes</h1>
    <form ... action="/exemple-05B/actions/DoSomething.action" method="post">
...
       <input type="submit" ... name="formulaire.execute" value="DoSomething.execute"/>
...
       <input type="submit" ... name="method:action1" value="DoSomething.action1"/>
...
        <input type="submit" ... name="action:DoSomethingElse!action2" value="DoSomethingElse.action2"/>
...
    </form>
    ...
    <a href="<a href="view-source:http://localhost:8084/exemple-05B/actions/DoSomething%21action3.action">/exemple-05B/actions/DoSomething!action3.action</a>">DoSomething.action3</a>
  </body>
</html>
  • Zeile 9: Das Formular-Tag für das HTML-Formular. Das Attribut „action“ gibt die URL an, an die die Formularparameter gesendet werden. Diese URL ist die der Aktion [DoSomething].
  • Zeilen 11, 13, 15: Die name-Attribute der Schaltflächen werden an die Zielaktion der Absenden-Schaltfläche gesendet. Dadurch kann Struts bestimmen, welche Aktion instanziiert und welche Methode ausgeführt werden soll.
  • Zeile 13: Das Attribut name=method:action1 gibt an, dass die Methode DoSomething.action1 ausgeführt werden muss.
  • Zeile 15: Das Attribut name=action:DoSomethingElse!action2 gibt an, dass die Methode DoSomethingElse.action2 ausgeführt werden muss.
  • Zeile 11: Das Attribut name="form.execute" gibt weder eine Aktion noch eine Methode an. Daher wird die Methode DoSomething.execute ausgeführt.
  • Zeile 19: Der Link fordert explizit die Ausführung der Methode DoSomething.action3 an

7.5. Aktionen

Die Aktion [DoSomething] lautet wie folgt:


package actions;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class DoSomething extends ActionSupport {
 
  public DoSomething() {
    System.out.println("DoSomething");
  }
 
  @Override
  public String execute() {
    System.out.println("DoSomething.execute");
    return SUCCESS;
  }
 
  public String action1() {
    System.out.println("DoSomething.action1");
    return SUCCESS;
  }
 
  public String action3() {
    System.out.println("DoSomething.action3");
    return SUCCESS;
  }
}
  • Die Methoden `execute`, `action1` und `action3` schreiben in die Webserver-Konsole und geben den Navigationsschlüssel für den Erfolg zurück.
  • Zeile 8: Der Konstruktor schreibt ebenfalls in die Webserver-Konsole

Anhand der verschiedenen Konsolenausgaben können Sie sehen, welche Methoden während einer Anfrage ausgeführt werden.

Die Aktion [DoSomethingElse] funktioniert ähnlich:


package actions;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class DoSomethingElse extends ActionSupport {
 
  public DoSomethingElse() {
    System.out.println("DoSomethingElse");
  }
 
  @Override
  public String execute() {
    System.out.println("DoSomethingElse.execute");
    return SUCCESS;
  }
 
  public String action2() {
    System.out.println("DoSomethingElse.action2");
    return SUCCESS;
  }
}

7.6. Die Tests

Die Tests zeigen folgende Ergebnisse (auf der Webserver-Konsole):

  • Wenn die Schaltfläche [DoSomething.execute] angeklickt wird, wird die Aktion [DoSomething] instanziiert und ihre Methode execute ausgeführt.
  • Wenn auf die Schaltfläche [DoSomething.action1] geklickt wird, wird die Aktion [DoSomething] instanziiert und ihre Methode action1 ausgeführt.
  • Wenn auf die Schaltfläche [DoSomethingElse.action2] geklickt wird, wird die Aktion [DoSomethingElse] instanziiert und ihre Methode action2 ausgeführt.
  • Wenn auf den Link [DoSomething.action3] geklickt wird, wird die Aktion [DoSomething] instanziiert und ihre action3-Methode ausgeführt.