论坛首页 Java企业应用论坛

WebWork中的模型的初始值问题

浏览 3584 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-04-28  
就用那个著名的教程中的例子:
模型为User:
public class User {

    private String username;
    private String password;
    private String email;
    private int age;
    private java.util.Date registerDate = new Date(); //注册时间

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
……
   
    public int getAge() {
        return age;
    }

    public int setAge(int age) {
        this.age = age;
    }

    public void setRegisterDate(java.util.Date regDate){
       this.registerDate = regDate;
   }
   public java.utilDate getRegisterDate(){return this.registerDate;}
   
    public String toString(){
    return "username=" + username
    + ";password=" + password
    + ";email=" + email
    + ";age=" + age
    + ";registerDate="+registerDate;
    }
}

Action 如下:
public class RegisterAction implements Action {

private User user= new User();

public User getUser(){
return this.user;
}

public String execute(){

//在这里调用用户注册的业务逻辑,比如:将注册信息存储到数据库,具体代码省略....

return SUCCESS;
}
}

好了,现在面临这样的一个情况:
第一次:输入用户名、密码、年龄什么的,保存到数据库中。OK,注册时间是正确的。
第二次:打开编辑界面(一个简单的form啦,从数据库中读取User的数据并初始化User实例,然后显示在form的各input中。不过肯定不会包含registerDate属性的,因为注册时间没有必要修改嘛),改变密码,然后保存。这时你会发现数据库中的注册时间变成了刚才保存瞬间的时间值了。问题就在于:Action中,默认的用new User()初始化了一个实例,而这个实例将会用于接收从IE端传递过来的各属性值,偏偏没有registerDate值从IE端传递过来。

这个问题似乎比较普遍:当某个form没有包含模型所有的属性的时候,那么一些需要赋初始值的字段就可能会被冲掉。

各位有没有什么好的办法?
   发表时间:2005-04-28  
通过 hidden都藏在页面中。好像没更好得办法。
0 请登录后投票
   发表时间:2005-04-29  
load before update
0 请登录后投票
   发表时间:2005-04-29  
你每次取到这个user对象的时候,都在user对象的内部new 了一个Date,当然会出现你现在的情况。如果是我的话,会考虑在hbm.xml文件里面标识这个Date的字段为update=false。不过我觉得最佳的方法还是在service层处理这个问题。
0 请登录后投票
   发表时间:2005-04-29  
谢谢回复。

可能spring嘟嘟没有理解我的意思(或者反过来),因为在update(User user)被调用之前,getUser()方法已经被调用过了(估计是用来接收IE端提交的值的),那么返回的实例是什么呢?这样又回到了问题的起点。

如果用readonly的方式,那么你就会发现什么也没能保存上,因为在update前的瞬间load的话(没理解错吧?),实例变量user的值会被用数据库中的旧值重新设置一遍,新值全丢了。

downpour的建议应该是性能较好的(我现在用的方法就笨些),不过这样的话如果User模型有不少初始值需要一一设置,然后在配置文件中又要一一对应地修改,维护工作岂不麻烦?

我现在的做法是这样的(欢迎拍砖):
1、private java.util.Date registerDate = null;
2、修改getUser()方法:
public User getUser(){
if (this.user != null) return this.user;

String uname = getRequest().getParameter("user.userName"); //getRequest()获取request
this.user = load(uname);//从数据库中读取并实例化

return this.user;
}

这样倒是可以正常新建、修改了,而且不用顾忌那个属性值是否需要修改。不知各位意下如何?
0 请登录后投票
   发表时间:2005-04-29  
search before post
http://forum.iteye.com/viewtopic.php?t=6103
0 请登录后投票
   发表时间:2005-04-29  
楼主,你没看明白spring嘟嘟和downpour的帖子。放在service是最好的办法。readonly的帖子则是对这类问题的一个统一方案,你这个小问题完全不需要这样做。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics