Spring MVC和Struts2的比較的優點
我們用struts2時采用的傳統的配置文件的方式,并沒有使用傳說中的0配置。spring3 mvc可以認為已經100%零配置了(除了配置spring mvc-servlet.xml外)。
Spring MVC和Struts2的區別:
-
核心控制器(前端控制器、預處理控制器):對于使用過mvc框架的人來說這個詞應該不會陌生,核心控制器的主要用途是處理所有的請求,然后對那些特殊的請求 (控制器)統一的進行處理(字符編碼、文件上傳、參數接受、異常處理等等),SpringMVC核心控制器是Servlet,而Struts2是 Filter。
</li> -
學習難度:Struts更加很多新的技術點,比如攔截器、值棧及OGNL表達式,學習成本較高,SpringMVC 比較簡單,很較少的時間都能上手。
</li> -
管理方式:大部分的公司的核心架構中,就會使用到Spring,而SpringMVC又是Spring中的一個模塊,所以spring對于SpringMVC的控制器管理更加簡單方便,而且提供了全 注解方式進行管理,各種功能的注解都比較全面,使用簡單,而struts2需要采用XML很多的配置參數來管理(雖然也可以采用注解,但是幾乎沒有公司那 樣使用)。
</li>
-
性能:SpringMVC會稍微比Struts2快。SpringMVC是基于方法的設計,而Sturts2是基于類,每次發一次請求都會實例一個action,每個action都會被注入屬性,而SpringMVC基于方法,粒度更細,但要小心把握像在servlet控制數據一樣。SpringMVC是方法級別的攔截,攔截到方法后根據參數上的注解,把request數據注入進去,在SpringMVC中,一個方法對應一個request上下文。而Struts2框架是類級別的攔截,每次來了請求就創建一個Action,然后調用setter getter方法把request中的數據注入;Struts2實際上是通過setter getter方法與request打交道的;Struts2中,一個Action對象對應一個request上下文。
</li> -
參數傳遞:Struts2中自身提供多種參數接受,其實都是通過(ValueStack)進行傳遞和賦值,而SpringMVC是通過方法的參數進行接收。
</li> -
設計思想上:Struts2更加符合oop的編程思想, SpringMVC就比較謹慎,在Servlet上擴展。
</li> -
intercepter的實現機制:Struts2有以自己的interceptor機制,SpringMVC用的是獨立的AOP方式。這樣導致Struts2的配置文件量還是比SpringMVC大,雖然Struts2的配置能繼承,所以我覺得論使用上來講,SpringMVC使用更加簡潔,開發效率SpringMVC確實比Struts2高。SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上SpringMVC就容易實現restful url。Struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,因為Struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標識其所屬方法了。SpringMVC的方法之間基本上獨立的,獨享request response數據,請求數據通過參數獲取,處理結果通過ModelMap交回給框架方法之間不共享變量,而Struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變量是共享的,這不會影響程序運行,卻給我們編碼,讀程序時帶來麻煩。
</li> -
另外,SpringMVC的驗證也是一個亮點,支持JSR303,處理ajax的請求更是方便,只需一個注解@ResponseBody ,然后直接返回響應文本即可。送上一段代碼:
</li> </ol>@RequestMapping(value=“/whitelists”) public String index(ModelMap map) { Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId()); List groupList = groupManager.findAllGroup(account.getId()); map.put(“account”, account); map.put(“groupList”, groupList); return “/group/group-index”; }
// @ResponseBody ajax響應,處理Ajax請求也很方便 @RequestMapping(value=“/whitelist/{whiteListId}/del”) @ResponseBody public String delete(@PathVariable Integer whiteListId) { whiteListManager.deleteWhiteList(whiteListId); return “success”; }