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

相关推荐

烤点老白薯:他第二句话的潜台词是想让你帮他点个瑞幸或者喜茶啥的
mt对你说过最有启发的一...
点赞 评论 收藏
分享
11-13 14:37
门头沟学院 Java
程序员牛肉:是的,我觉得你最先需要的是多接触计算机圈子。我感觉你这个写的太幼稚了,根本没换位思考面试官。 你对实习的描述还是我写了前后端,我写了Restful接口,我用了EChatrs。你这让面试官怎么问你?问你什么是前后端?问你什么是Restful?讲真的兄弟,你这个简历在面试官眼里就是啥也不懂的好学生。所以一定要尽快加入一个圈子跟大家多聊聊,看看正儿八经的简历是怎么写的。 可以看一下我首页的简历怎么写那篇文章来学一下,你这里面的坑点我那篇文章里面都有讲过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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