1. 程式人生 > >struts1和struts2和springMVC的區別和介紹

struts1和struts2和springMVC的區別和介紹

MVC是web開發常用的模式,M即模型層(Model):主要由javabean來實現。V即檢視層(View):主要由jsp、velocity、freemarker等。C即控制層(Controller):主要由servlet、strtus、springmvc來實現。

struts1 Struts1 工作流程
1  ActionServlet接收由瀏覽器發出的請求後,檢索和請求匹配的ActionMapping物件。如果不存在,返回請求無效的資訊。
2  檢索和請求匹配的ActionForm物件。如果不存在,就建立一個。把提交的表單中的資料儲存在ActionForm物件中
3  根據配置資訊決定是否進行校驗。如果是,就進行校驗。如果通過校驗,進行下一步
4  ActionServlet根據ActionMapping物件包含的資訊決定把請求轉發給哪個Action。如果這個Action的物件不存在,就建立一個,然後呼叫它的excute方法
5  Action的excute方法返回一個ActionForward物件。ActionServlet把請求轉發給ActionForward指定的JSP。
6  ActionFoward物件指定的JSP生成動態網頁,返回給瀏覽器


struts2
struts2是webwork升級版,跟struts1沒有關係。struts1和servlet耦合度高,各層之間耦合度高,單元測試困難,表示層技術單一,而struts2沒有和servlet耦合,更容易測試,支援更多表示層技術。 struts2工作流程 1)  客戶端初始化一個指向Servlet容器(例如Tomcat)的請求。
2)  這個請求經過一系列的過濾器(Filter)。
3)  接著FilterDispatcher被呼叫,FilterDispatcher詢問ActionMapper來決定這個請是否需要呼叫某個Action。
4)  如果ActionMapper決定需要呼叫某個Action,FilterDispatcher把請求的處理交給ActionProxy。
5)  ActionProxy通過Configuration Manager詢問框架的配置檔案,找到需要呼叫的Action類。
6)  ActionProxy建立一個ActionInvocation的例項。
7)  ActionInvocation例項使用命名模式來呼叫,在呼叫Action的過程前後,涉及到相關攔截器(Intercepter)的呼叫。
8)  一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。
Struts2的核心就是攔截器。Struts.xml中所有的package都要extends="struts-default"。同理與所有的Java類都要extends自Object一樣。struts-default.xml裡面就是要做以上事情。

springmvc

1.spring mvc將所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet將請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver檢視解析器,找到ModelAndView物件指定的檢視物件
6.檢視物件負責渲染返回給客戶端。

struts1與struts2的比較

1、struts1要求Action類繼承一個抽象基類,而不是介面,struts2繼承ActionSupport類或者實現Action介面。

2、struts1是單例模式的,Action資源必須是執行緒安全的或同步的,會有執行緒安全問題,struts2為每一個請求都例項化一個物件,不存線上程安全問題。

3、struts1依賴servlet API 因為execute方法的引數有httpservletrequest和httpservletresponse物件,而struts2不用依賴servlet。

4、struts1依賴servlet API,所以測試要依賴web容器,測試難,struts2不依賴於容器,允許Action脫離容器單獨被測試。 

5、ActionForm,普通的JavaBean不能用作ActionForm,因此,開發者必須建立大量的ActionForm類封裝使用者請求引數,Struts 2直接使用Action屬性來封裝使用者請求屬性,避免了開發者需要大量開發ActionForm類的煩瑣。Struts 2提供了ModelDriven模式,可以讓開發者使用單獨的Model物件來封裝使用者請求引數,但該Model物件無需繼承任何Struts 2基類,是一個POJO,從而降低了程式碼汙染。 

6、struts1 支援jsp作為表現層技術,struts2支援velocity、freemarker等表現層技術。 7、Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本物件圖遍歷,但是對集合和索引屬性的支援很弱。 Struts2可以使用JSTL,但是也支援一個更強大和靈活的表示式語言OGNL 8、Struts1支援每一個模組有單獨的Request Processors(生命週期),但是模組中的所有Action必須共享相同的生命週期。 Struts2支援通過攔截器堆疊(Interceptor Stacks)為每一個Action建立不同的生命週期 struts2與springmvc比較

1、spring mvc的入口是servlet,而struts2是filter
2、struts2是類級別的攔截, 一個類對應一個request上下文,springmvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應
3、spring會稍微比struts快。spring mvc是基於方法的設計,而sturts是基於類,每次發一次請求都會例項一個action,每個action都會被注入屬性,而spring基於方法,粒度更細,但要小心把握像在servlet控制資料一樣。spring3 mvc是方法級別的攔截,攔截到方法後根據引數上的註解,把request資料注入進去,在spring3 mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,然後呼叫setter getter方法把request中的資料注入;struts2實際上是通過setter getter方法與request打交道的;struts2中,一個Action物件對應一個request上下文。
4、spring3mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,然後直接返回響應文字即可。