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

Struts2攔截器執行順序

系統 1989 0

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


接下來,我們將重點討論一下Struts2中的攔截器的內部結構和執行順序,并結合源碼進行分析。

Interceptor結構讓我們再來回顧一下之前我們曾經用過的一張Action LifeCycle的圖:

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

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

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

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

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

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

由此,我們就可以通過invocation.invoke()作為Action代碼真正的攔截點,從而實現AOP。

Interceptor攔截類型

?? 從上面的分析,我們知道,整個攔截器的核心部分是invocation.invoke()這個函數的調用位置。事實上,我們也正式根據這句代碼的調用位置,來進行攔截類型的區分的。在Struts2中,Interceptor的攔截類型,分成以下三類:

?? 1. before

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

?? 2. after

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

Interceptor執行順序

??? Interceptor的執行順序或許是我們在整個過程中最最關心的部分。根據上面所提到的概念,我們實際上已經能夠大致明白了Interceptor的執行機理。我們來看看Struts2的Reference對Interceptor執行順序的一個形象的例子。

如果我們有一個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>??


那么,整個執行的順序大概像這樣:


Struts2攔截器執行順序


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

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

Struts2攔截器執行順序


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 鹿邑县| 沾化县| 郸城县| 手游| 霸州市| 托克逊县| 长汀县| 永城市| 五华县| 秦安县| 和硕县| 贡嘎县| 罗城| 航空| 东丽区| 平安县| 贵德县| 黑龙江省| 大田县| 正宁县| 武威市| 宣武区| 梨树县| 贡觉县| 安福县| 台中县| 乐清市| 兴海县| 乌鲁木齐县| 宜兴市| 远安县| 疏勒县| 富蕴县| 兴海县| 乌什县| 新龙县| 阆中市| 黄龙县| 仲巴县| 米脂县| 临邑县|