成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Struts2請(qǐng)求處理流程及源碼分析

開發(fā) 后端
根據(jù)Web.xml配置,請(qǐng)求首先經(jīng)過ActionContextCleanUp過濾器,其為可選過濾器,這個(gè)過濾器對(duì)于Struts2和其他框架的集成很有幫助(SiteMesh Plugin),主要清理當(dāng)前線程的ActionContext和Dispatcher;

1.1 Struts2請(qǐng)求處理

1. 一個(gè)請(qǐng)求在Struts2框架中的處理步驟:

a) 客戶端初始化一個(gè)指向Servlet容器的請(qǐng)求;

b) 根據(jù)Web.xml配置,請(qǐng)求首先經(jīng)過ActionContextCleanUp過濾器,其為可選過濾器,這個(gè)過濾器對(duì)于Struts2和其他框架的集成很有幫助(SiteMesh Plugin),主要清理當(dāng)前線程的ActionContext和Dispatcher;

c) 請(qǐng)求經(jīng)過插件過濾器,如:SiteMesh、etc等過濾器;

d) 請(qǐng)求經(jīng)過核心過濾器FilterDispatcher,執(zhí)行doFilter方法,在該方法中,詢問ActionMapper來決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action;

e) 如果ActionMapper決定需要調(diào)用某個(gè)Action,則ActionMapper會(huì)返回一個(gè)ActionMapping實(shí)例(存儲(chǔ)Action的配置信息),并創(chuàng)建ActionProxy(Action代理)對(duì)象,將請(qǐng)求交給代理對(duì)象繼續(xù)處理;

f) ActionProxy對(duì)象根據(jù)ActionMapping和Configuration Manager詢問框架的配置文件,找到需要調(diào)用的Action類;

g) ActionProxy對(duì)象創(chuàng)建時(shí),會(huì)同時(shí)創(chuàng)建一個(gè)ActionInvocation的實(shí)例;

h) ActionInvocation實(shí)例使用命名模式來調(diào)用,在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用;

i) 一旦Action執(zhí)行完畢,ActionInvocation實(shí)例負(fù)責(zé)根據(jù)struts.xml中的配置創(chuàng)建并返回Result。Result通常是一個(gè)需要被表示的JSP或者FreeMarker的模版,也可能是另外的一個(gè)Action鏈;

j) 如果要在返回Result之前做些什么,可以實(shí)現(xiàn)PreResultListener接口,PreResultListener可以在Interceptor中實(shí)現(xiàn),也可以在Action中實(shí)現(xiàn);

k) 根據(jù)Result對(duì)象信息,生成用戶響應(yīng)信息response,在生成響應(yīng)過程中可以使用Struts2 框架中繼承的標(biāo)簽,在此過程中仍會(huì)再次涉及到ActionMapper;

2. Struts2請(qǐng)求處理示意圖:

clip_image002

1.2 Struts2請(qǐng)求處理源碼分析

當(dāng)用戶向Struts2發(fā)送請(qǐng)求時(shí),F(xiàn)ilterDispatcher的doFilter()方法自動(dòng)調(diào)用,doFilter()方法處理請(qǐng)求過程,如下:

1. 創(chuàng)建值棧對(duì)象stack;

2. 創(chuàng)建Action上下文對(duì)象;

3. 對(duì)請(qǐng)求進(jìn)行重新封裝,此次封裝根據(jù)請(qǐng)求內(nèi)容的類型不同,返回不同的對(duì)象:

如果為multipart/form-data類型,則返回MultiPartRequestWrapper類型的對(duì)象,該對(duì)象服務(wù)于文件上傳,否則返回StrutsRequestWrapper類型的對(duì)象,MultiPartRequestWrapper是StrutsRequestWrapper的子類,而這兩個(gè)類都是HttpServletRequest接口的實(shí)現(xiàn)。

