初学Struts2-自定义拦截器及其配置

自定义拦截器,首先新建一个继承自AbstractInterceptor类的类,然后重写intercept方法,代码如下

public class HelloInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("拦截器测试");
        // 放行到下一个
        return invocation.invoke();
    }

}

 

一、自定义拦截器,只作用于当前Action类

新建structs-interceptor.xml文件,然后进行相关配置,使用时要记得包含到structs.xml文件中;自定义的拦截器注册在包内(即package节点下),配置在action节点下,代码如下(记得配置structs提供的默认拦截器)

<?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>
    <package
        name="interceptor"
        namespace="/interceptor"
        extends="struts-default">
        <!-- 注册拦截器 -->
        <interceptors>
            <!-- name:拦截器名称;class:拦截器完整类名 -->
            <interceptor
                name="hello"
                class="cn.hjp.interceptor.HelloInterceptor"></interceptor>
        </interceptors>
        <action
            name="HelloAction"
            class="cn.hjp.interceptor.HelloAction">
            <result
                name="success"
                type="dispatcher">/index.jsp</result>
            <!-- 拦截器拦截 ,自定义拦截器一般放在最前面 -->
            <interceptor-ref name="hello"></interceptor-ref>
            <!-- 如果自己配置了拦截器,不配置下面的拦截器,则struts默认的18个拦截器不在执行 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>

 

二、自定义拦截器,作用于该包下所有Action类

 自定义拦截器,注册和配置都在package节点下,自定义的拦截器配置在拦截器栈中,最后还要重新配置structs的默认拦截器,这样,访问该包的action时就会走新配置的默认拦截器,代码如下

<?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>
    <package
        name="interceptor"
        namespace="/interceptor"
        extends="struts-default">
        <interceptors>
            <!-- name:拦截器名称;class:拦截器完整类名 -->
            <interceptor
                name="hello"
                class="cn.hjp.interceptor.HelloInterceptor"></interceptor>
            <!-- 拦截器栈 -->
            <interceptor-stack name="myDefaultStack">
                <!-- 拦截器拦截 ,自定义拦截器一般放在最前面 -->
                <interceptor-ref name="hello"></interceptor-ref>
                <!-- 如果自己配置了拦截器,不配置下面的拦截器,则struts默认的18个拦截器不在执行 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 将自己的拦截器栈myDefaultStack设为该包下默认拦截器栈,如此,该包下的action都会执行默认拦截器栈中的拦截器 -->
        <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
        <action name="HelloAction"  class="cn.hjp.interceptor.HelloAction">
            <result name="success" type="dispatcher">/index.jsp</result>
        </action>
    </package>
</struts>

 

三、自定义拦截器,实现允许在其他包下也可以有效

如果想让其他包下的action使用别的包下的拦截器,那么就让新的配置文件继承自其他包

<?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>
    <package
        name="interceptor2"
        namespace="/interceptor"
        extends="interceptor">
        <action name="TestInter"  class="cn.hjp.test.TestInter">
            <result name="success" type="dispatcher">/index.jsp</result>
        </action>
    </package>
</struts>

注意:由dtd文件决定了structs配置文件书写规则,所以拦截器和action的配置是有顺序的

四、自定义指定方法的拦截器

新建一个继承自MethodFilterInterceptor的类,并实现doIntercept方法,代码如下

public class MyMethodInterceptor extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("方法拦截器");
        return invocation.invoke();
    }

}

新建一个进行测试的Action类,代码如下

public class HelloAction2 extends ActionSupport {

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return SUCCESS;
    }
    
    public void add(){
        System.out.println("方法拦截器---add方法");
    }
    
    public void find(){
        System.out.println("方法拦截器---find方法");
    }

    public void delete(){
        System.out.println("方法拦截器---delete方法");
    }
}

新建struts-methodInterceptor.xml文件,进行相关配置,最后记得include到struts.xml文件中,配置如下

<?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>
    <package
        name="methodInterceptor"
        namespace="/methodInterceptor"
        extends="struts-default">
        <interceptors>
            <interceptor
                name="MyMethodInterceptor"
                class="cn.hjp.interceptor.MyMethodInterceptor"></interceptor>
            <interceptor-stack name="myDefaultStack">
                <interceptor-ref name="MyMethodInterceptor">
                    <!--excludeMethods指定不进行过滤的方法,includeMethods指定过滤的方法 -->
                    <!-- 如果只有excludeMethods,其他默认进行过滤,如果只有 includeMethods,其他默认不过滤,两个都有,其他默认不过滤-->
                    <param name="excludeMethods">find</param><!-- 如果多个方法,用英文逗号分隔 -->
                    <param name="includeMethods">add</param>
                </interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
        <action
            name="HelloAction2"
            class="cn.hjp.interceptor.HelloAction2">
            <result
                name="success"
                type="dispatcher">/index.jsp</result>
        </action>
    </package>
</struts>

 

posted @ 2015-08-03 11:50  jiapeng  阅读(627)  评论(0编辑  收藏  举报