[文件中]Struts與Spring整合
要將 Struts 與 Spring 整合,你有兩個選擇:
-
配置 Spring 將 Action 作為 bean 託管,使用
ContextLoaderPlugin
, 並且在 Spring context中設定依賴關係。 -
繼承 Spring 的
ActionSupport
類並且 使用getWebApplicationContext() 方法獲取 Spring 管理的 bean。
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 部分的底端:
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
context配置檔案的位置可以通過 contextConfigLocation
屬性來自定義。
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation"
- value="/WEB-INF/action-servlet.xml.xml,/WEB-INF/applicationContext.xml"/>
- </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.xml 和 action-servlet.xml 中的 Action 的橋樑 是 action-mapping 的“path”和 bean 的“name”。如果你在 struts-config.xml 檔案中有如下配置:
- <action path="/users" .../>
你必須在 action-servlet.xml 中將 Action bean 的名字定義為 “/users”:
- <bean name="/users" .../>
為了在 struts-config.xml 檔案中配置 DelegatingRequestProcessor
,你需要過載 <controller> 元素的 “processorClass” 屬性。 下面的幾行應該放在 <action-mapping> 元素的後面。
- <controller>
- <set-property property="processorClass"
- value="org.springframework.web.struts.DelegatingRequestProcessor"/>
- </controller>
增加這些設定之後,不管你查詢任何型別的 Action,Sping都自動在它的context配置檔案中尋找。 實際上,你甚至不需要指定型別。下面兩個程式碼片斷都可以工作:
- <action path="/user" type="com.whatever.struts.UserAction"/>
- <action path="/user"/>
如果你使用 Struts 的 modules 特性,你的 bean 命名必須含有 module 的字首。 舉個例子,如果一個 Action 的定義為 <action path="/user"/>
,而且它的 module 字首為“admin”, 那麼它應該對應名為 <bean name="/admin/user"/>
的 bean。
注意
如果你在 Struts 應用中使用了 Tiles,你需要配置 <controller> 為 DelegatingTilesRequestProcessor
。
如果你有一個自定義的 RequestProcessor
並且不能夠使用 DelegatingRequestProcessor
或者 DelegatingTilesRequestProcessor
,你可以使用 DelegatingActionProxy
作為你 action-mapping 中的型別。
- <action path="/user" type="org.springframework.web.struts.DelegatingActionProxy"
- name="userForm" scope="request" validate="false" parameter="method">
- <forward name="list" path="/userList.jsp"/>
- <forward name="edit" path="/userForm.jsp"/>
- </action>
action-servlet.xml 檔案中的bean定義依然不變,不管你使用了自定義的 RequestProcessor
還是 DelegatingActionProxy
。
如果你把 Action
定義在Spring的context檔案裡,那麼 Spring bean 容器的所有特性都可用了: 比如,依賴注入,再比如,為每個請求初始化一個新的 Action
例項。 如果要使用這個特性, Action bean 定義中需要宣告scope="prototype"。
- <bean name="/user" scope="prototype" autowire="byName"
- class="org.example.web.UserAction"/>
正如前面提到的,你可以使用 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:
相關文章
- struts與Spring整合Spring
- struts與spring 的整合Spring
- Struts2【與Spring整合】Spring
- Struts 和Spring ioc 整合Spring
- spring整合struts2Spring
- Struts+Spring整合3Spring
- [我]Struts+Spring整合Spring
- spring整合struts2(續)Spring
- [我]Struts+Spring的整合Spring
- mybatis+spring+struts2框架整合MyBatisSpring框架
- [摘]Struts+Spring+Hibernate整合Spring
- 使用 Spring 更好地處理 Struts 動作----三種整合 Struts 應用程式與 Spring 的方式Spring
- [求助] STRUTS2和SPRING整合問題Spring
- spring json dwr struts2.0 hibernate整合SpringJSON
- Spring Boot 3中將JWT與Spring Security 6整合Spring BootJWT
- Struts1.x Spring2.x Hibernate3.x DWR2.x 整合工具文件Spring
- Struts2+Spring整合後Action物件建立方式Spring物件
- SSH開發實踐part4:Spring整合StrutsSpring
- struts+hibernate+spring 整合中出現的問題Spring
- Struts2+hibernate+spring配置程式整合下載Spring
- Spring與ActiveMQ整合SpringMQ
- spring與redis整合SpringRedis
- Mybatis與Spring整合MyBatisSpring
- Spring與Hibernate整合中的session問題SpringSession
- spring:spring與mybatis的整合SpringMyBatis
- 框架(Spring、Struts2和Hibernate三者)整合框架Spring
- ElasticSearch與Spring Boot整合ElasticsearchSpring Boot
- 【RabbitMQ】RabbitMQ與Spring整合MQSpring
- CAS與Spring的整合Spring
- Spring Boot 整合 Swagger 構建介面文件Spring BootSwagger
- Unit08: Spring與MyBatis整合 、 Spring整合MyBatis應用SpringMyBatis
- Spring AI與大模型Ollama如何整合整合?SpringAI大模型
- Solr與Spring Boot整合 - ViithiisysSolrSpring Boot
- Spring與Web環境整合SpringWeb
- Spring Cache與Ehcache 3整合Spring
- 將Flex與Spring框架整合FlexSpring框架
- spring-boot-route(六)整合JApiDocs生成介面文件SpringbootAPI
- spring-boot-route(五)整合Swagger生成介面文件SpringbootSwagger