JSP 開發之Struts2內建自定義攔截器
Struts2的自定義攔截器主要用于解析請求參數,將請求參數賦值給Action屬性,執行數據校驗,文件上傳等等操作。當需要擴展Struts2的功能時,我們只需要提供相應的攔截器并將它配置到Struts2容器中即可;當我們不需要使用的時候,只需要取消它在Struts2容器中的配置就行了。
1>配置攔截器主要使用四個配置元素:
:用于配置自定義攔截器
:用于引用攔截器或者攔截器棧
:用于配置自定義攔截器棧,一個攔截器棧由多個攔截器構成,也可以包含其他的攔截器棧
:擁有配置參數
<!--配置自定義攔截器--><interceptor name="攔截器名" class="實現類"> <param name>..</param> ...</interceptor><!--配置攔截器棧,用于一次性過引用多個攔截器--><interceptor-stack name="攔截器棧名"> <interceptor-ref name="攔截器1" /> <interceptor-ref name="攔截器2"> <param name>..</param> ... </interceptor-ref> <!--也可以引用攔截器棧--> <interceptor-ref name="攔截器棧名" /></interceptor-stack>
2>配置好了攔截器之后,就可以在元素中使用該攔截器了,使用自定義攔截器時,還必須顯示使用系統默認的攔截器defaultStack。
<package ..> <!--配置包下所有Action的默認攔截器--》 <!--如果Action配置了自己的攔截器,那么默認攔截器將不會配置到該Action下--> <default-interceptor-ref name="defaultStack" /> <action ...> <!--配置自己的interceptor攔截器--> <interceptor-ref name="myInterceptor" /> <!--因為已經配置了自己的攔截器,所以包默認配置攔截器將不作用,因此需要自己顯示配置defaultStack系統默認攔截器--> <interceptor-ref name="defaultStack" /> </action></package>
3>用戶自定義攔截器:Struts2提供了Interceptor攔截器原生接口:
public interface Interceptor extends Serializable{ //初始化攔截器的回調方法 void init() ; //實現攔截的處理方法 String intercept(ActionInvocation invocation) throws Exception ; //銷毀攔截器之前的回調方法 void destroy() ;}
因此,用戶自定義攔截器類需要實現該接口并提供該接口中的所有抽象方法的實現。不過Struts2還提供了該接口的一個直接實現類:AbstractInterceptor,該類提供了init()和destroy()方法的實現,我們只需要重寫intercept()攔截方法即可:
public class simpleInterceptor extends AbstractInterceptor{ private String username ; private String password ; //omit setter and getter methods @Override public String intercept(ActionInvocation invocation) throws Exception { //獲取被攔截的Action實例 LoginAction action = (LoginAction)invocation.getAction() ; System.out.println("開始攔截:" + new Date()) ; //取得開始執行Action處理方法的時間 long start = System.currentTimeMillis() ; //回調執行Action被攔截的處理方法 String result = invocation.invoke() ; System.out.println("結束執行:" + new Date()) ; //取得執行Action處理方法之后的時間 Long end = System.currentTimeMillis() ; System.out.println("執行用時:" + (end-start) +"ms") ; return result ; }}
上面提供的AbstractInterceptor類定義的攔截器會攔截Action內的所有處理方法,如果只想攔截指定的方法,或者想指定哪些方法攔截,哪些方法不攔截,可以使用Struts2提供的MethodFilterInterceptor類,該類是AbstractInterceptor類的子類,提供了下面三個主要的方法:
1>String doIntercept(ActionInvocation invocation) throws Exception:同intercept()方法作用一樣
2>void setIncludeMethods(String includeMethods):設置需要被攔截的方法名
3>void setExcludeMethods(String excludeMethods):設置不需要被攔截的方法名
其中兩個setter方法可以在配置該攔截器時通過param元素來指定屬性值
<interceptor name="simpleIntercept2" class="com.chengxi.SimpleInterceptor2"> <param name="includeMethods">login,execute</param> <param name="excludeMethods">regiset</param></interceptor>
4>攔截器的執行順序:如果有多個攔截器同時作用于一個Action上時,遵循:在Action的控制方法執行之前,先定義的攔截器先作用執行;在Action的控制方法執行之后,先定義的攔截器后作用執行;也就是在invocation.invoke()方法這個點進行分界
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答