1. 程式人生 > >詳細分析spring與struts2的整合原理

詳細分析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包。