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裏面就是要作以上事情。
springmvcjava
1.spring mvc將全部的請求都提交給DispatcherServlet,它會委託應用系統的其餘模塊負責對請求進行真正的處理工做。
2.DispatcherServlet查詢一個或多個HandlerMapping,找處處理請求的Controller.
3.DispatcherServlet將請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。web
struts1與struts2的比較ajax
一、struts1要求Action類繼承一個抽象基類,而不是接口,struts2繼承ActionSupport類或者實現Action接口。spring
二、struts1是單例模式的,Action資源必須是線程安全的或同步的,會有線程安全問題,struts2爲每個請求都實例化一個對象,不存在線程安全問題。瀏覽器
三、struts1依賴servlet API 由於execute方法的參數有httpservletrequest和httpservletresponse對象,而struts2不用依賴servlet。安全
四、struts1依賴servlet API,因此測試要依賴web容器,測試難,struts2不依賴於容器,容許Action脫離容器單獨被測試。 mvc
五、ActionForm,普通的JavaBean不能用做ActionForm,所以,開發者必須建立大量的ActionForm類封裝用戶請求參數,Struts 2直接使用Action屬性來封裝用戶請求屬性,避免了開發者須要大量開發ActionForm類的煩瑣。Struts 2提供了ModelDriven模式,可讓開發者使用單獨的Model對象來封裝用戶請求參數,但該Model對象無需繼承任何Struts 2基類,是一個POJO,從而下降了代碼污染。
六、struts1 支持jsp做爲表現層技術,struts2支持velocity、freemarker等表現層技術。
七、Struts1 整合了JSTL,所以使用JSTL EL。這種EL有基本對象圖遍歷,可是對集合和索引屬性的支持很弱。 Struts2可使用JSTL,可是也支持一個更強大和靈活的表達式語言OGNL
八、Struts1支持每個模塊有單獨的Request Processors(生命週期),可是模塊中的全部Action必須共享相同的生命週期。 Struts2支持經過攔截器堆棧(Interceptor Stacks)爲每個Action建立不一樣的生命週期
struts2與springmvc比較
一、spring mvc的入口是servlet,而struts2是filter 二、struts2是類級別的攔截, 一個類對應一個request上下文,springmvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應 三、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上下文。 四、spring3mvc的驗證也是一個亮點,支持JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,而後直接返回響應文本便可。