拦截器的查找顺序
如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢:
(1)首先查找当前Action是否声明了拦截器,如果有则使用这个拦截器,不再继续寻找,如果没有,则执行下一步
(2)其次,查找当前Action所在的包中是否声明了默认的拦截器引用,即看<package>元素下有没有<default-intercptor-ref>元素,如果有就使用它,不再继续寻找。如果没有,则执行下一步
(3)最后,递归寻找Action所在包的父包中是否设置了默认拦截器引用,直到找到为止。
注:这里的三步是覆盖的关系,即执行了(2),那么(2)(3)就不会执行了。自顶向下的优先级。一般情况下,如果我们没有在strtus.xml中对Action进行拦截器引用配置,但是我们的包继承了strtus-default包,那么就会使用定义在strtus-default包中的defaultStack拦截器栈。至于没有拦截器的情况,应该是不存在的,如果不使用拦截器,那么就失去了使用Strtus的意义了。
自定义拦截器
虽然实际使用中struts2提供的拦截器已经基本够我们使用了,一般不需要我们自己写拦截器。但是为了更加深刻的理解拦截器的实现机制。我们还是自己动手写一个自定义的拦截器。要想自定义拦截器,我们只需要实现com.opensymphony.xwork2.interceptor.Interceptor接口即可。这个接口中定义了三个方法,init方法会在对象初始化时被调用,可以用来获取一些资源;destory方法类似与c++中的析构函数(这样便于理解,实际还是有差别的);真正实拦截器功能的是interceptor方法,我们自定拦截器主要就是实现这个方法。下面我们以判断用户是否登录为例来写一个自定义拦截器:
Struts.xml
<package
name="default"
namespace="/"
extends="struts-default">
<interceptors>
<interceptor
name="myinterceptor"class="interceptor.MyInterceptor"
/>
<interceptor-stack
name="myStack">
<interceptor-ref
name="defaultStack"></interceptor-ref>
<interceptor-ref
name="myinterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref
name="myStack"></default-interceptor-ref>
<action
name="hello"
class="action.HelloWorld">
<result
name="success">/hello.jsp</result>
</action>
</package>
Hello.jsp
<body>
<%
System.out.println("结果已执行...");
%>
This is hello.jsp. <br>
</body>
在浏览器中访问hello动作,hello.jsp页面呈现之后,查看控制台输出如下:
动作执行之前...
结果已执行...
结果执行之后...
由此可见,我们自定义的interceptor已经在动作执行之前和结果执行之后都被执行了。当然,如果你想在结果被执行之前做点什么,那就需要使用前面学到的PreResultListenner来实现了。
总结:关于拦截器的学习,差不多就到这里了。拦截器的配置和使用本身不难,主要是理解拦截器的实现原理。到现在差不多就把Struts2中的几个基本的概念学完了,接下来就该学习OGNL和类型转换以及输入验证了。以前自学都只是看看书或者教程,没怎么做过笔记,现在发现其实在写笔记的过程中,会加深对所学只是的理解,有些你看书或教程没理解到的地方,在你边写笔记边做实例的过程中就理解的很清楚了。看来以后学习的时候尽量写一些笔记来加深自己的理解,记不清的时候还可以拿出来看看。
分享到:
相关推荐
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
STRUTS2:拦截器Interceptor
struts2 Interceptor拦截器 http://whitewolf.0fees.net
简单的拦截器例子,适合初学者学习,也是一个备忘录
Struts2.3.6实现自定义拦截器Interceptor http://blog.csdn.net/alanchen520/article/details/34086699
struts2 拦截器_教程.zip
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...
在struts2中使用拦截器(Interceptor)控制登录和权限[汇编].pdf
struts2,Interceptor struts2拦截器实例,两套实例,一套是针对单个的action配置的,另一套实例是针对全局的action配置的拦截器interceptor
当前struts2的filter过滤到一个.action结尾的请求的时候,会把这个请求交给struts2内部的拦截器(interceptor) 2)拦截器起到什么作用 可以帮我们丰富action的功能,比自动类型转换(页面传一个String类型的id,接收的...
NULL 博文链接:https://wang4717.iteye.com/blog/796941
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
jfinal中拦截器(Interceptor)的参数注入jfinal中拦截器(Interceptor)的参数注入
在struts2框架中主配置文件struts-defalut.xml 文件中定义了大量的拦截器和拦截器栈。通过 default-interceptor-ref元素定义了 当前应用的默认拦截器栈,对用户的每次请求都需要调用拦截器栈中的每个拦截器来拦截...
利用反射和动态代理机制实现自定义拦截器Interceptor http://blog.csdn.net/alanchen520/article/details/34087833
详细介绍struts2 interceptor
创建自己struts2拦截器,手工创建自己的拦截器实现
Struts2_自定义拦截器 struts2_3500_my_interceptor
使用Struts2实现用户权限拦截、重点是掌握拦截器的使用和配置方法,通过案例的学习,就能掌握struts中拦截器的使用方法,让我们能快速上手
综合使用servlet filter与struts2 interceptor对权限进行验证。