struts2自定义拦截器

110 篇文章 6 订阅
36 篇文章 1 订阅

1.你要懂得的知识

首先放一张Struts2框架流程图
这里写图片描述
在这里我们需要关注的是这一部分
这里写图片描述

struts在执行Action之前会先创建一个ActionInvocation实例,然后检查Action是否配置有拦截器,如果有按照拦截器顺序一个一个的执行,然后进入result结果视图,调用相关的jsp或其它template,然后再按照拦截器的逆顺序执行一遍,最后到HttpServletResponse.
从图中我们可以看到ActionInvocation贯穿 interceptor-action-result-template的整个执行过程。可见拦截器机制就是早期的AOP(Aspect Orient Program,面向切面编程)思想。拦截器在AOP中用于在某个方法或字段被访问之前进行拦截,然后在之前,之后加入某些操作,AOP就是面向切面编程,是一种消除代码重复的方法。

2.AbstractInterceptor类

其实在Struts2中拦截器体系是一个重要的组成部分,可以认为struts2是一个空的容器,正是因为大量自带的拦截器的使用,让整个框架功能变得强大起来。在struts2的核心jar包中有一个struts-default.xml文件,里面有许多拦截器例如ServletConfigInterceptor,ModelDriverInterceptor。其中一些默认的拦截器如下

 <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="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</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-ref name="debugging"/>
            </interceptor-stack>

查看源码可以发现,这些拦截器都继承于AbstractInterceptor类,

public abstract class AbstractInterceptor implements Interceptor {
    public void init() {
    }
    public void destroy() {
    }
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}

在这个类中没有实现任何方法,就是一个简单的Interceptor接口。拦截器要在Action之前执行,只有在继承这个类时,通过实现它的抽象方法intercept()来完成拦截器的功能。也就是说,在intercept()方法中会先执行拦截器想要完成的任务,然后再转向Action执行,一般函数最后都会加上这句代码:String res=invocation.invoke();
具体的结构图如下:
这里写图片描述
我们自定义的拦截器MyInterceptor也可以通过继承AbstractInterceptor类来实现拦截器的功能。

3.自定义interceptor的配置

通过上面的知识,我们就可以自定义拦截器了。使用自定义拦截器需要知道当配置了任何一个拦截器,默认的拦截器栈就不会工作了。至于如何让默认的拦截器栈和自定义的拦截器一起工作,我们会在下篇文章写个小例子。

自定义interceptor的配置步骤如下:

1.创建一个普通类,继承AbstractInterceptor,实现抽象方法intercept
2.在struts.xml中配置拦截器
2.1声明拦截器
2.2使用拦截器

普通类MyIntercepter .java 自定义拦截器 在Action执行之前和执行之后各输出一句话。

public class MyIntercepter extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("拦截器拦截啦-----动作执行之前");
        String res=invocation.invoke();
        System.out.println("拦截器拦截啦-----动作执行之后");
        return res;
    }
}

其中String res=invocation.invoke(); 执行后返回的String类型的res即是Action中相应方法执行后返回的结果。

配置拦截器

struts.xml 在这个配置文件里,配置了一个struts2框架预定义的拦截器,名称为myIntercepter,然后在Action里引用了这个Action,指定这个Action和这个拦截器装配,对这个Action起作用。这样当struts2框架发现了这个装配的拦截器后,在调用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>
    <!-- 开发者模式 -->
    <constant name="struts.devMode" value="true"></constant>
    <package name="user" extends="struts-default" namespace="/user">
        <!-- 声明自己定义的拦截器,名字以及对应的java类 -->
        <interceptors> 
            <interceptor name="myIntercepter" class="com.scx.web.intercepter.MyIntercepter"></interceptor>
        </interceptors>
        <action name="login" class="com.scx.web.action.UserAction" method="login">
            <!-- 配置自己定义的拦截器 -->
            <interceptor-ref name="myIntercepter"></interceptor-ref>
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

运行结果

配置完这些,在浏览器中输入:http://localhost:8080/Interceptor/user/login.action
控制台输出结果为:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值