拦截器的的调用顺序
攔截器的的調用順序
a:首先,要找到它自己有沒有聲明攔截器的引用,即<action>元素有沒有<interceptor-ref>子元素,如果有,則不用繼續尋找(即不會再使用b,c即默認的攔截器棧等),直接使用這些攔截器,如果沒有進行下一步的查找。
b:其次,找到這個<action>所在包有沒有聲明默認的攔截器引用,即<package>元素的<default-interceptor-ref>子元素,如果有,則不用繼續再找,直接使用這些攔截器,如果沒有,則進行下一步的查找。
c:遞歸的查找這個包的父包,看看有沒有聲明默認的攔截器引用,直到找到默認的攔截器引用為止。
d:同一層下,攔截器的執行順序為配置的順序
補充:
abstract:把包聲明為抽象包,抽象包就是用來被繼承的(等待被繼承)。只要是沒有<action>元素的包,就可以聲明為抽象包。(抽象包如果不被子包繼承,它里面寫的任何東西都不起作用)?
?注意:@ParentPackage("default")? 值可以是一個抽象包,此時抽象包中的內容也會起作用(比如定義的攔截器等)相當于該抽象包被繼承了。
攔截器的使用方式:
攔截器引用一般是兩種方式
1,
如何使用struts2攔截器,或者自定義攔截器。特別注意,在使用攔截器的時候,在Action里面必須最后一定要引用struts2自帶的攔截器缺省堆棧defaultStack,
如下(這里我是引用了struts2自帶的checkbox攔截器),因為<action>下配置了攔截器,所以默認就不會使用b和c:
<package name="default" extends="struts-default" namespace="/ce">
<interceptors>
<interceptor name="loginInterceptor" class="com.action.LoginInterceptor"/>
</interceptors>
<action name="hello" class="com.action.HelloWorld" method="hello">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="defaultStack"></interceptor-ref>(必須加,否則不會使用默認攔截器棧中的攔截器)
<result name="success">/WEB-INF/index.jsp</result>
</action>
</package>
也可以改為對全局Action設置自己需要的攔截器,如下:
2,
struts-action.xml里面配置Action如下:
<!-- 一個公共包 -->
<package name="myDefault" extends="struts-default" abstract="true">
<!-- 聲明攔截器 -->
<interceptors>
<interceptor name="checkLogin"
class="com.itheima.web.interceptors.CheckLoginInterceptor"/>
<!-- 定義一個攔截器棧 -->
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="checkLogin">
<!-- 由于我們使用了繼承MethodFilterInterceptor,
此時我們可以告知攔截器,排除掉登錄方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>(同一層下,攔截器的執行順序為配置的順序,即先執行checkLogin,后執行defaultStack下的19個攔截器)
</interceptor-stack>
</interceptors>
<!-- 修改默認攔截器棧,設置我們自定義的攔截器棧,
這樣的話我們寫的所有動作都有了檢查登錄功能。并且排除了登錄方法-->
<default-interceptor-ref name="myDefaultStack"/>
<!-- 全局結果視圖 -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
</package>
<!-- 配置動作,讓此包繼承我們自己寫的公共包myDefault -->
<package name="customer" extends="myDefault" namespace="/customer">
<!-- 查詢所有客戶 -->
<action name="findAllCustomer" class="com.itheima.web.action.CustomerAction"
method="findAllCustomer">
<result name="findAllCustomer">/jsp/customer/list.jsp</result>
</action>
</package>
?
相關鏈接:
https://www.cnblogs.com/wwicked/articles/4455477.html
https://www.cnblogs.com/yw-ah/p/5761235.html
https://www.cnblogs.com/Ant-soldier/p/5490035.html
轉載于:https://www.cnblogs.com/zxwBj/p/8552471.html
總結
- 上一篇: Ajax--serialize应用表单数
- 下一篇: [luogu4133 BJOI2012]