成功整合spring和webwork

始終沒有搞明白在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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章