17. Örnek 15 – Struts 2 / Spring Entegrasyonu
Önceki örnekte, tüm kullanıcıların tüm istekleri tarafından paylaşılan Application kapsamındaki verilerimiz yoktu. Burada bunun bir örneğini göstereceğiz. Bunu uygulamak için Spring [http://www.springsource.org/] çerçevesini kullanıyoruz. Spring, çok değerli bir araçtır. Bu örnekte, Spring’in sadece çok küçük bir kısmını gösteriyoruz. İleride vereceğimiz bir örnekte Spring’i daha kapsamlı bir şekilde kullanacağız.
Bu uygulamanın amacı, Application menzil verilerini görüntülemektir.
17.1. NetBeans projesi
Uygulamanın NetBeans projesi şöyledir:
![]() |
- [1]'te:
- Web uygulamasını yapılandıran [web.xml] dosyası, önceki sürümlerdeki haline göre değişiklik gösterecektir
- [applicationContext.xml], Spring'in yapılandırma dosyasıdır
- [2]: Uygulama kapsamındaki verileri görüntüleyecek olan [Context.JSP] görünümü
- [3]:
- [messages.properties] mesaj dosyası
- Struts'un ana yapılandırma dosyası [struts.xml]. Önceki uygulamalara göre değişiklik gösterecektir.
- [4]'te:
- Struts eylemi [Action1.java]
- uygulama kapsamındaki verileri depolayacak olan [Config.java] sınıfı
- Struts'un ikincil yapılandırma dosyası [example.xml]
- [5] içinde: Struts 2 kütüphanesi
- [6]'te:
- Spring için gerekli arşivler: [spring-core, spring-context, spring-beans, spring-web, commons-logging]
- Struts 2 için Spring eklentisinin arşivi. Spring'in Struts 2 ile entegrasyonunu sağlar [struts2-spring-plugin]
Önceki sürümlerle karşılaştırıldığında:
- projeye arşivler eklenmelidir
- [web.xml] ve [struts.xml] dosyalarını düzenlemek gerekir
17.2. Configuration
17.2.1. [web.xml] dosyası
[web.xml] dosyası şu şekilde güncellenmiştir:
<?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>
Değişiklik 12-14. satırlarda gerçekleşir. Web uygulamasına bir listener dosyası eklenir. Web uygulaması başlatıldığında, bu listener dosyasını uygulayan sınıfın bir örneği oluşturulur. Bu bir Spring sınıfıdır. Bu sınıf, [WEB-INF/applicationContext.xml] dosyasını kullanacaktır. Dosya içeriği şöyledir:
<?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">
<!-- uygulama kapsamındaki bean yapılandırması -->
<bean id="config" class="example.Config" >
<property name="nbMaxUsers" value="10"/>
</bean>
</beans>
- Spring yapılandırma dosyası, kök etiket olarak <beans>'i içerir (2. ve 11. satırlar). beans ifadesini "nesneler" olarak çevirebiliriz. Spring, bu yapılandırma dosyasında bulunan tüm nesneleri (bean) örneklendirecektir. Bunu, web uygulaması başlatıldığında Spring listener çalıştırıldığında yalnızca bir kez yapar.
- 7-9. satırlar: config (id) adlı bir bean tanımlar. Bu yapılandırma bean’ı, class sınıfıyla ilişkilendirilir. Spring bu sınıfın bir örneğini oluşturacaktır.
- 8. satır: [example.Config] sınıfının bir özelliğini tanımlar. Spring, [example.Config].setNbMaxUsers(10) yöntemini çağıracaktır. Bu nedenle, setNbMaxUsers yönteminin sınıfta mevcut olması gerekir. Bu yöntem şöyledir:
package example;
public class Config {
private int nbMaxUsers;
public int getNbMaxUsers() {
return nbMaxUsers;
}
public void setNbMaxUsers(int nbMaxUsers) {
this.nbMaxUsers = nbMaxUsers;
}
}
Bu sınıf, nbMaxUsers alanını, get ve set ile birlikte tanımlamaktadır. Söylenenleri doğru bir şekilde takip ettiysek, web uygulamasının başlatılması sırasında, [Config] sınıfının bir örneği, nbMaxUsers alanı için 10 değeri ile oluşturulur. Sadece tek bir alan tanımladık, ancak bu, örneğimiz için yeterlidir. Maksimum kullanıcı sayısını temsil edebilecek bu alanın, tüm eylemler tarafından erişilebilen Application kapsamındaki bir veri olduğunu göstermek istiyoruz. Bunu, [Action1] eylemiyle göstereceğiz.
17.2.2. [struts.xml] dosyası
Struts’un ana yapılandırma dosyası şöyledir:
<?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>
<!-- uluslararasılaştırma -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- Spring entegrasyonu -->
<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>
Bu dosyanın önceki sürümlerinden yalnızca 10. satır farklıdır. Bu satır, bir Struts sabitini tanımlar. Spring tarafından örneklendirilen nesneler, diğer nesnelere enjekte edilebilir. Bu, Spring'in temelini oluşturur. Burada, Spring tarafından oluşturulan [Config] türündeki nesneye yapılan bir referans, Struts nesnelerine enjekte edilebilecektir. İşte burada, Struts 2 için Spring eklentisi devreye girer ve Spring'in Struts ile entegrasyonunu sağlar.
- satır, Spring nesnelerinin bir Struts nesnesine (autowire) ad (value) yoluyla otomatik olarak enjekte edileceğini belirtir. [applicationContext.xml] yapılandırma dosyasına geri dönelim:
<!-- uygulama kapsamındaki bean'lerin yapılandırılması -->
<bean id="config" class="example.Config" >
<property name="nbMaxUsers" value="10"/>
</bean>
Struts 2'nin bean adı olarak adlandırdığı şey, burada aslında id'tir. Dolayısıyla burada, örneklendirilen [Config] türündeki bean'in adı config'tir.
[Action1.java] eylemi şöyledir:
package example;
import com.opensymphony.xwork2.ActionSupport;
...
public class Action1 extends ActionSupport implements SessionAware, RequestAware, ParameterAware {
// parametresiz oluşturucu
public Action1() {
}
// Oturum, İstek, Parametreler
private Map<String, Object> session;
private Map<String, Object> request;
private Map<String, String[]> parameters;
private Config config;
@Override
public String execute() {
....
// istek
request.put("nbMaxUsers", config.getNbMaxUsers());
// sayfa görüntüleme JSP
return SUCCESS;
}
...
public Config getConfig() {
return config;
}
public void setConfig(Config config) {
this.config = config;
}
}
[Action1] eylemi, aşağıdaki ayrıntılar dışında önceki uygulamadaki ile aynıdır:
- 15. satır: config adlı bir alan eklenmiştir. Bu alan, Spring tarafından örneklendirilen bir bean’in adını taşıdığı için, bu nesneye ait bir referans otomatik olarak bu alana atanacaktır. Böylelikle eylem, uygulama yapılandırmasına veya daha genel olarak Application kapsamındaki verilere erişebilir.
- 31. satır: Spring, config alanını set yöntemi aracılığıyla örneklendirecektir. Dolayısıyla bu yöntemin mevcut olması gerekir.
- 21. satır: Eylem, Application kapsamındaki bilgilere erişir. nbMaxUsers sorgusuna maksimum kullanıcı sayısını ekliyoruz, böylece [Context.JSP] görünümü bunu görüntüleyebilir.
17.2.3. [example.xml] dosyası
Struts’un ikincil yapılandırma dosyası, önceki sürümdekiyle aynıdır:
<?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. [Context.JSP] görünümü
[Context.JSP] görünümü şöyledir:
<%@ 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. Testler
Bir yürütme örneği şöyledir:
![]() |

