博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2 - ModelDriven 拦截器、Preparable 拦截器
阅读量:5233 次
发布时间:2019-06-14

本文共 1885 字,大约阅读时间需要 6 分钟。

开篇:拦截器在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的业务逻辑执行

 

 

转载于:https://www.cnblogs.com/pjlhf/p/8721257.html

你可能感兴趣的文章
最近一月研报推荐次数最多的股票
查看>>
PC 远程控制 android手机的方法之二 androidscreencast
查看>>
CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】
查看>>
Android学习总结(十一)———— Adapter的使用
查看>>
META Header实例讲解(转)
查看>>
swift UILabel的高度自适应
查看>>
基于AOP注解实现业务功能的动态配置
查看>>
Ubuntu 出现apt-get: Package has no installation candidate问题
查看>>
Shiro安全框架入门篇(登录验证实例详解与源码)
查看>>
Mac下用brew搭建PHP(LNMP/LAMP)开发环境
查看>>
CORS实现跨域资源访问
查看>>
HTTP(超文本传输协议)入门
查看>>
JavaBean入门及简单的例子
查看>>
editplus的注册码 4.0
查看>>
JAVA JDBC 连接 Oracle
查看>>
【转】知识管理中需要关注的‘两化’
查看>>
Project入门学习
查看>>
C#复习笔记(4)--C#3:革新写代码的方式(扩展方法)
查看>>
关于EditText的android:maxLength属性的注意事项
查看>>
第27月第17天 objc_msgSendSuper
查看>>