Struts是基於mvc模式的開發框架。任何框架,都會預先實現一部分功能。struts框架自帶功能的實現,是通過一個個攔截器完成的。
Struts早起版本中,核心功能是通過一個類完成的,這個類叫做核心過濾器。
Struts2.0之後的版本,每一個攔截功能,都由一個單獨的類實現,形成一個獨立的攔截器,用戶可以自由組合這些攔截器來完成自己想要的功能。
有了攔截器,我們的開發就類似於組裝電腦配件。帶來的好處:解耦。
攔截器簡介:
Struts2預定義了一些攔截器,實現了某些功能,如文件上傳等,默認的攔截器在struts-default.xml文件中配置。
如果使用struts2的相應功能,可以一個個引用攔截器! 也可以定義攔截器棧,包含多個攔截器!開發中就直接使用攔截器棧即可!
struts2定義了默認執行的攔截器棧!
攔截器可以對action請求進行攔截, 從而執行一些預處理操作,預處理操作完成後,控制權進入到action!
action處理請求完成,又回到攔截器!
注意:
如果struts自帶的攔截器完成不了需要,用戶也可以自定義攔截器!
如果用戶自定義了攔截器,並使用,struts2默認的攔截器就不會調用!
自定義攔截器的時候,要引用默認的攔截器!(defaultStack)
<interceptors>
// 攔截器定義
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
攔截器棧(Interceptor Stack): 將攔截器按一定的順序聯結成一條鏈. 在訪問被攔截的方法時, Struts2攔截器鏈中的攔截器就會按其之前定義的順序被依次調用。
// 攔截器棧定義 (包含多個攔截器)
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
</interceptor>
// 執行攔截器
<default-interceptor-ref name="defaultStack"/>
</interceptors>
攔截器與過濾器區別
共同點:都可以對請求進行攔截! 處理一些公用的操作!
區別:
1.作用範圍
攔截器是struts2的概念!(只在struts中用)
過濾器是servlet中技術!(在servlet/struts中都可以使用!)
2. 攔截區域
攔截器,攔截的是action中方法的執行!
過濾器,可以攔截任何請求!
Struts2自定義攔截器實現
1、定義一個類實現Interceptor接口
2、實現生命週期方法
3、聲明和引用自定義攔截器
Interceptor接口
com.opensymphony.xwork2.interceptor.Interceptor
所有的自定義攔截器都需要實現該接口,且以單例運行。
init: 創建後初始化時被調用, 它在攔截器的生命週期內只被調用一次。
interecept: 每攔截一個動作請求, 該方法就會被調用一次。
destroy: 攔截器被銷燬之前被調用, 它在攔截器的生命週期內也只被調用一次.
Struts2自帶的攔截器