您肯定已經聽說過控制反轉 (IOC) 設計模式
因為很長一段時間以來一直在流傳關於它的信息
如果您在任何功能中使用過 Spring 框架
那麼您就知道其原理的作用
在本文中
我利用這一原理把一個 Struts 應用程序注入 Spring 框架
您將親身體會到 IOC 模式的強大
將一個 Struts 應用程序整合進 Spring 框架具有多方面的優點
首先
Spring 是為解決一些關於 JEE 的真實世界問題而設計的
比如復雜性
低性能和可測試性
等等
第二
Spring 框架包含一個 AOP 實現
允許您將面向方面技術應用於面向對象的代碼
第三
一些人可能會說 Spring 框架只有處理 Struts 比 Struts 處理自己好
但是這是觀點問題
我演示三種將 Struts 應用程序整合到 Spring 框架的方法後
具體由您自己決定使用哪一種
我所演示的方法都是執行起來相對簡單的
但是它們卻具有明顯不同的優點
我為每一種方法創建了一個獨立而可用的例子
這樣您就可以完全理解每種方法
請參閱 下載 部分獲得完整例子源代碼
請參閱 參考資料
下載 Struts MVC 和 Spring 框架
為什麼 Spring 這麼了不起? Spring 的創立者 Rod Johnson 以一種批判的眼光看待 Java? 企業軟件開發
並且提議很多企業難題都能夠通過戰略地使用 IOC 模式(也稱作依賴注入)來解決
當 Rod 和一個具有奉獻精神的開放源碼開發者團隊將這個理論應用於實踐時
結果就產生了 Spring 框架
簡言之
Spring 是一個輕型的容器
利用它可以使用一個外部 XML 配置文件方便地將對象連接在一起
每個對象都可以通過顯示一個 JavaBean 屬性收到一個到依賴對象的引用
留給您的簡單任務就只是在一個 XML 配置文件中把它們連接好
IOC 和 Spring IOC 是一種使應用程序邏輯外在化的設計模式
所以它是被注入而不是被寫入客戶機代碼中
將 IOC 與接口編程應用結合
就像 Spring 框架那樣
產生了一種架構
這種架構能夠減少客戶機對特定實現邏輯的依賴
請參閱 參考資料 了解更多關於 IOC 和 Spring 的信息
依賴注入是一個強大的特性
但是 Spring 框架能夠提供更多特性
Spring 支持可插拔的事務管理器
可以給您的事務處理提供更廣泛的選擇范圍
它集成了領先的持久性框架
並且提供一個一致的異常層次結構
Spring 還提供了一種使用面向方面代碼代替正常的面向對象代碼的簡單機制
Spring AOP 允許您使用攔截器 在一個或多個執行點上攔截應用程序邏輯
加強應用程序在攔截器中的日志記錄邏輯會產生一個更可讀的
實用的代碼基礎
所以攔截器廣泛用於日志記錄
您很快就會看到
為了處理橫切關注點
Spring AOP 發布了它自己的攔截器
您也可以編寫您自己的攔截器
整合 Struts 和 Spring 與 Struts 相似
Spring 可以作為一個 MVC 實現
這兩種框架都具有自己的優點和缺點
盡管大部分人同意 Struts 在 MVC 方面仍然是最好的
很多開發團隊已經學會在時間緊迫的時候利用 Struts 作為構造高品質軟件的基礎
Struts 具有如此大的推動力
以至於開發團隊寧願整合 Spring 框架的特性
而不願意轉換成 Spring MVC
沒必要進行轉換對您來說是一個好消息
Spring 架構允許您將 Struts 作為 Web 框架連接到基於 Spring 的業務和持久層
最後的結果就是現在一切條件都具備了
在接下來的小竅門中
您將會了解到三種將 Struts MVC 整合到 Spring 框架的方法
我將揭示每種方法的缺陷並且對比它們的優點
一旦您了解到所有三種方法的作用
我將會向您展示一個令人興奮的應用程序
這個程序使用的是這三種方法中我最喜歡的一種
三個小竅門 接下來的每種整合技術(或者竅門)都有自己的優點和特點
我偏愛其中的一種
但是我知道這三種都能夠加深您對 Struts 和 Spring 的理解
在處理各種不同情況的時候
這將給您提供一個廣闊的選擇范圍
方法如下
使用 Spring 的 ActionSupport 類整合 Structs
使用 Spring 的 DelegatingRequestProcessor 覆蓋 Struts 的 RequestProcessor
將 Struts Action 管理委托給 Spring 框架
裝載應用程序環境
無論您使用哪種技術
都需要使用 Spring 的 ContextLoaderPlugin 為 Struts 的 ActionServlet 裝載 Spring 應用程序環境
就像添加任何其他插件一樣
簡單地向您的 struts
config
xml 文件添加該插件
如下所示
<plug
in className=
org
springframework
web
struts
ContextLoaderPlugIn
>
<set
property property=
contextConfigLocation
value=
/WEB
INF/beans
xml
/>
</plug
in>
前面已經提到過
在 下載 部分
您能夠找到這三個完全可使用的例子的完整源代碼
每個例子都為一個書籍搜索應用程序提供一種不同的 Struts 和 Spring 的整合方法
您可以在這裡看到例子的要點
但是您也可以下載應用程序以查看所有的細節
竅門
使用 Spring 的 ActionSupport
手動創建一個 Spring 環境是一種整合 Struts 和 Spring 的最直觀的方式
為了使它變得更簡單
Spring 提供了一些幫助
為了方便地獲得 Spring 環境
org
springframework
web
struts
ActionSupport 類提供了一個 getWebApplicationContext() 方法
您所做的只是從 Spring 的 ActionSupport 而不是 Struts Action 類擴展您的動作
如清單
所示
清單
使用 ActionSupport 整合 Struts
package ca
nexcel
books
actions;
import java
io
IOException;
import javax
servlet
ServletException;
import javax
servlet
http
HttpServletRequest;
import javax
servlet
http
HttpServletResponse;
import org
apache
struts
action
ActionError;
import org
apache
struts
action
ActionErrors;
import org
apache
struts
action
ActionForm;
import org
apache
struts
action
ActionForward;
import org
apache
struts
action
ActionMapping;
import org
apache
struts
action
DynaActionForm;
import orgntext
ApplicationContext;
import org
springframework
web
struts
ActionSupport;
import ca
nexcel
books
beans
Book;
import ca
nexcel
books
business
BookService;
public class SearchSubmit extends ActionSupport { |(
)
public ActionForward execute(
ActionMapping mapping
ActionForm form
HttpServletRequest request
HttpServletResponse response)
throws IOException
ServletException {
DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchForm
get(
isbn
);
//the old fashion way
//BookService bookService = new BookServiceImpl();
ApplicationContext ctx =
getWebApplicationContext(); |(
)
BookService bookService =
(BookService) ctx
getBean(
bookService
); |(
)
Book book = bookService
read(isbn
trim());
if (null == book) {
ActionErrors errors = new ActionErrors();
errors
add(ActionErrors
GLOBAL_ERROR
new ActionError
(
message
notfound
));
saveErrors(request
errors);
return mapping
findForward(
failure
) ;
}
request
setAttribute(
book
book);
return mapping
findForward(
success
);
}
}
讓我們快速思考一下這裡到底發生了什麼
在 (
) 處
我通過從 Spring 的 ActionSupport 類而不是 Struts 的 Action 類進行擴展
創建了一個新的 Action
在 (
) 處
我使用 getWebApplicationContext() 方法獲得一個 ApplicationContext
為了獲得業務服務
我使用在 (
) 處獲得的環境在 (
) 處查找一個 Spring bean
這種技術很簡單並且易於理解
不幸的是
它將 Struts 動作與 Spring 框架耦合在一起
如果您想替換掉 Spring
那麼您必須重寫代碼
並且
由於 Struts 動作不在 Spring 的控制之下
所以它不能獲得 Spring AOP 的優勢
當使用多重獨立的 Spring 環境時
這種技術可能有用
但是在大多數情況下
這種方法不如另外兩種方法合適
竅門
覆蓋 RequestProcessor
將 Spring 從 Struts 動作中分離是一個更巧妙的設計選擇
分離的一種方法是使用 org
springframework
web
struts
DelegatingRequestProcessor 類來覆蓋 Struts 的 RequestProcessor 處理程序
如清單
所示
清單
通過 Spring 的 DelegatingRequestProcessor 進行整合
<?xml version=
encoding=
ISO
?>
<!DOCTYPE struts
config PUBLIC
//Apache Software Foundation//DTD Struts Configuration
//EN
config_
_
dtd
>
<struts
config>
<form
beans>
<form
bean name=
searchForm
type=
org
apache
struts
validator
DynaValidatorForm
>
<form
property name=
isbn
type=
java
lang
String
/>
</form
bean>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28273.html