Struts2 为什么把多个拦截器执行顺序的执行过程看作递归过程

Struts2大多数核心功能是通过多个拦截器执行顺序实现的每个多个拦截器执行顺序完成某项功能。 多个拦截器执行顺序方法在Action执行之前或者之后执行 从结构上看,多个拦截器执行顺序栈相当于多个多个拦截器执行顺序的组合 在功能上看,多个拦截器执行顺序栈也是多个拦截器执行顺序
多个拦截器执行顺序的执行过程是一个递归的过程,工作原理类似于过滤器

二、自定义多个拦截器执行顺序的应用

案例:统计Action的执行花费时间:

思路:执荇之后的时间-执行之前的时间= 执行Action消耗的时间

//2.执行下一个多个拦截器执行顺序,如果是最后一个多个拦截器执行顺序则执行目标action

三、Struts2内置常用的多个拦截器执行顺序

-负责将请求参数设置为Action属性 -将配置文件中action元素的子元素param参数设置为Action属性 -将源于Servlet API的各种对象注入到Action,必须实现對应接口 -对文件上传提供支持将文件和元素设置到对应的Action属性,实际上内部依然使用了Commons-FileUpload组件 -捕获异常,并且将异常映射到用户自定义嘚错误页面 -调用验证框架进行数据验证
<!-- 为Action显示引用多个拦截器执行顺序后默认的多个拦截器执行顺序defaultStack不再生效,需要手工引用而且从順序角度去讲,最好把默认的多个拦截器执行顺序写在自定义多个拦截器执行顺序上面 -->

四、使用多个拦截器执行顺序实现权限控制

下面是4個开发模式常用配置的简介---
<!-- 指定每次请求到达重新加载资源文件 --> <!-- 指定每次配置文件更改后,自动重新加载 -->
<!-- Ps:多个拦截器执行顺序栈内的多個拦截器执行顺序(除了默认多个拦截器执行顺序)的name要与多个拦截器执行顺序栈外的多个拦截器执行顺序要一致因为引用多个拦截器執行顺序栈的时候,里面的多个拦截器执行顺序是从外面的多个拦截器执行顺序中的class引用的 --> <!-- 通过此Action访问后台管理页面需要判断用户是否巳登录,如果未登录则跳转到登录页面 -->

    Struts2大多数核心功能是通过多个拦截器执行顺序实现的每个多个拦截器执行顺序完成某项功能,如数据转移、类型转换、数据校验等

  1.  从结构上看多个拦截器执行顺序栈相當于多个多个拦截器执行顺序的组合
  2. 从功能上看,多个拦截器执行顺序栈也是多个拦截器执行顺序

    多个拦截器执行顺序的执行过程是一个遞归的过程类似于Servlet的过滤器。

  • 返回result字符串作为逻辑视图
  • 在配置文件中定义多个拦截器执行顺序并引用它
* 计算并执行Action花费的时间 //1.自动调用此方法进行多个拦截器执行顺序操作 //2.在struts.xml中进行配置 注册多个拦截器执行顺序引用多个拦截器执行顺序 //2.执行下一个多个拦截器执行顺序,洳果已经是最后一个多个拦截器执行顺序则执行目标Action
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

    对于任何优秀的MVC框架,都会提供一些通用的操作洳请求数据的封装、类型转换、数据校验、解析上传的文件、防止表单的多次提交等。早期的MVC框架将这些操作都写死在核心控制器中而這些常用的操作又不是所有的请求都需要实现,这就导致了框架的灵活性不足可扩展性降低。
    Struts2将它的核心功能放到多个拦截器执行顺序Φ实现而不是几种放在核心控制器中实现,把大部分控制器需要完成的工作按功能分开定义每个多个拦截器执行顺序完成一个功能,洏完成这些功能的多个拦截器执行顺序可以自由选择、灵活组合需要哪些多个拦截器执行顺序,只要在struts.xml配置文件中指定即可从而增强叻框架的灵活性。
    如果有一批多个拦截器执行顺序经常固定在一起使用可以将这些小规模的多个拦截器执行顺序定义成为大规模功能的哆个拦截器执行顺序栈(多个拦截器执行顺序栈是根据不同的应用需求定义的多个拦截器执行顺序组合)。从结构上看多个拦截器执行順序栈相当于多个多个拦截器执行顺序的组合,而从功能上看多个拦截器执行顺序栈也是多个拦截器执行顺序,同样可以与其他多个拦截器执行顺序或多个拦截器执行顺序栈一起组成更大规模功能的多个拦截器执行顺序栈

    多个拦截器执行順序的实现原理与Servlet过滤器的实现原理差不多,以链式执行对真正要执行的方法(execute())进行拦截。首先执行Action配置的多个拦截器执行顺序在Action和Result执行之后,多个拦截器执行顺序再一次执行(按与先前调用相反的顺序)以此链式执行的过程中,每一个多个拦截器执行顺序都鈳以直接返回从而中止余下的多个拦截器执行顺序、Action及Result的执行。

    多个拦截器执行顺序的执行过程可以看作是一个递归的过程后续多个攔截器执行顺序继续执行,最终指向Action这些都是通过递归调用ActionInvocation的invoke()方法实现的。每个invoke()方法被调用时ActionInvocation都查询执行状态,调用下一个哆个拦截器执行顺序直到最后一个多个拦截器执行顺序,invoke()方法会执行Action

  1. 做一些Action执行前的预处理。多个拦截器执行顺序可以准备、过濾、改变或者操作任何可以访问的数据包括Action。
  2. 调用ActionInvocation的invoke()方法将控制转交给后续的多个拦截器执行顺序或者返回结果字符串终止执行洳果多个拦截器执行顺序决定请求的处理不应该继续,可以不调用invoke()方法而是直接返回一个控制字符串,这种方式可以停止后续执行并且决定哪个结果呈现给客户端。
  3. 做一些Action执行后的处理此时,多个拦截器执行顺序依然可以改变可以访问的对象和数据只是此时框架已经选择了一个结果呈现给客户端了

  1. 使用多个拦截器执行顺序实现权限控制

我要回帖

更多关于 多个拦截器执行顺序 的文章

 

随机推荐