始终没有搞明白在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>