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()方法过于繁琐,还停留在面向过程的实现方式。如何改进?