詳細分析spring與struts2的整合原理
spring與struts2如何整合:
- 1). 整合目標 ? 使 IOC 容器來管理 Struts2 的 Action!
- 2). 如何進行整合 ?
1. 正常匯入入 Struts2與spring包之後 還需要一個額外的包:
struts2-spring-plugin-2.3.3.jar
2 .在 Spring 的 IOC 容器中配置 Struts2 的 Action.即在 IOC 容器中配置 Struts2 的 Action。
這時注意一個問題:spring IOC容器中的bean預設是單例的,而如果struts2的Action是多例的,在裝配Action時注意設定scope。
修改web.xml為:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Spring/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class >
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern >/*</url-pattern>
</filter-mapping>
這樣在宣告Action例項時只需要指向在IOC容器中的id即可。
如上就是Spring與Struts2的整合,非常簡單。現在我們來分析原理。
spring與struts2整合原理:
通過新增 struts2-spring-plugin-2.3.15.3.jar 以後, Struts2 會先從 IOC 容器中獲取 Action 的例項.
首先從struts入手,瞭解struts的外掛機制。
Struts-plugin.xml
說明:
Struts-plugin.xml檔案是在tomcat伺服器啟動的時候載入的
該配置檔案在classpath的根目錄下
在每一個含有plugin字母的jar包的根目錄下有一個struts-plugin.xml檔案 (例如 剛剛我們匯入的struts2-spring-plugin)
當tomcat啟動的時候,就把所有的含有plungin的jar包的該配置檔案就載入了。
研究struts2的靜態注入:
1、 在struts2的配置檔案struts-default中寫的bean:
在tomcat啟動的時候,會執行OgnlValueStackFactory的createValueStack方法
從上圖可以看出,在tomcat啟動的時候就決定了ValueStack的實現類.
2、 改變靜態注入的方式
可以在struts.xml檔案中對struts-default.xml檔案中的bean進行配置和覆蓋,這樣就可以按照覆蓋掉的執行。在struts.xml檔案中,做如下的配置:
這個時候,當tomcat啟動的時候,將會報錯。
瞭解了struts2的靜態注入後,我們來改變action的產生方式。
struts有一個類:ObjectFactory
說明:
Struts2容器就是利用ObjectFactory的上面的幾個方法產生的action,result,interceptor.
struts2的配置檔案struts-default.xml中:
在struts2容器中,物件工廠是由StrutsObjectFactory來產生的。
從上圖中可以看出,StrutsObjectFactory繼承了ObjectFacotry,但是沒有覆蓋buildAction方法,說明struts2的action的產生還是呼叫了ObjectFactory中的buildAction方法。
寫一個物件工廠:
public class Itheima09ObjectFactory extends ObjectFactory{
@Override
public Object buildAction(String actionName, String namespace, ActionConfig config,
Map<String, Object> extraContext) throws Exception {
// TODO Auto-generated method stub
System.out.println("create Action");
return "66";
}
}
該類重寫了buildAction方法。
配置檔案:
說明:
當在瀏覽器提交一個請求,請求某一個action的時候,在建立action的時候,就會進入到Itheima09ObjectFactory中執行buildAction方法。
現在我們回過頭看spring與struts的整合使用的jar包:
Struts-plugin.xml:
說明:物件工廠為spring:StrutsSpringObjectFactory。
總結
當tomcat啟動的時候,載入了很多個struts-plugin.xml檔案,在該檔案中可以配置
Bean
Package
Interceptor
Action
Result
這些元素就被載入到了struts2容器中。
如果不想要某一些內容,只要把這些內容所在的struts-plugin.xml的jar包去掉就可以了。
外掛的主要體現形式是jar包。