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的那个属性值决定压到值栈栈顶的对象, 最后再为栈顶对象的属性赋值.
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的那个属性值决定压到值栈栈顶的对象, 最后再为栈顶对象的属性赋值.