6. Beispiel 05 – Das Eingabeformular
Anhand eines einfachen Beispiels führen wir das Konzept des Eingabeformulars ein.
6.1. Das NetBeans-Projekt
![]() |
In [1] umfasst das Projekt:
- die Ansichten [Saisie.jsp], [Confirmation.jsp]
- die Konfigurationsdatei [struts.xml]
- die Meldungsdatei [messages.properties]
- die Aktion [Confirmer.java]
In [2], die Eingabeseite
6.2. Configuration
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>
<!-- Internationalisierung -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- Standardpaket -->
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Saisir</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<!-- Aktionspaket -->
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Saisir">
<result name="success">/vues/Saisie.jsp</result>
</action>
<action name="Confirmer" class="actions.Confirmer">
<result name="success">/vues/Confirmation.jsp</result>
</action>
</package>
</struts>
- Zeile 20: das Aktionspaket für URLs /actions/Action.
- Zeilen 21–23: definieren die Aktion [Saisir]. Ihr ist keine Klasse zugeordnet. Die Antwort ist immer die Ansicht [/vues/Saisie.jsp]
- Zeilen 24–26: Definieren die Aktion [Confirmer]. Ihr ist die Klasse [actions.Confirmer] zugeordnet. Die Antwort ist immer die Ansicht [/vues/Confirmation.jsp]
6.3. Die Aktion [Confirmer]
Ihr Code lautet wie folgt:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Confirmer extends ActionSupport{
// Vorlage
private String nom;
// Getter und Setter
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
}
Die Klasse hat nur ein Feld, nämlich das in Zeile 8 mit seinen get- und set-Methoden.
6.4. Die Meldungsdatei
Der Inhalt von [messages.properties] lautet wie folgt:
saisie.texte=Formulaire de saisie
saisie.titre1=Saisie
saisie.titre2=Saisie
saisie.libelle=Tapez votre nom
saisie.valider=Valider
confirm.titre1=Confirmation
confirm.titre2=Confirmation
confirm.texte=Bonjour
confirm.retour=Retour au formulaire de saisie
Diese Meldungsschlüssel werden in den beiden Sichten [Saisie.jsp] und [Confirmation.jsp] verwendet.
6.5. Die Sichten
6.5.1. Die Ansicht [Saisie.jsp]
Sieht optisch wie folgt aus:
![]() |
Ihr Quellcode 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="saisie.titre1"/></title>
</head>
<body>
<h1><s:text name="saisie.titre2"/></h1>
<s:form action="Confirmer">
<s:textfield key="saisie.libelle" name="nom"/>
<s:submit key="saisie.valider" action="Confirmer"/>
</s:form>
</body>
</html>
- Zeile 7: Zeigt die Schlüsselmeldung saisie.titre1 (Eingabe) [1] an.
- Zeile 10: Zeigt die Schlüsselmeldung saisie.titre2 (Eingabe) [2] an.
- Zeilen 11, 14: Das Tag <s:form> leitet ein HTML-Formular ein. Alle Eingaben innerhalb dieses Formulars werden an den Webserver gesendet. Man sagt, sie seien postées, da der HTTP-Vorgang, der bei dieser Datenübertragung an den Server zum Tragen kommt, POST heißt. Die gesendeten Daten werden in Form einer Zeichenkette param1=valeur1¶m2=valeur2& übertragen... Diese Zeichenkette ist uns bereits in Beispiel 02 in Abschnitt 3.5 begegnet. In beiden Fällen wird die Parameterzeichenfolge von Struts 2 auf dieselbe Weise verarbeitet. Die Werte valeuri der Parameter parami werden in die ausgeführte Aktion in Felder eingefügt, die dieselben Namen wie die Parameter parami tragen. An wen werden die über POST gesendeten Daten übermittelt? Standardmäßig an die Aktion, die das Formular angezeigt hat, hier die Aktion Saisir [5]. Man kann auch das Attribut „action“ verwenden, um eine andere Aktion anzugeben, hier die Aktion [Confirmer].
- Zeile 12: Das Tag <s:textfield ...> zeigt das Eingabefeld [3] an. Sein Attribut key bezeichnet den Schlüssel der Beschriftung, die links neben dem Eingabefeld angezeigt werden soll. Die Beschriftung wird daher in der Datei [messages.properties] gesucht. Das Attribut name ist der Name des Parameters, der übermittelt wird. Der diesem Parameter zugeordnete Wert ist der im Eingabefeld eingegebene Text.
- Zeile 13: Das Tag <s:submit ...> zeigt die Schaltfläche [4] an. Ihr Attribut key bezeichnet den Schlüssel der Beschriftung, die auf der Schaltfläche angezeigt werden soll. Die Beschriftung wird daher in der Datei [messages.properties] gesucht. Eine Schaltfläche vom Typ submit löst das Absenden des Formulars an eine Aktion aus. Wir haben oben bereits erwähnt, dass es sich dabei aufgrund des Attributs action des Tags <s:form> um die Aktion [Confirmer] handelt. Das Attribut action des Tags <s:submit> ermöglicht es, gegebenenfalls eine andere Aktion anzugeben. Hier haben wir die Aktion [Confirmer] festgelegt. Die Schaltfläche hat einen Standard-Parameternamen: action:nom_action, hier action:Confirmer. Der diesem Parameter zugeordnete Wert ist die Beschriftung der Schaltfläche. Letztendlich lautet die Parameterzeichenfolge, die an die Aktion [Confirmer] gesendet wird, wenn der Benutzer auf die Schaltfläche [Valider] klickt:
?nom=xx&action:Confirmer=Valider.
wobei xx der vom Benutzer in das Eingabefeld eingegebene Text ist.
6.5.2. Die Ansicht [Confirmation.jsp]
sieht optisch wie folgt aus:
![]() |
Wir geben einen Namen ein und bestätigen die Eingabeseite. Daraufhin erhalten wir die Antwort [1], die der Ansicht [Confirmation.jsp] entspricht. Die unter [2] angezeigte URL ist die der Aktion [Confirmer]. Im obigen Beispiel wurde die folgende Zeichenfolge gesendet:
name=bernard&action:Confirmer=Valider
Der Parameter action:Confirmer ermöglicht es Struts 2, die Anfrage an die richtige Aktion weiterzuleiten, in diesem Fall an die Aktion [Confirmer]. Der Wert des Parameters nom wird dann in das Feld nom der Aktion [Confirmer] eingefügt.
Der Quellcode der Aktion [Confirmation.jsp] 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="confirm.titre1"/></title>
</head>
<body>
<h1><s:text name="confirm.titre2"/></h1>
<s:text name="confirm.texte"/>
<s:property value="nom"/> !
<br/><br/>
<a href="<s:url action="Saisir"/>"><s:text name="confirm.retour"/></a>
</body>
</html>
- Zeile 7: Zeigt die Schlüsselbezeichnung confirm.titre1 an, die in der Meldungsdatei [1] gefunden wurde
- Zeile 10: Zeigt die Schlüsselbezeichnung confirm.titre2 an, die in der Meldungsdatei [3] gefunden wurde
- Zeile 12: Zeigt die Eigenschaft nom der ausgeführten Aktion [Confirmer] an.
- Zeile 14: Erstellt einen Link zur Aktion [Saisir]. Das bereits erwähnte Tag <s:url>, wird anhand der Browser-URL [2] generiert. Der Pfad entspricht dem von [2] http://localhost:8084/exemple-05/actions und die Aktion dem des Attributs action, in diesem Fall Saisir. Die URL des Links lautet somit http://localhost:8084/exemple-05/actions/Saisir.action. Der Linktext entspricht der Bezeichnung, die dem Schlüssel confirm.retour [4] zugeordnet ist.
6.6. Die Tests
Hier sind zwei Abfragen:
![]() |
In [1] gibt man einen Namen ein und klickt auf „Bestätigen“. In [2] wird die Bestätigungsseite angezeigt.
![]() |
In [3] folgt man dem Link zurück zum Formular. In [4] das Ergebnis. Alles wurde erklärt, außer dem Übergang von [3] zu [4]. Warum findet man in [4] nicht den Namen, den man eingegeben hatte?
Der Link in [3] ist ein Link zur URL [http://localhost:8084/exemple-05/actions/Saisir.action]. Die Aktion [Saisir] wird also ausgeführt. Sehen wir uns ihre Konfiguration in [struts.xml] an:
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Saisir">
<result name="success">/vues/Saisie.jsp</result>
</action>
<action name="Confirmer" class="actions.Confirmer">
<result name="success">/vues/Confirmation.jsp</result>
</action>
</package>
Die Aktion [Saisir] ist keiner Aktion zugeordnet. Daher wird die Ansicht [Saisie.jsp] sofort angezeigt. Sehen wir uns den Code dieser Ansicht an:
<%@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="saisie.titre1"/></title>
</head>
<body>
<h1><s:text name="saisie.titre2"/></h1>
<s:form>
<s:textfield key="saisie.libelle" name="nom"/>
<s:submit key="saisie.valider" action="Confirmer"/>
</s:form>
</body>
</html>
In Zeile 12 wird das Eingabefeld angezeigt. Sein Inhalt wird mit der Eigenschaft nom (name) initialisiert. Erinnern wir uns an das, was oben über die Funktionsweise des Tags <s:property> geschrieben wurde:
Mit dem Tag <s:property name="Eigenschaft"> lässt sich der Wert einer Eigenschaft eines Objekts namens ActionContext schreiben. In diesem Objekt befinden sich:
- die Eigenschaften der Klasse, die der ausgeführten Aktion zugeordnet ist.
- die Attribute der aktuellen Anfrage, gekennzeichnet mit <s:property name="#request['clé']">
- die Attribute der Benutzersitzung, gekennzeichnet mit <s:property name="#session['clé']">
- die Attribute der Anwendung selbst, gekennzeichnet mit <s:property name="#application['clé']">
- die vom Client-Browser gesendeten Parameter, gekennzeichnet mit <s:property name="#parameters['clé']">
- Die Notation <s:property name="#attr['clé']"> zeigt den Wert eines Objekts an, das nacheinander in der Seite, der Anfrage, der Sitzung und der Anwendung gesucht wird.
Hier liegt Fall 1 vor. Der Aktion [Saisir] ist keine Klasse zugeordnet. Die Eigenschaft nom existiert daher nicht. Im Eingabefeld wird dann eine leere Zeichenfolge angezeigt.
Um in [4] den Namen anzuzeigen, der in [1] eingegeben wurde, verwenden wir die Sitzung des Benutzers.




