请问下prepare方法是在action的属性被赋值之前还是之后执行??

blurm 2009-01-05
看了下默认的拦截器配置 param 应该是在 prepare之前配置的

但是我在prepare方法当中读取 model类的值缺取不到,报了空指针
cbywxy 2009-01-06
这个可能跟拦截器的执行的顺序有关,先执行的拦截器最后结束,prepare那个接口是一般是为了初始化一些固定的数据集合的,如果你想要预先处理你的Model,可以实现一个拦截器,在拦截器中通过Request来得到你的model,不过这样的处理也可以在写在prepare方法中,主要是看个人习惯。一般我不会在Action中写request,session之内的东西
blurm 2009-01-06
cbywxy 写道
这个可能跟拦截器的执行的顺序有关,先执行的拦截器最后结束,prepare那个接口是一般是为了初始化一些固定的数据集合的,如果你想要预先处理你的Model,可以实现一个拦截器,在拦截器中通过Request来得到你的model,不过这样的处理也可以在写在prepare方法中,主要是看个人习惯。一般我不会在Action中写request,session之内的东西


多谢这位仁兄回帖,用prepare主要是为了解决二次绑定这个问题,即从页面加载的数据要和数据库加载的数据合并。目前引用了paramprepareparamstack,即先绑定一次参数,再执行prepare,然后再绑定一次参数。在第一个param里我清楚的debug到form里的值已经被设到了valueStack里,但是在之后的prepare方法里却取不到值,难道是因为 先执行的拦截器最后结束 这个原因么?
blurm 2009-01-06
似乎也不尽然,没个拦截器都是在自己的行为结束之后才调用       
return invocation.invoke();

所以应该是及时生效才对的
cbywxy 2009-01-06
我测试一下,的确不是那样的问题,具体什么时候才有值,我想可能要等所有的拦截器执行完了。这个要研究一下源码才知道。不过你不必一定要采用这样的方式啊。在prepare方法中你可以用request得到你提交的参数,这样来合并。
blurm 2009-01-06
因为在prepare里已经可以取到id的值,所以应该不是拦截器未完成而没有赋值的问题

参考struts-default.xml里的注释:

            <!-- An example of the params-prepare-params trick. This stack
                 is exactly the same as the defaultStack, except that it
                 includes one extra interceptor before the prepare interceptor:
                 the params interceptor.

                 This is useful for when you wish to apply parameters directly
                 to an object that you wish to load externally (such as a DAO
                 or database or service layer), but can't load that object
                 until at least the ID parameter has been loaded. By loading
                 the parameters twice, you can retrieve the object in the
                 prepare() method, allowing the second params interceptor to
                 apply the values on the object. -->


第一个param应该只是给基本类型的parameter赋值,为了让你在prepare里用id之类的去拿到model类,因为在第一个param运行的时候model应该是为null,所以他不可能将页面的值赋给model。

但是此时页面里的值是不是应该保存在valuestack里呢?如果是的话,在prepare里怎么取到这些值呢?
blurm 2009-01-14
这里还是很冷清啊。。
结论是在prepare里是不能从model里取到值的,从request里取了了事
wanghualeilei 2009-01-17
可以手动修改拦截器的执行顺序,让prepare在参数封装之前执行
Global site tag (gtag.js) - Google Analytics