使用Struts2及Hibernate,然后在页面上使用user.name,user.sex这样的方式,让Action自动设置对象属性,但是这样就有一个问题,当我使用更新的时候,由于Hibernate会把所有的属性全部更新一遍,使得我在更新前,需要先根据ID从数据库读出来该对象,再让Struts2自动设置现在的问题是,我不知道怎样在Action对对象进行设置前,先对对象进行初始化。拦截器?以前在Servlet很简单
String id=request.getParameter("id");
if(id!=null)
    user = dao.getById(id);

解决方案 »

  1.   

    struts2中, 你只需要在action中写那些对象就可以了比如
    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文档资料.
      

  2.   

    在action中的具体响应方法中, 使用方法如下, class PersonAction { 
      private Person person; 
      //getter and setter 
      private String getUser() {
         Person p = personService.getPersonByName(person.getName());
      }
      

  3.   

    谢谢,我现在就是这么用的,现在的问题是hibernate带来的
    比如User类有三个属性,username,password,nickname
    然后我在一个表单用于设置昵称,这样struts2只会自动帮我设置nickname这个属性,username和password就是null,本来这没什么问题,但是我需要保存到数据库,使用hibernate的时候,它会把所有的属性都update了,这样,就会导致在数据库中,username和password变成NULL了所以我才需要在ACTION自动设置值前,先把User对象从数据库里面读出来
      

  4.   

    有两种方案,在页面上将username和password设为隐藏域。
    或者,将nickname单独设为action的属性。保存的时候先get,然后单独修改nickname属性就OK了。
      

  5.   

    我是建议你在action中使用之前, 加载(也就是查询)一次, 设置合理的二级缓存, 不会带来太大的效率问题.
      

  6.   

    再说清楚一点吧。你前台传过来的数据,struts2会拦截到并且封装到一个usre对象里面。但这个对象是新生成的,并不是持久化对像。这个时候你需要通过ID先从数据库里面得到你要修改的那个对象,比如说是user1,这个时候你要对user和user1的数据进行对比处理。就好比你上面的,user里面username和password都是空,那么就应该处理为没有改变。然后将user1.setnickname(user.getnickname);
    记住一定要先从数据库取,再做对比。保存都不用,hibernate会自动判断你的user1有没变化来决定是否update.