攔截器(Interceptor)是 Struts2 框架中一個非常重要的核心物件,它可以動態增強 Action 物件的功能。在 Struts2 框架中,很多重要的功能都是通過攔截器實現的。比如,在使用 Struts2 框架中,我們發現 Struts2 與 Servlet API 進行解耦,Action 對請求的處理不依賴於 Servlet API,但 Struts2 的 Action 卻具有更加強大的請求處理功能,那麼,這個功能的實現就是攔截器對 Action 的增強,可見攔截器的重要性。此外,Struts2 框架中的表單重負提交、物件型別轉換、檔案上傳以及前面所學習的 ModelDriven 的操作,都離不開攔截器幕後的操作,Struts2 的攔截器的處理機制是 Struts2 框架的核心。
攔截器動態地作用於 Action 與 Result 之間,它可以動態地在 Action 與 Result 中加入新功能。
語法:
在 Struts2 API 中,存在一個名為 com.opensymphony.xwork2.interceptor 的包,此包中的物件是 Struts2 內建的一些攔截器物件,它們具有不同的功能。在這些物件中,Interceptor 介面是 Struts2 框架中定義的攔截器物件,其他的攔截器都直接或間接地實現於此介面。
說明:Interceptor 是 Struts2 框架中定義的攔截器物件,它是一個介面,無論是 Struts2 內建的攔截器物件,還是自定義的攔截器都需要直接或間接地實現於此介面。
Struts2 API 中定義該介面的原始碼如下:
public interface Interceptor extends Serializable{
void destroy();
void init();
String intercept(ActionInvocation invocation)throws Exception;
}
引數說明:
-
destroy():指示攔截器的生命週期結束,它在攔截器被銷毀前呼叫,用於釋放攔截器在初始化時所佔用的一些資源。
-
init():用於對攔截器進行一些初始化操作,此方法在攔截器被範例化後,intercept() 方法執行前呼叫。
-
intercept():是攔截器中的主要方法,用於執行 Action 物件中的請求處理方法以及在 Action 的前前後後進行一些操作,動態地增強 Action 的功能。
說明:只有呼叫了intercept()方法中的invocation引數的invoke()方法,才可以執行Action物件中的請求處理方法。
雖然 Struts2 提供了攔截器物件 Interceptor,但此物件是一個介面,如果通過此介面建立攔截器物件,就需要實現 Interceptor 提供的三個方法,而在實際的開發中,主要用到的方法只有 intercept() 方法,如果沒有用到 init() 方法與 destroy() 方法也需要對其進行空實現,這種建立攔截器的方式似乎有些不太方便。
為了簡化程式的開發,建立攔截器物件也可以通過 Struts2 API 中的 AbstractInterceptor 物件進行建立,它與 Interceptor 的關係如圖所示。