天天看点

Struts2模型驱动的一个问题

模型驱动在Struts2中确实是一个好东西,可以让我们方便的获取表单提交过来的数据。而不再是原来使用的属性驱动。

同时,我们也要了解其原理。实现ActionSupport的子类通过实现ModelDriven接口,并实现getModel方法。

我们的Action一定会有一个private T t;这里的T是指JavaBean实体类。当然我们也会new一个new T

public class TestAction extends ActionSupport implements ModelDriven<User>{
    //待会Struts会将这个对象压入值栈ValueStack
    private User user=new User();
    @Override
    public User getModel() {
        return this.user;
    }
}
           

因为返回Action并转发到指定页面,此时Struts会将User对象压入值栈的栈顶。此时栈顶的User对象指向我们new的这个实例。

public String show(){
    //new一个User对象模拟从数据库中查找出来的对象
    User user=new User();
    user.setUid();
    user.setUsername("bleboz");
    //将这个模型驱动对象的引用指向创建出来的对象。
    this.user=user;
    return "show";
}
           

这里便出问题了,ValueStack中的User对象指向我们一开始模型驱动new的User对象,而我们在show方法中又重新创建了一个User对象,它指向一个新的地址。而我们的

this.user=user;

将this.user指向了我们新建的User对象,此时,ValueStack中的User指向还是原来的,我们ModelDriven一开始new的User对象,所以并没有给ValueStack中的User对象赋值。

具体如何解决

最傻瓜式的办法

public String show(){
    User user=new User();
    user.setUid();
    user.setUsername("bleboz");
    //一个一个的赋值。
    this.user.setUid(user.getUid());
    this.user.setUsername(user.getUsername());
    return "show";
}
           

这样的话,问题就完美的解决了,但是似乎有一丝不灵活。

继续阅读