天天看點

java---springMVC與strutsMVC的差別 spring mvc與struts的差別

spring mvc與struts的差別

标簽: strutsspringmvcservletactiontomcat

2011-11-24 17:34 24205人閱讀 評論(6) 收藏 舉報

 分類:

Spring(25) 

spring3mvc與struts2比較

項目剛剛換了web層架構,放棄了struts2改用spring3mvc 

當初還架構的時候目的比較單純---springmvc支援rest,小生對restful url由衷的喜歡

不用不知道 一用就發現開發效率确實比struts2高 

我們用struts2時采用的傳統的配置檔案的方式,并沒有使用傳說中的0配置 

spring3 mvc可以認為已經100%零配置了(除了配置springmvc-servlet.xml外) 

比較了一下strus2與spring3 mvc的差别 

============================================ 

struts2架構是類級别的攔截,每次來了請求就建立一個Action,然後調用setter getter方法把request中的資料注入

struts2實際上是通過setter getter方法與request打交道的 

struts2中,一個Action對象對應一個request上下文 

spring3 mvc不同,spring3mvc是方法級别的攔截,攔截到方法後根據參數上的注解,把request資料注入進去

在spring3mvc中,一個方法對應一個request上下文 

好了 我們來整理一下 

struts2是類級别的攔截, 一個類對應一個request上下文, 

springmvc是方法級别的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應

是以說從架構本身上 spring3 mvc就容易實作restful url 

而struts2的架構實作起來要費勁 

因為struts2 action的一個方法可以對應一個url 

而其類屬性卻被所有方法共享,這也就無法用注解或其他方式辨別其所屬方法了 

=================================== 

spring3mvc的方法之間基本上獨立的,獨享request response資料 

請求資料通過參數擷取,處理結果通過ModelMap交回給架構 

方法之間不共享變量 

而struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變量是共享的 

這不會影響程式運作,卻給我們編碼 讀程式時帶來麻煩 

==================================== 

spring3 mvc的驗證也是一個亮點,支援JSR303 

處理ajax的請求更是友善 隻需一個注解@ResponseBody ,然後直接傳回響應文本即可 

附上一段代碼 

Java代碼

@RequestMapping(value="/whitelists")   

  1. public String index(ModelMap map){   
  2.     Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId()) ;   
  3.     List<Group> groupList = groupManager.findAllGroup(account.getId()) ;   
  4.     map.put("account", account);   
  5.     map.put("groupList", groupList);   
  6.     return "/group/group-index" ;   
  7. }   
  8.        //@ResponseBody ajax響應     
  9. @RequestMapping(value="/whitelist/{whiteListId}/del")   
  10. @ResponseBody     
  11. public String delete(@PathVariable Integer whiteListId){   
  12.     whiteListManager.deleteWhiteList(whiteListId) ;   
  13.     return "success" ;   
  14. }  

評論截選:

注解和性能沒有關系,Servlet的生命周期是這樣的,在調用這個Servlet時候才建立這個Servlet的類并運作init()方法,然後另外有人運作這個Servlet的時候并沒有重新開機建立Servlet和運作裡邊的init()方法,是以Servlet容器時單利的,spring就是Servlet的封裝的架構,包括所有的依賴注入都是在tomcat啟動的時候全部被初始化的,其他的注解也一樣,也就是說注解也就是以前的xml的配置的替代,以前沒個請求都要運作一次xml嗎?并不是的,xml是在tomcat啟動時就讀一次而已并利用裡邊的配置初始化很多的東西,然後就不在使用了,因為都成了單利的,這樣就保證了效率,不是每次都把我們要注入的全部new一次,而是tomcat啟動的時候全部new一次以後就不new了,保證了效率問題。

是以我不明白那個 光看注解就知道性能不好? 

注解就是替代了xml配置而已,而且也是初始化一次,也就是說和編寫Servlet一樣的在init()中做了很多的事而已,并且以後不會在運作init()了,除非你重新開機tomcat。

struts1也一樣,運作一個action的方法的時候建立一個action類,以後再運作就不會建立了,其實也是Servlet的封裝的架構。 

struts2特殊一些,沒個請求要new一個action來保證線程安全。是以效率會低一些,但是不會低的特别離譜。 

這樣也說明了spring3的mvc和struts1的mvc還有Servlet都是方法的線程安全,是以在類方法聲明的私有或者公有變量不是線程安全的,struts2的确實是線程安全的。

所有各有各的好處,用什麼當然是仁者見仁智者見智了。 

不過我們确實在新項目中大量的使用了spring3,因為REST挺好的。