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

Struts2和SpringMVC是比較流行的MVC框架,兩者的工做流程大致類似,從下面兩張圖就能夠看出。前端

SpringMVC工做流程圖

圖二 ajax

SpringMVC的工做流程描述spring

      1. 用戶向服務器發送請求,請求被Spring前端控制Servelt DispatcherServlet捕獲;json

      2. DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;服務器

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

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

      HttpMessageConveter:將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息mvc

      數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等app

      數據根式化:對請求消息進行數據格式化。如將字符串轉換成格式化數字或格式化日期等框架

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

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

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

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

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

Strut2的體系結構如圖所示:

從圖能夠看出,一個請求在Struts2框架中的處理大概分爲如下幾個步驟:

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

二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMeshPlugin);

三、接着StrutsPrepareAndExecuteFilter被調用,StrutsPrepareAndExecuteFilter詢問ActionMapper來決定這個請求是否須要調用某個Action;

四、若是ActionMapper決定須要調用某個Action,StrutsPrepareAndExecuteFilter把請求的處理交給ActionProxy;

五、ActionProxy經過ConfigurationManager詢問框架的配置文件,找到須要調用的Action類;

六、ActionProxy建立一個ActionInvocation的實例。

七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。

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

 

以上是從宏觀上對比下兩者的工做流程,下面針對細節對比兩者的不一樣。

SpringMVC和Struts2的區別:

1. 機制:

springmvc的入口是servlet,而struts2是filter(這裏要指出,filter和servlet是不一樣的。之前認爲filter是servlet的一種特殊),這樣就致使了兩者的機制不一樣,這裏就牽涉到servlet和filter的區別了。

 

  1. spr ing 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交回給框架方法之間不共享變量

 

  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. i ntercepter的實現機制:

struts有以本身的interceptor機制, springmvc用的是獨立的AOP方式 。這樣致使struts的配置文件量仍是比springmvc大,雖然struts的配置能繼承,因此我以爲論使用上來說,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。

 

小結

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

相關文章
相關標籤/搜索