1. 程式人生 > >攔截器和過濾器區別,Struts2與SpringMVC的區別

攔截器和過濾器區別,Struts2與SpringMVC的區別

攔截器和過濾器

1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的;

2.攔截器不依賴於servlet容器,而過濾器依賴於servlet容器

3.攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用;

4.攔截器可以訪問Action上下文、值棧裡的物件,而過濾器不能;

5.Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次。


有多個攔截器和過濾器時,執行順序跟他們在xml中的配置檔案順序有關


Struts2與SpringMVC的區別

springMVC預設是單例的,Struts2預設是多例的;

Springmvc

的入口是一個servlet即前端控制器,而Struts2入口是一個filter過慮器;

Springmvc是基於方法開發(一個url對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或多例(建議單例)struts2是基於類開發,傳遞引數是通過類的屬性,只能設計為多例;

Struts2採用值棧儲存請求和響應的資料,通過OGNL存取資料,Springmvc通過引數解析器是將request請求內容解析,並給方法形參賦值,將資料和檢視封裝成ModelAndView物件,最後又將ModelAndView中的模型資料通過reques域傳輸到頁面,Jsp檢視解析器預設使用JSTL


儘量不要在controller裡面去定義屬性,如果在特殊情況需要定義屬性的時候,那麼就在類上面加上註解@Scope("prototype")

改為多例的模式,以前struts是基於類的屬性進行發的,定義屬性可以整個類通用,所以預設是多例,不然多執行緒訪問肯定是共用類裡面的屬性值的,肯定是不安全的,但是springmvc是基於方法的開發,都是用形參接收值,一個方法結束引數就銷燬了,多執行緒訪問都會有一塊記憶體空間產生,裡面的引數也是不會共用的,所有springmvc預設使用了單例,所以controller裡面不適合在類裡面定義屬性,只要controller中不定義屬性,那麼單例完全是安全的。springmvc這樣設計主要的原因也是為了提高程式的效能和以後程式的維護只針對業務的維護就行,要是struts的屬性定義多了,都不知道哪個方法用了這個屬性,對以後程式的維護還是很麻煩的。