全部博文(695)
分类: Java
2016-09-03 10:16:41
1. 关于action
Struts2会为每个处理线程分配一个 Action对象,将提交的参数注入到Action属性中,并调用Action的相关方法如execute()等完成业务逻辑,因此struts2的 Action会有多个对象。处理完毕,线程结束,Action也会被抛弃,Struts2的Action是线程安全的。
当Struts单独使用时action使用Struts2自己负责;当使用Spring+Struts联合使用时,action实例使用Spring负责创建。两种情况下的配置文件也略有不同。
1.Struts单独使用时,配置中action的class属性属于全路径名。
model对象在action的初始化(拦截器执行之前已经初始化完毕)过程中被创建 (通过action的构造函数)。当通过ModeDriven拦截器时,通过调用getModel()方法将model压入值栈。当调用action中的 业务逻辑方法(如:designSurvey()方法)时,需要给模型对象赋值。但此时值栈中的模型对象仍是旧对象,所以涉及到model对象的赋值问 题。
2.1 使用paramsPrepareParamsStack和prepare拦截器
通过配置paramsPrepareParamsStack(prepare拦截器在ModeDriven拦截器之前)。使用prepare拦截器直接新模型对象赋给action中的模型。
此方法性能不好,因为当有多个model时就需要多个prepareXxx()方法,造成方法爆炸。
2.2 通过刷新机制
通过配置ModelDriven拦截器中refreshModelBeforeResult属性为true来实现当发现model为新model时自动刷新(可参考ModelDrivenInterface源代码),一般采用此种方法。