17. Voorbeeld 15 – Integratie van Struts 2 en Spring
In het vorige voorbeeld hadden we geen gegevens met het bereik Application die door alle verzoeken van alle gebruikers werden gedeeld. Hier laten we een voorbeeld daarvan zien. Om dit te implementeren, gebruiken we het Spring-framework [http://www.springsource.org/]. Spring is een zeer waardevol hulpmiddel. In dit voorbeeld laten we slechts een heel klein deel ervan zien. In een volgend voorbeeld zal er intensiever gebruik van worden gemaakt.
Het doel van deze applicatie is om gegevens uit het bereik Application weer te geven.
17.1. Het NetBeans-project
Het NetBeans-project van de applicatie is als volgt:
![]() |
- in [1]:
- [web.xml], dat de webapplicatie configureert, zal veranderen ten opzichte van eerdere versies
- [applicationContext.xml] is het configuratiebestand van Spring
- in [2]: de weergave [Context.JSP] die de gegevens van het Application-bereik weergeeft
- in [3]:
- het berichtenbestand [messages.properties]
- het hoofdconfiguratiebestand van Struts [struts.xml]. Dit zal ten opzichte van eerdere applicaties worden aangepast.
- in [4]:
- de Struts-actie [Action1.java]
- de klasse [Config.java] die de gegevens op applicatieniveau zal opslaan
- het secundaire Struts-configuratiebestand [example.xml]
- in [5]: de Struts 2-bibliotheek
- in [6]:
- de benodigde archieven voor Spring [spring-core, spring-context, spring-beans, spring-web, commons-logging]
- het archief van de Spring-plugin voor Struts 2. Maakt de integratie van Spring met Struts 2 mogelijk [struts2-spring-plugin]
In vergelijking met eerdere versies:
- moeten er archieven aan het project worden toegevoegd
- de bestanden [web.xml] en [struts.xml] aanpassen
17.2. Configuration
17.2.1. Het bestand [web.xml]
Het bestand [web.xml] is als volgt gewijzigd:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Exemple 14</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<URL-pattern>/*</URL-patroon>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
De wijziging vindt plaats op regels 12-14. Er wordt een listener toegevoegd aan de webapplicatie. Wanneer de webapplicatie wordt gestart, wordt de klasse die dit listener implementeert, geïnstantieerd. Dit is een Spring-klasse. Deze klasse maakt gebruik van het bestand [WEB-INF/applicationContext.xml]. Dit ziet er als volgt uit:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- configuratie van beans met applicatiebereik -->
<bean id="config" class="example.Config" >
<property name="nbMaxUsers" value="10"/>
</bean>
</beans>
- Het Spring-configuratiebestand heeft de root-tag <beans> (regels 2 en 11). beans zou je kunnen vertalen als ‘objecten’. Spring zal alle objecten (bean) die in dit configuratiebestand worden aangetroffen, instantiëren. Dit gebeurt slechts één keer, wanneer de Spring-instantie listener bij het opstarten van de webapplicatie wordt gestart.
- regels 7-9: definiëren een bean met de naam config (id). De bean ‘config’ is gekoppeld aan de klasse (class) [example.Config]. Spring zal deze klasse instantiëren.
- regel 8: definieert een eigenschap van de klasse [example.Config]. Spring roept de methode [example.Config].setNbMaxUsers(10) aan. De methode setNbMaxUsers moet dus in de klasse aanwezig zijn. Deze is als volgt:
package example;
public class Config {
private int nbMaxUsers;
public int getNbMaxUsers() {
return nbMaxUsers;
}
public void setNbMaxUsers(int nbMaxUsers) {
this.nbMaxUsers = nbMaxUsers;
}
}
Deze klasse definieert slechts één veld nbMaxUsers met de bijbehorende get en set. Als we het goed hebben begrepen, wordt bij het opstarten van de webapplicatie een instantie van de klasse [Config] aangemaakt met de waarde 10 voor het veld nbMaxUsers. We hebben slechts één veld gedefinieerd, maar dat is voldoende voor onze demonstratie. We willen laten zien dat dit veld, dat bijvoorbeeld het maximale aantal gebruikers zou kunnen vertegenwoordigen, een gegeven is met het bereik Application dat toegankelijk is voor alle acties. Dit zullen we laten zien met de actie [Action1].
17.2.2. Het bestand [struts.xml]
Het hoofdconfiguratiebestand van Struts is als volgt:
<?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>
<!-- internationalisering -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- Spring-integratie -->
<constant name="struts.objectFactory.spring.autoWire" value="name" />
<include file="example/example.xml"/>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Action1</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
</struts>
Alleen regel 10 wijkt af van eerdere versies van dit bestand. Deze regel definieert een Struts-constante. Door Spring geïnstantieerde objecten kunnen in andere objecten worden geïnjecteerd. Dit is de basis van Spring. Hier kan een verwijzing naar het door Spring aangemaakte object van het type [Config] in Struts-objecten worden geïnjecteerd. Hier komt de Spring-plugin voor Struts 2 om de hoek kijken, die zorgt voor de integratie van Spring in Struts.
Regel 10 geeft aan dat de injectie van Spring-objecten in een Struts-object automatisch plaatsvindt (autowire) op basis van de naam (value). Laten we teruggaan naar het configuratiebestand [applicationContext.xml]:
<!-- configuratie van beans met applicatiebereik -->
<bean id="config" class="example.Config" >
<property name="nbMaxUsers" value="10"/>
</bean>
Wat Struts 2 de naam van de bean noemt, is hier in feite de id. Hier heeft de geïnstantieerde bean van het type [Config] dus de naam config.
De actie [Action1.java] is als volgt:
package example;
import com.opensymphony.xwork2.ActionSupport;
...
public class Action1 extends ActionSupport implements SessionAware, RequestAware, ParameterAware {
// constructor zonder parameters
public Action1() {
}
// Sessie, verzoek, parameters
private Map<String, Object> session;
private Map<String, Object> request;
private Map<String, String[]> parameters;
private Config config;
@Override
public String execute() {
....
// verzoek
request.put("nbMaxUsers", config.getNbMaxUsers());
// pagina weergeven JSP
return SUCCESS;
}
...
public Config getConfig() {
return config;
}
public void setConfig(Config config) {
this.config = config;
}
}
De actie [Action1] is identiek aan die in de vorige toepassing, op de volgende details na:
- regel 15: er is een veld config toegevoegd. Omdat dit veld de naam draagt van een door Spring geïnstantieerde bean, krijgt dit veld automatisch een verwijzing naar dat object. Zo heeft de actie toegang tot de configuratie van de applicatie of, meer in het algemeen, tot de gegevens met het bereik Application.
- regel 31: Spring zal het veld config instantiëren via de methode set. Deze methode moet dus aanwezig zijn.
- regel 21: de actie heeft toegang tot de gegevens met het bereik Application. We vermelden het maximale aantal gebruikers nbMaxUsers in de query, zodat de weergave [Context.JSP] dit kan weergeven.
17.2.3. Het bestand [example.xml]
Het secundaire configuratiebestand van Struts is identiek aan dat van de vorige versie:
<?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>
<package name="example" namespace="/example" extends="struts-default">
<action name="Action1" class="example.Action1">
<result name="success">/example/Context.JSP</result>
</action>
</package>
</struts>
17.3. De weergave [Context.JSP]
De weergave [Context.JSP] ziet er als volgt uit:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title><s:text name="Context.titre"/></title>
<s:head/>
</head>
<body background="<s:url value="/ressources/standard.jpg"/>">
<h2><s:text name="Context.message"/></h2>
<h3><s:text name="Context.parameters"/></h3>
nom : <s:property value="#parameters['nom']"/><br/>
age : <s:property value="#parameters['age']"/>
<h3><s:text name="Context.session"/></h3>
compteur : <s:property value="#session['compteur']"/>
<h3><s:text name="Context.request"/></h3>
nbMaxUsers : <s:property value="#request['nbMaxUsers']"/>
</body>
</html>
17.4. De tests
Een voorbeeld van een uitvoering is als volgt:
![]() |

