[文件中]Struts與Spring整合

linweihan1984發表於2007-10-16

要將 Struts 與 Spring 整合,你有兩個選擇:

  • 配置 Spring 將 Action 作為 bean 託管,使用 ContextLoaderPlugin, 並且在 Spring context中設定依賴關係。

  • 繼承 Spring 的 ActionSupport 類並且 使用getWebApplicationContext() 方法獲取 Spring 管理的 bean。

15.4.1. ContextLoaderPlugin

ContextLoaderPlugin 是 Struts 1.1+ 的外掛,用來為 Struts 的 ActionServlet 載入 Spring context檔案。 這個context引用 WebApplicationContext (由 ContextLoaderListener 載入) 作為它的父類。預設的context檔案是對映的 Servlet 的名字,加上 -servlet.xml字尾。 如果 ActionServlet 在 web.xml 裡面的定義是 <servlet-name>action</servlet-name>, 那麼預設的檔案就是 /WEB-INF/action-servlet.xml

要配置這個外掛,請把下面的 XML 貼到 struts-config.xml 檔案中 plug-ins 部分的底端:

xml 程式碼
  1. <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>  

context配置檔案的位置可以通過 contextConfigLocation屬性來自定義。

xml 程式碼
  1. <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">  
  2.   <set-property property="contextConfigLocation"  
  3.       value="/WEB-INF/action-servlet.xml.xml,/WEB-INF/applicationContext.xml"/>  
  4. </plug-in>  

你也可以使用這個外掛載入所有的配置檔案,這在使用測試工具(例如 StrutsTestCase)的時候特別有用。 StrutsTestCase 的 MockStrutsTestCase 不會在啟動的時候初始化 Listener, 將你所有的配置檔案放在plug-in裡面是一種解決方案。(有個 已記錄的 bug 就是針對這個問題的,但是已經被標記為“無須改正”)。

struts-config.xml 中配置好外掛以後,你可以配置Sping來管理 Action。Spring (1.1.3以後的版本) 提供下面兩種方式:

  • 用 Spring 的DelegatingRequestProcessor過載 Struts 預設的 RequestProcessor

  • <action-mapping>type 屬性設為 DelegatingActionProxy

這兩種方法都允許你在 action-context.xml 檔案中管理你的 Action 以及依賴關係。 連線 struts-config.xmlaction-servlet.xml 中的 Action 的橋樑 是 action-mapping 的“path”和 bean 的“name”。如果你在 struts-config.xml 檔案中有如下配置:

xml 程式碼
  1. <action path="/users" .../>  

你必須在 action-servlet.xml 中將 Action bean 的名字定義為 “/users”:

xml 程式碼
  1. <bean name="/users" .../>  

15.4.1.1. DelegatingRequestProcessor

為了在 struts-config.xml 檔案中配置 DelegatingRequestProcessor,你需要過載 <controller> 元素的 “processorClass” 屬性。 下面的幾行應該放在 <action-mapping> 元素的後面。

xml 程式碼
  1. <controller>  
  2.   <set-property property="processorClass"  
  3.       value="org.springframework.web.struts.DelegatingRequestProcessor"/>  
  4. </controller>  

增加這些設定之後,不管你查詢任何型別的 Action,Sping都自動在它的context配置檔案中尋找。 實際上,你甚至不需要指定型別。下面兩個程式碼片斷都可以工作:

xml 程式碼
  1. <action path="/user" type="com.whatever.struts.UserAction"/>           
  2. <action path="/user"/>  

如果你使用 Struts 的 modules 特性,你的 bean 命名必須含有 module 的字首。 舉個例子,如果一個 Action 的定義為 <action path="/user"/>,而且它的 module 字首為“admin”, 那麼它應該對應名為 <bean name="/admin/user"/> 的 bean。

注意

如果你在 Struts 應用中使用了 Tiles,你需要配置 <controller> 為 DelegatingTilesRequestProcessor

15.4.1.2. DelegatingActionProxy

如果你有一個自定義的 RequestProcessor 並且不能夠使用 DelegatingRequestProcessor 或者 DelegatingTilesRequestProcessor,你可以使用 DelegatingActionProxy 作為你 action-mapping 中的型別。

xml 程式碼
  1. <action path="/user" type="org.springframework.web.struts.DelegatingActionProxy"  
  2.     name="userForm" scope="request" validate="false" parameter="method">  
  3.   <forward name="list" path="/userList.jsp"/>  
  4.   <forward name="edit" path="/userForm.jsp"/>  
  5. </action>  

action-servlet.xml 檔案中的bean定義依然不變,不管你使用了自定義的 RequestProcessor 還是 DelegatingActionProxy

如果你把 Action 定義在Spring的context檔案裡,那麼 Spring bean 容器的所有特性都可用了: 比如,依賴注入,再比如,為每個請求初始化一個新的 Action 例項。 如果要使用這個特性, Action bean 定義中需要宣告scope="prototype"

xml 程式碼
  1. <bean name="/user" scope="prototype" autowire="byName"  
  2.     class="org.example.web.UserAction"/>  

15.4.2. ActionSupport

正如前面提到的,你可以使用 WebApplicationContextUtils 類從 ServletContext 中獲得 WebApplicationContext 。 另一個簡單的辦法是繼承 Spring 的 Action 類。舉個例子,除了繼承 Struts 的 Action 之外,你也可以繼承 Spring 的 ActionSupport 類。

ActionSupport 類提供了一些便利的方法,例如 getWebApplicationContext()。 下面的例子展示瞭如何在 Action 中使用它:

public class UserAction extends DispatchActionSupport {

    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("entering 'delete' method...");
        }
        WebApplicationContext ctx = getWebApplicationContext();
        UserManager mgr = (UserManager) ctx.getBean("userManager");
        // talk to manager for business logic
        return mapping.findForward("success");
    }
}

Spring 包含了所有標準 Struts Action 的子類 - Spring 版本在類名末尾附加了 Support

相關文章