Struts 2攔截器

來源:互聯網
上載者:User

 

Struts 2攔截器

代理模式

抽象主題:真是主題和代理主題的共同介面

真實主題:實現抽象主題,定義了代理角色所代表的真實對象

代理主題:實現抽象主題,含有對真實主題角色的引用,代理角色通常將會在用戶端調用傳遞給真實主題對象之前或者之後執行的某些操作,而不是單純返回真實對象。

 

動態代理模式

1.       建立抽象主題介面

2.       建立真實主題類實現抽象主題介面

3.       建立處理類,實現java.lang.reflect.InvocationHandler介面

4.       Client類,該類中new一個真實主題對象並傳入處理類中

5.       最後用JDK內建的Proxy類的newProxyInstance方法,建立動態代理執行個體。

 

攔截器的實現原理

攔截器:在進行一個操作(調用某個方法)時,它會在執行操作前進行一些列的操作,而在執行完操作後,它又會進行一系列操作。

攔截:其實是動態地產生一個代理對象,而這個代理對象包含對攔截器方法的調用。因此調用代理對象的方法的同時也調用攔截器方法,這樣就實現了動態調用攔截器方法。

舉例:

1.       建立DAO介面,因為動態代理只能對實現了介面的執行個體來組建代理程式。定義相應的方法。

2.       DAO介面實作類別,實現DAO介面的所有方法。

3.       攔截器類

4.       處理類,實現java.lang.reflect.InvocationHandler介面,方法中以適當的順序調用DAOImpl類和攔截器類的方法。

5.       代理工廠類,該工廠接受目標代理對象,建立一個處理類對象,目標代理對象傳入處理類對象,最後用java.lang.reflect.Proxy建立並返回代理對象執行個體。

6.       Client類,調用代理

 

自訂攔截器

第一種自訂攔截器的方法:

實現com.opensymphony.xwork2.interceptor.Interceptor介面

實現其intercept方法尤為重要,可以在該方法裡定義各種動作。

package com.opensymphony.xwork2.interceptor;

 

import com.opensymphony.xwork2.ActionInvocation;

 

import java.io.Serializable;

 

public interface Interceptor extends Serializable{

void destroy();

void init();

String intercept(ActionInvocation invocation) throws Exception;

}

 

第二種自訂攔截器方法:

繼承com.opensymphony.xwork2.interceptor.AbstractInterceptor

該類實現了上述的Interceptor介面。

 

自訂好攔截器後要進行配置:

配置攔截器

在struts.xml中添加<interceptors>標籤,是<package>的子標籤

<interceptors>

      <interceptor name=”攔截器名” class=”攔截器實作類別”></interceptor>

</interceptors>

如果需要傳參:

<interceptors>

      <interceptor name=”攔截器名” class=”攔截器實作類別”>

               <param name=”參數名”>參數值</param>

     </interceptor>

</interceptors>

如果需要配置多個攔截器,就多添加<interceptor>,還可以把多個攔截器組合起來組成攔截器棧。

<interceptors>

      <interceptor name=”攔截器名” class=”攔截器實作類別”>

               <param name=”參數名”>參數值</param>

     </interceptor>

 

     <interceptor-stack name=”攔截器棧名”>

            <interceptor name=”攔截器一” class=”攔截器實作類別”>

                  <param name=”參數名”>參數值</param>

            </interceptor>

            <interceptor name=”攔截器二” class=”攔截器實作類別”></interceptor>

     </interceptor-stack>

 

</interceptors>

 

按上面的方法配置好攔截器後,還要

配置Action使用攔截器:struts.xmls在<action>標籤中添加子標籤:

<interceptor-ref name=”myInter”></interceptor-ref>

 

<interceptor-ref name=”myInter”>

                <param name=”myValue”>abcd</param>

</interceptor-ref>

 

這就完成了攔截器的建立配置使用。按以上步驟完成後發現原來的輸入校正功能沒有了,資料格式不對的話直接跳到了登陸失敗頁面,而資料格式對了也是登入失敗。原因如下:

配置Action時,package是繼承struts-default包的,而這個struts-default包配置了預設的攔截器棧defaultStack,這個棧中定義了大量的攔截器。Struts 2中的類型轉換輸入校正檔案上傳等操作都是通過調用這些隱含配置的攔截器。

如果struts.xml的package包中的Action沒有添加使用攔截器,則預設的攔截器將會起作用。而一旦該包中的Action添加使用了某個攔截器,那麼預設的攔截器就相當於沒有添加,所以沒有作用。這時需要在<action>中手動添加子標籤來配置這個defaultStack:

<interceptor-ref name=”defaultStack”></interceptor-ref>

這樣就一切OK啦!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.