? ? ? ?所謂的攔截器就是指實現了Interceptor接口的類,該接口中定義了三個方法: ? ? ? ? ? ?init(),destroy(),intercept()。
? ? ? ? init()用于在服務器啟動的時候,初始化這個攔截器。destroy()用于清理分配給攔截器的資源,intercept()是用來起攔截作用的,這個方法還有一個ActionInvocation類型的參數invocation,并且返回一個字符串。ActionInvocation類中有一個方法,是invoke(),這個方法很重要,它的作用是首先判斷一下有沒有其他的攔截器了,如果有,則繼續進入下一個攔截器,如果沒有那么就進入Action中執行業務邏輯。intercept()方法的執行過程也很特殊,在invoke()函數之前的代碼先執行,執行到invoke()時,判斷一下,進入下一個攔截器,或是進行Action的業務處理,等到執行完所有請求轉發的Action時,會再回到intercept()方法,繼續執行invoke()后面的內容。
? ? ? ? ?注意上面紅顏色的部分,為什么是執行完所有的請求轉發的Action呢?這是因為執行完當前的Action,可能會請求轉發或是重定向到另一個Action中或是結果頁面,若是重定向的話,那么就不是在一個請求過程中了,就會重新發一次請求,請求另一個Action,因為一個攔截器只會對一個特定的Action起作用,所以重定向,就完全是另一次請求過程了。然而在攔截器中,若是重定向到另一個Action的話,那么當前的Action就算完成了它的業務邏輯,就會返回執行invoke()方法之后的內容,然后,再進行另一次請求過程。如果是請求轉發的話,那么Action之間是在一個請求過程中,等到所有的請求轉發的Action執行完之后,才會去執行invoke()后面的內容。
具體博客:http://blog.csdn.net/hackerain/article/details/6991082