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

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


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


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


3、ModelDrivenInterceptor拦截器(Action要实现ModelDriven接口)
(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) 在配置文件中为拦截器栈的属性赋值, 如下:




false










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






你可能感兴趣的:(Struts2)