1. 程式人生 > 實用技巧 >SpringMVC與structs2區別

SpringMVC與structs2區別

Struts2和SpringMVC是比較流行的MVC框架,二者的工作流程大體相似,從下面兩張圖就可以看出。,

SpringMVC工作流程圖

圖二

SpringMVC的工作流程描述

  1. 使用者向伺服器傳送請求,請求被Spring前端控制Servelt DispatcherServlet捕獲;

  2. DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URI)。然後根據該URI,呼叫HandlerMapping獲得該Handler配置的所有相關的物件(包括Handler物件以及Handler物件對應的攔截器),最後以HandlerExecutionChain物件的形式返回;

  3. DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(…)方法)

  4. 提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:

    HttpMessageConveter:將請求訊息(如Json、xml等資料)轉換成一個物件,將物件轉換為指定的響應資訊

    資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等

    資料根式化:對請求訊息進行資料格式化。如將字串轉換成格式化數字或格式化日期等

    資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中

  5. Handler執行完成後,向DispatcherServlet 返回一個ModelAndView物件;

  6. 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;

  7. ViewResolver結合Model和View,來渲染檢視

8.將渲染結果返回給客戶端。

Strut2的體系結構如圖所示:

從圖可以看出,一個請求在Struts2框架中的處理大概分為以下幾個步驟:

1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;

2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的整合很有幫助,例如:SiteMeshPlugin);

3、接著StrutsPrepareAndExecuteFilter被呼叫,StrutsPrepareAndExecuteFilter詢問ActionMapper來決定這個請求是否需要呼叫某個Action;

4、如果ActionMapper決定需要呼叫某個Action,StrutsPrepareAndExecuteFilter把請求的處理交給ActionProxy;

5、ActionProxy通過ConfigurationManager詢問框架的配置檔案,找到需要呼叫的Action類;

6、ActionProxy建立一個ActionInvocation的例項。

7、ActionInvocation例項使用命名模式來呼叫,在呼叫Action的過程前後,涉及到相關攔截器(Intercepter)的呼叫。

8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標籤。在這個過程中需要涉及到ActionMapper。

以上是從巨集觀上對比下二者的工作流程,下面針對細節對比二者的不同。

SpringMVC和Struts2的區別:

1. 機制:

springmvc的入口是servlet,而struts2是filter(這裡要指出,filter和servlet是不同的。以前認為filter是servlet的一種特殊),這樣就導致了二者的機制不同,這裡就牽涉到servlet和filter的區別了。

(1)spring mvc是基於方法的設計,而sturts是基於類,導致:

效能:

spring會稍微比struts快。spring mvc是基於方法的設計,而sturts是基於類,每次發一次請求都會例項一個action,每個action都會被注入屬性,而spring基於方法,粒度更細,但要小心把握像在servlet控制資料一樣。spring3mvc是方法級別的攔截,攔截到方法後根據引數上的註解,把request資料注入進去,在spring3mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,然後呼叫settergetter方法把request中的資料注入;struts2實際上是通過setter getter方法與request打交道的,而springmvc不用setter getter方法;struts2中,一個Action物件對應一個request上下文。

實現restful:

springmvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上spring3 mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文;實現restfulurl要費勁,因為struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。

資料共享:

struts是在接受引數的時候,可以用屬性來接受引數,這就說明引數是讓多個方法共享的。

spring3 mvc的方法之間基本上獨立的,獨享request response資料,請求資料通過引數獲取,處理結果通過ModelMap交回給框架方法之間不共享變數

處理ajax的請求

spring3 mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,然後直接返回響應文字即可。送上一段程式碼:

@ResponseBody

@RequestMapping("/delUser")

public String delUser(String id, HttpServletResponse response){

String result ="{\"result\":\"error\"}";

if (userManager.delUser(id)) {

result ="{\"result\":\"success\"}";

}

return result;

//                spring3mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody

//                @ResponseBody代替了下面的程式碼

//                PrintWriterout = null;

//                response.setContentType("application/json");

//               

//                try{

//                        out= response.getWriter();

//                        out.write(result);

//                }catch (IOException e) {

//                        e.printStackTrace();

//                }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

intercepter的實現機制:

struts有自己的interceptor機制,springmvc用的是獨立的AOP方式。這樣導致struts的配置檔案量還是比springmvc大,雖然struts的配置能繼承,綜上,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。