4. 通過actionMapper.getMapping()獲得ActionMapping對(duì)象,Action的配置信息存儲(chǔ)在ActionMapping對(duì)象中(Action的配置信息:Action的name、namespace和要調(diào)用的方法method)。相關(guān)代碼如下圖所示:

clip_image004

以上代碼,活動(dòng)圖如下:

clip_image006

5. 如果getMapping()方法返回ActionMapping對(duì)象為null,則FilterDispatcher認(rèn)為用戶請(qǐng)求不是Action,此時(shí)FilterDispatcher會(huì)首先分析:

如果請(qǐng)求以/struts開頭,會(huì)自動(dòng)查找在web.xml文件中配置的packages初始化參數(shù),F(xiàn)ilterDispatcher會(huì)將packages參數(shù)值包下的文件當(dāng)作靜態(tài)資源處理,即直接在頁面上顯示文件內(nèi)容。

如果用戶請(qǐng)求的資源不是以/struts開頭—可能是.jsp文件,也可能是.html文件,則通過過濾器鏈繼續(xù)往下傳送,直到到達(dá)請(qǐng)求的資源為止。

6. 如果getMapping()方法返回有效的ActionMapping對(duì)象,則被認(rèn)為正在請(qǐng)求某個(gè)Action,將調(diào)用Dispatcher.serviceAction(request, response, servletContext, mapping)方法。

以上六步,相關(guān)代碼如下圖所示:

clip_image008

clip_image010

以上代碼,活動(dòng)圖如下:

clip_image012

7. 請(qǐng)求進(jìn)入dispatcher.serviceAction(request,response,servletContext,mapping)方法中:

a) 將相關(guān)對(duì)象信息封裝為Map(如:HttpServletRequest、Http parameters、HttpServletResponse、HttpSession、ServletContext、ActionMapping等對(duì)象信息),并存入到執(zhí)行上下文Map中,返回執(zhí)行上下文Map對(duì)象extraMap;

b) 獲取mapping對(duì)象中存儲(chǔ)的action命名空間、name屬性、method屬性等信息;

c) 加載并解析Struts2配置文件,如果沒有人為配置,默認(rèn)按順序加載struts-default.xml、struts-plugin.xml、struts.xml,將action配置、result配置、interceptor配置,解析并存入至config對(duì)象中,返回文件配置對(duì)象config;

d) 根據(jù)執(zhí)行上下文Map、action命名空間、name屬性、method屬性等創(chuàng)建用戶Action的代理對(duì)象;

e) 執(zhí)行Action代理對(duì)象proxy.execute()方法,并轉(zhuǎn)向結(jié)果;

以上步驟相關(guān)代碼,如圖所示:

clip_image014

8. 執(zhí)行Action代理對(duì)象proxy.execute()方法,該方法的執(zhí)行,其實(shí)就是調(diào)用了invocation.invoke()方法,如下圖所示:

clip_image016

9. 執(zhí)行invocation.invoke()方法,實(shí)現(xiàn)了截?cái)r器的遞歸調(diào)用和執(zhí)行Action的execute()方法,DefaultActionInvocation.invoke()方法中代碼,如下圖所示:

clip_image018

在以上代碼中,并未看出攔截器的遞歸調(diào)用,其實(shí)是否遞歸調(diào)用,是由程序員來控制的,遞歸調(diào)用實(shí)現(xiàn)很簡(jiǎn)單:

a) 首先看下Interceptor接口定義:

clip_image020

b) 所有的截?cái)r器必須實(shí)現(xiàn)intercept方法,而該方法的參數(shù)恰恰又是ActionInvocation,所以如果在intercept方法中調(diào)用invocation.invoke(),則會(huì)繼續(xù)從Action的Intercepor列表中找到下一個(gè)截?cái)r器執(zhí)行,依此遞歸調(diào)用Intercepor;

Struts2中的日志攔截器LoggingInterceptor,如下圖所示:

clip_image022

c) 攔截器遞歸調(diào)用活動(dòng)圖,如下所示:

clip_image024

