控制層SpringMVC和Struts2的區別
我們現在流行的常用的MVC層,控制層Controller層的框架主要有Struts2和SpringMVC兩個框架,分別對應著Action和Controller。那麼SpringMVC和Struts的主要區別有那些呢?
一、框架機制
我們知道Struts2採用Filter實現,而SpringMVC則採用Servlet實現。
Struts2使用StrutsPrepareAndExecuteFilter,而SpringMVC使用DispatcherServlet。Filter是一種特殊的Servlet。Filter在容器啟動之後即初始化;服務停止以後墜毀,晚於Servlet。Servlet在是在呼叫時初始化,先於Filter呼叫;服務停止後墜毀。
二、攔截機制
1、Struts2
Struts2框架是類級別的攔截,每次請求就會建立一個Action,和spring整合時Struts2的Action Bean注入作用域是原型模式prototype(否則會出現執行緒併發問題),然後通過setter,getter吧request資料注入到屬性。
Struts2中,一個Action對應一個request,response上下文,在接收引數時,可以通過屬性接收,這說明屬性引數是讓多個方法共享的。
2、SpringMVC
SpringMVC是方法級別的攔截,一個方法對應一個Request上下文,所以方法直接基本上是獨立的,獨享request,response資料。而每個方法同時又何一個url對應,引數的傳遞是直接注入到方法中的,是方法所獨有的。處理結果通過ModeMap返回給框架。
在Spring整合時,SpringMVC的Controller Bean預設單例模式Singleton,所以預設對所有的請求,只會建立一個Controller,有應為沒有共享的屬性,所以是執行緒安全的,如果要改變預設的作用域,需要新增@Scope註解修改。
三、效能方面
SpringMVC實現了零配置,由於SpringMVC基於方法的攔截,有載入一次單例模式bean注入。而Struts2是類級別的攔截,每次請求對應例項一個新的Action,需要載入所有的屬性值注入,所以決定了SpringMVC更加快於Struts2。
四、攔截機制
Struts2有自己的攔截Interceptor機制,SpringMVC這是用的是獨立的Aop方式。