實現攔截器類

* 2.1實現攔截器類 *

public class Interceptor extends AbstractInterceptor{

    //簡單的攔截器名字
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String intercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        //取得被攔截的action實例
        LoginAction action = (LoginAction) invocation.getAction();
        //打印執行開始的實現
        System.out.println(name+"攔截器的動作-------"+
                "開始登陸action的時間爲:"+new Date()
                );
        //取得開始執行的時間
        long startTime = System.currentTimeMillis();
        //如果該攔截器之後沒有其他的攔截器,直線action的excute方法

        //注意這句話###############################
        //#######################################
        *String result = invocation.invoke();*
--------------------------------------

        //打印執行結束後的時間
        System.out.println(name+"執行結束的時間------"+
                "執行完登陸的時間"+new Date()
                );
        long endTime = System.currentTimeMillis();
        System.out.println("總共用時"+ (endTime - startTime));
        return result;
    }
}

上面的攔截器僅僅在被攔截的方法之前,打印出執行action的時間,並記錄開始執行action的時刻,執行action的execute方法之後再次打印出時間,String result = invocation.invoke();這句代碼將會調用目標action 的excute 方法

在上一篇中我們說攔截器一般有三個方法
1:init();
2:destroy();
3:intercept();
在這個攔截器中,我們並沒有打開相應的資源,所以,不需要事先init()和destroy();

在實現intercept(ActionInvocation invocation)方法時,可以獲得ActionInvocation參數,這個參數又可以獲得被攔截的action實例,有了這個實例,幾乎可以獲得action的所有控制權:可以解析HTTP請求中的參數,也可以將HTTP請求中的HttpServletRequest & HttpServletResponse中的實例傳遞給action中

2.2 :使用攔截器:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!--  通過常量配置Struts2中的國際化資源-->
    <constant name="struts.custom.i18n.resources" value="globalMessage"/>
    <!-- 配置解碼集 -->
    <constant name="struts.i18n.encoding" value="GBK"/>
    <!-- 配置本系統中使用的包 -->
    <package name="liang" extends="struts-default">
        <interceptors>
            <!-- 配置攔截器 -->
            <interceptor name="myInterceptor" class="liang.Interceptor"/>
        </interceptors> 

        <!-- 配置自己的action -->
        <action name="login" class="liang.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="error">/login.jsp</result>
            <!-- 攔截器一般配置在result之後 -->
            <!-- 配置系統默認的攔截器,如果配置了自定義的攔截器,默認的攔截器將會失去作用
            必須顯示的指定系統自定義的攔截器 -->
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="myInterceptor"/>
        </action>
    </package>
</struts>

2.3:攔截方法的攔截器:
在有些時候,我們並不想攔截所有的action 此時便需要使用struts2中的攔截器方法的過濾特性
爲了實現方法的過濾性,Struts2提供了一個MethodFilterInterceptor類,該類是AbstractInterceptor類的
子類,如果用戶想實現的攔截器支持方法的過濾特性,需要繼承MethodFilterInterceptor

下面自定義一個FilterInterceptor帶過濾方法功能的攔截器:

package pageInterCeptor;

import java.util.Date;

import Action.LoginAction;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//過濾方法的過濾器,應該繼承MethodFilterInterceptor

public class MyFilterInterceptor extends MethodFilterInterceptor {

    //簡單的攔截器的名稱
    private String name;
    //爲該過濾器設置名字
    public void setName(String name) {
        this.name = name;
    }   
    //重寫doIntercept,對action進行攔截邏輯
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        //取得被攔截的action的實例
        LoginAction login = (LoginAction) invocation.getAction();
        //打印執行action的時間
        System.out.println(name+"攔截器的動作---開始的時間\t"+new Date());
        //指定後一個action 或者直接執行action的excute方法
        String result = invocation.invoke();
        //打印執行結束的時間
        System.out.println(name+"攔截器的動作--攔截器結束的時間\t"+new Date());

        return result;
    }
}

跟前面的攔截器相比似乎沒有太大的改變,只有兩個地方需要注意
1:繼承的是MethodFilterInterceptor攔截器
2:重寫的是doInterceptor攔截器
在MethodFilterInterceptor方法中,額外的增加了兩個方法:
public void setExcludeMethods(String execludeMethods):排除需要過濾的方法,所有在execludeMethods中出現的方法都不會被攔截
public void setIncludeMethods(String includeMethods):設置的都會被攔截

如果一個方法同時出現在execludeMethods 以及includeMethods 則該方法會被攔截
方法過濾實例如下所示:

<package name="liang" extends="struts-default">
        <interceptors>
            <!--   配置方法的攔截器    -->
            <interceptor name="myFilter" class="pageInterCeptor.MyFilterInterceptor">
                <param name="name">方法過濾器</param>
            </interceptor>
        </interceptors>
        <!-- 指定處理用戶的action -->
        <action name="login" class="liang.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="myFilter">
                <param name="name">改名後的攔截器</param>
                <!-- 指定execute方法不需要攔截  如果需要攔截多個方法,方法之間使用逗號隔開-->
                <param name="execludeMethods">execute</param>
            </interceptor-ref>
        </action>   
    </package>

上面的攔截器不會攔截execute方法,如果一個action中只有execute方法,則不會被攔截,控制檯不會打印任何的輸出
execute則表示只攔截execute方法

發佈了59 篇原創文章 · 獲贊 28 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章