struts2的crud引出的问题:
1.当Action里面有其他类的实例引用属性时,当要用请求参数为该对象的属性赋值时,如何将其压入栈顶。
2.当有的操作(list)不需要创建该属性的实例对象时,或者需要创建实例时,如何解决。
3.struts.xml如何配置选择某一拦截器栈(比如:paramsPrepareParams拦截器栈),又如何通过struts.xml的配置修改某一拦截器的字段值(比如:PrepareInterceptor 的 alwaysInvokePrepare属性)。
问题解决:
1.通过Action实现ModelDriven接口,实现其getModel()方法,getModel()方法的返回值将被压入值栈栈顶。
2.通过Action实现Preparable接口,然后在Action里面为每一个需要的方法准备对应的prepare[ActionMethodName]方法,比如:Action里面有save()方法,则需要创建 prepareSave()方法,通过其返回值来为save()方法准备实例,不需要则可以不准备。在实现了Preparable接口时,需要实现prepare方法,默认是执行的。
3.选择paramsPrepareParams拦截器栈,并将prepare的alwaysInvokePrepare属性赋为false,并将此栈命名为gy,而且被配置使用:
1 <interceptors> 2 <interceptor-stack name="gy"> 3 <interceptor-ref name="paramsPrepareParamsStack"> 4 <param name="prepare.alwaysInvokePrepare">false</param> 5 </interceptor-ref> 6 </interceptor-stack> 7 </interceptors> 8 9 <default-interceptor-ref name="gy"/>