Diff/SpringMVC/Struts2
- J2EE最常用的兩個前端MVC框架,過去屬于Struts2,未來則是SpringMVC的
- 從以下方面對比兩個框架的不同之處
攔截級別
Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上SpringMVC就容易實現restful url,而struts2的架構實現起來要費勁,因為Struts2中Action的一個方法可以對應一個url,而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標識其所屬方法了。
數據獨立性
由上邊原因,SpringMVC的方法之間基本上獨立的,獨享request response數據,請求數據通過參數獲取,處理結果通過ModelMap交回給框架,方法之間不共享變量,而Struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變量是共享的,這不會影響程序運行,卻給我們編碼 讀程序時帶來麻煩,每次來了請求就創建一個Action,一個Action對象對應一個request上下文。
內存損耗
由于Struts2需要針對每個request進行封裝,把request,session等servlet生命周期的變量封裝成一個一個Map,供給每個Action使用,并保證線程安全,所以在原則上,是比較耗費內存的。
攔截器機制
攔截器實現機制上,Struts2有以自己的interceptor機制,SpringMVC用的是獨立的AOP方式,這樣導致Struts2的配置文件量還是比SpringMVC大。
入口的不同
SpringMVC的入口是servlet,而Struts2是filter(這里要指出,filter和servlet是不同的。以前認為filter是servlet的一種特殊實現),這就導致了二者的機制不同,這里就牽涉到servlet和filter的區別了。
對Ajax的支持
SpringMVC集成了Ajax,使用非常方便,只需一個注解@ResponseBody就可以實現,然后直接返回響應文本即可(只支持異步調用),而Struts2攔截器集成了Ajax,在Action中處理時一般必須安裝插件或者自己寫代碼集成進去,使用起來也相對不方便。
驗證機制
SpringMVC驗證支持JSR303,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感覺太煩亂。
和Spring關系
spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(當然Struts2也可以通過不同的目錄結構和相關配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少)。
設計思想
Struts2更加符合OOP的編程思想, SpringMVC就比較謹慎,在servlet上擴展(個人認為這是個好處)。
開發效率和性能
SpringMVC開發效率和性能高于Struts2。SpringMVC可以認為已經100%零配置。
Struts2優缺點
優點
(1) 實現了MVC模式,層次結構清晰,使程序員只需關注業務邏輯的實現。
(2) 豐富的標簽庫,大大提高了開發的效率。
(3) Struts2提供豐富的攔截器實現。
(4) 通過配置文件,就可以掌握整個系統各個部分之間的關系。
(5) 異常處理機制,只需在配置文件中配置異常的映射,即可對異常做相應的處理。
(6) Struts2的可擴展性高。Struts2的核心jar包中由一個struts-default.xml文件,在該文件中設置了一些默認的bean,resultType類型,默認攔截器棧等,所有這些默認設置,用戶都可以利用配置文件更改,可以更改為自己開發的bean,resulttype等。因此用戶開發了插件的話只要很簡單的配置就可以很容易的和Struts2框架融合,這實現了框架對插件的可插拔的特性。
(7) 面向切面編程的思想在Strut2中也有了很好的體現。最重要的體現就是攔截器的使用,攔截器就是一個一個的小功能單位,用戶可以將這些攔截器合并成一個大的攔截器,這個合成的攔截器就像單獨的攔截器一樣,只要將它配置到一個、Action中就可以。
缺點
(1) Struts2中Action中取得從jsp中傳過來的參數時還是有點麻煩。可以為Struts2的Action中的屬性配置上Getter和Setter方法,通過默認攔截器,就可以將請求參數設置到這些屬性中。如果用這種方式,當請求參數很多時,Action類就會被這些表單屬性弄的很臃腫,讓人感覺會很亂。還有Action中的屬性不但可以用來獲得請求參數還可以輸出到Jsp中,這樣就會更亂。假設從JSP1中獲得了參數money=100000,但是這個Action還要輸出到JSP2中,但是輸出的格式卻不同,money=100,000,這樣這個Action中的money中的值就變了。
(2) 校驗還是感覺比較繁瑣,感覺太煩亂,也太細化了,如果校驗出錯的只能給用戶提示一些信息。如果有多個字段,每個字段出錯時返回到不同的畫面,這個功能在Strut2框架下借助框架提供的校驗邏輯就不容易實現。
(3) 安全性有待提高。Struts2曝出2個高危安全漏洞,一個是使用縮寫的導航參數前綴時的遠程代碼執行漏洞,另一個是使用縮寫的重定向參數前綴時的開放式重定向漏洞。這些漏洞可使黑客取得網站服務器的“最高權限”,從而使企業服務器變成黑客手中的“肉雞”。