Struts2+Springインプレッション
さっそく環境をこさえて実際に動かしてみた。
Spring2.5は最低限知ってるのでメインはStruts2の設定周りをメインに。
環境まわり
Eclipseのプラグインでtomcat launcher pluginとSpringIDEを。
H2はWindowsのサービスに登録してから、TomcatにDataSourceをJNDI登録。
といっても、今日はActionを作っただけだったりw
Struts2-blankを元にいぢる
Tomcatプロジェクトを作ってそこに必要なJARをコピー。
Struts2依存JAR
commons-logging-1.1.1.jar
struts2-core-2.0.11.1.jar
struts2-spring-plugin-2.0.11.1.jar
freemarker-2.3.8.jar
xwork-2.0.4.jar
ognl-2.6.11.jar
Spring依存JAR
spring-2.5.3.jar
aspectjrt-1.5.4.jar
aspectjweaver-1.5.4.jar
cglib-nodep-2.1_3.jar
Spring(DB Connection pool)関連
commons-collections-3.2.jar
commons-dbcp-1.2.2.jar
commons-pool-1.3.jar
設定ファイル
/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd "> <display-name>Struts2 Sample Web Application</display-name> <filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> </filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <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>
SpringのScope管理で「Request」「Session」を使いたいんでStruts2のフィルタより前に定義。
classpath:struts.xml
<?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> < !-- SpringFramework integration --> <constant name="struts.objectFactory" value="spring" /> < !-- 任意のアクションメソッドの実行許可する (default:false) --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> < !-- 開発モード (default:false) --> <constant name="struts.devMode" value="false" /> <include file="/struts2/sample/HelloWorld.xml"/> < !-- Add packages here --> </struts>
「struts.objectFactory」を「spring」にするとStruts2のInterceptorになにやら追加されるぽい。
classpath:HelloWorld.xml
<?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="Hello" extends="struts-default"> <action name="HelloWorld" method="display" class="helloWorld"> < !--interceptor-ref name="autowiring" /--> < !--interceptor-ref name="sessionAutowiring" /--> <result>/Hello/HelloWorld.jsp</result> </action> </package> </struts>
struts.xmlでSpring連携を有効にしてるので、Action定義のclassには後述のbean idを書く。
(interceptor-refは気にしない方向で^^;)
/WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <bean id="helloWorld" class="struts2.sample.HelloWorld" scope="request"> </bean> </beans>
お約束。
これだけであっさり連携できるとは。
Struts1のstruts-config.xmlよりいまのところ記述も少ないし簡単かも?
あと試してみたいのは、ActionにAOPをかましてみるのとSpringの@Autowiredも併用してみようかと。
JPAは気が向いたらで。