使用Struts2及Hibernate,然后在页面上使用user.name,user.sex这样的方式,让Action自动设置对象属性,但是这样就有一个问题,当我使用更新的时候,由于Hibernate会把所有的属性全部更新一遍,使得我在更新前,需要先根据ID从数据库读出来该对象,再让Struts2自动设置现在的问题是,我不知道怎样在Action对对象进行设置前,先对对象进行初始化。拦截器?以前在Servlet很简单
String id=request.getParameter("id");
if(id!=null)
user = dao.getById(id);
String id=request.getParameter("id");
if(id!=null)
user = dao.getById(id);
class Person {
private String name;
//getter and setter method
}
class PersonAction {
private Person person;
//getter and setter
}那么在页面使用
<form action="....." method="....." >
<input type="text" name="person.name" />
</form>
表单提交在程序运行到action中时, 就已经完成了初始化了, 内部使用的是ognl的实现, 对ognl做了一次包装, 使用了ValueStack, 具体你可以查查相关的struts2文档资料.
private Person person;
//getter and setter
private String getUser() {
Person p = personService.getPersonByName(person.getName());
}
}
比如User类有三个属性,username,password,nickname
然后我在一个表单用于设置昵称,这样struts2只会自动帮我设置nickname这个属性,username和password就是null,本来这没什么问题,但是我需要保存到数据库,使用hibernate的时候,它会把所有的属性都update了,这样,就会导致在数据库中,username和password变成NULL了所以我才需要在ACTION自动设置值前,先把User对象从数据库里面读出来
或者,将nickname单独设为action的属性。保存的时候先get,然后单独修改nickname属性就OK了。
记住一定要先从数据库取,再做对比。保存都不用,hibernate会自动判断你的user1有没变化来决定是否update.