struts2學習(4)
Struts2攔截器概述
1 Struts2是框架,封裝了很多功能,struts2裡面封裝的概念都是在攔截器裡面
2 Struts2裡面封裝了很多的概念,有很多攔截器,不是每次這些攔截器都執行,每次執行預設的攔截器
3 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="debugging"/> <interceptor-ref name="profiling"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-refname="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
4 攔截器在什麼時候進行?
(1)在action物件建立之後,action方法之前執行。
攔截器底層原理
1 攔截器底層使用兩個原理
第一個aop思想
(1)文字描述
Aop是面向切面程式設計,有基本概念,擴充套件功能,不通過修改業務處理原始碼方式擴充套件功能。
(2)畫圖分析
第二個責任鏈模式
(1)在java中有很多的設計模式,責任鏈模式是其中的一種
(2)責任鏈模式和過濾鏈很相似的
責任鏈模式:
要執行多個操作,有新增、修改、刪除三個操作。
首先執行新增操作,新增操作執行之後做類似於放行操作,執行修改操作,修改操作執行之後做類似放行操作,執行刪除操作。
過濾鏈:一個請求可以有多個過濾器進行過濾,每個過濾只有做放行才能到下一個過濾器
2 aop思想和責任鏈模式如何應用到攔截器裡面?
(1)文字描述
-攔截器在action物件建立之後,action的方法執行之前執行
-在action方法執行之前執行預設攔截器,執行過程使用aop思想,在action沒有直接呼叫攔截器的方法,使用配置檔案進行操作。
-在執行攔截器時候,執行很多的攔截器,這個過程使用責任鏈模式
-假如要執行三個攔截器,執行攔截器1,執行攔截器1之後作放行操作,執行攔截器2,執行攔截器2之後放行,執行攔截器3之後放行,執行action方法。
Struts2預設會執行很多攔截器,這和配置有關。
攔截器執行過程:
3 檢視原始碼
(1)執行action
(2)建立action物件,使用動態代理方式
(3)執行action的方法
(4)執行很多的攔截器,遍歷執行
類似於放行的操作的方法。
重要的概念
1 過濾器和攔截器的區別
(1)過濾器:過濾器理論上可以過濾任意內容,比如html,jsp,servlet,圖片路徑
(2)攔截器:攔截器可以攔截action
2 servlet和action區別
(1)servlet預設是第一次訪問時建立,建立一次,單例項物件
(2)action每次訪問時候建立,建立多次,多例項物件。
自定義攔截器
1 在struts2裡面有很多的攔截器,這些攔截器是struts2封裝的功能,但是在實際開發中,
struts2裡面的攔截器中可以沒有我們要使用的功能,這個時候需要自己寫攔截器實現功能。
(1)檢視原始碼看攔截器結構
-繼承類
在接口裡面有三個方法
做初始化操作
銷燬
攔截邏輯操作
(2)開發中,建議使用另外一種方式
-寫類,繼承MethodFilterInterceptor類實現
-讓action裡面的某個方法不進行攔截
(3)讓攔截器和action有關係
-不是在action呼叫攔截器的方法,而是通過配置檔案方式讓建立關係
自定義登入攔截器
1 需求:在專案中,有很多action的超連結,實現只有是登入的狀態,才可以點選action的超連結實現功能,如果不是登入功能,點選action超連結返回登入頁面。
2 登入的狀態:使用session域物件實現
(1) 登入成功之後,把資料放到session裡面
(2)判斷session是否有值,可以知道是否是登入狀態
3 實現登入的基本功能
(1)查詢資料庫判斷使用者名稱和密碼
4 新增登入攔截器功能
(1)判斷是否登入:判斷session裡面是否有名稱是username的值
(2)攔截器實現過程
第一步 建立類,繼承MethodFilterInterceptor類
第二步 重新MethodFilterInterceptor類裡面的方法寫攔截器邏輯
public class LoginInterceptor extends MethodFilterInterceptor { //這個方法裡面寫攔截器邏輯 protected String doIntercept(ActionInvocation invocation) throws Exception { //判斷session裡面是否有名稱是username的值 //得到session HttpServletRequest request = ServletActionContext.getRequest(); Object obj = request.getSession().getAttribute("username"); //判斷 if(obj != null){ //登入操作 //做類似於放行操作,執行action的方法 return invocation.invoke(); }else{ //不是登入狀態 //不到登入,不執行action的方法,返回登入頁面 //到result標籤裡面找到名稱是login的值,到配置路徑裡面 return "login"; } } }
第三步 配置action和攔截器關係(註冊攔截器)
action沒有呼叫interceptor的語句,而是通過配置,也叫註冊攔截器。
(1)在要攔截的action標籤所在的package標籤裡面宣告攔截器
<interceptors> <interceptor name="loginintercept" class="cn.itcast.interceptor.LoginInterceptor" /> </interceptors>
(2)在具體的action標籤裡面使用宣告的攔截器
<interceptor-ref name="loginintercept"></interceptor-ref>
(3)struts2裡面執行很多的預設攔截器,但是如果在action裡面配置自定義攔截器。
問題:預設的攔截器不會執行了。
解決:把預設攔截器手動使用一次
<!-- 3 把預設攔截器手動使用一次 --> <interceptor-ref name="defaultStack"></interceptor-ref>
-配置攔截器,對action裡面所有的方法都進行攔截。