【Struts2】 Action實現。 interceptor實現。 Filter工做原理。 html
使用 攔截器來處理請求。web
業務邏輯控制器與 Servlet API分離。數據庫
============================================================================================================= 編程
HttpServletRequest - ActionMapper - FilterDispatcher - ActionProxyFactory - ActionProxy (Configuration Manager - struts.xml) - Action Invocation - Interceptors - Action - Result - Template(JSP) - Interceptors - HttpServletResponse瀏覽器
=============================================================================================================app
《Struts2:運行順序圖》框架
=============================================================================================================jsp
【請求響應流程】spa
Controller、ActionProxy、ActionMapping、Configuration Manager、ActionInvocation、Inerceptor、Action、Result等。設計
(1) 客戶端(Client)向Action發用一個請求(Request)
(2) Container經過web.xml映射請求,並得到控制器(Controller)的名字
(3) 容器(Container)調用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。
在Struts2.1之前調用FilterDispatcher,Struts2.1之後調用StrutsPrepareAndExecuteFilter
(4) 控制器(Controller)經過ActionMapper得到Action的信息
(5) 控制器(Controller)調用ActionProxy
(6) ActionProxy讀取struts.xml文件獲取action和interceptor stack的信息。
(7) ActionProxy把request請求傳遞給ActionInvocation
(8) ActionInvocation依次調用action和interceptor
(9) 根據action的配置信息,產生result
(10) Result信息返回給ActionInvocation
(11)產生一個HttpServletResponse響應
(12)產生的響應行爲發送給客服端。
=============================================================================================================
【Struts1的缺點】
1)支持的表現層技術單一
2)與Servlet API嚴重耦合,這點能夠從Action的Execute的方法聲明裏面就能夠看的出來
3)代碼依賴Struts1 API,有侵入性,這點能夠從寫Action類和FormBean的時候看的出來,Action必須實現Struts的Action類。
Struts1是使用ActionServlet作爲其中心處理器,Struts2則使用一個攔截器(FilterDispatcher)作爲其中心處理器,這樣作的一個好處就是將Action類和Servlet API進行了分離。
Struts 2框架自己大體能夠分爲3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。
【優勢】
第一:在軟件設計上不依賴與Servlet API跟servlet沒有太多的耦合度,struts2的設計是無侵入式的設計,struts1是侵入式設計。
第二:Struts2提供了攔截器的功能,利用攔截器進行AOP編程(面向切面編程),實現權限驗證等功能。
第三: struts2也提供了類型轉換的功能,對特殊的需求進行轉換。若是咱們要對一樣的功能進行轉換,咱們必須在底層實現對beanutil的註冊。
第四:struts2支撐多種表現層的技術如jsp,freemarker等
第五:struts2能夠對指定的方法和全部的方法進行校驗。
第六:提供了全局範圍,包範圍和action範圍的資源國際化的實現。
=============================================================================================================
【請求細節處理】
1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
2、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin);
三、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否須要調用某個Action;
4、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
5、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類;
六、ActionProxy建立一個ActionInvocation的實例。
7、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper。
=============================================================================================================
【處理流程】不詳細
一、加載類(FilterDispatcher)
二、讀取配置(struts配置文件中的Action)
三、派發請求(客戶端發送請求)
四、調用Action(FilterDispatcher從struts配置文件中讀取與之相對應的Action )
五、啓用攔截器(WebWork攔截器鏈自動對請求應用通用功能,如驗證)
六、處理業務(回調Action的execute()方法)
七、返回響應(經過execute方法將信息返回到FilterDispatcher)
八、查找響應(FilterDispatcher根據配置查找響應的是什麼信息如:SUCCESS、ERROR,將跳轉到哪一個jsp頁面)
九、響應用戶(jsp--->客戶瀏覽器端顯示)
十、struts2標籤庫(相比struts1的標籤庫,struts2是大大增強了,對數據的操做功能很強大)
=============================================================================================================
struts2經過攔截器來處理用戶的請求,從而容許用戶的業務邏輯控制器和Servlet分離。
【處理流程】較老版本的過程
1.瀏覽器發送請求例如/muweb/login.action,report/es.pdf等
2.核心控制器FilgerDispatcher根據請求調用對應的action。中心處理器根據struts.xml文件查找對應的處理請求的Action類。
3.WebWork的攔截器鏈自動對請求應用通用功能,例如:WorkFlow、Validation等功能
4.若是Struts.xml文件中配置Method參數,則調用Method參數對應的Action類中的Method方法,不然調用通用的Execute方法來處理用戶請求。
回調action的execute的方法,該方法先獲取參數,而後執行數據的操做,既能夠把數據保存到數據庫中也能夠把數據從數據中提取出來,同時在出來以後返回一個string類型的值。
5.Action中execute的方法處理結果信息將輸出到html中或者是文檔,咱們主要經過execute方法處理後的返回參數來調用。
=============================================================================================================