struts與spring 的整合

linweihan1984發表於2007-10-19

Struts與Spring整合方法之一- -

                                      

 

   最近用Struts,Spring做了一個程式,看了很多這方面的資料和程式碼。這篇是對Struts和Spring協同工作所需要做的工作的總結。

   Struts和Spring協同工作有兩種方法:
1.   一種是在Struts的Action中直接呼叫Spring的Bean;(就是原來一個路徑對一個action的方法)

2.  另一種方式是將Struts的Action作為Spring Beans,由Spring進行管理。


要使StrutsSpring協同工作需要修改Struts的配置檔案struts-config.xmlSpring的配置檔案applicationContext.xml

修改struts-config.xml

xml 程式碼
  1. <struts-config>  
  2.   
  3. <plug-in  
  4.   
  5. className="org.springframework.web.struts.ContextLoaderPlugIn">  
  6.   
  7. <set-property property="contextConfigLocation"  
  8.   
  9. value="/WEB-INF/applicationContext.xml" />  
  10.   
  11. </plug-in>  
  12.   
  13. </struts-config>  

通過

xml 程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts    
  4.   
  5.   Configuration 1.2//EN"    
  6.   
  7.   "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">  
  8.   
  9. <struts-config>  
  10.   
  11.   <!-- ================ Form Bean Definitions ================-->  
  12.   
  13.   <form-beans>  
  14.   
  15.       <form-bean name="userForm"    
  16.   
  17.           type="org.apache.struts.validator.DynaValidatorForm">  
  18.   
  19.           <form-property name="user" type="org.appfuse.model.User"/>  
  20.   
  21.       </form-bean>  
  22.   
  23.   </form-beans>  
  24.   
  25.   <!-- ================ Action Mapping Definitions ================-->  
  26.   
  27.   <action-mappings>  
  28.   
  29.       <action path="/user"    
  30.   
  31.           type="org.springframework.web.struts.DelegatingActionProxy"    
  32.   
  33.           name="userForm" scope="request" parameter="method" validate="false">  
  34.   
  35.           <forward name="list" path="/userList.jsp"/>  
  36.   
  37.           <forward name="edit" path="/userForm.jsp"/>  
  38.   
  39.       </action>  
  40.   
  41.   </action-mappings>  
  42.   
  43. <!--  <action-mappings>  
  44.   
  45.       <action path="/user"    
  46.   
  47.           type="com.ctbr.springtest.web.action.UserAction"    
  48.   
  49.           name="userForm" scope="request" parameter="method" validate="false">  
  50.   
  51.           <forward name="list" path="/userList.jsp"/>  
  52.   
  53.           <forward name="edit" path="/userForm.jsp"/>  
  54.   
  55.       </action>  
  56.   
  57.   </action-mappings>-->  
  58.   
  59.   <!-- ================= Plug Ins Configuration ================-->  
  60.   
  61.   <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">  
  62.   
  63.       <set-property property="contextConfigLocation"    
  64.   
  65.           value="/WEB-INF/applicationContext.xml,   
  66.   
  67.                    /WEB-INF/action-servlet.xml"/>  
  68.   
  69.   </plug-in>  
  70.   
  71. </struts-config>  

Action配置上也需要做修改,

我們試圖在action-mapping 中增加一個名為userFormAction,傳統方式中,直接將類名作為action節點的type屬性,Struts將根據type中的類名載入對應的Action例項。

而在面向SS組合的配置方式中,我們用Spring提供的DelegatingActionProxy 作為Actiontype屬性。DelegatingActionProxy同樣是org.apache.struts.action.Action的一個子類,它將把呼叫請求轉交給真正的Action實現。下面是DelegatingActionProxyexecute方法程式碼:

public ActionForward execute(

ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response)

throws Exception {

//獲得實際的Action例項,並將請求轉交

Action delegateAction = getDelegateAction(mapping);

return delegateAction.execute(mapping, form, request, response);

}

