1. Einführung
Die PDF des Dokuments ist verfügbar |HIER|.
Die Beispiele aus dem Dokument sind verfügbar |HIER|.
Wir möchten hier anhand von Beispielen die wichtigsten Konzepte von Struts 2 vorstellen. Struts 2 ist ein Web-Framework, das Folgendes bereitstellt:
- eine Reihe von Bibliotheken in Form von JAR-Dateien
- ein Entwicklungsframework: Struts 2 beeinflusst die Art und Weise, wie eine Webanwendung entwickelt wird.
Zum Verständnis der Beispiele sind folgende Voraussetzungen erforderlich:
- Grundkenntnisse in der Programmiersprache Java
- Grundkenntnisse in der Webentwicklung, insbesondere in HTML.
Auf der Website [http://developpez.com] finden Sie alle für diese Voraussetzungen erforderlichen Ressourcen. Einige davon habe ich selbst verfasst; diese finden Sie auf der Website [http://tahe.developpez.com].
Die Beispiele dieses Dokuments sind unter der URL [http://tahe.developpez.com/java/struts2] verfügbar.
Um sich näher mit Struts 2 zu befassen, können die folgenden Referenzen herangezogen werden:
- [ref1]: die Struts-2-Dokumentation, die auf der Struts-Website zu finden ist
- [ref2]: das Buch „Struts 2 in Action“ von Donald Brown, Chad Michael Davis und Scott Stanlick, erschienen im Manning-Verlag. Dieses Buch ist besonders lehrreich.
Gelegentlich werden wir auf [ref2] verweisen, um den Leser darauf hinzuweisen, dass er sich mit diesem Buch näher in ein Thema vertiefen kann.
Das Dokument wurde so verfasst, dass es auch ohne Computer zur Hand gelesen werden kann. Daher enthalten wir zahlreiche Screenshots.
1.1. Die Rolle von Struts 2 in einer Webanwendung
Zunächst wollen wir Struts 2 in den Kontext der Entwicklung einer Webanwendung einordnen. Meistens basiert diese auf einer mehrschichtigen Architektur wie der folgenden:
![]() |
- Die Schicht [web] ist die Schicht, die mit dem Benutzer der Webanwendung in Kontakt steht. Dieser interagiert mit der Webanwendung über Webseiten, die in einem Browser angezeigt werden. In dieser Schicht befindet sich Struts 2 und ausschließlich in dieser Schicht.
- Die Schicht [metier] implementiert die Geschäftslogik der Anwendung, wie beispielsweise die Berechnung eines Gehalts oder einer Rechnung. Diese Schicht nutzt Daten, die vom Benutzer über die Schicht [web] und vom Datenbanksystem über die Schicht [dao] bereitgestellt werden.
- Die Schicht [dao] (Data Access Objects), die Schicht [jpa] (Java Persistence API) und der JDBC-Treiber verwalten den Zugriff auf die Daten des DBMS. Die Schicht [jpa] dient als ORM (Object Relational Mapper). Sie bildet eine Brücke zwischen den von der Schicht [dao] verarbeiteten Objekten und den Zeilen und Spalten der Daten einer relationalen Datenbank.
- Die Integration der Schichten kann über einen Spring- oder EJB3-Container (Enterprise Java Bean) erfolgen.
Die meisten der im Folgenden aufgeführten Beispiele verwenden nur eine einzige Schicht, nämlich die Schicht [web]:
![]() |
Dieses Dokument schließt jedoch mit der Erstellung einer mehrschichtigen Webanwendung ab:
![]() |
Die Schichten [metier], [dao] und [jpa/hibernate] werden uns in Form eines JAR-Archivs zur Verfügung gestellt, sodass wir wiederum nur die Schicht [web] erstellen müssen.
1.2. Das Entwicklungsmodell MVC von Struts 2
Struts 2 implementiert das sogenannte MVC-Architekturmodell (Model – View – Controller) wie folgt:
![]() |
Die Bearbeitung einer Client-Anfrage läuft wie folgt ab:
Die angeforderten URLs haben die Form http://machine:port/contexte/rep1/rep2/.../Action.. Der Pfad [/rep1/rep2/.../Action] muss einer in einer Struts-2-Konfigurationsdatei definierten Aktion entsprechen, andernfalls wird die Anfrage abgelehnt. Eine Aktion wird in einer XML-Datei in folgender Form definiert:
Nehmen wir im obigen Beispiel an, dass die URL „[ http://machine:port/contexte/actions/Action1]“ angefordert wird. Dann werden die folgenden Schritte ausgeführt:
- Anfrage – Der Browser des Clients sendet eine Anfrage an den Controller [FilterDispatcher]. Dieser empfängt alle Anfragen der Clients. Er ist das Eingangstor der Anwendung. Er entspricht dem „C“ in MVC.
- Verarbeitung
- Der Controller C konsultiert seine Konfigurationsdatei und stellt fest, dass die Aktion actions/Action1 existiert. namespace (Zeile 1), verkettet mit dem Namen der Aktion (Attribut name aus Zeile 2), definiert die Aktion actions/Action1.
- Der Controller C instanziiert [2a], eine Klasse vom Typ [actions.Action1] (Attribut class aus Zeile 2). Der Name und das Paket dieser Klasse können beliebig sein.
- Wenn die angeforderte URL Parameter vom Typ [param1=val1¶m2=val2&...] enthält, weist der Controller C diese Parameter der Klasse [actions.Action1] wie folgt zu:
Die Klasse [actions.Action1] muss daher für jeden der erwarteten Parameter parami über die entsprechenden Methoden setParami verfügen.
- Der Controller C fordert die Signaturmethode [String execute()] der Klasse [actions.Action1] auf, ausgeführt zu werden. Diese kann dann die Parameter parami nutzen, die die Klasse abgerufen hat. Bei der Bearbeitung der Benutzeranfrage benötigt sie möglicherweise die Schichten [metier] und [2b]. Sobald die Client-Anfrage bearbeitet wurde, kann sie verschiedene Antworten auslösen. Ein klassisches Beispiel ist:
- eine Fehlerseite, wenn die Anfrage nicht korrekt verarbeitet werden konnte
- ansonsten eine Bestätigungsseite
Die Methode execute gibt an den Controller C ein Ergebnis vom Typ Zeichenkette zurück, das als Navigationsschlüssel bezeichnet wird. Im obigen Beispiel ist dies [actions.Action1].execute kann zwei Navigationsschlüssel erzeugen: „page1“ (Zeile 3) und „page2“ (Zeile 4). Die Methode [actions.Action1].execute aktualisiert zudem die Vorlage M [2c], die von der Seite JSP verwendet wird, welche als Antwort an den Benutzer gesendet wird. Diese Vorlage kann Elemente der folgenden
- der Klasse [actions.Action1], die
- der Benutzersitzung
- Daten im Anwendungsbereich
- ...
- Antwort – Der Controller C fordert die Seite JSP, die dem Navigationsschlüssel [3] entspricht, auf, sich anzuzeigen. Dies ist die Ansicht, das V von MVC. Die Seite JSP verwendet eine Vorlage M, um die dynamischen Teile der Antwort zu initialisieren, die sie an den Client senden muss.
Lassen Sie uns nun den Zusammenhang zwischen der Webarchitektur MVC und der Schichtenarchitektur näher erläutern. Tatsächlich handelt es sich um zwei unterschiedliche Konzepte, die manchmal verwechselt werden. Nehmen wir eine einschichtige Struts-2-Webanwendung:
![]() |
Wenn wir die Schicht [web] mit Struts 2 implementieren, haben wir zwar eine Webarchitektur MVC, aber keine mehrschichtige Architektur. Hier übernimmt die Schicht [web] alles: Darstellung, Geschäftslogik und Datenzugriff. Bei Struts 2 übernehmen Klassen vom Typ [Action] diese Aufgaben.
Betrachten wir nun eine mehrschichtige Webarchitektur:
![]() |
Die Schicht [web] kann ohne Framework und ohne Befolgung des Modells MVC implementiert werden. Wir haben dann zwar eine mehrschichtige Architektur, aber die Webschicht implementiert das Modell MVC nicht.
In MVC haben wir gesagt, dass das Modell M das der Ansicht V, c.a.d, ist – also die Gesamtheit der von der Ansicht V angezeigten Daten. Manchmal (oft) wird eine andere Definition des Modells M von MVC angegeben:
![]() |
Viele Autoren sind der Ansicht, dass das, was sich rechts von der Ebene [web] befindet, das Modell M von MVC bildet. Um Mehrdeutigkeiten zu vermeiden, kann man sprechen von:
- vom Domänenmodell, wenn man alles bezeichnet, was rechts von der Ebene [présentation] liegt
- vom Modell der Ansicht, wenn man die von einer Ansicht V angezeigten Daten bezeichnet
Im Folgenden bezeichnet der Begriff „M-Modell“ ausschließlich das Modell einer Ansicht V.
1.3. Die verwendeten Werkzeuge
Im Folgenden verwenden wir (Dezember 2011)
- NetBeans 7.01 (IDE), verfügbar unter der URL [http://www.netbeans.org]
- das Struts-2-Plugin für NetBeans 7.01, verfügbar unter der URL [http://plugins.netbeans.org/plugin/39218]
- die Version 2.2.3 von Struts 2, verfügbar unter der URL [http://struts.apache.org/]
Es sei darauf hingewiesen, dass für die Entwicklung der folgenden Beispiele ausschließlich die Struts-2-Bibliotheken erforderlich sind, die unter der URL [http://struts.apache.org/] erhältlich sind. NetBeans kann durch eine andere Umgebung (Eclipse, JDeveloper, IntelliJ, …) ersetzt werden, und das Struts-2-Plugin dient lediglich dazu, dem Entwickler die Arbeit zu erleichtern. Auch dieses ist nicht zwingend erforderlich.
1.3.1. IDE NetBeans
Auf der Download-Seite von NetBeans wählen wir die Java-Version EE aus:

1.3.2. Struts-2-Plugin
Je nach NetBeans-Version war dieses Plugin nicht immer verfügbar. Im Dezember 2011 findet man es unter der URL [http://plugins.netbeans.org]. Über diese URL lassen sich die verschiedenen für NetBeans verfügbaren Plugins einsehen. Man kann die Suche filtern. Unter [1] werden die Plugins angefordert, deren Name das Wort „struts“ enthält.
![]() |
- Man folgt dem Link [2]
![]() |
Man lädt das Plugin herunter und entpackt es: [2]. Um es in NetBeans zu integrieren, kann man wie folgt vorgehen:
- Starten Sie NetBeans
![]() |
- in [1] wählen Sie das Menü „Tools/Plugins“
- auf der Registerkarte [2] die Schaltfläche [3] verwenden
- Wählen Sie unter „[4]“ die Dateien „.nbm“ der heruntergeladenen Plugins aus. Hier wählen wir die Bibliotheken von Struts Version 2.2.3 anstelle derjenigen von Struts 2.0.14
- Zurück auf der Registerkarte „[2]“ installieren wir die ausgewählten Plugins über die Schaltfläche „[5]“.
Die Installation der Plugins erfordert oft einen Neustart von NetBeans.
1.3.3. Die Struts-2-Bibliotheken
Wenn Sie das Struts-2-Plugin für NetBeans heruntergeladen haben, stehen Ihnen die wichtigsten Struts-Bibliotheken zur Verfügung, jedoch nicht alle. Im weiteren Verlauf benötigen wir bestimmte Bibliotheken, die auf der Struts-2-Website unter [http://struts.apache.org/] verfügbar sind.
![]() |
Wir folgen dem Link [1] und anschließend dem Link [2], um die ZIP-Datei der Distribution 2.2.3.1 herunterzuladen. Nach dem Entpacken der Distribution befinden sich die für Struts erforderlichen Bibliotheken im Ordner [lib] [3] der Distribution. Da es mehrere Dutzend davon gibt, stellt sich die Frage, welche davon unverzichtbar sind. Hier hilft uns das Struts-Plugin weiter.










