开篇:拦截器在Struts中的作用

在我们的web.xml中,我们配置了一个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类。一旦接受到任意action的请求,该类会创建和初始化一个ActionProxy实例,它代理了具体的action,在其中我们可以添加任意拦截器在execute方法执行之前和之后做一些额外的操作,最终会调用该action实例的execute方法,为用户返回视图结果字符串,然后系统会根据该视图结果字符串调取相应的视图页面。下图是拦截器和action之间的关系:

这是一种典型的AOP思想,当我们在Struts.xml中定义一个包的时候,大部分情况下我们会继承struts-default文件,所以虽然我们在自己的配置文件中并没有手动配置任何的拦截器,但是我们创建的action却被很多拦截器拦截处理,就是因为struts-default中配置的拦截器生效了。Struts中内建了很多的拦截器,他们大多被配置在struts-default文件中,详细的内建拦截器的介绍可以参考官方API。

1.ModelDriven 拦截器

  • 当用户触发 add 请求时, ModelDriven 拦截器将调用 EmployeeAction 对象的 getModel() 方法, 并把返回的模型(Employee实例)压入到 ValueStack 栈.
  • 接下来 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 因为此时 ValueStack 栈的栈顶元素是刚被压入的模型(Employee)对象, 所以该模型将被填充. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象

2.Preparable 拦截器

  • Struts 2.0 中的 modelDriven 拦截器负责把 Action 类以外的一个对象压入到值栈栈顶
  • 而 prepare 拦截器负责准备为 getModel() 方法准备 model

3. PrepareInterceptor拦截器用方法

  • 若 Action 实现 Preparable 接口,则 Action 方法需实现 prepare() 方法
  • PrepareInterceptor 拦截器将调用 prepare() 方法,prepareActionMethodName()方法 或 prepareDoActionMethodName ()方法
  • PrepareInterceptor 拦截器根据 firstCallPrepareDo  属性决定获取 prepareActionMethodName 、prepareDoActionMethodName的顺序。默认情况下先获取 prepareActionMethodName (), 如果没有该方法,就寻找prepareDoActionMethodName()。如果找到对应的方法就调用该方法
  • PrepareInterceptor 拦截器会根据 alwaysInvokePrepare 属性决定是否执行prepare()方法

4.paramsPrepareParamsStack 拦截器栈

  • paramsPrepareParamsStack 从字面上理解来说, 这个stack的拦截器调用的顺序为:首先 params,然后 prepare,接下来 modelDriven,最后再 params
  • Struts 2.0的设计上要求 modelDriven 在 params 之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在 prepare之前运行params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。
  • 流程如下:

    –      1. params拦截器首先给action中的相关参数赋值,如id

    –      2. prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象

    –      3. modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的

    –      4. params拦截器再将参数赋值给model对象

    –      5. action的业务逻辑执行

最新文章

  1. UITableView(二)
  2. Codeforces Round #352 (Div. 2)
  3. [转]Linux/Ubuntu sudo不用输入密码的方法
  4. Ubuntu-安装-theano+caffe-超详细教程
  5. 关于在VS 上发布网站
  6. 让谷歌浏览器 chrome 支持小于12px的字体
  7. phpweb成品网站最新版(注入、上传、写shell)
  8. nginx 相关问题
  9. 重设mysql的root密码,MAC OSX
  10. SICP 1.1-1.5
  11. Template_Method
  12. string.Format 里面包含 javascript方法参数的时候 单引号变成双引号的问题解决方法
  13. 前端必会html知识整理
  14. mongo客户端mongo VUE增删改查
  15. SQL2008-截取字段函数
  16. POJ 2127 Greatest Common Increasing Subsequence -- 动态规划
  17. String, StringBuffer, StringBuilder比较
  18. UIActivityIndicatorView-初识IOS
  19. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理
  20. shell脚本基础 数值运算 判断 及if语句

热门文章

  1. JQuery+Json 省市区三级联动
  2. Linux - SVN的基本操作
  3. SQLServer2008 统计表占用空间
  4. sgu Theodore Roosevelt【判断点是否在凸多边形内模板】
  5. Python中为什么要使用线程池?如何使用线程池?
  6. mysql 大数据 查询方面的测试
  7. QT里面的delay使用
  8. 每天一个Linux命令(18)loacte命令
  9. CSS3自定义Checkbox特效
  10. 从输入url到浏览器呈现网页发生了什么?