Struts2 in action 笔记4

来源:互联网 发布:学游泳费用 知乎 编辑:程序博客网 时间:2024/05/23 01:15

拦截器

在Struts2中,没有一个动作被单独调用。动作调用是一个分层的过程,总是包含一系列的拦截器在动作执行之前或之后执行。框架不直接调用动作的execute()方法,而是创建一个叫做ActionInvocation的对象,它封装了动作和一系列被配置在动作执行之前之后触发的拦截器。
动作的调用必须首先通过与之关联的拦截器栈,动作最终会执行并返回一个控制字符串用来选择合适的结果。
这里写图片描述

拦截器的强大功能之一是改变调用工作流。如,动作实现了Validateable接口,workflow拦截器就会调用该动作的validate()方法。

ActionInvocation

当框架收到一个请求时,它首先必须决定这个URL映射到哪个动作。这个动作的一个实例会被加入到一个新创建的ActionInvocation实例中。接着,框架咨询声明性架构(通过应用程序的XML或者Java注解创建),以发现哪些拦截器应该触发,及按照什么样的顺序触发。指向这些拦截器的引用被加入到ActionInvocation中。除了这些核心元素,ActionInvocation也拥有对其他重要信息(例Servlet请求对象和当前动作可用的结果组件的映射)的引用。
ActionInvocation公开了invoke()方法,框架通过调用这个方法开始动作的执行。
ActionInvocation的invoke()方法是一个递归的调用过程。框架通过第一次调用ActionInvocation对象的invoke()方法开始了这个过程。ActionInvocation通过调用拦截器的intercept()方法把控制转交给栈中的第一个拦截器。重要的是,intercept()方法把ActionInvocation实例作为一个参数。在拦截器的处理过程中,它会调用这个对象(ActionInvocation实例)上的invoke()方法来继续调用后续拦截器的递归过程。因此,在通常的执行中,调用过程向下通过所有的拦截器,直到最后栈中再也没有拦截器时动作被触发。另外,ActionInvocation在内部管理处理状态,因此它总是知道现在处理在栈的哪里。

拦截器有一个3阶段的,有条件的执行周期

1。做一些预处理
2。通过调用invoke()方法将控制转移给后续的拦截器,最后直到动作,或者通过返回一个控制字符串中断执行。
3。做一些后加工。

例1: 以下的代码片段展示了TimerInterceptor的intercept()方法,这是struts-default包含的一个拦截器。
这里写图片描述

例2: 以下的代码片段展示了DefaultWorkflowInterceptor的intercept()方法,这是struts-default包含的一个拦截器。
这里写图片描述

0 0
原创粉丝点击