1. 程式人生 > >struts2攔截器的執行原理以及攔截器和過濾器的區別

struts2攔截器的執行原理以及攔截器和過濾器的區別

struts2攔截器的執行原理:

    注意:struts2.1.3以後的版中下邊這張圖中的FilterDispatcher已經改為StrutsPrepareAndExecuteFilter

    1.首先伺服器接受請求,首先載入web.xml,通過核心控制器StrutsPrepareAndExecuteFilter,通過StrutsPrepareAndExecuteFilter載入struts.xml檔案並進行解析,將解析好的資料資訊放在ActionMapper中。

2.客戶傳送請求,請求被核心控制器StrutsPrepareAndExecuteFilter進行攔截,他會通過ActionMapper找到對應的url地址,找到Action中對應的方法

3.執行Action代理方法,在執行方法中會判斷是否有下一個攔截器如下:

if (interceptors.hasNext()) {//判斷是否有下一個攔截器.                     final InterceptorMapping interceptor = interceptors.next(); //得到一個攔截器                     String interceptorMsg = "interceptor: " + interceptor.getName();                     UtilTimerStack.push(interceptorMsg);                     try {                             resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);                             //呼叫得到的攔截器的攔截方法.將本類物件傳遞到了攔截器中。                         }                     finally {                         UtilTimerStack.pop(interceptorMsg);                     }                 }

4.得到返回資料並響應給客戶端。

        

 攔截器和過濾器的區別

1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的。

2.過濾器是依賴於servlet容器的,而攔截器是不依賴servlet容器的。

3.攔截器只能對Action請求起作用,不能對靜態資源起作用(jsp,html),而過濾器可以對幾乎所有請求起作用。

4.攔截器可以訪問Action上下文,值棧裡的物件,而過濾器不能。

5.在Action的生命週期中,攔截器可以多次使用,而過濾器只能在容器初始化時被呼叫一次。