在學習Struts2的過程當中對攔截器和動做類的執行過程一度陷入誤區,特別讀了一下Struts2的源碼,將本身的收穫分享給正在困惑的童鞋。。。瀏覽器
開始先上圖:學習
從Struts2的圖能夠看出當瀏覽器發出請求以後,通過Struts2的一些核心處理以後(在攔截器以前的執行過程此處略過)到達Interceptor1第一個攔截器
此時Struts將會按照順序進行執行攔截器一直到達動做方法。
若是爲某個動做方法配置了攔截器,那麼在調用到該動做方法以前會通過攔截器,通常咱們的攔截器會在攔截條件以後選擇是否進行放行操做,
當請求知足放行條件時調用invocation的invoke()方法放行可是在此有兩種狀況:
咱們去看一下源碼:spa
經過分析源碼咱們能夠看出,攔截的工做過程當中最重要的是invocation.invoke();這個方法在攔截器的執行過程當中充當調度者的做用。
若是在攔截器中沒有調用invocation.invoke();的話在執行攔截器類的時候就會按照順序執行直接返回字符串3d
當攔截器執行完畢以後跳轉到相應的JSP模板進行執行,此時瀏覽器仍然不會跳轉到目的頁面
執行完JSP頁面代碼以後按照逆序的方式執行攔截器
最後響應客戶端請求blog