1、攔截器,和過濾器很相似,是可以在action前後執行的代碼,Struts的核心功能都是通過攔截器來實現的。
Struts攔截器,每個攔截器只有一個對象實例,即採用單例模式,所有引用這個
2、攔截器棧:由多個攔截器組成。
3、攔截器和過濾器的區別:
1)、攔截器和過濾器的概念非常相似。
2)、過濾器屬於web容器,可以過濾一切請求,包括action,servlet,hsp等等
3)、攔截器隸屬於Struts2框架,只能蘭娜姐action,無法攔截jsp的請求
4)、過濾取採用函數回調來實現,攔截器採用動態代理來實現;
4、多個攔截器之間的執行是採用攔截器責任鏈設計模式來實現
HttpServletRequest-->struts Filter Dispatcher-->Interceptor1-->Interceptor2-->Interceptor3-->(Action獲取結果Result)-->Interceptor3-->Interceptor2-->Interceptor1-->HttpServletResponse
5、攔截器的實現步驟:
a)編寫攔截器(實現Interceptor接口或者繼承AcstractInterceptor)
b)在Struts.xml中配置攔截器
c)在action中引用攔截器
6、案例
定義攔截器類
圖略
配置引用攔截器
圖略
7、攔截器的配置詳解
1)、當引用了自定義攔截器後,默認的攔截器就不起作用了
2)、默認攔截器在struts-default.xml中配置了默認攔截器,當不使用自定義攔截器的時候默認攔截器就會起作用
總結:當引用了自定義攔截器後,又不是去原有的默認的攔截器就需要手動引用
<default-interceptor-ref name="defaultStack"/>
3)、當一個action引用的攔截器個數比較多的時候,可以將多個攔截器放到一個攔截器棧中
<interceptors>
<interceptor>
<interceptor-refname="自定義攔截器名" class="自定義攔截器全類路徑"/>
<!--攔截器棧-->
<interceptor-stack name="myStack">
<interceptor-refname="自定義攔截器名"/>
<interceptor-refname=" defaultStack"/><!--defaultStack這個是不要改變的,默認xml文件中有-->
</interceptor-stack>
</interceptor>
</interceptors>
<action name="Vote_*" class="com.yc.ssm.action.VoteAction"method="{1}">
<resultname="view">/view.jsp</result>
<resultname="default">/404.jsp</result>
<--攔截器引用-->
<interceptor-refname=" myStack "></interceptor-ref>
</action>
未完待續......