版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。Struts2請求處理流程及源碼分析www29shuacom-1.1Struts2請求處理1.一個請求在Struts2框架中的處理步驟:a)客戶端初始化一個指向Servlet容器的請求;b)根據(jù)Web.xml配置,請求首先經(jīng)過ActionContextCleanUp過濾器,其為可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助(SiteMeshPlugin),主要清理當(dāng)前線程的ActionContext和Dispatcher;c)請求經(jīng)過插件過濾器,如:SiteMesh、etc等過濾器;d
2、)請求經(jīng)過核心過濾器FilterDispatcher,執(zhí)行doFilter方法,在該方法中,詢問ActionMapper來決定這個請求是否需要調(diào)用某個Action;e)如果ActionMapper決定需要調(diào)用某個Action,則ActionMapper會返回一個ActionMapping實例(存儲Action的配置信息),并創(chuàng)建ActionProxy(Action代理)對象,將請求交給代理對象繼續(xù)處理;f)ActionProxy對象根據(jù)ActionMapping和ConfigurationManager詢問框架的配置文件,找到需要調(diào)用的Action類;g)ActionProxy對象創(chuàng)建時,會同
3、時創(chuàng)建一個ActionInvocation的實例;h)ActionInvocation實例使用命名模式來調(diào)用,在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用;i)一旦Action執(zhí)行完畢,ActionInvocation實例負(fù)責(zé)根據(jù)struts.xml中的配置創(chuàng)建并返回Result。Result通常是一個需要被表示的JSP或者FreeMarker的模版,也可能是另外的一個Action鏈;j)如果要在返回Result之前做些什么,可以實現(xiàn)PreResultListener接口,PreResultListener可以在Interceptor中實現(xiàn),也可以在Actio
4、n中實現(xiàn);k)根據(jù)Result對象信息,生成用戶響應(yīng)信息response,在生成響應(yīng)過程中可以使用Struts2框架中繼承的標(biāo)簽,在此過程中仍會再次涉及到ActionMapper;2.Struts2請求處理示意圖:1.2Struts2請求處理源碼分析當(dāng)用戶向Struts2發(fā)送請求時,F(xiàn)ilterDispatcher的doFilter()方法自動調(diào)用,doFilter()方法處理請求過程,如下:1.創(chuàng)建值棧對象stack;2.創(chuàng)建Action上下文對象;3.對請求進(jìn)行重新封裝,此次封裝根據(jù)請求內(nèi)容的類型不同,返回不同的對象:如果為multipart/form-data類型,則返回MultiPar
5、tRequestWrapper類型的對象,該對象服務(wù)于文件上傳,否則返回StrutsRequestWrapper類型的對象,MultiPartRequestWrapper是StrutsRequestWrapper的子類,而這兩個類都是HttpServletRequest接口的實現(xiàn)。4.通過actionMapper.getMapping()獲得ActionMapping對象,Action的配置信息存儲在ActionMapping對象中(Action的配置信息:Action的name、namespace和要調(diào)用的方法method)。相關(guān)代碼如下圖所示:以上代碼,活動圖如下:5.如果getMappi
6、ng()方法返回ActionMapping對象為null,則FilterDispatcher認(rèn)為用戶請求不是Action,此時FilterDispatcher會首先分析:如果請求以/struts開頭,會自動查找在web.xml文件中配置的packages初始化參數(shù),F(xiàn)ilterDispatcher會將packages參數(shù)值包下的文件當(dāng)作靜態(tài)資源處理,即直接在頁面上顯示文件內(nèi)容。如果用戶請求的資源不是以/struts開頭可能是.jsp文件,也可能是.html文件,則通過過濾器鏈繼續(xù)往下傳送,直到到達(dá)請求的資源為止。6.如果getMapping()方法返回有效的ActionMapping對象,則被
7、認(rèn)為正在請求某個Action,將調(diào)用Dispatcher.serviceAction(request,response,servletContext,mapping)方法。以上六步,相關(guān)代碼如下圖所示:以上代碼,活動圖如下:7.請求進(jìn)入dispatcher.serviceAction(request,response,servletContext,mapping)方法中:a)將相關(guān)對象信息封裝為Map(如:HttpServletRequest、Httpparameters、HttpServletResponse、HttpSession、ServletContext、ActionMapping等
8、對象信息),并存入到執(zhí)行上下文Map中,返回執(zhí)行上下文Map對象extraMap;b)獲取mapping對象中存儲的action命名空間、name屬性、method屬性等信息;c)加載并解析Struts2配置文件,如果沒有人為配置,默認(rèn)按順序加載struts-default.xml、struts-plugin.xml、struts.xml,將action配置、result配置、interceptor配置,解析并存入至config對象中,返回文件配置對象config;d)根據(jù)執(zhí)行上下文Map、action命名空間、name屬性、method屬性等創(chuàng)建用戶Action的代理對象;e)執(zhí)行Actio
9、n代理對象proxy.execute()方法,并轉(zhuǎn)向結(jié)果;以上步驟相關(guān)代碼,如圖所示:8.執(zhí)行Action代理對象proxy.execute()方法,該方法的執(zhí)行,其實就是調(diào)用了invocation.invoke()方法,如下圖所示:9.執(zhí)行invocation.invoke()方法,實現(xiàn)了截攔器的遞歸調(diào)用和執(zhí)行Action的execute()方法,DefaultActionInvocation.invoke()方法中代碼,如下圖所示:在以上代碼中,并未看出攔截器的遞歸調(diào)用,其實是否遞歸調(diào)用,是由程序員來控制的,遞歸調(diào)用實現(xiàn)很簡單:a)首先看下Interceptor接口定義:b)所有的截攔器必
10、須實現(xiàn)intercept方法,而該方法的參數(shù)恰恰又是ActionInvocation,所以如果在intercept方法中調(diào)用invocation.invoke(),則會繼續(xù)從Action的Intercepor列表中找到下一個截攔器執(zhí)行,依此遞歸調(diào)用Intercepor;Struts2中的日志攔截器LoggingInterceptor,如下圖所示:c)攔截器遞歸調(diào)用活動圖,如下所示:10.在invocation.invoke()方法中,執(zhí)行攔截器、action并獲得resultCode完畢后,則會繼續(xù)執(zhí)行PreResultListener集合,并生成Result對象,實現(xiàn)PreResultListener接口,可在返回Result之前,做些自定義處理,如圖所示在返回Result之前,通過PreResultListener實現(xiàn)自定義處理,常用的有兩種方式:一種在Interceptor中實現(xiàn),一種在Action實現(xiàn),如圖所示:以上兩種
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度核能設(shè)施安裝與安全監(jiān)督協(xié)議2篇
- 二零二五年度智能灌溉田地租賃技術(shù)合作協(xié)議3篇
- 小學(xué)數(shù)學(xué)課堂上的思維火花批判性思維的培養(yǎng)實踐
- 二零二五年度藝術(shù)品投資預(yù)約買賣合同范本3篇
- 2024年高管績效與股權(quán)掛鉤協(xié)議
- 醫(yī)療空間人性化設(shè)計全案指南
- 2025年度認(rèn)繳股權(quán)轉(zhuǎn)讓協(xié)議范本:含公司股權(quán)結(jié)構(gòu)調(diào)整協(xié)議3篇
- 技術(shù)創(chuàng)新對教育行業(yè)人才的影響與培養(yǎng)新路徑
- 2024私人非商業(yè)用途汽車租賃協(xié)議模板版
- 小學(xué)階段的多學(xué)科融合教學(xué)模式研究-以化學(xué)為例
- 醫(yī)學(xué)文獻(xiàn)檢索復(fù)習(xí)試題和答案解析(四)
- 科學(xué)備考講解模板
- 中國大數(shù)據(jù)產(chǎn)業(yè)發(fā)展指數(shù)報告(2024版)
- 2024-2025學(xué)年重慶市北碚區(qū)三上數(shù)學(xué)期末監(jiān)測試題含解析
- 大宗貿(mào)易居間協(xié)議2024年
- DL∕T 5499-2015 換流站二次系統(tǒng)設(shè)計技術(shù)規(guī)程
- 2024年安徽省高考政治試卷(真題+答案)
- 中外合作辦學(xué)規(guī)劃方案
- 增強現(xiàn)實技術(shù)在藝術(shù)教育中的應(yīng)用
- 教師法及與教師有關(guān)的法律法規(guī)培訓(xùn)
- 降溫池施工方案
評論
0/150
提交評論