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

JPA(TopLink JPA)

h2.jar
jta-1.1.jar
persistence-1.0.jar
toplink-api-10.1.3.jar
toplink-essentials-2.0.0.b41.jar

Logger

log4j-1.2.14.jar


毎度のことながらSpringが依存してるJARとかわかりづらい。
やっぱりMavenを使ったりした方が楽になるのかなぁ…。

設定ファイル

/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は気が向いたらで。