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

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

Das Projekt besteht aus folgenden Elementen:
- [DoSomething.jsp]: Die einzige Ansicht der Anwendung, die die drei Navigationsschaltflächen sowie einen Link enthält.
- [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. Configuration
Die folgende Datei [struts.xml] 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] bewirkt die Instanziierung der Klasse [actions.DoSomething], und ihre Methode execute wird standardmäßig ausgeführt. Diese Standardeinstellung kann außer Kraft gesetzt werden, wenn die an die Aktion [Something] ü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 Meldungsdatei
Die Meldungsdatei [messages.properties] lautet wie folgt:
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:

Ihr 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] gesendet. Das bedeutet nicht zwangsläufig, dass genau diese Aktion ausgelöst wird. Dies hängt von der Schaltfläche submit ab, die für POST verwendet wird.
- Zeile 12: Die Schaltfläche „submit“ gibt weder eine Aktion noch eine Methode an. Es wird die Aktion „[DoSomething]“ instanziiert, die durch das Tag <form> angegeben wird. Die ausgeführte Methode ist die in der Datei [struts.xml] definierte Methode execute.
- Zeile 13: Die Schaltfläche submit gibt eine Methode an. Es wird die Aktion [DoSomething] instanziiert, die durch das Tag <form> festgelegt ist. Die ausgeführte Methode ist die Methode action1.
- Zeile 14: Die Schaltfläche submit gibt eine Aktion und eine Methode an. Es wird die Aktion [DoSomethingElse] instanziiert. Die ausgeführte Methode ist die Methode 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 Schaltflächen submit löst ein Klick auf den Link nicht eine POST, sondern eine GET aus. Es werden also keine Parameter übermittelt.
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 HTML-Formular-Tag form. 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 Attribute name der Schaltflächen werden an die Zielaktion der Schaltfläche submit gesendet. Auf diese Weise 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 soll.
- Zeile 15: Das Attribut „name= action:DoSomethingElse!action2“ gibt an, dass die Methode „DoSomethingElse.action2“ ausgeführt werden soll.
- Zeile 11: Das Attribut „name= formulaire.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. Die 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 Konsole des Webservers und geben den Navigationsschlüssel success zurück.
- Zeile 8: Der Konstruktor schreibt ebenfalls in die Konsole des Webservers
Anhand der verschiedenen Einträge in der Konsole lässt sich erkennen, welche Methoden bei einer Anfrage ausgeführt werden.
Die Aktion [DoSomethingElse] verhält sich ä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 (in der Konsole des Webservers):
- Beim Klicken auf die Schaltfläche [DoSomething.execute] wird die Aktion [DoSomething] instanziiert und ihre Methode execute ausgeführt.
- Beim Klicken auf die Schaltfläche „[DoSomething.action1]“ wird die Aktion „[DoSomething]“ instanziiert und ihre Methode „action1“ ausgeführt.
- Bei einem Klick auf die Schaltfläche [DoSomethingElse.action2] wird die Aktion [DoSomethingElse] instanziiert und ihre Methode action2 ausgeführt.
- Bei einem Klick auf den Link [DoSomething.action3] wird die Aktion [DoSomething] instanziiert und ihre Methode action3 ausgeführt.