7. Beispiel 05B – Navigation in einem Dateneingabeformular
Wir betrachten ein Formular mit mehreren Schaltflächen, um die eingegebenen Daten an eine Aktion zu übermitteln.

7.1. Das NetBeans-Projekt
Das NetBeans-Projekt sieht wie folgt aus:

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:

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