Struts2拦截器(Interceptor)(下)
2012-05-22 00:14
405 查看
拦截器的查找顺序
如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢:
(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方法,我们自定拦截器主要就是实现这个方法。下面我们以判断用户是否登录为例来写一个自定义拦截器:
[java] view
plaincopyprint?
public class MyInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("动作执行之前...");
String result = invocation.invoke();
System.out.println("结果执行之后...");
return result;
}
}
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来实现了。
如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢:
(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方法,我们自定拦截器主要就是实现这个方法。下面我们以判断用户是否登录为例来写一个自定义拦截器:
[java] view
plaincopyprint?
public class MyInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("动作执行之前...");
String result = invocation.invoke();
System.out.println("结果执行之后...");
return result;
}
}
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 拦截器 interceptor
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
- struts2 拦截器Interceptor
- Struts2使用MethodFilterInterceptor来实现方法拦截器
- struts2 角色权限 filter(过滤器)和interceptor(拦截器)
- struts2 拦截器 interceptor
- Struts2 拦截器(Interceptor )原理和配置
- 在struts2中使用拦截器(Interceptor)控制登录和权限
- Struts2 的基石--拦截器(Interceptor)(转载自http://www.blogjava.net/max/archive/2006/12/06/85925.html)
- struts2 拦截器Interceptor中取得request、response
- Struts2拦截器(Interceptor)
- struts2 学习总结 ---- 拦截器(interceptor)
- Struts2拦截器(Interceptor)原理详解
- Struts2拦截器Interceptor学习笔记
- SSH-Struts2简单的自定义拦截器MethodFilterInterceptor
- 浅谈Struts2拦截器Interceptor的设计原理
- Struts2拦截器(Interceptor)原理详解
- struts2- Interceptor(默认拦截器)介绍
- Struts2拦截器(Interceptor)
- Struts2 拦截器(Interceptor )原理和配置 (区别 过滤器Filter)