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、声明拦截器并构建新的默认栈