Struts框架_5 拦截器

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

2.使用paramsPrepareParamsStack拦截器栈后的运行流程
1)。paramsPrepareParamsStack 和defaultStack -样都是拦截器栈。面struts - default包默认使用的是defaultStack
2).可以在Struts配置文件中通过以下方式修改使用的默认的拦截器栈
<default- interceptor- ref name= ”paramsPrepareParamsStack"></ default- interceptor- ref>
3). paramsPrepareParamsStack 拦截器在于params -> modelDriven -> params
所以可以先把请求参数赋给Action对应的属性,再根据赋给Action的那个属性值决定压到值栈栈顶的对象,最后再为栈顶对象的属性赋值.
对于edit操作而言:
先为EmployeeAction的employeeId赋值
II. 根据employeeId从数据库中加载对应的对象,并放入到值栈的栈顶
III.再为栈顶对象的employeeId赋值(实际上此时employeeId属性值已经存在)
IV.把栈顶对象的属性回显在表单中。


在执行删除的时候,employeeId 不为nu1l,但getModel方法却从数据库加载了一个对象。不该加载!
指向查询全部信息时,也new Employee()对象。浪费!
解决方案:使用PrepareInterceptor和Preparable接口.

结论:

若Action实现了Preparable接口,则Struts将尝试执行prepare[ ActionMethodName]方法,
若prepare [ ActionMethodName]不存在,则将尝试执行prepareDo[ ActionMethodName]方法.
若都不存在,就都不执行。
若PrepareInterceptor的 alwaysInvokePrepare属性为false,
则Struts2将不会调用实现了Preparable接口的Action的prepare()方法
[能解决(5)的问题的方案]
可以为每一个Act ionMethod,准备prepare[ Act ionMethdName]方法, 而抛弃掉原来的prepare()方法
将PrepareInterceptor的alwaysInvokePrepare属性置为false,以避免Struts2框架再调用prepare()方法。

配置使用paramsPrepareParamsStack作为默认的拦截器栈
修改PrepareInterceptor拦截器的always InvokePrepare属性值为false

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


使用paramsPrepareParamsStack
拦截器栈paramsPrepareParamsStack从字面上理解来说,这个stack的拦截器调用的顺序为:首先params ,必后prepare ,接下来modelDriven,最后再paramsStruts 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的业务逻辑执行

猜你喜欢

转载自blog.csdn.net/XiaoXiao_Lin/article/details/109379534