struts2的核心和工做原理

struts2的框架結構圖

工做流程

一、客戶端請求一個HttpServletRequest的請求,如在瀏覽器中輸入http://localhost: 8080/bookcode/Reg.action就是提交一個(HttpServletRequest)請求。
二、這個請求通過一系列的過濾器(Filter)如(ActionContextCleanUp、其餘過濾器(SiteMesh等)、 FilterDispatcher)。注意:這裏是有順序的,先ActionContext CleanUp,再其餘過濾器(Othter Filters、SiteMesh等),最後到FilterDispatcher。
FilterDispatcher是控制器的核心,就是MVC的Struts 2實現中控制層(Controller)的核心。
三、FilterDispatcher詢問ActionMapper是否須要調用某個Action來處理這個(HttpServlet Request)請求,若是ActionMapper決定須要調用某個Action,FilterDispatcher則把請求的處理交給ActionProxy
四、ActionProxy經過Configuration Manager(struts.xml)詢問框架的配置文件,找到須要調用的Action類。例如,用戶註冊示例將找到UserReg類
五、ActionProxy建立一個ActionInvocation實例,同時ActionInvocation經過代理模式調用Action。但在調用以前,ActionInvocation會根據配置加載Action相關的全部Interceptor(攔截器)。
六、 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果result
七、最後經過HTTPServletResponse返回客戶端一個響應。java

注意:web

一、調用Action的過程先後,涉及到相關攔截器(Intercepter)設計模式

二、Struts 2的核心控制器是FilterDispatcher,有3個重要的方法:destroy()、doFilter()和Init(),能夠在Struts 2的下載文件夾中找到源代碼,執行順序是:init()---->doFilter()-------->destroy()api

攔截器和過濾器的區別

Filter基於回調函數,咱們須要實現的filter接口中doFilter方法就是回調函數;而interceptor基於java自己的反射機制(從配置文件中讀取類名而後實例化該類),這是二者最本質的區別。
Filter是依賴於servlet容器的,即只能在servlet容器中執行,很顯然沒有servlet容器就沒法來回調doFilter方法。而interceptor與servlet容器無關。
Filter的處理對象是HttpRequest,過濾範圍比Interceptor大,而interceptor處理對象是action。
interceptor的攔截處理其實就是代理機制,處理對象是action。Struts的核心過濾器攔截了action的請求以後產生action的代理後進行處理的。瀏覽器

Struts2和struts1的比較

struts2相對於struts1來講簡單了不少,功能強大了不少,咱們能夠從幾個方面來看:安全

  • 體系結構:struts2大量使用攔截器來出來請求,從而容許與業務邏輯控制器 與 servlet-api分離,避免了侵入性;而struts1.x在action中明顯的侵入了servlet-api.
  • 線程安全:struts2.x是線程安全的,每個對象產生一個實例,避免了線程安全問題;而struts1.x在action中屬於單線程。
  • 性能方面:struts2.x測試能夠脫離web容器,而struts1.x依賴servlet-api,測試須要依賴web容器。
  • 請求參數封裝:struts2.x使用ModelDriven模式,這樣咱們 直接 封裝model對象,無須要繼承任何struts2的基類,避免了侵入性。
  • 標籤的優點:標籤庫幾乎能夠徹底替代JSTL的標籤庫,而且 struts2.x支持強大的ognl表達式。

固然,struts2和struts1相比,在 文件上傳,數據校驗 等方面也 方便了好多。在這就不詳談了。
一個比較優秀的框架能夠幫着咱們更高效,穩定的開發合格的產品,不過咱們也不要依賴框架,咱們只要理解了思想、設計模式,咱們能夠本身擴展功能,否則就要永遠讓別人牽着走了!app

相關文章
相關標籤/搜索