1. Inleiding
De PDF van het document is beschikbaar |HIER|.
De voorbeelden uit het document zijn beschikbaar |HIER|.
We willen hier aan de hand van voorbeelden de belangrijke begrippen van Struts 2 introduceren. Struts 2 is een webframework dat het volgende biedt:
- een aantal bibliotheken in de vorm van JAR-bestanden
- een ontwikkelingsraamwerk: Struts 2 beïnvloedt de manier waarop een webapplicatie wordt ontwikkeld.
De vereisten om de voorbeelden te kunnen begrijpen zijn als volgt:
- basiskennis van de programmeertaal Java
- basiskennis van webontwikkeling, met name HTML.
Op de website [http://developpez.com] zijn alle benodigde bronnen voor deze vereisten te vinden. Ik heb er zelf een aantal geschreven, die te vinden zijn op de website [http://tahe.developpez.com].
De voorbeelden in dit document zijn beschikbaar op de websites URL en [http://tahe.developpez.com/java/struts2].
Om meer te weten te komen over Struts 2, kunt u de volgende bronnen raadplegen:
- [ref1]: de documentatie van Struts 2, te vinden op de website van Struts
- [ref2]: het boek "Struts 2 in Action", geschreven door Donald Brown, Chad Michael Davis en Scott Stanlick, uitgegeven door Manning. Dit boek is bijzonder leerzaam.
We zullen af en toe verwijzen naar [ref2] om de lezer erop te wijzen dat hij zich met dit boek verder in een bepaald onderwerp kan verdiepen.
Het document is zo geschreven dat het ook zonder computer bij de hand kan worden gelezen. Daarom worden er veel schermafbeeldingen getoond.
1.1. De rol van Struts 2 in een webapplicatie
Laten we allereerst de plaats van Struts 2 binnen de ontwikkeling van een webapplicatie in kaart brengen. Meestal wordt deze gebouwd op basis van een meerlaagse architectuur, zoals de volgende:
![]() |
- De laag [web] is de laag die in contact staat met de gebruiker van de webapplicatie. De gebruiker communiceert met de webapplicatie via webpagina’s die in een browser worden weergegeven. In deze laag bevindt zich Struts 2, en uitsluitend in deze laag.
- De laag [metier] implementeert de bedrijfsregels van de applicatie, zoals de berekening van een salaris of een factuur. Deze laag maakt gebruik van gegevens die afkomstig zijn van de gebruiker via de laag [web] en van het DBMS via de laag [dao].
- De laag [dao] (Data Access Objects), de laag [jpa] (Java Persistence API) en de JDBC-driver beheren de toegang tot de gegevens van het DBMS. De laag [jpa] fungeert als ORM (Object Relational Mapper). Deze vormt een brug tussen de objecten die door de laag [dao] worden beheerd en de rijen en kolommen van de gegevens in een relationele database.
- De integratie van de lagen kan worden gerealiseerd door een Spring-container of een EJB3-container (Enterprise Java Bean).
De meeste voorbeelden die hierna worden gegeven, maken slechts gebruik van één laag, namelijk de laag [web]:
![]() |
Dit document wordt echter afgesloten met de bouw van een meerlaagse webapplicatie:
![]() |
De lagen [metier], [dao] en [jpa/hibernate] worden ons geleverd in de vorm van een jar-archief, zodat we opnieuw alleen de laag [web] hoeven te bouwen.
1.2. Het ontwikkelingsmodel MVC van Struts 2
Struts 2 implementeert het zogenaamde MVC-architectuurmodel (Model – View – Controller) als volgt:
![]() |
De verwerking van een verzoek van een client verloopt als volgt:
De opgevraagde URL hebben de vorm http://machine:port/contexte/rep1/rep2/.../Action.. Het pad [/rep1/rep2/.../Action] moet overeenkomen met een actie die is gedefinieerd in een Struts 2-configuratiebestand; anders wordt het geweigerd. Een actie wordt in een XML-bestand gedefinieerd in de volgende vorm:
Laten we in het vorige voorbeeld aannemen dat de actie URL wordt aangevraagd. De volgende stappen worden dan uitgevoerd:
-
verzoek – de browser van de klant doet een verzoek aan de controller [FilterDispatcher]. Deze verwerkt alle verzoeken van klanten. Dit is de toegangspoort tot de applicatie. Dit is de C van MVC.
-
Verwerking
- de C-controller raadpleegt zijn configuratiebestand en ontdekt dat de actie actions/Action1 bestaat. De namespace (regel 1), samengevoegd met de naam van de actie (attribuut name van regel 2), definieert de actie actions/Action1.
- De controller C maakt een instantie aan van [2a], een klasse van het type [actions.Action1] (attribuut class van regel 2). De naam en het pakket van deze klasse kunnen willekeurig zijn.
- Als de aangevraagde URL vergezeld gaat van parameters van het type [param1=val1¶m2=val2&...], dan wijst de C-controller deze parameters als volgt toe aan de klasse [actions.Action1]:
De klasse [actions.Action1] moet dus voor elk van de verwachte parameters parami over deze methoden setParami beschikken.
- (vervolg)
- controller C vraagt de ondertekeningsmethode [String execute()] van de klasse [actions.Action1] om uit te voeren. Deze kan dan gebruikmaken van de parameters parami die de klasse heeft opgehaald. Bij de verwerking van het verzoek van de gebruiker kan de methode de lagen [metier] en [2b] nodig hebben. Zodra het verzoek van de klant is verwerkt, kan de methode verschillende reacties genereren. Een klassiek voorbeeld is:
- een foutpagina als het verzoek niet correct kon worden verwerkt
- een bevestigingspagina in het andere geval
- controller C vraagt de ondertekeningsmethode [String execute()] van de klasse [actions.Action1] om uit te voeren. Deze kan dan gebruikmaken van de parameters parami die de klasse heeft opgehaald. Bij de verwerking van het verzoek van de gebruiker kan de methode de lagen [metier] en [2b] nodig hebben. Zodra het verzoek van de klant is verwerkt, kan de methode verschillende reacties genereren. Een klassiek voorbeeld is:
De methode execute levert aan controller C een resultaat van het type tekenreeks, een zogenaamde navigatiesleutel. In het bovenstaande voorbeeld is dat [actions.Action1].execute kan twee navigatiesleutels genereren: „page1“ (regel 3) en „page2“ (regel 4). De methode [actions.Action1].execute werkt ook het M-sjabloon [2c] bij, dat wordt gebruikt door de pagina JSP die als antwoord naar de gebruiker wordt verzonden. Dit sjabloon kan de volgende elementen bevatten:
- (vervolg)
- de klasse [actions.Action1], geïnstantieerd
- de sessie van de gebruiker
- gegevens met het bereik Application
- …
- antwoord – de C-controller vraagt de pagina JSP, die overeenkomt met de navigatiesleutel [3], om te worden weergegeven. Dit is de weergave, de V van MVC. De pagina JSP gebruikt een M-sjabloon om de dynamische delen van het antwoord te initialiseren dat naar de client moet worden verzonden.
Laten we nu het verband tussen de webarchitectuur MVC en de gelaagde architectuur verduidelijken. In feite zijn dit twee verschillende concepten die soms door elkaar worden gehaald. Laten we een Struts 2-webapplicatie met één laag nemen:
![]() |
Als we de laag [web] met Struts 2 implementeren, hebben we weliswaar een MVC-webarchitectuur, maar geen meerlaagse architectuur. Hier zorgt de laag [web] voor alles: presentatie, bedrijfslogica en toegang tot gegevens. Met Struts 2 zijn het de klassen van het type [Action] die dit werk doen.
Laten we nu eens kijken naar een meerlaagse webarchitectuur:
![]() |
De laag [web] kan worden geïmplementeerd zonder framework en zonder het model MVC te volgen. We hebben dan wel een meerlaagse architectuur, maar de weblaag implementeert het model MVC niet.
In MVC hebben we gezegd dat het model M dat van de weergave V is, c.a.d, de verzameling gegevens die door de weergave V wordt weergegeven. Soms (vaak) wordt een andere definitie van het model M van MVC gegeven:
![]() |
Veel auteurs zijn van mening dat wat zich rechts van de laag [web] bevindt, het M-model van MVC vormt. Om dubbelzinnigheden te voorkomen, kan men spreken van:
- het domeinmodel wanneer men alles bedoelt wat zich rechts van de laag [présentation] bevindt
- van het model van de weergave wanneer men verwijst naar de gegevens die door een weergave V worden weergegeven
In het vervolg zal de term "model M" uitsluitend verwijzen naar het model van een weergave V.
1.3. De gebruikte hulpmiddelen
Hierna gebruiken we (december 2011)
- NetBeans 7.01, beschikbaar op URL [http://www.netbeans.org]
- de Struts 2-plugin voor NetBeans 7.01, beschikbaar op URL [http://plugins.netbeans.org/plugin/39218]
- versie 2.2.3 van Struts 2 is beschikbaar via URL [http://struts.apache.org/]
Let op: alleen de Struts 2-bibliotheken die te vinden zijn op URL [http://struts.apache.org/] zijn onmisbaar voor het ontwikkelen van de voorbeelden die hierna volgen. NetBeans kan worden vervangen door een andere IDE (Eclipse, JDeveloper, IntelliJ, ...) en de Struts 2-plug-in is er alleen om het leven van de ontwikkelaar te vergemakkelijken. Ook deze is niet onmisbaar.
1.3.1. IDE NetBeans
Op de downloadpagina van NetBeans kiezen we de Java-versie EE:

1.3.2. Struts 2-plug-in
Afhankelijk van de versie van NetBeans is deze plug-in niet altijd beschikbaar geweest. In december 2011 is deze te vinden op URL [http://plugins.netbeans.org]. Via deze URL kun je zien welke plug-ins er voor NetBeans beschikbaar zijn. Je kunt je zoekopdracht filteren. In [1] zoek je naar plug-ins waarvan de naam het woord "struts" bevat.
![]() |
- volg de link [2]
![]() |
We downloaden de plug-in en pakken deze uit: [2]. Om deze in NetBeans te integreren, kunnen we als volgt te werk gaan:
- Start NetBeans
![]() |
- in [1], kies je het menu Tools/Plugins
- in het tabblad [2] de knop [3] gebruiken
- in [4], selecteer de bestanden .nbm van de gedownloade plug-ins. Hier kiezen we de bibliotheken van Struts versie 2.2.3 in plaats van die van Struts 2.0.14
- Terug in het tabblad [2] installeer je de geselecteerde plug-ins met de knop [5].
Voor de installatie van de plug-ins moet NetBeans vaak opnieuw worden opgestart.
1.3.3. De Struts 2-bibliotheken
Als je de Struts 2-plug-in voor NetBeans hebt gedownload, beschik je over de belangrijkste Struts-bibliotheken, maar niet over alle. Verderop hebben we bepaalde bibliotheken nodig die beschikbaar zijn op de Struts 2-website [http://struts.apache.org/].
![]() |
We volgen de link [1] en vervolgens de link [2] om het zip-bestand van de distributie 2.2.3.1 te downloaden. Zodra de distributie is uitgepakt, bevinden de bibliotheken die nodig zijn voor Struts zich in de map [lib] [3] van de distributie. Er zijn er tientallen, en dan rijst de vraag welke onmisbaar zijn. Hier komt de Struts-plugin ons te hulp.










