struts2中action自动将模型(实体类对象)放入值栈栈顶,栈顶的实体类实例的各个属性(除了从页面通过模型驱动进来的属性)总是null,通过不断的挠头和查阅才发现模型驱动的ModelDriven接口的 getModel()返回的对象指向的是实例是最初new出的对象的地址,如果在action中调用service返回一个新的对象,再给原来的对象赋值,就改变了地址,这个新的地址中的对象就不会被返回,因此,值栈中的对象还是从前地址中的对象,各项都是null。
private user = new user() ;// 这是最初的模型
@Override
public Draft getModel() {
return user; //返回的是这个对象的地址
}
如果此时在某个action中:
@Action(value="",results={@Result(name="",location="")})
public String test(){
user = service.finUser(xxx) ; //findUser方法返回一个User对象,并且改变了原来user对象的引用,指向了返回的这个User对象。地址发生了改变,getModel方法依旧返回了原来地址中的对象
}
而这个时候,如果要想栈顶对象的各个属性都有值,那么可以通过在action中创建一个临时的userTemp对象,用这个对象去接受service.find()方法返回的对象,然后再通过user.setXxx(userTemp.getxxx())方法,在不改变user地址的前提下,设置user对象的值。
@Action(value="",results={@Result(name="",location="")})
public String test(){
userTemp = service.findUser(xxx) ;
user.setUsername (userTemp.getUsername()) ;
user.setPassword(userTemp.getPassword) ;
....
return SUCCESS ;
}
这样做就可以让值栈栈顶的user对象的各属性都有值,但是这样有点僵硬,还有其他办法吗?