struts interceptor

工作流程

Struts從2代開始,將核心功能放在了攔截器(Interceptor)上,這大大增加了Struts的靈活性。

攔截器可以在用戶請求Struts的Action時的前或後,進行一些業務處理。攔截器可以是1或N個,看看下面的圖大家可能會對Struts2的工作流程有所了解:

Struts2 工作流程圖 Struts2 工作流程圖

最初伺服器接收到用戶客戶端的請求,通過ActionContextCleanUp,Other filters……,FilterDispatcher,這些其實也是一些攔截器,到達ActionMapper,ActionMapper是Struts對Action類的Map形式封裝,接著,ActionMapper再通過開始的3個攔截器到達ActionProxy,ActionProxy是Action類的一個代理類,此時到達了ActionInvocation類,ActionInvocation類是ActionProxy(代理)類產生的一個Action對象,再經過Interceptor1至Interceptor3,這只是一個演示,實際可能有更多的Interceptor或更少,下面就可以訪問Action和Result了,Action下的Result決定了將以什麼樣的視圖或稱為(模板)去反饋給用戶,下面的攔截器,Interceptor3到Interceptor1其實還是上面的攔截器,只是這時倒序執行了,這是攔截器依然可以對數據進行一些處理,但不同的是,這時已經反饋給用戶一個視圖了。

這個過程的重點是攔截器的執行流程,可以理解成攔截器的三個階段:

1、對Action進行預處理。(正序執行)

2、攔截器自身決定該不該執行後續的攔截器(由invoke()方法的返回值決定)。

3、對Action進行後期處理。(倒序執行)

(註:如果大家對Struts框架有一點了解或了解其基本工作原理,可能對上面的解釋不屑一顧,但卻可能使初學者更加的困惑,所以)說了這么多,還是讓我們用代碼來解釋吧!

用(Java)代碼定義一個Struts2的攔截器:

public class MyInterceptor extends AbstractInterceptor{

public String interceptor(ActionInvocation args0) throws Exception{

System.out.println("=========預處理========="); //這裡僅僅做一個示意,可以在此處添加任何代碼

String result=args0.invoke();//得到invoke()的返回值

System.out.println("=========後續處理========"); //這裡僅僅做一個示意,可以在此處添加任何代碼

return result;//返回invoke()方法的返回值

}

}

配置一個Struts2的攔截器:

<struts>

<package name="mystruts" extends="struts-default">

<interceptors>

<interceptor name="myInterceptor" class="interceptor的全局限定名"/>

<interceptor-stack name="myInterceptorStack">

<interceptor-ref name="defaultStack"><!--這裡要先引用Struts默認的攔截器棧,不然無法實現Struts的基本功能-->

<interceptor-ref name="myInterceptor">

</interceptor-stack>

</interceptors>

<default-interceptor-ref name="myInterceptorStack"/>

</package>

</struts>

<interceptor>

攔截類型

在Struts2中,Interceptor 的攔截類型,分成以下三類:

1. before

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

2. after

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

3. PreResultListener

有的時候,before攔截和after攔截對我們來說是不夠的,因為需要在Action執行完之後,但是還沒有回到視圖層之前,做一些事情。Struts2同樣支持這樣的攔截,這種攔截方式,是通過在攔截器中註冊一個PreResultListener的接口來實現.

相關詞條

熱門詞條

聯絡我們