Strurs+Spring整合2

linweihan1984發表於2007-10-15

struts與spring三種整合方法_2

分類:預設欄目

竅門 2. 覆蓋 RequestProcessor

       將 Spring 從 Struts 動作中分離是一個更巧妙的設計選擇。分離的一種方法是使用 org.springframework.web.struts.DelegatingRequestProcessor 類來覆蓋 Struts 的 RequestProcessor 處理程式,如清單 2 所示:


清單 2. 通過 Spring 的 DelegatingRequestProcessor 進行整合

xml 程式碼
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2. <!DOCTYPE struts-config PUBLIC   
  3.             "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"   
  4.             "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">  
  5. <struts-config>  
  6.  <form-beans>  
  7.       <form-bean name="searchForm"    
  8.         type="org.apache.struts.validator.DynaValidatorForm">  
  9.                  <form-property name="isbn"      type="java.lang.String"/>  
  10.       </form-bean>  
  11.     </form-beans>  
  12.  <global-forwards type="org.apache.struts.action.ActionForward">  
  13.        <forward     name="welcome"                  path="/welcome.do"/>  
  14.        <forward     name="searchEntry"              path="/searchEntry.do"/>  
  15.        <forward     name="searchSubmit"             path="/searchSubmit.do"/>  
  16.  </global-forwards>  
  17.  <action-mappings>  
  18.       <action      path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>  
  19.       <action      path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>  
  20.       <action      path="/searchSubmit"    
  21.                  type="ca.nexcel.books.actions.SearchSubmit"  
  22.                  input="/searchEntry.do"  
  23.                  validate="true"  
  24.                  name="searchForm">  
  25.                 <forward name="success" path="/WEB-INF/pages/detail.jsp"/>  
  26.                 <forward name="failure" path="/WEB-INF/pages/search.jsp"/>  
  27.       </action>       
  28.  </action-mappings>  
  29.  <message-resources parameter="ApplicationResources"/>  
  30.  <controller processorClass="org.springframework.web.struts.   
  31.      DelegatingRequestProcessor"/> |(1)   
  32.  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">  
  33.       <set-property property="pathnames"    
  34.         value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>  
  35.  </plug-in>  
  36.  <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">  
  37.       <set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml"/>  
  38.  </plug-in>  
  39. </struts-config>  
  40.         


      我利用了 <controller> 標記來用 DelegatingRequestProcessor 覆蓋預設的 Struts RequestProcessor。下一步是在我的 Spring 配置檔案中註冊該動作,如清單 3 所示:


清單 3. 在 Spring 配置檔案中註冊一個動作

xml 程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"    
  3.     "http://www.springframework.org/dtd/spring-beans.dtd">  
  4. <beans>  
  5.     <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>  
  6.     <bean name="/searchSubmit"    
  7.       class="ca.nexcel.books.actions.SearchSubmit"> |(1)   
  8.        <property name="bookService">  
  9.           <ref bean="bookService"/>  
  10.        </property>  
  11.     </bean>  
  12. </beans>  
  13.         


      注意:在 (1) 處,我使用名稱屬性註冊了一個 bean,以匹配 struts-config 動作對映名稱。SearchSubmit 動作揭示了一個 JavaBean 屬性,允許 Spring 在執行時填充屬性,如清單 4 所示:


清單 4. 具有 JavaBean 屬性的 Struts 動作



      在清單 4 中,您可以瞭解到如何建立 Struts 動作。在 (1) 處,我建立了一個 JavaBean 屬性。DelegatingRequestProcessor自動地配置這種屬性。這種設計使 Struts 動作並不知道它正被 Spring 管理,並且使您能夠利用 Sping 的動作管理框架的所有優點。由於您的 Struts 動作注意不到 Spring 的存在,所以您不需要重寫您的 Struts 程式碼就可以使用其他控制反轉容器來替換掉 Spring。

    DelegatingRequestProcessor 方法的確比第一種方法好,但是仍然存在一些問題。如果您使用一個不同的 RequestProcessor,則需要手動整合 Spring 的 DelegatingRequestProcessor。新增的程式碼會造成維護的麻煩並且將來會降低您的應用程式的靈活性。此外,還有過一些使用一系列命令來代替 Struts RequestProcessor 的傳聞。 這種改變將會對這種解決方法的使用壽命造成負面的影響。

你可以通過這個連結引用該篇文章:http://pearlkeeper.bokee.com/tb.b?diaryId=15898726

相關文章