1. 程式人生 > >Struts2 與 SpringMvc 的區別

Struts2 與 SpringMvc 的區別

SpringMVC和Struts2的區別:

1. 機制:

springmvc的入口是servlet,而struts2是filter,這樣就導致了二者的機制不同,這裡就牽涉到servlet和filter的區別了。

  1. spring mvc是基於方法的設計  而sturts2是基於類 ,導致:

效能:

spring會稍微比struts2快。 spring mvc是基於方法的設計  struts2是基於類 ,每次發一次請求都會例項一個action,每個action都會被注入屬性,而spring基於方法,粒度更細,但要小心把握像在servlet控制資料一樣。spring3mvc是方法級別的攔截,攔截到方法後根據引數上的註解,把request資料注入進去,在spring3mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,然後呼叫settergetter方法把request中的資料注入;

 struts2實際上是通過setter getter方法與request打交道的 ,而 springmvc 不用 setter getter 方法 ;struts2中,一個Action物件對應一個request上下文。

實現restful:

springmvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上 spring3 mvc就容易實現restful。 struts2 是類級別的攔截,一個類對應一個 request 上下文;實現 restfulurl 要費勁,因為 struts2 action 的一個方法可以對應一個 url ;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。

資料共享:

struts2是在接受引數的時候,可以用屬性來接受引數,這就說明引數是讓多個方法共享的。

spring3mvc的方法之間基本上獨立的,獨享request response資料,請求資料通過引數獲取,處理結果通過ModelMap交回給框架方法之間不共享變數

2.struts2是多例模式,而SpingMvc是單例模式

Struts2:

1) Struts2 會對每一個請求,產生一個Action的例項來處理.

2) Spring的Ioc容器管理的bean預設是單例項的.

首先從資料安全性的問題上考慮,我們的Action應該保證是多例的,這樣才不會出現數據問題。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一個來提高效能,這樣的話,就可以使用單例模式。

不過幸好,Spring的bean可以針對每一個設定它的scope,所以,上面的問題就不是問題了。如果用單例,就在spring的action bean配置的時候設定scope="prototype".

SpingMvc:

最佳實踐:

1、不要在controller中定義成員變數。

2、萬一必須要定義一個非靜態成員變數時候,則通過註解@Scope("prototype"),將其設定為多例模式。