始終沒有搞明白在appfuse中是通過什麼方式將webwork和spring整合在一起的;
在webwork的wiki網站中提供了以下幾種方案:http://wiki.opensymphony.com/display/WW/WebWork+2+Spring+Integration
在關於xwork1.x的設想中(W1:Spring Framework Integration)提到過用以下的方式來實現webwork和spring的整合。
在webwork.properties 文件中添加如下配置:
webwork.action.factory=webwork.action.factory.SpringActionFactory
具體操作步驟:
方案1:
其實,在webwork2中(主要是xwork的功能),action類與其它對象的對應關係是在XWork系統的xwork.xml文件完成的,而不是在spring的applicationContext.xml文件中。如果是一個action類調用一個DAO,而不是向在applicationContext.xml一樣聲明一個Bean:
<bean id="myAction" class="com.ryandaigle.web.actions.MyAction" singleton="false">
<property name="DAO">
<ref bean="myDAO"/>
</property>
<bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" />
你可以將action的聲明放在xwork.xml中,而DAO仍舊在applicationContext.xml完成,這樣xwork.xml就變成:
<action name="myAction" class="com.ryandaigle.web.actions.MyAction">
<external-ref name="DAO">myDAO</external-ref>
<result name="success" type="dispatcher">
<param name="location">/success.jsp</param>
</result>
</action>
applicationContext.xml則變成:
<bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" />
請注意在xwork.xml的配置中由external-ref來指向一個由Spring聲明的對象;但是要想真正讓external-ref生效,還需要好幾項工作要做,這裏只是給大家一個初步的印象。
首先,下載文件http://www.ryandaigle.com/pebble/images/webwork2-spring.jar並添加到環境變量CLASSPATH中(或直接放在web項目的WEB-INF/lib/下);然後對xwork.xml文件進行修改:
<package name="default" extends="webwork-default"
externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
同時在xwork.xml中添加攔截器reference-resolver
<interceptors>
<interceptor name="reference-resolver" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
<interceptor-stack name="myDefaultWebStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="reference-resolver"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultWebStack"/>
最後別忘了在web.xml中添加一個偵聽類:
<listener>
<listener-class>com.atlassian.xwork.ext.ResolverSetupServletContextListener</listener-class>
</listener>
方案2:SpringObjectFactory
配置方法:
第一步.在spring的 applicationContext.xml (根據實際情況決定) 裏面定義你的action,例如
<bean name="some-action" class="fully.qualified.class.name" singleton="false">
<property name="someProperty"><ref bean="someOtherBean"/></property>
</bean>
可以看到,可以使用Spring的特性來給你的action設置屬性等,當然也可以使用Spring的攔截器等 (可以使用不一定等於推薦使用)
注意一定是singleton="false",因爲xwork的action是這樣要求的.
第二步.在xwork.xml裏定義你的action定義
<action name="myAction" class="some-action">
<result name="success">view.jsp</result>
</action>
第三步.要使上面的關聯生效,還要用我們的SpringObjectFactory來替換Xwork的默認ObjectFactory. 替換的方法有兩種供用戶選擇,一種是將SpringObjectFactoryListener添加到web.xml中,服務器啓動時對ObjectFactory重栽,另外一種是添加到Spring的配置文件,當系統加載spring配置文件時重栽;
A:修改web.xml
<!-- 必須加在 Spring ContextLoaderListener 的後面 -->
<listener>
<listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class>
</listener>
B. 添加到Spring的配置文件,例如
<bean id="spring-object-factory" class="com.opensymphony.xwork.spring.SpringObjectFactory"
init-method="initObjectFactory"/>
方案3:
最後一種對SpringObjectFactory進行重載的方法是ActionAutowiringInterceptor,通過這種攔截器的方式可以自動根據定義的匹配策略對Action進行匹配。使用這一方法的好處之一就是不用在spring的配置文件裏面去聲明action。
對xwork.xml配置:
<interceptors>
<interceptor name="autowire" class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor">
<param name="autowireStrategy">1</param>
</interceptor>
<interceptor-stack name="autowireDefault">
<interceptor-ref name="autowire"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
其中攔截器匹配策略autowireStrategy 是可選配置項,如果用戶沒有對此進行定義系統則默認根據名稱進行匹配。
最後別忘記在web.xml中添加如下配置:
<!-- 這個是spring的listener,可以改爲你的自定義的spring的Listenter -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>