更新時間:2023-12-28 來源:黑馬程序員 瀏覽量:
在Struts2框架中,通常開發(fā)人員所編寫的自定義攔截器類都會直接或間接地實現(xiàn)com.opensymphony.xwork2.interceptor.Interceptor接口。Interceptor接口中的主要代碼如下所示:
public interface Interceptor extends Serializable { void init(); void destroy(); String intercept(ActionInvocation invocation) throws Exception; }
從上述代碼中可以看出,該接口共提供了以下三個方法。
該方法在攔截器被創(chuàng)建后會立即被調(diào)用,它在攔截器的生命周期內(nèi)只被調(diào)用一次。可以在該方法中對相關資源進行必要的初始化。
該方法與init()方法相對應,在攔截器實例被銷毀之前,將調(diào)用該方法釋放和攔截器相關的資源,它在攔截器的生命周期內(nèi),也只被調(diào)用一次。
該方法是攔截器的核心方法,用于添加真正執(zhí)行攔截工作的代碼,實現(xiàn)具體的攔截操作,它返回一個字符串作為邏輯視圖,系統(tǒng)根據(jù)返回的字符串跳轉(zhuǎn)到對應的視圖資源。每攔截一個動作請求,該方法就會被調(diào)用一次。該方法的ActionInvocation參數(shù)包含了被攔截的Action的引用,可以通過該參數(shù)的invoke()方法,將控制權轉(zhuǎn)給下一個攔截器或者轉(zhuǎn)給Action的execute()方法。
除了實現(xiàn)Interceptor接口可以自定義攔截器以外,在實際開發(fā)過程中,更常用的一種方式是繼承抽象攔截器類AbstractIntercepter。該類實現(xiàn)了Interceptor接口,并且提供了init()方法和destroy()方法的空實現(xiàn)。使用時,可以直接繼承該抽象類,而不用實現(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)實現(xiàn)了Interceptor接口的所有方法,一般情況下,只需繼承AbstractInterceptor類,實現(xiàn)interceptor()方法就可以創(chuàng)建自定義攔截器。需要注意的是,只有當自定義的攔截器需要打開系統(tǒng)資源時,才需要覆蓋AbstractInterceptor類的init()方法和destroy()方法。與實現(xiàn)Interceptor接口相比,繼承AbstractInterceptor類的方法更為簡單。
本文版權歸黑馬程序員Java培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:黑馬程序員Java培訓學院
首發(fā):https://java.itheima.com