国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

使用Spring更好地處理Struts動作

2019-11-18 13:00:37
字體:
供稿:網(wǎng)友

  您肯定已經(jīng)聽說過控制反轉(zhuǎn) (IOC) 設計模式,因為很長一段時間以來一直在流傳關(guān)于它的信息。假如您在任何功能中使用過 SPRing 框架,那么您就知道其原理的作用。在本文中,我利用這一原理把一個 Struts 應用程序注入 Spring 框架,您將親身體會到 IOC 模式的強大。
  
  將一個 Struts 應用程序整合進 Spring 框架具有多方面的優(yōu)點。首先,Spring 是為解決一些關(guān)于 JEE 的真實世界問題而設計的,比如復雜性、低性能和可測試性,等等。第二,Spring 框架包含一個 AOP 實現(xiàn),答應您將面向方面技術(shù)應用于面向?qū)ο蟮拇a。第三,一些人可能會說 Spring 框架只有處理 Struts 比 Struts 處理自己好。但是這是觀點問題,我演示三種將 Struts 應用程序整合到 Spring 框架的方法后,具體由您自己決定使用哪一種。
  
  我所演示的方法都是執(zhí)行起來相對簡單的,但是它們卻具有明顯不同的優(yōu)點。我為每一種方法創(chuàng)建了一個獨立而可用的例子,這樣您就可以完全理解每種方法。請參閱 下載 部分獲得完整例子源代碼。請參閱 參考資料,下載 Struts MVC 和 Spring 框架。
  
  為什么 Spring 這么了不起?
  
  Spring 的創(chuàng)立者 Rod Johnson 以一種批判的眼光看待 java? 企業(yè)軟件開發(fā),并且提議很多企業(yè)難題都能夠通過戰(zhàn)略地使用 IOC 模式(也稱作依靠注入)來解決。當 Rod 和一個具有奉獻精神的開放源碼開發(fā)者團隊將這個理論應用于實踐時,結(jié)果就產(chǎn)生了 Spring 框架。簡言之,Spring 是一個輕型的容器,利用它可以使用一個外部 xml 配置文件方便地將對象連接在一起。每個對象都可以通過顯示一個 JavaBean 屬性收到一個到依靠對象的引用,留給您的簡單任務就只是在一個 XML 配置文件中把它們連接好。
  
  IOC 和 Spring
  
  IOC 是一種使應用程序邏輯外在化的設計模式,所以它是被注入而不是被寫入客戶機代碼中。將 IOC 與接口編程應用結(jié)合,就像 Spring 框架那樣,產(chǎn)生了一種架構(gòu),這種架構(gòu)能夠減少客戶機對特定實現(xiàn)邏輯的依靠。請參閱 參考資料 了解更多關(guān)于 IOC 和 Spring 的信息。
  
  依靠注入是一個強大的特性,但是 Spring 框架能夠提供更多特性。Spring 支持可插拔的事務治理器,可以給您的事務處理提供更廣泛的選擇范圍。它集成了領(lǐng)先的持久性框架,并且提供一個一致的異常層次結(jié)構(gòu)。Spring 還提供了一種使用面向方面代碼代替正常的面向?qū)ο蟠a的簡單機制。
  
  Spring AOP 答應您使用攔截器 在一個或多個執(zhí)行點上攔截應用程序邏輯。加強應用程序在攔截器中的日志記錄邏輯會產(chǎn)生一個更可讀的、實用的代碼基礎,所以攔截器廣泛用于日志記錄。您很快就會看到,為了處理橫切關(guān)注點,Spring AOP 發(fā)布了它自己的攔截器,您也可以編寫您自己的攔截器。
  
  整合 Struts 和 Spring
  
  與 Struts 相似,Spring 可以作為一個 MVC 實現(xiàn)。這兩種框架都具有自己的優(yōu)點和缺點,盡管大部分人同意 Struts 在 MVC 方面仍然是最好的。很多開發(fā)團隊已經(jīng)學會在時間緊迫的時候利用 Struts 作為構(gòu)造高品質(zhì)軟件的基礎。Struts 具有如此大的推動力,以至于開發(fā)團隊寧愿整合 Spring 框架的特性,而不愿意轉(zhuǎn)換成 Spring MVC。沒必要進行轉(zhuǎn)換對您來說是一個好消息。Spring 架構(gòu)答應您將 Struts 作為 Web 框架連接到基于 Spring 的業(yè)務和持久層。最后的結(jié)果就是現(xiàn)在一切條件都具備了。
  
  在接下來的小竅門中,您將會了解到三種將 Struts MVC 整合到 Spring 框架的方法。我將揭示每種方法的缺陷并且對比它們的優(yōu)點。 一旦您了解到所有三種方法的作用,我將會向您展示一個令人興奮的應用程序,這個程序使用的是這三種方法中我最喜歡的一種。
  
  三個小竅門
  
  接下來的每種整合技術(shù)(或者竅門)都有自己的優(yōu)點和特點。我偏愛其中的一種,但是我知道這三種都能夠加深您對 Struts 和 Spring 的理解。在處理各種不同情況的時候,這將給您提供一個廣闊的選擇范圍。方法如下:
  
  使用 Spring 的 ActionSupport 類整合 StrUCts
  
  使用 Spring 的 DelegatingRequestProcessor 覆蓋 Struts 的 RequestProcessor
  
  將 Struts Action 治理委托給 Spring 框架
  
  裝載應用程序環(huán)境
  
  無論您使用哪種技術(shù),都需要使用 Spring 的 ContextLoaderPlugin 為 Struts 的 ActionServlet 裝載 Spring 應用程序環(huán)境。就像添加任何其他插件一樣,簡單地向您的 struts-config.xml 文件添加該插件,如下所示:
  
  <plug-in className=
  "org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property=
  "contextConfigLocation" value="/WEB-INF/beans.xml"/>
  </plug-in>
  
  前面已經(jīng)提到過,在 下載 部分,您能夠找到這三個完全可使用的例子的完整源代碼。每個例子都為一個書籍搜索應用程序提供一種不同的 Struts 和 Spring 的整合方法。您可以在這里看到例子的要點,但是您也可以下載應用程序以查看所有的細節(jié)。
  
  竅門 1. 使用 Spring 的 ActionSupport
  
  手動創(chuàng)建一個 Spring 環(huán)境是一種整合 Struts 和 Spring 的最直觀的方式。為了使它變得更簡單,Spring 提供了一些幫助。為了方便地獲得 Spring 環(huán)境,org.springframework.web.struts.ActionSupport 類提供了一個 getWebapplicationContext() 方法。您所做的只是從 Spring 的 ActionSupport 而不是 Struts Action 類擴展您的動作,如清單 1 所示:
  
  清單 1. 使用 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 org.springframework.context.ApplicationContext;
  import org.springframework.web.struts.ActionSupport;
  
  import ca.nexcel.books.beans.Book;
  import ca.nexcel.books.business.BookService;
  
  public class SearchSubmit extends ActionSupport {  (1)
  
  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();  (2)
  BookService bookService =
  (BookService) ctx.getBean("bookService");  (3)
  
  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");
  }
  }
  
  讓我們快速思考一下這里到底發(fā)生了什么。在 (1) 處,我通過從 Spring 的 ActionSupport 類而不是 Struts 的 Action 類進行擴展,創(chuàng)建了一個新的 Action。在 (2) 處,我使用 getWebApplicationContext() 方法獲得一個 ApplicationContext。為了獲得業(yè)務服務,我使用在 (2) 處獲得的環(huán)境在 (3) 處查找一個 Spring bean。
  
  這種技術(shù)很簡單并且易于理解。不幸的是,它將 Struts 動作與 Spring 框架耦合在一起。假如您想替換掉 Spring,那么您必須重寫代碼。并且,由于 Struts 動作不在 Spring 的控制之下,所以它不能獲得 Spring AOP 的優(yōu)勢。當使用多重獨立的 Spring 環(huán)境時,這種技術(shù)可能有用,但是在大多數(shù)情況下,這種方法不如另外兩種方法合適。
  
  竅門 2. 覆蓋 RequestProcessor
  
  將 Spring 從 Struts 動作中分離是一個更巧妙的設計選擇。分離的一種方法是使用 org.springframework.web.struts.DelegatingRequestProcessor 類來覆蓋 Struts 的 RequestProcessor 處理程序,如清單 2 所示:
  
  清單 2. 通過 Spring 的 DelegatingRequestProcessor 進行整合
  
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  
  <!DOCTYPE struts-config PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
  "http://jakarta.apache.org/struts/dtds/struts-config_1_1.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>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永平县| 阿坝| 城固县| 沂水县| 雷波县| 乐亭县| 元阳县| 长治县| 龙泉市| 凤冈县| 西安市| 蒲江县| 云安县| 光山县| 盘山县| 莎车县| 泰安市| 黎川县| 鄂尔多斯市| 惠州市| 子长县| 静乐县| 禹城市| 桃江县| 云龙县| 渭源县| 秦皇岛市| 六盘水市| 永嘉县| 台安县| 靖边县| 山丹县| 布尔津县| 宾川县| 滕州市| 绥化市| 东兰县| 吕梁市| 嵊州市| 罗江县| 义马市|