Struts2请求处理的内部流程说明(版本二)
文章目錄
- 請(qǐng)求處理流程圖
- 流程說(shuō)明
請(qǐng)求處理流程圖
流程說(shuō)明
第 1 步:
客戶端初始化一個(gè)指向 Servlet 容器(例如 Tomcat)的請(qǐng)求,例如:在瀏覽器中輸入 http:localhost:8080/Struts2/helloworld/helloworldAction.action 就是提交一個(gè)HttpServletRequest 請(qǐng)求。
請(qǐng)求會(huì)被 Tomcat 接收到,Tomcat 服務(wù)器來(lái)選擇處理這個(gè)請(qǐng)求的 Web 應(yīng)用,那就是由 helloworld 這個(gè) web 工程來(lái)處理這個(gè)請(qǐng)求。
第 2 步:
Web 容器會(huì)去讀取 helloworld 這個(gè)工程的 web.xml,在 web.xml 中進(jìn)行匹配,最后發(fā)現(xiàn)需要經(jīng)過(guò)一堆的過(guò)濾器。
這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter),例如:ActionContextCleanUp、其他過(guò)濾器(SiteMesh等)、FilterDispatcher
注意:
這里是有順序的,先 ActionContextCleanUp,再其它過(guò)濾器,最后FilterDispatcher。FilterDispatcher 是Struts 2 的調(diào)度中心,是 Struts 2 的控制器的核心,也就是 Struts 2 框架中的控制層(Controller)的核心
FilterDispatcher 必須放在濾器鏈的最后,如果在 FilterDispatcher 前出現(xiàn)了如SiteMesh 這種特殊的過(guò)濾器,還必須在 SiteMesh 前引用 Struts 2 的ActionContextCleanUp 過(guò)濾器。
Struts 2.1.3 版本后核心控制器 FilterDispatcher 被棄用了,替換成 StrutsPrepareAndExecuteFilter,因?yàn)?FilterDispatch 在執(zhí)行 Action 之前不能插入自定義的過(guò)濾器, 而 StrutsPrepareAndExecuteFilter 可以在執(zhí)行 Action 之前添加自己的過(guò)濾器。如果要使用 ActionContextCleanUp,則可以通過(guò)StrutsPrepareFilter 和 StrutsExecuteFilter 進(jìn)行替換。
擴(kuò)展:
Struts 2 的核心控制器 FilterDispatcher,有 3 個(gè)重要的方法:destroy()、doFilter()、init(),執(zhí)行順序是:init() ? doFilter() ? destroy()
第 3 步:
接著 FilterDispatcher 被調(diào)用,即容器會(huì)創(chuàng)建 FilterDispatcher 實(shí)例,然后調(diào) doFilter() 方法,在這個(gè)方法中,FilterDispatcher 詢問(wèn) ActionMapper 是否需要調(diào)用某個(gè) Action 來(lái)處理這個(gè)(HttpServletRequest)請(qǐng)求,如果 ActionMapper 決定需要調(diào)用某個(gè) Action,ActionMapper 會(huì)通知 FilterDispatcher 需要處理這個(gè)請(qǐng)求,FilterDispatcher 會(huì)停止過(guò)濾器鏈以后的部分,(這也就是為什么 FilterDispatcher 應(yīng)該出現(xiàn)在過(guò)濾器鏈的最后的原因)。FilterDispatcher 則把請(qǐng)求的處理交給 ActionProxy,即建立一個(gè) ActionProxy 實(shí)例,這個(gè)對(duì)象作為Action 與 xwork 之間的中間層,會(huì)代理 Action 的運(yùn)行過(guò)程。
第 4 步:
ActionProxy 通過(guò) ConfigurationManager 詢問(wèn)框架的配置文件(struts.xml),找到需要調(diào)用的 Action 類
注意:
在服務(wù)器啟動(dòng)的時(shí)候,ConfigurationManager 就會(huì)把 struts.xml 中的所有信息讀到內(nèi)存里,并緩存,當(dāng) ActionProxy 帶著 URL 向他詢問(wèn)要運(yùn)行哪個(gè) Action 的時(shí)候,就可以直接查找并返回
第 5 步:
ActionProxy 創(chuàng)建一個(gè) ActionInvocation 實(shí)例,同時(shí) ActionInvocation 通過(guò)代理模式調(diào)用 Action。但在調(diào)用之前,ActionInvocation 會(huì)根據(jù)配置加載 Action 相關(guān)的所有 Interceptor(攔截器),即調(diào)用 Action 的過(guò)程前后,涉及到相關(guān)攔截器的調(diào)用
第 6 步:
一旦 Action 執(zhí)行完畢,ActionInvocation 負(fù)責(zé)根據(jù) struts.xml 中的配置找到對(duì)應(yīng)的返回結(jié)果 result。返回結(jié)果通常是一個(gè)需要被表示的 JSP 或者 FreeMarker 的模版(不一定是頁(yè)面,也可能是另外的一個(gè) Action 鏈)。在表示的過(guò)程中可以使用 Struts 2 框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到 ActionMapper。
第 7 步:
最后,ActionInvocation 對(duì)象倒序執(zhí)行攔截器。ActionInvocation 對(duì)象執(zhí)行完畢后,已經(jīng)得到響應(yīng)對(duì)象(HttpServletResponse)了,最后按與過(guò)濾器配置定義相反的順序依次經(jīng)過(guò)過(guò)濾器,向客戶端展示出響應(yīng)的結(jié)果,即通過(guò) HTTPServletResponse 返回客戶端一個(gè)響應(yīng)。
總結(jié)
以上是生活随笔為你收集整理的Struts2请求处理的内部流程说明(版本二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。