Params 拦截器、ModelDrivenInterceptor拦截器 和 PrepareInterceptor拦截器

Params 拦截器、ModelDrivenInterceptor拦截器 和 PrepareInterceptor拦截器、paramsPrepareParamsStack 拦截器栈后的运行流程


1、Action需要实现的接口
ModelDrivenInterceptor拦截器 ----- ModelDriven<E>接口;
PrepareInterceptor拦截器 ----- Preparable 接口


2、Parameters 拦截器(Action不需要配置和实现接口)
(1) Parameters 拦截器把Action的参数映射到栈顶对应的对应属性中(Action需要有对应的set方法),
(2) Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中
(即:把表单的值赋给栈顶对象的各个属性)。
    如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象。


3、ModelDrivenInterceptor拦截器(Action要实现ModelDriven<E>接口)
(1) 如果 Action 类实现了ModelDriven接口,该拦截器将把ModelDriven接口的getModel()方法返回的对象置于栈顶;
(2) ModelDriven接口要实现getModel()方法,如下:
 public Employee getModel()
 {
 return employee;
 }

4、PrepareInterceptor拦截器(Action要实现Preparable接口)
(1) Action 方法需实现 prepare()方法, 如下:
 public void prepare() throws Exception {}
(2) prepare拦截器负责为 ModelDriven 拦截器的 getModel()方法准备 model;
(3) 可以为Action的每一个方法准备model:
<1> prepare[ActionMethdName] 方法, 而抛弃掉原来的 prepare()方法, 例如下;
 //为 update()方法准备model 
 public void prepareUpdate()
 {
 employee = new Employee();
 }
 
 //为 edit()方法准备model 
 public void prepareEdit()
 {
 employee = dao.get(employeeId);
 }
<2> 将PrepareInterceptor的alwaysInvokePrepare 属性置为 false,以避免 Struts2 框架再调用prepare()方法;
(4) 在配置文件中为拦截器栈的属性赋值, 如下:
<!-- 
把paramsPrepareParamsStack拦截器栈中的 PrepareInterceptor 拦截器的 
alwaysInvokePrepare 属性值修改为false;
并将其重命名为myStack拦截器栈;  -->
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="paramsPrepareParamsStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>

<!-- 配置使用自定义的myStack 作为默认的拦截器栈  -->
<default-interceptor-ref name="myStack" />




5、paramsPrepareParamsStack拦截器栈
(1) paramsPrepareParamsStack 拦截器在于:
params -> modelDriven -> params
(2) 所以可以先把请求参数赋给 Action 对应的属性, 再根据赋给Action的那个属性值决定压到值栈栈顶的对象, 最后再为栈顶对象的属性赋值.






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值