论坛首页 入门技术论坛

webwork和spring整合

浏览 1599 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-01  

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

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics