strust2拦截器

拦截器体系是struts2框架的重要组成部分。
param拦截器负责解析HTTP请求参数,并设置Action的属性
servlet-config拦截器直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action
fileUpload拦截器负责解析请求参数中的文件域,并将文件域设置成Action的三个属性。
struts2工作原理
这里写图片描述
这张图的FilterDispatcher是struts2.0-2.1(应该是)的版本,现在使用的是StrutsPrepareAndExecuteFilter。当他拦截到用户请求之后,大量拦截器对用户请求进行处理。
StrutsPrepareAndExecuteFilter会初始化一个ActionProxy实例,并调用他的execute方法。拦截器方法会先拦截,并处理用户请求,然后到Action的execute方法处理用户请求,最后返回逻辑视图资源呈现给用户。

配置拦截器

<interceptor name="拦截器名" class="拦截器实现类"/>

可以传入相关参数 要有setter方法。

<interceptor name="拦截器名" class="拦截器实现类">
    <param name="参数名">参数值</param>
</interceptor>

配置拦截器栈

<interceptor-stack name="拦截器栈名">
    <interceptor-ref name="拦截器一"/>
    <interceptor-ref name="拦截器二"/>
</interceptor-stack>

自己开发拦截器类,应该实现Intercepto接口,接口定义

public interface Interceptor extends Serializable{
    //销毁该拦截器之前的回调方法
    void destroy();
    //初始化该拦截器的回调方法
    void init();
    //拦截器实现拦截的逻辑方法
    String intercept(ActionInvocation invocation ) throws Exception;
}

自定义一个拦截器

public class SimpleInterceptor extends AbstractInterceptor {
    //拦截器的名字
    private String name;
    //为该拦截器设置名字的setter方法
    public void setName(String name){
        this.name = name;
    }
    public String intercept(ActionInvocation invocation) throws Exception {
        // 取得被拦截的Action实例
        LoginAction action = (LoginAction)invocation.getAction();
        // 打印执行开始的时间
        System.out.println(name + " 拦截器的动作---------" +
                "开始执行登录Action的时间为:" + new Date());
        // 取得开始执行Action的时间
        long start = System.currentTimeMillis();
        // 执行该拦截器的后一个拦截器
        // 如果该拦截器后没有其他拦截器,则直接执行Action的被拦截方法
        String result = invocation.invoke();
        // 打印执行结束的时间
        System.out.println(name + " 拦截器的动作---------" +
                "执行完登录Action的时间为:" + new Date());
        long end = System.currentTimeMillis();
        System.out.println(name + " 拦截器的动作---------" +
                "执行完该Action的时间为" + (end - start) + "毫秒");
        return result;
    }
}

拦截器执行顺序(补充:2016-11-27)
在Action的控制方法执行之前,位于拦截器链前面的拦截器将先发生作用;在Action的控制方法执行之后,位于拦截器链前面的拦截器将后发生作用。(图上的拦截器123 321 就是这么回事,,)

struts.xml配置

<interceptors>
            <interceptor name="mySimple" class="org.crazyit.app.interceptor.SimpleInterceptor">
                <param name="name">简单拦截器</param>
            </interceptor>
        </interceptors>

        <action name="login" class="org.crazyit.app.action.LoginAction">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="mySimple">
                <param name="name">改名后的拦截器</param>
            </interceptor-ref>
            <result>/WEB-INF/content/welcome.jsp</result>
            <result name="error">./welcome.jsp</result>
        </action>

以上是关于实现普通拦截继承AbstractInterceptor。
实现拦截方法是继承MethodFilterInterceptor

1.拦截方法
继承MethodFilterInterceptor 重写doIntercept

配置文件中传入参数有2中 1种拦一种不拦
<param name="excludeMethods">execute</param> <!--拦-->

setExcludeMethods 不拦 setIncludeMethods 拦

2.普通拦截
继承AbstactInterceptor 重写intercept

拦截器将在execute方法执行之前之后的动作都定义在拦截器intercept方法中,
监听器也可注册在拦截器中,只要拦截器起作用的地方,监听器都会触发。brforeResult方法在intercept的Result之前执行的动作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值