熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

使用Spring更好地處理Struts動作

2013-11-23 20:18:54  來源: Java開源技術 

  您肯定已經聽說過控制反轉 (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 應用程序環境就像添加任何其他插件一樣簡單地向您的 strutsconfigxml 文件添加該插件如下所示
  
  <plugin className=
  orgspringframeworkwebstrutsContextLoaderPlugIn>
  <setproperty property=
  contextConfigLocation value=/WEBINF/beansxml/>
  </plugin>
  
  前面已經提到過在 下載 部分您能夠找到這三個完全可使用的例子的完整源代碼每個例子都為一個書籍搜索應用程序提供一種不同的 Struts 和 Spring 的整合方法您可以在這裡看到例子的要點但是您也可以下載應用程序以查看所有的細節
  
  竅門 使用 Spring 的 ActionSupport
  
  手動創建一個 Spring 環境是一種整合 Struts 和 Spring 的最直觀的方式為了使它變得更簡單Spring 提供了一些幫助為了方便地獲得 Spring 環境orgspringframeworkwebstrutsActionSupport 類提供了一個 getWebApplicationContext() 方法您所做的只是從 Spring 的 ActionSupport 而不是 Struts Action 類擴展您的動作如清單 所示
  
  清單 使用 ActionSupport 整合 Struts
  
  package canexcelbooksactions;
  
  import javaioIOException;
  
  import javaxservletServletException;
  import javaxservlethttpHttpServletRequest;
  import javaxservlethttpHttpServletResponse;
  
  import orgapachestrutsactionActionError;
  import orgapachestrutsactionActionErrors;
  import orgapachestrutsactionActionForm;
  import orgapachestrutsactionActionForward;
  import orgapachestrutsactionActionMapping;
  import orgapachestrutsactionDynaActionForm;
  import orgntextApplicationContext;
  import orgspringframeworkwebstrutsActionSupport;
  
  import canexcelbooksbeansBook;
  import canexcelbooksbusinessBookService;
  
  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) searchFormget(isbn);
  
  //the old fashion way
  //BookService bookService = new BookServiceImpl();
  
  ApplicationContext ctx =
  getWebApplicationContext();  |()
  BookService bookService =
  (BookService) ctxgetBean(bookService);  |()
  
  Book book = bookServiceread(isbntrim());
  
  if (null == book) {
  ActionErrors errors = new ActionErrors();
  errorsadd(ActionErrorsGLOBAL_ERRORnew ActionError
  (messagenotfound));
  saveErrors(request errors);
  return mappingfindForward(failure) ;
  }
  
  requestsetAttribute(book book);
  return mappingfindForward(success);
  }
  }
  
  讓我們快速思考一下這裡到底發生了什麼在 () 處我通過從 Spring 的 ActionSupport 類而不是 Struts 的 Action 類進行擴展創建了一個新的 Action在 () 處我使用 getWebApplicationContext() 方法獲得一個 ApplicationContext為了獲得業務服務我使用在 () 處獲得的環境在 () 處查找一個 Spring bean
  
  這種技術很簡單並且易於理解不幸的是它將 Struts 動作與 Spring 框架耦合在一起如果您想替換掉 Spring那麼您必須重寫代碼並且由於 Struts 動作不在 Spring 的控制之下所以它不能獲得 Spring AOP 的優勢當使用多重獨立的 Spring 環境時這種技術可能有用但是在大多數情況下這種方法不如另外兩種方法合適
  
  竅門 覆蓋 RequestProcessor
  
  將 Spring 從 Struts 動作中分離是一個更巧妙的設計選擇分離的一種方法是使用 orgspringframeworkwebstrutsDelegatingRequestProcessor 類來覆蓋 Struts 的 RequestProcessor 處理程序如清單 所示
  
  清單 通過 Spring 的 DelegatingRequestProcessor 進行整合
  
  <?xml version= encoding=ISO ?>
  
  <!DOCTYPE strutsconfig PUBLIC
  //Apache Software Foundation//DTD Struts Configuration //EN
  config__dtd>
  
  <strutsconfig>
  <formbeans>
  <formbean name=searchForm
  type=orgapachestrutsvalidatorDynaValidatorForm>
  <formproperty name=isbn  type=javalangString/>
  </formbean>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28273.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.