1. 程式人生 > >struts2學習(4)

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-ref
name="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裡面所有的方法都進行攔截。