拦截器的查找顺序

如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢:

(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方法,我们自定拦截器主要就是实现这个方法。下面我们以判断用户是否登录为例来写一个自定义拦截器:

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中的几个基本的概念学完了,接下来就该学习OGNL和类型转换以及输入验证了。以前自学都只是看看书或者教程,没怎么做过笔记,现在发现其实在写笔记的过程中,会加深对所学只是的理解,有些你看书或教程没理解到的地方,在你边写笔记边做实例的过程中就理解的很清楚了。看来以后学习的时候尽量写一些笔记来加深自己的理解,记不清的时候还可以拿出来看看。

转载于:https://www.cnblogs.com/JPAORM/archive/2012/05/20/2509739.html

Struts2学习笔记(九) 拦截器(Interceptor)(下)相关推荐

  1. JavaWeb学习笔记:拦截器

    一.概述 当客户端发起请求时,Filter 过滤器可以将请求拦截下来,对请求进行一些判断,只有符合要求的请求才会放行.应用场景:登录验证,设置编码,过滤明杆字符等. 二.生命周期 过滤器的生命周期和 ...

  2. 【SpringMVC笔记】拦截器 + 文件上传下载

    拦截器 + 文件上传下载 拦截器(interceptor) 自定义拦截器 验证用户是否登录 (认证用户) 没有拦截器 配置拦截器 文件的上传 文件输出流进行文件上传 file.Transto 进行文件 ...

  3. Struts2学习笔记(八) 拦截器(Interceptor)(上)

    什么是拦截器(Interceptor) 拦截器是struts2框架最重要的特性之一.它可以让你在Action 方法执行前后(Result执行之后)进行一些功能处理.在前面学习Action和学习Resu ...

  4. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  5. Struts2拦截器(Interceptor)原理详解

    1.    理解拦截器 1.1.    什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作 ...

  6. Struts2拦截器Interceptor的使用

    一.拦截器的使用: 只有用户登录时才可以查看商品,否则点击查看商品时会跳回login登录页面. struts2.xml中拦截器Interceptor的配置: <interceptors>& ...

  7. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  8. Struts2拦截器-day04下

    目录 第一节 Strust2的拦截器 1.1 拦截器的重要性 1.2 拦截器的执行时机 1.3 拦截器的部分类结构 1.4 简单拦截器入门 单个拦截器 多个拦截器 1.5 拦截器的应用场景(登录) 案 ...

  9. Struts2学习笔记(十六) 文件上传(File Upload)

    使用jsp/Servlet实现文件上传 在我们的web应用中,文件上传是一项非常常见的功能.以前我学习php的时候也用php写过文件上传,不过php中实现起来比较方便,只需要从全局变量$_FILES中 ...

  10. Struts2学习笔记总结

    **技术分析之Struts2框架的概述** 1. 什么是Struts2的框架 * Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Stru ...

最新文章

  1. 领导力,就是这5个问题
  2. 【iOS学习笔记】IOS开发中设置applicationIconBadgeNumber和消息推送
  3. mysql拉荐_荐 一步一步教你MySQL主从复制读写分离
  4. Django中pipeline操作Redis数据库
  5. Nginx服务的信号控制之USR2
  6. 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例
  7. ajax ssm 页面跳转_SSM框架的面试常见问题
  8. 2021 年云原生技术发展现状及未来趋势
  9. 我的世界服务器防挂系统,[管理|机制]AFKKicker —— 防挂机!定时要求输入验证码 防止挂机[1.7.10-1.12.2]...
  10. 利用权限禁止QQ的自动升级(QQUpdateCenter)
  11. SQL Proc(存储过程)/tran(事物)
  12. VB中的format格式化函数
  13. 这里90%的程序员根本就不算程序员。
  14. wpsppt设置页码和总页数_Word页码,这几个技巧真的很实用!
  15. Leetcode 129. 根到叶子结点数字之和
  16. git clone出现fatal: HTTP request failed --git版本问题
  17. 运行aspnet时要求启用windows集成身份验证
  18. linux 创建交换文件格式,Linux系统下的交换分区和交换文件的含义 (创建交换分区文件基本文件的swap)...
  19. directx修复工具v3.2增强版_「电脑知识」USBOS 超级PE启动维护工具增强版及标准版...
  20. PLC控制系统设计的一般步骤是什么?

热门文章

  1. 【自】数据库系统原理(三)——测试总结后,
  2. 【解决】Oracle服务器ip地址被占用
  3. nginx配置SSL实现服务器/客户端双向认证
  4. 学完之后,有什么证书发吗?要另外收费吗?收费多少? 学员每天的上课时间是怎样安排的?...
  5. ASP.NET URL Rewrite. URL重写
  6. 如何在有限的时间内编写完整有效的测试用例?
  7. 【实习之T100开发】T100 基础架构、命名原则
  8. 别被忽悠了!我来谈谈大数据平台的4个要点,你们写的都不是干货
  9. 报表选型除了看开发难易,还要看运维省不省心
  10. mysql 唯一 标识符_mysql – 获取唯一标识符而不插入