ModelDriven和Preparable拦截器
- 提出问题
- 如果不使用ModelDriven和Preparable拦截器技术,Action类需要包含JavaBean中的业务属性,例如:
- 目标:将冗余代码抽取出来,把操作一个一个散列的属性变为操作一个对象——在这里就是封装了业务信息的领域模型:JavaBean,以实现模块化编程。
- 分析问题
- 当前的情况下,目标Action的实例对象会被压入值栈栈顶,params拦截器会将表单域中的值注入到目标Action(也就是栈顶对象)对应的属性中。
- 我们的需求就是:如何在params拦截器工作之前把JavaBean压入值栈栈顶?
- 解决问题
- 使用ModelDriven拦截器
- 使用方法:
①让我们的Action方法实现com.opensymphony.xwork2.ModelDriven接口,如图所示:
update()方法
delete()方法
edit()方法
原因分析:
①ModelDriven拦截器工作之后,Action类中的JavaBean和值栈栈顶的JavaBean指向的都是getModel()方法返回的那个对象,如图所示:
②执行edit()方法后,Action类中的JavaBean指向的就是从Dao中取出的对象,而此时值栈栈顶的对象指向的还是原来那个对象,没有被注入从数据库中取出的数据,而表单回显依靠的是栈顶对象
此时edit()方法正确的写法是:
正确回显:
遗留问题:edit()方法过于繁琐,还停留在面向过程的实现方式。如何改进?