如此一來,Struts 在執行期載入的實際上是DelegatingActionProxy , 而DelegatingActionProxy則實現了針對實際Action的呼叫代理,Struts最終呼叫的將是由Spring管理的Action例項。

通過這樣的方式,Spring 獲得了對Action 例項的管理權,它將對Action進行排程,併為Struts提供所需的Action例項。既然Action已經由Spring全權接管,那麼我們就可以將此Action看作是Spring中的一個Bean,它可享受Spring提供的所有服務(依賴注入、例項管理、事務管理等)。

與之對應,Spring Context配置如下:

applicationContext.xml:

xml 程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"    
  4.   
  5.   "http://www.springframework.org/dtd/spring-beans.dtd">  
  6.   
  7.         <!--    資料來源配置    -->  
  8.   
  9. <beans>  
  10.   
  11.   <bean id="dataSource"    
  12.   
  13.       class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  14.   
  15.       <property name="driverClassName">  
  16.   
  17.           <value>com.mysql.jdbc.Driver</value>  
  18.   
  19.       </property>  
  20.   
  21.       <property name="url">  
  22.   
  23.           <value>jdbc:mysql://localhost:3306/bbs</value>  
  24.   
  25.       </property>  
  26.   
  27.       <property name="username">  
  28.   
  29.           <value>bao</value>  
  30.   
  31.       </property>  
  32.   
  33.       <property name="password">  
  34.   
  35.           <value>double</value>  
  36.   
  37.       </property>  
  38.   
  39.   </bean>  
  40.   
  41.     <!--      DAO配置     -->  
  42.   
  43.   <bean id="userDao" class="com.ctbr.springtest.dao.jdbc.UserDaoJdbc">  
  44.   
  45.       <property name="dataSource">  
  46.   
  47.           <ref bean="dataSource"/>  
  48.   
  49.       </property>  
  50.   
  51.   </bean>  
  52.   
  53.   <bean id="postDao" class="com.ctbr.springtest.dao.jdbc.PostDaoJdbc">  
  54.   
  55.       <property name="dataSource">  
  56.   
  57.           <ref bean="dataSource"/>  
  58.   
  59.       </property>  
  60.   
  61.   </bean>  
  62.   
  63.   <!--    <bean id="replyDAO" class="com.ctbr.springtest.dao.jdbc.ReplyDaoJdbc">  
  64.   
  65.       <property name="postDao">  
  66.   
  67.           <ref bean="postDAO" />  
  68.   
  69.       </property>  
  70.   
  71.   </bean>  
  72.   
  73.   -->  
  74.   
  75.   <!--        Service配置         -->  
  76.   
  77.   <bean id="userService"    
  78.   
  79.       class="com.ctbr.springtest.service.impl.UserServiceImpl"    
  80.   
  81.       autowire="byType" />  
  82.   
  83.   <bean id="postService"    
  84.   
  85.       class="com.ctbr.springtest.service.impl.PostServiceImpl">  
  86.   
  87.       <!--    <property name="replyDao">  
  88.   
  89.           <ref bean="replyDao" />  
  90.   
  91.       </property>-->  
  92.   
  93.   </bean>  
  94.   
  95. <!--      Action配置      -->  
  96.   
  97.   <bean name="/user" class="com.ctbr.springtest.web.action.UserAction"    
  98.   
  99.       singleton="false">  
  100.   
  101.       <property name="userService">  
  102.   
  103.           <ref bean="userService"/>  
  104.   
  105.       </property>  
  106.   
  107.   </bean>  
  108.   
  109. </beans>  
上面的action-mapping配置中包含了loginForm的兩種配置形式,第一種是面向改造後的形式,第二種(作為註釋)是與之對應的傳統Struts配置方式。plug-in我們實現了Spring Context的載入,我們還需要修改配置,將Struts Action交給Spring容器進行管理:

相關文章