Spring IoC容器管理Action
Spring IoC容器管理Action有兩種方式:DelegatingRequestProcessor、DelegatingActionProxy
不管采用哪一種方式,都需要隨應用啟動時創建ApplicationContext實例,由Struts負責在應用啟動時創建ApplicationContext實例。Struts中提供了PlugIn的擴展點,可在應用啟動和關閉時,創建或銷毀某些資源。
使用ContextLoaderPluIn創建了ApplicationContext實例後,關鍵是如何將AtionServlet攔截的請求,轉發給Spring管理的bean。
ActionServlet將請求轉發到Spring容器,有以下兩個時機:在ActionServlet之處將處理轉發給Spring容器中的bean、在Action之處將處理轉發給Spring容器中的bean。
根據這兩個時機,完成這個轉發也有以下兩種策略:采用DelegatingRequestProcessor,在ActionServlet出完成轉發、采用DelegatingActionProxy,在Action出完成轉發。
查看 Struts 的源代碼,我們可以看到由 ActionServlet 調用 RequestProcessor 完成實 際的轉發。如想在 ActionServlet 處將請求轉發給 ApplicationContext 的 bean ,可以通過 擴展 RequestProcessor 完成,使用擴展的 RequestProcessor 替換 Struts 的 RequestProcessor ,例如:
//使用 spring 的 RequestProcessor 替換 struts 原有的 RequestProcessor
<controller processorClass="org.springframework.web.struts.Delegating RequestProcessor"/>
DelegatingRequestProcessor 可直接替換了原有的 RequestProcessor,並在請求轉發給 action 之前,轉發給 Spring 管理的 bean; 而 DelegatingActionProxy 則被配置成 Struts 的 action,即所有的請求先被 ActionServlet 攔截,然後將請求轉發到對應的 action,而 action 的實現類全都是 DelegatingActionProxy; 最後由 DelegatingActionProxy 將請求轉發給 Spring 容器的 bean。
Spring IoC容器管理Action