浏览 3584 次
锁定老帖子 主题:WebWork中的模型的初始值问题
精华帖 (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没有包含模型所有的属性的时候,那么一些需要赋初始值的字段就可能会被冲掉。 各位有没有什么好的办法? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-04-28
通过 hidden都藏在页面中。好像没更好得办法。
|
|
返回顶楼 | |
发表时间:2005-04-29
load before update
|
|
返回顶楼 | |
发表时间:2005-04-29
你每次取到这个user对象的时候,都在user对象的内部new 了一个Date,当然会出现你现在的情况。如果是我的话,会考虑在hbm.xml文件里面标识这个Date的字段为update=false。不过我觉得最佳的方法还是在service层处理这个问题。
|
|
返回顶楼 | |
发表时间: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; } 这样倒是可以正常新建、修改了,而且不用顾忌那个属性值是否需要修改。不知各位意下如何? |
|
返回顶楼 | |
发表时间:2005-04-29
search before post
http://forum.iteye.com/viewtopic.php?t=6103 |
|
返回顶楼 | |
发表时间:2005-04-29
楼主,你没看明白spring嘟嘟和downpour的帖子。放在service是最好的办法。readonly的帖子则是对这类问题的一个统一方案,你这个小问题完全不需要这样做。
|
|
返回顶楼 | |