struts2浅谈之拦截器

拦截器完成各种任务时,我们称之为横切、预处理、后加工。
比如,日志记录就是一个横切关注点。他不跟模型层交互,他不是某个动作所特有,他横向关联所有的动作。


框架不直接调用动作的execute()方法,而是创建一个ActionInvocation的对象,他封装了动作和一系列被配置在动作执行之前和之后的拦截器。
ActionInvocation
——————————————————————————————————————————————————————>Action
                                                         |
exception->modeldriven->fileUpload->params->workFolw     |   
                                                         v           
<——————————————————————————————————————————————————————result


拦截器强大的功能之一就是改变工作流。

拦截器工作原理:
总指挥:ActionInvocation指挥着动作的完整执行,以及与之相关的拦截器栈的顺序触发。

拦截器栈是递归调用的,因为在第一次调用ActionInvocation的invoke()方法,ActionInvocation通过拦截器的intercept()方法把控制转交给拦截器栈里的第一个拦截器,重要的是,intercept()方法把ActionInvocation实例作为一个参数。

拦截器触发时:
1、做一些预处理
2、通过调用invoke()方法把控制转交给下一个拦截器,最后直到动作,或者通过返回一个控制字符串中断执行。
3、做一些后加工。

default包里的一个TimerInterceptor的intecept()方法:
public String intercept(ActionInvocation invocation)throws Exception{
    long startTime=System.currentTimeMillis(); //预处理
    String result=invocation.invoke();//invoke()方法
    long executeTime=System.currentTimeMills()-startTime;//后加工
    ....
    return result;//让递归返回拦截器栈
}
调用invoke()方法后,等待这个方法的返回结果。

工作流拦截器:
workflow拦截器使用params调整拦截器的执行
可以使用以下几个参数:
alwaysInvokeValidate(true或者false,默认true,意思是validate()方法将会被调用)
inputResultName(验证失败时选择结果的名字,默认是Action.INPUT)
excludeMethods(workflow拦截器不应该执行的方法名,可以省略动作的某一个方法的验证检查)
<interceptor-ref name="workflow">
    <param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>

自定义拦截器:
1、实现Interceptor接口
2、声明拦截器并构建新的默认栈

#Java工程师#
全部评论
赞!
点赞 回复 分享
发布于 2016-11-10 14:27

相关推荐

水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务