# 【第十章】集成其它Web框架 之 10.3 集成Struts2.x ——跟我學spring3
先進行通用配置,?[【第十章】集成其它Web框架 之 10.1 概述](http://sishuok.com/forum/blogPost/list/2510.html "【第十章】集成其它Web框架 之 10.1 概述 ——跟我學spring3")?
## 10.3? 集成Struts2.x
### 10.3.1? 概述
Struts2前身是WebWork,核心并沒有改變,其實就是把WebWork改名為struts2,與Struts1一點關系沒有。
Struts2中通過ObjectFactory接口實現創建及獲取Action實例,類似于Spring的IoC容器,所以Action實例可以由ObjectFactory實現來管理,因此集成Spring的關鍵點就是如何創建ObjectFactory實現來從Spring容器中獲取相應的Action Bean。
Struts2提供一個默認的ObjectFactory接口實現StrutsSpringObjectFactory,該類用于根據Struts2配置文件中相應Bean信息從Spring 容器中獲取相應的Action。
因此Struts2.x與Spring集成需要使用StrutsSpringObjectFactory類作為中介者。
**接下來讓我們首先讓我們準備Struts2x所需要的jar包**
**準備Struts2.x需要的jar包,到Struts官網http://struts.apache.org/下載struts-2.2.1.1版本,拷貝如下jar包到項目的lib目錄下并添加到類路徑:**
+ lib\struts2-core-2.2.1.1.jar ?????????????//核心struts2包
+ lib\xwork-core-2.2.1.1.jar??? ??????????//命令框架包,獨立于Web環境,為Struts2
+ //提供核心功能的支持包
+ lib\freemarker-2.3.16.jar????????????? ?//提供模板化UI標簽及視圖技術支持
+ lib\ognl-3.0.jar??????????????????? ???//對象圖導航工具包,類似于SpEL
+ lib\ struts2-spring-plugin-2.2.1.1.jar???? ?//集成Spring的插件包
+ lib\commons-logging-1.0.4.jar????????? //日志記錄組件包(已有)
+ lib\commons-fileupload-1.2.1.jar??????? //用于支持文件上傳的包
### 10.3.2? 使用ObjectFactory集成
**1、Struts2.x的Action實現:**
```
package cn.javass.spring.chapter10.struts2x.action;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String message;
@Override
public String execute() throws Exception {
ServletActionContext.getRequest().setAttribute("message", message);
return "hello";
}
public void setMessage(String message) {//setter注入
this.message = message;
}
}
```
**2、JSP頁面定義,使用Struts1x中定義的JSP頁面“webapp/WEB-INF/jsp/hello.jsp”;**
**3、Spring一般配置文件定義(resources/chapter10/applicationContext-message.xml):**
在此配置文件中定義我們使用的“message”Bean;
```
<bean id="message" class="java.lang.String">
<constructor-arg index="0" value="Hello Spring"/>
</bean>
```
**4、Spring Action?配置文件定義(resources/chapter10/hello-servlet.xml):**
```
<bean name="helloAction" class="cn.javass.spring.chapter10.struts2x.action.HelloWorldAction" scope="prototype">
<property name="message" ref="message"/>
</bean>
```
Struts2的Action在Spring中配置,而且應該是prototype,因為Struts2的Action是有狀態的,定義在Spring中,那Struts如何找到該Action呢?
**5、struts2配置文件定義(resources/chapter10/struts2x/struts.xml):**
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>
<constant name="struts.devMode" value="true"/>
<package name="default" extends="struts-default">
<action name="hello" class="helloAction">
<result name="hello" >/WEB-INF/jsp/hello.jsp</result>
</action>
</package>
</struts>
```
* **struts.objectFactory:**通過在Struts配置文件中使用常量屬性**struts.objectFactory**來定義Struts將要使用的ObjectFactory實現,此處因為需要從Spring容器中獲取Action對象,因此需要使用StrutsSpringObjectFactory來集成Spring;
* <action name="hello"?**class="helloAction"**>:StrutsSpringObjectFactory對象工廠將根據<action>標簽的class屬性去Spring容器中查找同名的Action Bean;即本例中將到Spring容器中查找名為helloAction的Bean。
**6、web.xml部署描述符文件定義(webapp/WEB-INF/web.xml):**
**6.1、由于Struts2只能使用通用配置,因此需要在通用配置中加入Spring Action配置文件(chapter10/struts2x/struts2x-servlet.xml):**
```
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:chapter10/applicationContext-message.xml,
classpath:chapter10/struts2x/struts2x-servlet.xml
</param-value>
</context-param>
```
Struts2只能在通用配置中指定所有Spring配置文件,并沒有如Struts1自己指定Spring配置文件的實現。
**6.2、Strut2前端控制器定義,在web.xml中添加如下配置:**
```
<!-- Struts2.x前端控制器配置開始 -->
<filter>
<filter-name>struts2x</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>
struts-default.xml,struts-plugin.xml,chapter10/struts2x/struts.xml
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2x</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<!-- Struts2.x前端控制器配置結束 -->
```
* **FilterDispatcher:**Struts2前端控制器為FilterDispatcher,是Filter實現,不是Servlet;
* **config:**通過初始化參數config指定配置文件為struts-default.xml,struts-plugin.xml,chapter10/struts2x/struts.xml;如果不知道該參數則默認加載struts-default.xml,struts-plugin.xml,struts.xml(位于webapp/WEB-INF/classes下);顯示指定時需要將struts-default.xml,struts-plugin.xml也添加上。
* ***.action:**將攔截以“.action”結尾的HTTP請求;
* **struts2x:**FilterDispatcher前端控制器的名字為struts2x,因此相應的Spring配置文件名為struts2x-servlet.xml。
**7、執行測試,在Web瀏覽器中輸入http://localhost:8080/hello.action可以看到“Hello Spring”信息說明Struts2集成成功。**
**集成Strut2也是非常簡單,在此我們總結一下吧:**
* **配置文件位置:**
Struts配置文件默認加載“struts-default.xml,struts-plugin.xml, struts.xml”,其中struts-default.xml和struts-plugin.xml是Struts自帶的,而struts.xml是我們指定的,默認位于webapp/WEB-INF/classes下;
如果需要將配置文件放到其他位置,需要在web.xml的<filter>標簽下,使用初始化參數config指定,如“struts-default.xml,struts-plugin.xml,chapter10/struts2x/struts.xml”,其中“struts-default.xml和struts-plugin.xml”是不可省略的,默認相對路徑是類路徑。
* **集成關鍵ObjectFactory:**在Struts配置文件或屬性文件中使用如下配置知道使用StrutsSpringObjectFactory來獲取Action實例:
在struts.xml中指定:
```
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>
```
**或在struts.properties文件(webapp/WEB-INF/classes/)中:**
```
struts.objectFactory=org.apache.struts2.spring.StrutsSpringObjectFactory
```
* **集成關鍵Action定義:**
StrutsSpringObjectFactory將根據Struts2配置文件中的<action class=””>標簽的classes屬性名字去到Spring配置文件中查找同名的Bean定義,這也是集成的關鍵。
**?**
* **Spring配置文件中Action定義:**由于Struts2的Action是有狀態的,因此應該將Bean定義為prototype。
如圖10**-**5,Sturt2與Spring集成的關鍵就是StrutsSpringObjectFactory,注意圖只是說明Struts與Spring如何通過中介者StrutsSpringObjectFactory來實現集成,不能代表實際的類交互。

圖10-5 Strut2與Spring集成
原創內容,轉載請注明出處【[http://sishuok.com/forum/blogPost/list/0/2512.html](http://sishuok.com/forum/blogPost/list/0/2512.html#7237)】
- 跟我學 Spring3
- 【第二章】 IoC 之 2.1 IoC基礎 ——跟我學Spring3
- 【第二章】 IoC 之 2.2 IoC 容器基本原理 ——跟我學Spring3
- 【第二章】 IoC 之 2.3 IoC的配置使用——跟我學Spring3
- 【第三章】 DI 之 3.1 DI的配置使用 ——跟我學spring3
- 【第三章】 DI 之 3.2 循環依賴 ——跟我學spring3
- 【第三章】 DI 之 3.3 更多DI的知識 ——跟我學spring3
- 【第三章】 DI 之 3.4 Bean的作用域 ——跟我學spring3
- 【第四章】 資源 之 4.1 基礎知識 ——跟我學spring3
- 【第四章】 資源 之 4.2 內置Resource實現 ——跟我學spring3
- 【第四章】 資源 之 4.3 訪問Resource ——跟我學spring3
- 【第四章】 資源 之 4.4 Resource通配符路徑 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.1 概述 5.2 SpEL基礎 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.3 SpEL語法 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.4在Bean定義中使用EL—跟我學spring3
- 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3
- 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我學spring3
- 【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我學spring3
- 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我學spring3
- 【第六章】 AOP 之 6.5 AspectJ切入點語法詳解 ——跟我學spring3
- 【第六章】 AOP 之 6.6 通知參數 ——跟我學spring3
- 【第六章】 AOP 之 6.7 通知順序 ——跟我學spring3
- 【第六章】 AOP 之 6.8 切面實例化模型 ——跟我學spring3
- 【第六章】 AOP 之 6.9 代理機制 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.1 概述 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.2 JDBC模板類 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.3 關系數據庫操作對象化 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.4 Spring提供的其它幫助 ——跟我學spring3【私塾在線原創】
- 【第七章】 對JDBC的支持 之 7.5 集成Spring JDBC及最佳實踐 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.1 概述 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.2 集成Hibernate3 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.3 集成iBATIS ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.4 集成JPA ——跟我學spring3
- 【第九章】 Spring的事務 之 9.1 數據庫事務概述 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.2 事務管理器 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.3 編程式事務 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.4 聲明式事務 ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.1 概述 ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.2 集成Struts1.x ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.3 集成Struts2.x ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.4 集成JSF ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.1 概述 ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.2 實現通用層 ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.3 實現積分商城層 ——跟我學spring3
- 【第十二章】零配置 之 12.1 概述 ——跟我學spring3
- 【第十二章】零配置 之 12.2 注解實現Bean依賴注入 ——跟我學spring3
- 【第十二章】零配置 之 12.3 注解實現Bean定義 ——跟我學spring3
- 【第十二章】零配置 之 12.4 基于Java類定義Bean配置元數據 ——跟我學spring3
- 【第十二章】零配置 之 12.5 綜合示例-積分商城 ——跟我學spring3
- 【第十三章】 測試 之 13.1 概述 13.2 單元測試 ——跟我學spring3
- 【第十三章】 測試 之 13.3 集成測試 ——跟我學spring3
- 跟我學 Spring MVC
- SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常見問題總結
- Spring Web MVC中的頁面緩存支持 ——跟我學SpringMVC系列
- Spring3 Web MVC下的數據類型轉換(第一篇)——《跟我學Spring3 Web MVC》搶先看
- Spring3 Web MVC下的數據格式化(第二篇)——《跟我學Spring3 Web MVC》搶先看
- 第一章 Web MVC簡介 —— 跟開濤學SpringMVC
- 第二章 Spring MVC入門 —— 跟開濤學SpringMVC
- 第三章 DispatcherServlet詳解 ——跟開濤學SpringMVC
- 第四章 Controller接口控制器詳解(1)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(2)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(3)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解 (4)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(5)——跟著開濤學SpringMVC
- 跟著開濤學SpringMVC 第一章源代碼下載
- 第二章 Spring MVC入門 源代碼下載
- 第四章 Controller接口控制器詳解 源代碼下載
- 第四章 Controller接口控制器詳解(6)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(7 完)——跟著開濤學SpringMVC
- 第五章 處理器攔截器詳解——跟著開濤學SpringMVC
- 源代碼下載 第五章 處理器攔截器詳解——跟著開濤學SpringMVC
- 注解式控制器運行流程及處理器定義 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- 源代碼下載 第六章 注解式控制器詳解
- SpringMVC3強大的請求映射規則詳解 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- Spring MVC 3.1新特性 生產者、消費者請求限定 —— 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC強大的數據綁定(1)——第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC強大的數據綁定(2)——第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC數據類型轉換——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC
- SpringMVC數據格式化——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC
- SpringMVC數據驗證——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC