struts interceptor

基本介紹

  • 中文名:攔截器
  • 外文名:struts interceptor
  • 類型:程式
  • 特點:增加了Struts的靈活性
  • 國家:中國
工作流程,攔截類型,

工作流程

Struts從2代開始,將核心功能放在了攔截器(Interceptor)上,這大大增加了Struts的靈活性。
攔截器可以在用戶請求Struts的Action時的前或後,進行一些業務處理。攔截器可以是1或N個,看看下面的圖大家可能會對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其實還是上面的攔截器,只是這時倒序執行了,這是攔截器依然可以對數據進行一些處理,但不同的是,這時已經反饋給用戶一個視圖了。
Struts2 工作流程圖Struts2 工作流程圖
這個過程的重點是攔截器的執行流程,可以理解成攔截器的三個階段:
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的接口來實現.

相關詞條

熱門詞條

聯絡我們