10. 在invocation.invoke()方法中,執(zhí)行攔截器、action并獲得resultCode完畢后,則會(huì)繼續(xù)執(zhí)行PreResultListener集合,并生成Result對(duì)象,實(shí)現(xiàn)PreResultListener接口,可在返回Result之前,做些自定義處理,如圖所示

clip_image026

在返回Result之前,通過PreResultListener實(shí)現(xiàn)自定義處理,常用的有兩種方式:一種在Interceptor中實(shí)現(xiàn),一種在Action實(shí)現(xiàn),如圖所示:

clip_image028

clip_image030

以上兩種方式,大家可以發(fā)現(xiàn)都是通過匿名內(nèi)部類的方式實(shí)現(xiàn),其實(shí)還有一種方式就是通過在攔截器中實(shí)現(xiàn)PreResultListener接口,并實(shí)現(xiàn)方法beforeResult方法,即可。如下圖所示:

clip_image032

11. ***,通過生成Result完成用戶響應(yīng);

以上1-11步,為Struts2處理請(qǐng)求的完整流程分析,其相關(guān)代碼調(diào)用流程,如下圖所示:

clip_image034

 

原文鏈接:http://my.oschina.net/xianggao/blog/75514

【編輯推薦】

  1. Struts2漏洞瘋狂來襲 WEB安全危機(jī)四伏
  2. Marvin 1.4.0發(fā)布 Java圖像處理框架
  3. JavaScript提升網(wǎng)頁加載速度
  4. Java程序員集合框架面試題
  5. Aspose.BarCode for Java 4.5.0發(fā)布
責(zé)任編輯:張偉 來源: 爪哇王子的博客
相關(guān)推薦

2009-06-05 10:43:29

struts2 checheckbox實(shí)例

2013-07-18 15:09:27

2013-07-19 09:36:04

struts2struts2漏洞

2012-04-25 10:14:40

JavaStruts

2009-06-05 10:48:01

struts2 ite功能

2009-07-29 09:54:34

struts2和str

2009-06-05 09:58:20

struts2驗(yàn)證用戶注冊(cè)

2009-06-25 15:11:28

Struts2教程Struts2程序

2009-06-08 16:44:00

struts2 ogn

2009-06-04 07:47:54

Struts 2權(quán)威指源碼

2009-02-04 10:51:07

2012-12-18 16:18:06

2009-02-04 11:00:44

2017-07-11 09:42:22

漏洞

2009-07-03 09:35:57

Struts2 JSP

2009-06-04 08:34:24

Struts2配置struts.xml

2009-06-25 15:22:03

Struts2教程一個(gè)form多個(gè)sub

2009-06-25 16:04:30

2009-07-14 17:10:44

struts2webwork

2009-06-04 09:20:19

struts2 if標(biāo)使用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品久久久久久亚洲精品 | 黄视频在线网站 | 国产乱性 | 久久久久久免费毛片精品 | 一级少妇女片 | 在线播放国产一区二区三区 | 性一区| 亚洲成人网在线 | 国产粉嫩尤物极品99综合精品 | 黄瓜av | 在线视频一区二区 | 国产在线拍偷自揄拍视频 | a欧美| 色.com| 久久国产亚洲 | 99av成人精品国语自产拍 | 欧美精品一级 | 国产精品久久久久久久久久 | 国产成人99久久亚洲综合精品 | 五月花丁香婷婷 | 亚洲va欧美va天堂v国产综合 | 国产在线网址 | 亚洲自拍一区在线观看 | 91精品国产综合久久久久久漫画 | 久久精品国产一区二区三区 | 久久久久久网 | 国产欧美在线 | 婷婷久久综合 | 亚洲精品大全 | 日韩有码一区 | 中文字幕四虎 | 久久在线 | 亚洲国产一区二区在线 | 亚洲精品1区 | 国产精品69久久久久水密桃 | www.成人.com| 成人黄色三级毛片 | 亚洲高清视频在线观看 | 在线国产一区 | 国产精品黄色 | 国产精品揄拍一区二区 |