首頁常見問題正文

Java培訓(xùn):實(shí)現(xiàn)自定義攔截器

更新時(shí)間:2023-12-28 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在Struts2框架中,通常開發(fā)人員所編寫的自定義攔截器類都會(huì)直接或間接地實(shí)現(xiàn)com.opensymphony.xwork2.interceptor.Interceptor接口。Interceptor接口中的主要代碼如下所示:

public interface Interceptor extends Serializable {
   void init();
   void destroy();
   String intercept(ActionInvocation invocation) throws Exception;
}

  從上述代碼中可以看出,該接口共提供了以下三個(gè)方法。

  (1)void init():

  該方法在攔截器被創(chuàng)建后會(huì)立即被調(diào)用,它在攔截器的生命周期內(nèi)只被調(diào)用一次??梢栽谠摲椒ㄖ袑ο嚓P(guān)資源進(jìn)行必要的初始化。

  (2)void destroy():

  該方法與init()方法相對應(yīng),在攔截器實(shí)例被銷毀之前,將調(diào)用該方法釋放和攔截器相關(guān)的資源,它在攔截器的生命周期內(nèi),也只被調(diào)用一次。

  (3)String intercept(ActionInvocation invocation)throws Exception:

  該方法是攔截器的核心方法,用于添加真正執(zhí)行攔截工作的代碼,實(shí)現(xiàn)具體的攔截操作,它返回一個(gè)字符串作為邏輯視圖,系統(tǒng)根據(jù)返回的字符串跳轉(zhuǎn)到對應(yīng)的視圖資源。每攔截一個(gè)動(dòng)作請求,該方法就會(huì)被調(diào)用一次。該方法的ActionInvocation參數(shù)包含了被攔截的Action的引用,可以通過該參數(shù)的invoke()方法,將控制權(quán)轉(zhuǎn)給下一個(gè)攔截器或者轉(zhuǎn)給Action的execute()方法。

  除了實(shí)現(xiàn)Interceptor接口可以自定義攔截器以外,在實(shí)際開發(fā)過程中,更常用的一種方式是繼承抽象攔截器類AbstractIntercepter。該類實(shí)現(xiàn)了Interceptor接口,并且提供了init()方法和destroy()方法的空實(shí)現(xiàn)。使用時(shí),可以直接繼承該抽象類,而不用實(shí)現(xiàn)那些不必要的方法。AbstractIntercepter類中定義的方法如下所示:

public abstract class AbstractInterceptor implements Interceptor {
   public void init() {}
   public void destroy() {}
   public abstract String intercept(ActionInvocation invocation) throws Exception;
}

  從上述代碼中可以看出,AbstractInterceptor類已經(jīng)實(shí)現(xiàn)了Interceptor接口的所有方法,一般情況下,只需繼承AbstractInterceptor類,實(shí)現(xiàn)interceptor()方法就可以創(chuàng)建自定義攔截器。需要注意的是,只有當(dāng)自定義的攔截器需要打開系統(tǒng)資源時(shí),才需要覆蓋AbstractInterceptor類的init()方法和destroy()方法。與實(shí)現(xiàn)Interceptor接口相比,繼承AbstractInterceptor類的方法更為簡單。

  本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!

  作者:黑馬程序員Java培訓(xùn)學(xué)院

  首發(fā):https://java.itheima.com

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!