更新時(shí)間:2023-12-28 來(lái)源:黑馬程序員 瀏覽量:
在Struts2框架中,通常開(kāi)發(fā)人員所編寫(xiě)的自定義攔截器類都會(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è)方法。
該方法在攔截器被創(chuàng)建后會(huì)立即被調(diào)用,它在攔截器的生命周期內(nèi)只被調(diào)用一次??梢栽谠摲椒ㄖ袑?duì)相關(guān)資源進(jìn)行必要的初始化。
該方法與init()方法相對(duì)應(yīng),在攔截器實(shí)例被銷毀之前,將調(diào)用該方法釋放和攔截器相關(guān)的資源,它在攔截器的生命周期內(nèi),也只被調(diào)用一次。
該方法是攔截器的核心方法,用于添加真正執(zhí)行攔截工作的代碼,實(shí)現(xiàn)具體的攔截操作,它返回一個(gè)字符串作為邏輯視圖,系統(tǒng)根據(jù)返回的字符串跳轉(zhuǎn)到對(duì)應(yīng)的視圖資源。每攔截一個(gè)動(dòng)作請(qǐng)求,該方法就會(huì)被調(diào)用一次。該方法的ActionInvocation參數(shù)包含了被攔截的Action的引用,可以通過(guò)該參數(shù)的invoke()方法,將控制權(quán)轉(zhuǎn)給下一個(gè)攔截器或者轉(zhuǎn)給Action的execute()方法。
除了實(shí)現(xiàn)Interceptor接口可以自定義攔截器以外,在實(shí)際開(kāi)發(fā)過(guò)程中,更常用的一種方式是繼承抽象攔截器類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)自定義的攔截器需要打開(kāi)系統(tǒng)資源時(shí),才需要覆蓋AbstractInterceptor類的init()方法和destroy()方法。與實(shí)現(xiàn)Interceptor接口相比,繼承AbstractInterceptor類的方法更為簡(jiǎn)單。
本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:黑馬程序員Java培訓(xùn)學(xué)院
首發(fā):https://java.itheima.com