如何更新表单中提交的所有字段 - Spring MVC

时间:2015-06-23 15:38:17

标签: spring forms spring-mvc

我有一个包含10多个字段输入的表单,将由用户更新。在提交时,我需要更新对象(通过id)和在表单中修改的任何/所有字段(使用Spring Data JPA& Repositories)。我相信我可以通过将@ModelAttribute作为与我的对象相关联的方法参数传递来做到这一点,但我还没有完全理解这一点。这是我的控制器

    @RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
    public String saveUser(@ModelAttribute("User") User user, @PathVariable Long id, Model model) {
        user = userRepo.findOne(id); //Spring Repository method to find user by ID  
        // Here is where you'd set all fields of the User object including those modified in the form
        model.addAttribute("user", user);
        userRepo.save(user); //Updates user in database
        return "success";
    }

我正在寻找一种与以下内容完全相同的方法:

user.setName(user.getName());
user.setAddress(user.getAddress));
//etc.

不显式调用每个set方法(字段输入的数量将增加)。

感谢队友

1 个答案:

答案 0 :(得分:1)

如果你有一个表单并且你正在使用ModelAndAttribute,你只需要设置要发送给Controller的id属性

  <form:input id="id" path="id"/>
                <form:input id="name" path="name"/>
                <form:input id="address" path="address"/>

然后在你的控制器中,你只需要做你正在做的事情

   @RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("User") User user, @PathVariable Long id, Model model) {
    user = userRepo.findOne(id); //Spring Repository method to find user by ID  
    // Here is where you'd set all fields of the User object including those modified in the form
    model.addAttribute("user", user);
    userRepo.save(user); //Updates user in database
    return "success";
}

但是,如果您正在通过Ajax执行此请求,则需要再次加载实体User以使用新Id在表单中设置新实体。 您可以查看JQuery加载以再次加载表单元素。

或者,如果保存是通过HTTP Request完成的,则必须在保存后刷新页面,因此您需要再次返回ModelAndView,实体用户已经使用id更新

    @RequestMapping(value = "/saveUser/{id}", method =                 RequestMethod.POST)
    public String saveUser(@ModelAttribute("User") User user,         @PathVariable Long id, Model model) {
        user = userRepo.findOne(id); //Spring Repository method to find user by ID  
        userRepo.save(user); //Updates user in database
        ModelAndView mav = new ModelAndView(yourview);
        mav.setObject("user", user);
        return mav;
     }