日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Struts2攔截器執(zhí)行順序

系統(tǒng) 1865 0

在之前的文章中,我們已經(jīng)涉及到了攔截器(Interceptor)的概念。


接下來(lái),我們將重點(diǎn)討論一下Struts2中的攔截器的內(nèi)部結(jié)構(gòu)和執(zhí)行順序,并結(jié)合源碼進(jìn)行分析。

Interceptor結(jié)構(gòu)讓我們?cè)賮?lái)回顧一下之前我們?cè)?jīng)用過(guò)的一張Action LifeCycle的圖:

?? 我在這里需要指出的是一個(gè)很重要的方法invocation.invoke()。這是ActionInvocation中的方法,而ActionInvocation是Action調(diào)度者,所以這個(gè)方法具備以下2層含義:

?? 1. 如果攔截器堆棧中還有其他的Interceptor,那么invocation.invoke()將調(diào)用堆棧中下一個(gè)Interceptor的執(zhí)行。

?? 2. 如果攔截器堆棧中只有Action了,那么invocation.invoke()將調(diào)用Action執(zhí)行。

所以,我們可以發(fā)現(xiàn),invocation.invoke()這個(gè)方法其實(shí)是整個(gè)攔截器框架的實(shí)現(xiàn)核心。基于這樣的實(shí)現(xiàn)機(jī)制,我們還可以得到下面2個(gè)非常重要的推論:

?? 1. 如果在攔截器中,我們不使用invocation.invoke()來(lái)完成堆棧中下一個(gè)元素的調(diào)用,而是直接返回一個(gè)字符串作為執(zhí)行結(jié)果,那么整個(gè)執(zhí)行將被中止。

?? 2. 我們可以以invocation.invoke()為界,將攔截器中的代碼分成2個(gè)部分,在invocation.invoke()之前的代碼,將會(huì)在Action之前被依次執(zhí)行,而在invocation.invoke()之后的代碼,將會(huì)在Action之后被逆序執(zhí)行。

由此,我們就可以通過(guò)invocation.invoke()作為Action代碼真正的攔截點(diǎn),從而實(shí)現(xiàn)AOP。

Interceptor攔截類型

?? 從上面的分析,我們知道,整個(gè)攔截器的核心部分是invocation.invoke()這個(gè)函數(shù)的調(diào)用位置。事實(shí)上,我們也正式根據(jù)這句代碼的調(diào)用位置,來(lái)進(jìn)行攔截類型的區(qū)分的。在Struts2中,Interceptor的攔截類型,分成以下三類:

?? 1. before

before攔截,是指在攔截器中定義的代碼,它們存在于invocation.invoke()代碼執(zhí)行之前。這些代碼,將依照攔截器定義的順序,順序執(zhí)行。

?? 2. after

after攔截,是指在攔截器中定義的代碼,它們存在于invocation.invoke()代碼執(zhí)行之后。這些代碼,將一招攔截器定義的順序,逆序執(zhí)行。

Interceptor執(zhí)行順序

??? Interceptor的執(zhí)行順序或許是我們?cè)谡麄€(gè)過(guò)程中最最關(guān)心的部分。根據(jù)上面所提到的概念,我們實(shí)際上已經(jīng)能夠大致明白了Interceptor的執(zhí)行機(jī)理。我們來(lái)看看Struts2的Reference對(duì)Interceptor執(zhí)行順序的一個(gè)形象的例子。

如果我們有一個(gè)interceptor-stack的定義如下:

Xml代碼?
<interceptor-stack name="xaStack">??
? <interceptor-ref name="thisWillRunFirstInterceptor"/>??
? <interceptor-ref name="thisWillRunNextInterceptor"/>??
? <interceptor-ref name="followedByThisInterceptor"/>??
? <interceptor-ref name="thisWillRunLastInterceptor"/>??
</interceptor-stack>??


那么,整個(gè)執(zhí)行的順序大概像這樣:


Struts2攔截器執(zhí)行順序


?? 在這里,我稍微改了一下Struts2的Reference中的執(zhí)行順序示例,使得整個(gè)執(zhí)行順序更加能夠被理解。我們可以看到,遞歸調(diào)用保證了各種各樣的攔截類型的執(zhí)行能夠井井有條。

請(qǐng)注意在這里,每個(gè)攔截器中的代碼的執(zhí)行順序,在Action之前,攔截器的執(zhí)行順序與堆棧中定義的一致;而在Action和Result之后,攔截器的執(zhí)行順序與堆棧中定義的順序相反。

Struts2攔截器執(zhí)行順序


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 永善县| 平和县| 莱西市| 武陟县| 将乐县| 治县。| 大邑县| 嘉黎县| 蓬安县| 洪湖市| 桐庐县| 浦东新区| 乌兰察布市| 陆良县| 萝北县| 嘉义市| 吴川市| 安新县| 南江县| 临洮县| 漳平市| 普格县| 舒兰市| 柳州市| 盐源县| 台东县| 苏尼特右旗| 开封市| 潞西市| 澎湖县| 聂拉木县| 额敏县| 中阳县| 西盟| 遂溪县| 瑞昌市| 博客| 龙门县| 白沙| 确山县| 宜丰县|