一、攔截器的概述
1、什麼是攔截器
Interceptor:攔截器,起到的是攔截Action的作用
Filter:過濾器,從客戶端向服務器發送的請求。
Interceptor:攔截器,攔截的是客戶端對Action的訪問。更加細粒度化的攔截。(攔截Action當中具體的方法)。
Struts2框架核心的功能是依賴攔截器實現的。
2、Struts2的執行流程
官方Struts2執行流程圖
官方圖的原碼詳解
客戶端向服務器發送一個Action的請求,執行核心過濾器(doFilter)方法。
在這個方法當中,調用executeAction()方法,
在這個方法內部調用的是disoatcher.serviceAction();
在這個方法的內部創建了一個Action的代理,
最終執行的是Action的代理當中execute();
在這個代理中執行execute()方法中調用ActionInvocation的invoke方法。
在這個方法的內部遞歸執行一組攔截器(完成部分功能),
如果沒有下一個攔截器,就會執行目標Action,
根據Action返回的結果來進行頁面的跳轉。
二、自定義攔截器:
1、搭建Struts2的環境
web.xml
2、編寫攔截器的類
編寫一個類實現interceptor接口或者繼承AbstractInterceptor類。
(1)自定義攔截器一:繼承AbstractInterceptor類
編寫兩個攔截器
/*
* 自定義攔截器一
*/
public class InterceptorDemo1 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
System.out.println("InterceptorDemo1執行了。。。。。");
String obj = invocation.invoke();
System.out.println("InterceptorDemo1執行結束了");
return obj;
}
}
/*
* 自定義攔截器一
*/
public class InterceptorDemo2 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
System.out.println("InterceptorDemo2執行了。。。。。");
String obj = invocation.invoke();
System.out.println("InterceptorDemo2執行結束了");
return obj;
}
}
3、對攔截器進行配置
(1)定義攔截器進行配置
引入攔截器(一旦引入自定義攔截器,以下默認攔截器棧的攔截器就不執行了,所以需要手動設置默認的攔截器)
測試
結果及執行順序