Struts+Spring整合3

linweihan1984發表於2007-10-15

struts與<nobr>spring</nobr>三種整合方法_3

分類:預設欄目

竅門 3. 將動作管理委託給 Spring

     一個更好的解決方法是將 Strut 動作管理委託給 Spring。您可以通過在 struts-config 動作對映中註冊一個代理來實現。代理負責在 Spring 環境中查詢 Struts 動作。由於動作在 Spring 的控制之下,所以它可以填充動作的 JavaBean 屬性,併為應用諸如 Spring 的 AOP 攔截器之類的特性帶來了可能。

清單 5 中的 Action 類與清單 4 中的相同。但是 struts-config 有一些不同:


清單 5. Spring 整合的委託方法

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="org.springframework.web.struts.DelegatingActionProxy" |(1)   
  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.  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">  
  31.       <set-property    
  32.       property="pathnames"    
  33.       value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>  
  34.  </plug-in>  
  35.  <plug-in    
  36.       className="org.springframework.web.struts.ContextLoaderPlugIn">  
  37.       <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>  
  38.  </plug-in>  
  39. </struts-config>  


 

      清單 5 是一個典型的 struts-config.xml 檔案,只有一個小小的差別。它註冊 Spring 代理類的名稱,而不是宣告動作的類名,如(1)處所示。DelegatingActionProxy 類使用動作對映名稱查詢 Spring 環境中的動作。這就是我們使用 ContextLoaderPlugIn 宣告的環境。

      將一個 Struts 動作註冊為一個 Spring bean 是非常直觀的,如清單 6 所示。我利用動作對映使用 <bean> 標記的名稱屬性(在這個例子中是 "/searchSubmit")簡單地建立了一個 bean。這個動作的 JavaBean 屬性像任何 Spring bean 一樣被填充:


清單 6. 在 Spring 環境中註冊一個 Struts 動作

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


動作委託的優點

     動作委託解決方法是這三種方法中最好的。Struts 動作不瞭解 Spring,不對程式碼作任何改變就可用於非 Spring 應用程式中。RequestProcessor 的改變不會影響它,並且它可以利用 Spring AOP 特性的優點。

      動作委託的優點不止如此。一旦讓 Spring 控制您的 Struts 動作,您就可以使用 Spring 給動作補充更強的活力。例如,沒有 Spring 的話,所有的 Struts 動作都必須是執行緒安全的。如果您設定 <bean> 標記的 singleton 屬性為“false”,那麼不管用何種方法,您的應用程式都將在每一個請求上有一個新生成的動作物件。您可能不需要這種特性,但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命週期方法。例如,當例項化 Struts 動作時,<bean> 標記的 init-method 屬性被用於執行一個方法。類似地,在從容器中刪除 bean 之前,destroy-method 屬性執行一個方法。這些方法是管理昂貴物件的好辦法,它們以一種與 Servlet 生命週期相同的方式進行管理。

攔截 Struts

     前面提到過,通過將 Struts 動作委託給 Spring 框架而整合 Struts 和 Spring 的一個主要的優點是:您可以將 Spring 的 AOP 攔截器應用於您的 Struts 動作。通過將 Spring 攔截器應用於 Struts 動作,您可以用最小的代價處理橫切關注點。

     雖然 Spring 提供很多內建攔截器,但是我將向您展示如何建立自己的攔截器並把它應用於一個 Struts 動作。為了使用攔截器,您需要做三件事:

  1. 建立攔截器。
  2. 註冊攔截器。
  3. 宣告在何處攔截程式碼。

     這看起來非常簡單的幾句話卻非常強大。例如,在清單 7 中,我為 Struts 動作建立了一個日誌記錄攔截器。 這個攔截器在每個方法呼叫之前列印一句話:


清單 7. 一個簡單的日誌記錄攔截器



     這個攔截器非常簡單。before() 方法在攔截點中每個方法之前執行。在本例中,它列印出一句話,其實它可以做您想做的任何事。下一步就是在 Spring 配置檔案中註冊這個攔截器,如清單 8 所示:


清單 8. 在 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">  
  8.       <property name="bookService">  
  9.          <ref bean="bookService"/>  
  10.       </property>  
  11.    </bean>  
  12.    <!--   Interceptors -->    
  13.    <bean name="logger"        
  14.      class="ca.nexcel.books.interceptors.LoggingInterceptor"/> |(1)   
  15.    <!-- AutoProxies -->  
  16.    <bean name="loggingAutoProxy"    
  17.          class="org.springframework.aop.framework.autoproxy.   
  18.            BeanNameAutoProxyCreator"> |(2)   
  19.      <property name="beanNames">  
  20.            <value>/searchSubmit</valuesgt; |(3)   
  21.      </property>  
  22.      <property name="interceptorNames">  
  23.          <list>  
  24.            <value>logger</value> |(4)   
  25.          </list>  
  26.      </property>  
  27.     </bean>  
  28. </beans>  
  29.         


您可能已經注意到了,清單 8 擴充套件了 清單 6 中所示的應用程式以包含一個攔截器。具體細節如下:

  • 在 (1) 處,我註冊了這個攔截器。
  • 在 (2) 處,我建立了一個 bean 名稱自動代理,它描述如何應用攔截器。還有其他的方法定義攔截點,但是這種方法常見而簡便。
  • 在 (3) 處,我將 Struts 動作註冊為將被攔截的 bean。如果您想要攔截其他的 Struts 動作,則只需要在 "beanNames" 下面建立附加的 <value> 標記。
  • 在 (4) 處,當攔截髮生時,我執行了在 (1) 處建立的攔截器 bean 的名稱。這裡列出的所有攔截器都應用於“beanNames”。

     就是這樣。就像這個例子所展示的,將您的 Struts 動作置於 Spring 框架的控制之下,為處理您的 Struts 應用程式提供了一系列全新的選擇。在本例中,使用動作委託可以輕鬆地利用 Spring 攔截器提高 Struts 應用程式中的日誌記錄能力。

結束語

     在本文中,您已經學習了將 Struts 動作整合到 Spring 框架中的三種竅門。使用 Spring 的 ActionSupport 來整合 Struts(第一種竅門中就是這樣做的)簡單而快捷,但是會將 Struts 動作與 Spring 框架耦合在一起。如果您需要將應用程式移植到一個不同的框架,則需要重寫程式碼。第二種解決方法通過委託 RequestProcessor 巧妙地解開程式碼的耦合,但是它的可擴充套件性不強,並且當 Struts 的 RequestProcessor 變成一系列命令時,這種方法就持續不了很長時間。第三種方法是這三種方法中最好的:將 Struts 動作委託給 Spring 框架可以使程式碼解耦,從而使您可以在您的 Struts 應用程式中利用 Spring 的特性(比如日誌記錄攔截器)。

三種 Struts-Spring 整合竅門中的每一種都被實現成一個完整可用的應用程式

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

相關文章