6. Beispiel 05 – Das Eingabeformular
Wir werden das Konzept eines Eingabeformulars anhand eines einfachen Beispiels vorstellen.
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 [Confirm.java]
In [2] die Einstiegsseite
6.2. Konfiguration
Die Datei [struts.xml] sieht wie folgt aus:
<?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>
<!-- internationalization -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- default package -->
<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>
<!-- equity package -->
<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 die URL /actions/Action.
- Zeilen 21–23: Definieren die Aktion [Enter]. Ihr ist keine Klasse zugeordnet. Die Antwort ist immer die Ansicht [/views/Enter.jsp]
- Zeilen 24–26: Definieren die Aktion [Confirm]. Die Klasse [actions.Confirm] ist ihr zugeordnet. Die Antwort ist immer die Ansicht [/views/Confirmation.jsp]
6.3. Die Aktion [Bestätigen]
Der Code lautet wie folgt:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Confirmer extends ActionSupport{
// model
private String nom;
// getters and setters
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-/Set-Methoden.
6.4. Die Nachrichten-Datei
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 sowohl in der Ansicht [Entry.jsp] als auch in der Ansicht [Confirmation.jsp] verwendet.
6.5. Die Ansichten
6.5.1. Die Ansicht [Entry.jsp]
Optisch sieht sie wie folgt aus:
![]() |
Der 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 Meldung für den Schlüssel „saisie.titre1“ (Eingabe) an [1].
- Zeile 10: Zeigt die Meldung für den Schlüssel „saisie.titre2“ (Eingabe) [2] an.
- Zeilen 11, 14: Das <s:form>-Tag definiert ein HTML-Formular. Alle Eingaben innerhalb dieses Formulars werden an den Webserver gesendet. Man spricht dabei von einem „Post“, da der HTTP-Vorgang zum Senden dieser Daten an den Server als POST bezeichnet wird. Die Daten werden in Form einer Zeichenkette gesendet: param1=value1¶m2=value2&... Diese Zeichenkette ist uns bereits in Abschnitt 3.5 von Beispiel 02 begegnet. In beiden Fällen wird die Parameterzeichenfolge von Struts 2 auf die gleiche Weise verarbeitet. Die Werte der Parameter werden in die ausgeführte Aktion eingefügt, und zwar in Felder, die dieselben Namen wie die Parameter tragen. An wen werden die gesendeten Daten übermittelt? Standardmäßig an die Aktion, die das Formular angezeigt hat, hier die Aktion „Saisir“ [5]. Sie können auch das Attribut „action“ verwenden, um eine andere Aktion anzugeben, hier die Aktion „Confirmer“.
- Zeile 12: Das <s:textfield ...>-Tag zeigt das Eingabefeld [3] an. Sein „key“-Attribut gibt den Schlüssel für die Beschriftung an, die links neben dem Eingabefeld angezeigt werden soll. Die Beschriftung wird daher in der Datei [messages.properties] nachgeschlagen. Das „name“-Attribut ist der Name des Parameters, der gesendet wird. Der diesem Parameter zugeordnete Wert ist der im Eingabefeld eingegebene Text.
- Zeile 13: Das <s:submit ...>-Tag zeigt die Schaltfläche [4] an. Sein „key“-Attribut gibt den Schlüssel für die Beschriftung an, die auf der Schaltfläche angezeigt werden soll. Die Beschriftung wird daher aus der Datei [messages.properties] abgerufen. Eine Absenden-Schaltfläche löst das Senden des Formulars an eine Aktion aus. Wir haben bereits erwähnt, dass dies aufgrund des „action“-Attributs des <s:form>-Tags die Aktion [Confirm] ist. Das „action“-Attribut des <s:submit>-Tags ermöglicht es Ihnen, bei Bedarf eine andere Aktion anzugeben. Hier haben wir die Aktion auf [Confirm] gesetzt. Die Schaltfläche hat einen Standard-Parameternamen: action:action_name, hier action:Confirm. Der mit diesem Parameter verknüpfte Wert ist die Beschriftung der Schaltfläche. Letztendlich lautet die Parameterzeichenfolge, die an die [Confirm]-Aktion gesendet wird, wenn der Benutzer auf die Schaltfläche [Validate] klickt:
?name=xx&action:Confirm=Validate.
wobei xx der vom Benutzer in das Eingabefeld eingegebene Text ist.
6.5.2. Die Ansicht [Confirmation.jsp]
Optisch sieht das so aus:
![]() |
Wir geben einen Namen ein und senden die Eingabeseite ab. Daraufhin erhalten wir die Antwort [1], bei der es sich um die Ansicht [Confirmation.jsp] handelt. Die in [2] angezeigte URL ist die der Aktion [Confirm]. Im obigen Beispiel wurde die folgende Zeichenfolge gesendet:
name=bernard&action:Confirm=Validate
Der Parameter action:Confirm ermöglicht es Struts 2, die Anfrage an die richtige Aktion weiterzuleiten, in diesem Fall an die Aktion [Confirm]. Der Wert des Parameters name wird dann in das Feld name der Aktion [Confirm] eingefügt.
Der Quellcode für die 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 in der Meldungsdatei [1] gefundene Schlüsselbezeichnung confirm.title1 an
- Zeile 10: Zeigt die Schlüsselbezeichnung „confirm.title2“ an, die in der Meldungsdatei [3] zu finden ist
- Zeile 12: Zeigt die Eigenschaft „name“ der ausgeführten Aktion [Confirm] an.
- Zeile 14: Erstellt einen Link zur Aktion [Enter]. Das bereits bekannte <s:url>-Tag wird aus der URL des Browsers [2] generiert. Der Pfad ist der von [2] http://localhost:8084/exemple-05/actions und die Aktion ist die des action-Attributs, in diesem Fall Enter. Die URL des Links lautet daher http://localhost:8084/exemple-05/actions/Saisir.action. Der Linktext ist die Bezeichnung, die dem Schlüssel confirm.retour zugeordnet ist [4].
6.6. Die Tests
Hier sind zwei Anfragen:
![]() |
Geben Sie in [1] einen Namen ein und klicken Sie auf „Absenden“. In [2] erscheint die Bestätigungsseite.
![]() |
In [3] folgen wir dem Link zurück zum Formular. In [4] das Ergebnis. Alles wurde erklärt, außer dem Übergang von [3] zu [4]. Warum sehen wir den Namen, den wir in [4] eingegeben haben, nicht?
Der Link in [3] ist ein Link zur URL [http://localhost:8084/exemple-05/actions/Saisir.action]. Die Aktion [Submit] wird daher ausgeführt. Sehen wir uns die 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 [Enter] ist keiner Aktion zugeordnet. Daher wird die Ansicht [Entry.jsp] sofort angezeigt. Sehen wir uns den Code für diese 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 „name“ initialisiert. Erinnern Sie sich daran, was zuvor über die Funktionsweise des Tags <s:property> gesagt wurde:
Mit dem Tag <s:property name="property"> können Sie den Wert einer Eigenschaft eines Objekts namens ActionContext schreiben. Dieses Objekt enthält:
- die Eigenschaften der Klasse, die mit der ausgeführten Aktion verknüpft ist.
- die Attribute der aktuellen Anfrage, bezeichnet als <s:property name="#request['key']">
- die Attribute der Benutzersitzung, bezeichnet als <s:property name="#session['key']">
- Attribute der Anwendung selbst, bezeichnet als <s:property name="#application['key']">
- die vom Client-Browser gesendeten Parameter, bezeichnet als <s:property name="#parameters['key']">
- Die Notation <s:property name="#attr['key']"> zeigt den Wert eines Objekts an, das nacheinander in der Seite, der Anfrage, der Sitzung und der Anwendung gesucht wird.
Wir befinden uns hier in Fall 1. Der Aktion [Enter] ist keine Klasse zugeordnet. Die Eigenschaft „name“ existiert daher nicht. Im Eingabefeld wird dann eine leere Zeichenfolge angezeigt.
Um in [4] den in [1] eingegebenen Namen anzuzeigen, verwenden wir die Sitzung des Benutzers.




