兩段關於MVC的比較,待驗證--ZT

還是Spring MVC好

前兩天花時間看了一下Struts2(WebWork)的教程,對比了一下,還是覺得Spring MVC更好。
原因有幾點:
1。Spring MVC的controller+command object模式比Struts2的Action模式更安全一些。而在Struts2中,自動數據綁定發生在Action對象上。這樣,在Action類中任何有Set方法的屬性都有可能被http request的參數覆蓋,在設計Action類時如果不小心,就可能會產生安全隱患。比如某個身份認證方案可能會依賴於Action的某個屬性,如role來判斷用戶是否具有訪問該action的權限。這樣,惡意用戶可以通過在request參數中包含一個role參數來改寫action本身對role屬性的設置。
在Spring MVC中,controller和command object是兩個獨立的類,自動數據綁定只發生在command object上,對controller沒有影響,就不存在這個問題。
2。Struts 2的action類本身是線程不安全的,不能使用singleton模式來創建。在我看來,這個是比較ugly的。特別是一些處理邏輯比較複雜的action,每次創建一個新對象實例的代價可能是比較高的。而Spring MVC的command object基本上都是POJO,創建實例的代價很低。
3。Struts 2的jsp tags使用OGNL作爲表達式語言。我個人覺得這個語言功能過強,特別是能夠直接訪問action本身的方法,這類功能很容易被濫用,從而重蹈過去jsp<% %>標記的覆轍。
當然,Struts 2也有很多功能是值得Spring吸取的,比如redirect-action,對namespace的支持等等。特別是Struts 2的底層框架XWork的最新版本2.0beta3已經支持基於annotation的validation,這個Spring應該儘快跟進。
不過我還是覺得Spring 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變量是共享的 
這不會影響程序運行,卻給我們編碼 讀程序時帶來麻煩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章