struts2 拦截器: 自己总结 经典~~~

struts2 拦截器:
0.ActionInvocation负责整个Action对象执行,好比Action组件运行的一个容器
工作原理:url action请求-->创建action实例并付给新创建 ActionInvocation实例-->根据配置文件--->调用相应拦截器运行intercept方法。
1.Action是封装了处理逻辑的对象,则拦截器则为众多Action的公共行为,因此可以理解Aciton为线程独立的,拦截器是公用的。
2.自带20多个拦截器在struts-default中定义了, 用的时候struts-xxx.xml配置之后,任意Action则可用拦截器了!
3.由于原因2实现了,依赖注入,功能上高内聚,关联上的低耦合。
4.intercepter的核心方法为intercept(ActionInvocation invocation)---->相当于action中的execute()方法!
5.自己写拦截器-->继承AbstractInterceptor抽象类或实现Interceptor接口--->编写intercepter逻辑即可!
6.拦截器是公用的,因此是非线程独立的,所以拦截器不应含有任何局部变量-->否则引起并发问题。
7.拦截器配置非常简单,struts.xml中定义<interceptors><interceptor name class属性></interceptor><interceptors>-->再把拦截器与action关联即可,在<action><interceptor-ref name=xxx></action>即可

总结:拦截器为AOP编程,web应用本质决定的,如对任何web请求,都要有参数提取,输入校验等通用处理,与业务无关--->拦截器就是干这个事情的!


----------------------

   在这个实现类中,实际上已经实现了最简单的拦截器的雏形。这里需要指出的是一个很重要的方法invocation.invoke()。这是ActionInvocation中的方法,而ActionInvocationAction调度者,所以这个方法具备以下2层含义:

1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。


    所以,我们可以发现,invocation.invoke()这个方法其实是整个拦截器框架的实现核心。基于这样的实现机制,我们还可以得到下面2个非常重要的推论:
1. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。

2. 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。
由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP


原来在intercept()方法又对ActionInvocationinvoke()方法进行递归调用,ActionInvocation循环嵌套在intercept()中,一直到语句result = invocation.invoke()执行结束。这样,Interceptor又会按照刚开始执行的逆向顺序依次执行结束。一个有序链表,通过递归调用,变成了一个堆栈执行过程,将一段有序执行的代码变成了2段执行顺序完全相反的代码过程,从而巧妙地实现了AOP这也就成为了Struts2Action层的AOP基础


你可能感兴趣的:(struts2 拦截器: 自己总结 经典~~~)