Struts2中提供的很多特性都是通過攔截器實現的,例如異常處理,檔案上傳,生命週期回調與驗證。攔截器從概念上來講和Servlet過濾器或者JDK 的Proxy類是一樣的。它提供了一種對Action進行預先處理和事後處理的功能。和Servlet 過濾器一樣,攔截器可以被分層和排序。它還可以訪問所執行的Action和所有的環境變數與執行屬性。
Struts2內建了大量的攔截器,這些攔截器以name-class對的形式配置在struts-default. xml檔案中,其中name是攔截器的名字,就是以後使用該攔截器的唯一標識;class則指定了該攔截器的實作類別,如果我們定義的package繼承了Struts2的預設struts-default包,則可以自由使用下面定義的攔截器,否則必須自己定義這些攔截器。
讓我們從依賴注入來開始對攔截器的介紹。正如我們已經看到的一樣,依賴注入可以多種不同的實現方式。下面就是對應於不同實現方式的攔截器:
l Spring 架構——ActionAutowiringInterceptor攔截器
l 請求字串和表單值—— ParametersInterceptor攔截器
l 基於Servlet的對象——ServletConfigInterceptor攔截器
前兩種攔截器可以獨立工作,不需要Action的協助,但是最後一種不同,它是在以下幾種介面的輔助下工作的:
l SessionAware ——通過Map來提供對所有session屬性的訪問
l ServletRequestAware——提供對HttpServletRequest對象的訪問
l RequestAware ——通過Map來提供對所有request屬性的訪問
l ApplicationAware ——通過Map來提供對所有applicatin屬性的訪問
l ServletResponseAware ——提供對HttpServletResponse對象的訪問
l ParameterAware ——通過Map來提供對所有request string和表單資料的訪問
l PrincipalAware ——提供對PrincipleProxy對象的訪問;該對象實現了HttpServletRequest對象的有關principle 和role的方法,但是它提供了一個Proxy,因此所有的實現都是獨立於Action的。
l ServletContextAware ——提供對ServletContext對象的訪問
如果要把資料注入到Action中去,那麼對應的資料就需要實現必需的介面。