17. Beispiel 15 – Struts 2 / Spring-Integration
Im vorherigen Beispiel hatten wir keine Daten im Anwendungsbereich, die für alle Anfragen aller Benutzer gemeinsam genutzt wurden. Wir zeigen hier ein Beispiel dafür. Zur Umsetzung verwenden wir das Spring-Framework [http://www.springsource.org/]. Spring ist ein äußerst wertvolles Werkzeug. In diesem Beispiel zeigen wir nur einen winzigen Ausschnitt davon. Ein späteres Beispiel wird es umfangreicher nutzen.
Der Zweck dieser Anwendung besteht darin, Daten im Anwendungsbereich anzuzeigen.
17.1. Das NetBeans-Projekt
Das NetBeans-Projekt für die Anwendung sieht wie folgt aus:
![]() |
- in [1]:
- [web.xml], das die Webanwendung konfiguriert, wird sich gegenüber früheren Versionen ändern
- [applicationContext.xml] ist die Spring-Konfigurationsdatei
- in [2]: die Ansicht [Context.jsp], die Daten im Anwendungsbereich anzeigt
- in [3]:
- die Meldungsdatei [messages.properties]
- die Hauptkonfigurationsdatei von Struts [struts.xml]. Wird sich im Vergleich zu früheren Anwendungen ändern.
- in [4]:
- die Struts-Aktion [Action1.java]
- die Klasse [Config.java], die Daten im Anwendungsbereich speichert
- die sekundäre Struts-Konfigurationsdatei [example.xml]
- in [5]: die Struts-2-Bibliothek
- in [6]:
- die für Spring erforderlichen Archive [spring-core, spring-context, spring-beans, spring-web, commons-logging]
- das Spring-Plugin-Archiv für Struts 2. Ermöglicht die Integration von Spring mit Struts 2 [struts2-spring-plugin]
Im Vergleich zu früheren Versionen:
- müssen Sie dem Projekt Archive hinzufügen
- die Dateien [web.xml] und [struts.xml] ändern
17.2. Konfiguration
17.2.1. Die Datei [web.xml]
Die Datei [web.xml] ändert sich wie folgt:
<?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-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
Die Änderung erfolgt in den Zeilen 12–14. Der Webanwendung wird ein Listener hinzugefügt. Beim Start der Webanwendung wird die Klasse, die diesen Listener implementiert, instanziiert. Es handelt sich um eine Spring-Klasse. Diese Klasse verwendet die Datei [WEB-INF/applicationContext.xml]. Die Datei sieht wie folgt aus:
<?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">
<!-- application scope bean configuration -->
<bean id="config" class="example.Config" >
<property name="nbMaxUsers" value="10"/>
</bean>
</beans>
- Die Spring-Konfigurationsdatei enthält das Root-Tag <beans> (Zeilen 2 und 11). Beans können als Objekte betrachtet werden. Spring instanziiert alle Objekte (Beans), die in dieser Konfigurationsdatei gefunden werden. Dies geschieht nur einmal, wenn der Spring-Listener beim Start der Webanwendung gestartet wird.
- Zeilen 7–9: definieren eine Bean namens config (id). Die config-Bean ist mit der Klasse [example.Config] verknüpft. Spring instanziiert diese Klasse.
- Zeile 8: definiert eine Eigenschaft der Klasse [example.Config]. Spring ruft die Methode [example.Config].setNbMaxUsers(10) auf. Daher muss die Methode setNbMaxUsers in der Klasse vorhanden sein. Sie lautet wie folgt:
package example;
public class Config {
private int nbMaxUsers;
public int getNbMaxUsers() {
return nbMaxUsers;
}
public void setNbMaxUsers(int nbMaxUsers) {
this.nbMaxUsers = nbMaxUsers;
}
}
Diese Klasse definiert nur ein Feld, nbMaxUsers, mit seinen Get- und Set-Methoden. Wenn Sie den Schritten gefolgt sind, wird beim Start der Webanwendung eine Instanz der Klasse [Config] mit dem Wert 10 für ihr Feld nbMaxUsers instanziiert. Wir haben nur ein einziges Feld definiert, aber das reicht für unsere Demonstration aus. Wir wollen zeigen, dass dieses Feld, das eine maximale Anzahl von Benutzern darstellen könnte, Daten im Anwendungsbereich sind, auf die alle Aktionen zugreifen können. Das werden wir mit der Aktion [Action1] demonstrieren.
17.2.2. Die Datei [struts.xml]
Die Hauptkonfigurationsdatei von Struts 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" />
<!-- spring integration -->
<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>
Nur Zeile 10 unterscheidet sich von früheren Versionen dieser Datei. Sie definiert eine Struts-Konstante. Von Spring instanziierte Objekte können in andere Objekte injiziert werden. Dies ist die Grundlage von Spring. Hier kann eine Referenz auf das von Spring erstellte [Config]-Objekt in Struts-Objekte injiziert werden. Hier kommt das Spring-Plugin für Struts 2 ins Spiel, das die Integration von Spring in Struts gewährleistet.
Zeile 10 gibt an, dass die Einbindung von Spring-Objekten in ein Struts-Objekt automatisch (Autowiring) anhand des Namens (oder Werts) erfolgt. Kehren wir nun zur Konfigurationsdatei [applicationContext.xml] zurück:
<!-- configuration des beans de portée application -->
<bean id="config" class="example.Config" >
<property name="nbMaxUsers" value="10"/>
</bean>
Was Struts 2 als Bean-Namen bezeichnet, ist hier eigentlich die ID. In diesem Fall heißt die instanziierte [Config]-Bean also config.
Die Aktion [Action1.java] sieht wie folgt aus:
package example;
import com.opensymphony.xwork2.ActionSupport;
...
public class Action1 extends ActionSupport implements SessionAware, RequestAware, ParameterAware {
// constructor without parameters
public Action1() {
}
// Session, Request, Parametres
private Map<String, Object> session;
private Map<String, Object> request;
private Map<String, String[]> parameters;
private Config config;
@Override
public String execute() {
....
// request
request.put("nbMaxUsers", config.getNbMaxUsers());
// display page JSP
return SUCCESS;
}
...
public Config getConfig() {
return config;
}
public void setConfig(Config config) {
this.config = config;
}
}
Die Aktion [Action1] ist identisch mit der in der vorherigen Anwendung, mit den folgenden geringfügigen Unterschieden:
- Zeile 15: Ein Konfigurationsfeld wurde hinzugefügt. Da es den Namen einer von Spring instanziierten Bean trägt, erhält dieses Feld automatisch eine Referenz auf dieses Objekt. Somit hat die Aktion Zugriff auf die Anwendungskonfiguration oder, allgemeiner gesagt, auf Daten im Anwendungsbereich.
- Zeile 31: Spring instanziiert das Konfigurationsfeld über dessen set-Methode. Es muss daher vorhanden sein.
- Zeile 21: Die Aktion greift auf Informationen im Anwendungsbereich zu. Wir fügen die maximale Anzahl von Benutzern, nbMaxUsers, in die Anfrage ein, damit die Ansicht [Context.jsp] diese anzeigen kann.
17.2.3. Die Datei [example.xml]
Die sekundäre Struts-Konfigurationsdatei ist identisch mit der der vorherigen Version:
<?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. Die Ansicht [Context.jsp]
Die Ansicht [Context.jsp] sieht wie folgt aus:
<%@ 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. Tests
Ein Beispiel für die Ausführung lautet wie folgt:

