Spring MVC和Struts2的比較的優點

jopen 10年前發布 | 56K 次閱讀 Web框架 Spring MVC

我們用struts2時采用的傳統的配置文件的方式,并沒有使用傳說中的0配置。spring3 mvc可以認為已經100%零配置了(除了配置spring mvc-servlet.xml外)。

Spring MVC和Struts2的區別:

  1. 核心控制器(前端控制器、預處理控制器):對于使用過mvc框架的人來說這個詞應該不會陌生,核心控制器的主要用途是處理所有的請求,然后對那些特殊的請求 (控制器)統一的進行處理(字符編碼、文件上傳、參數接受、異常處理等等),SpringMVC核心控制器是Servlet,而Struts2是 Filter。

    </li>

  2. 學習難度:Struts更加很多新的技術點,比如攔截器、值棧及OGNL表達式,學習成本較高,SpringMVC 比較簡單,很較少的時間都能上手。

    </li>

  3. 管理方式:大部分的公司的核心架構中,就會使用到Spring,而SpringMVC又是Spring中的一個模塊,所以spring對于SpringMVC的控制器管理更加簡單方便,而且提供了全 注解方式進行管理,各種功能的注解都比較全面,使用簡單,而struts2需要采用XML很多的配置參數來管理(雖然也可以采用注解,但是幾乎沒有公司那 樣使用)。

    </li>

  4. 性能: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>

  5. 參數傳遞:Struts2中自身提供多種參數接受,其實都是通過(ValueStack)進行傳遞和賦值,而SpringMVC是通過方法的參數進行接收。

    </li>

  6. 設計思想上:Struts2更加符合oop的編程思想, SpringMVC就比較謹慎,在Servlet上擴展。

    </li>

  7. 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>

  8. 另外,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”;  
        }  

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!