Struts2+Spring整合後Action物件建立方式

StackFlow發表於2018-02-04

1、Spring容器建立:(web.xml中配置)

Xml程式碼  收藏程式碼
  1. <!-- spring配置檔案-->  
  2.     <context-param>  
  3.         <param-name>contextConfigLocation</param-name>  
  4.         <param-value>WEB-INF/classes/com/zjy/gpx/config/applicationContext*.xml</param-value>      
  5.     </context-param>  
  6.     <!-- Spring監聽器,隨web應用啟動初始化Spring容器  -->  
  7.     <listener>  
  8.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  9.     </listener>  

 2、action建立的兩種方式,第一種由Spring負責管理:

 

struts.xml檔案中

Xml程式碼  收藏程式碼
  1. <!-- spring來管理action物件的建立 -->  
  2.     <constant name="struts.objectFactory" value="spring" />  
  3.   
  4. <!-- 省,市,縣地區選擇 -->  
  5.         <action name="city_*" class="coreCityAction" method="{1}">  
  6.             <result name="success">/success.jsp</result>  
  7.             <result name="error">/error.jsp</result>  
  8.         </action>  

applicationContext檔案中:

Xml程式碼  收藏程式碼
  1. <bean id="coreCityAction" class="com.zjy.gpx.struts.CoreCityAction">  
  2.         <property name="coreCityService" ref="coreCityService" />  
  3.     </bean>  

 

這裡是通過Spring來負責建立Action物件,這個工作是通過Struts2提供的Spring外掛struts-spring-plugin完成的,外掛文件地址:http://struts.apache.org/release/2.0.x/docs/spring-plugin.html

 

struts.xml檔案中action配置的class屬性對應spring配置檔案中Bean的id名,當struts2將請求轉發給指定的Action時,struts.xml中的Action就是個“偽”Action,因為它的class屬性不是一個真實的類,而它指定的是spring容器中Action例項的id。

 

注意:由Spring負責建立action物件的時候一般要加上scope屬性,比如:scope = "prototype",因為spring預設生成的Bean是單例的,而struts2負責生成的action是多例的,每個action值棧中都對應一個請求存放不同的區域性變數,所以這裡需要加上scope屬性。

 

這種方式不足之處:必須把所有action配置在spring中,而且struts.xml還要寫生一個偽action,導致配置檔案臃腫;

 

 3、第二種方式:Spring的自動裝配,Action會自動從Spring容器中獲取邏輯層元件(service)

 

struts.xml檔案(和未整合前一致)

Xml程式碼  收藏程式碼
  1. <action name="relogin" class="com.xxt.user.action.LoginAction">  
  2.             <result name="input" type="freemarker">/login/index.ftl</result>  
  3.             <result name="error" type="freemarker">/error.ftl</result>  
  4.         </action>  

 applicationContext檔案中:(一個簡單的Bean)

Xml程式碼  收藏程式碼
  1. <bean id="loginService"  
  2.         class="com.xxt.user.service.impl.LoginServiceImpl">  
  3.         <property name="dbs" ref="dbs"></property>  
  4.     </bean>  

 

action方法中有LoginServiceImpl loginService = null;然後setter()方法。

基本流程是這樣的,這種情況還是由Struts2自己建立Action物件,建立後的物件會去Spring容器中尋找它成員變數對應的Bean,預設的自動裝配策略是按照名字來匹配的。

 

通過設定struts.objectFactory.spring.autoWire常量來改變Spring裝配策略。幾個常用的值:

name、type、auto、constructor,這個和Spring自身的轉配策略是相同的。

 

這種方式優點:struts.xml檔案和未整合前是一致的,主要是要在spring配置檔案中定義邏輯層的Bean,相比前一種好處就是簡化配置檔案。

缺點:如果採用預設自動裝配策略,action類中的成員變數名要和spring中Bean id名保持一致,且程式碼可讀性差些。

相關文章