同是流行MVC框架,比較Strtus2和SpringMVC的區別

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 urlstruts2是類級別的攔截,一個類對應一個request上下文;實現restfulurl要費勁,因爲struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。

 

數據共享:

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

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

 

 

  1. 處理ajax的請求

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

<span style="font-family:SimSun;font-size:18px;">@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();
//                }
}</span>

 

  1. intercepter的實現機制:

struts有以自己的interceptor機制,springmvc用的是獨立的AOP方式。這樣導致struts的配置文件量還是比springmvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。


小結

    其實用什麼技術,這一點真的沒有硬性的要求,有人覺得struts好用,有人就覺得springMVC先進。總的來說,實現的功能都是大體一致的。有時候架構師一直使用struts,爲了項目的穩定,就一直沿用;而一些先進分子總是喜歡在項目中常識新的技術,也促進了這項技術的發展。單就struts和springMVC來說,都是controller層的框架,作用都是接收request請求,中間調用業務邏輯代碼,最後返回reponse響應,不用刻意遠離SSH,也不用一味追求Spring MVC。總之,合適的就是最好的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章