Spring MVC - 发送模型以查看并返回控制器

时间:2015-09-09 07:57:55

标签: java spring scala spring-mvc

我的应用中存在数据流问题..

在控制器中我从DB获取一些模型,然后我将其传递给视图 - 这里显示了一些字段(不是全部),用户可以修改它们。 然后,当他提交表单时,控制器应该在db中更新模型。

问题在于流程,因为并非所有字段都在标记中,因此在提交表单后它们不会通过。 我找到的唯一解决方案是创建包含所有字段的附加标记,这些字段不用于向前传递它们。

但是如果我有很多字段,例如 - 30,我将不得不创建很多隐藏的字段......

您认为哪种解决方案最好?

问候, 微米。

1 个答案:

答案 0 :(得分:0)

您有2个选项

  1. 创建@ModelAttribute带注释的方法,以便从数据库中为每个请求获取模型对象
  2. 使用@SessionAttributes将其放入会话中。
  3. @ModelAttribute带注释的方法

    您可以使用@ModelAttribute annotated method代替GET方法填充模型。将在控制器中的每个请求处理方法之前调用此方法。要注意的一件事是在每个请求中传递id。

    @ModelAttribute
    public YourObject modelObject(@RequestParam long id) {
        return yourObjectDao.findOne(id);
    }
    

    现在,您只需从GET方法中删除模型的填充,并在POST方法中添加@ModelAttribute带注释的方法参数。然后将使用新获得的对象。

    这种方法的缺点是,当使用乐观锁定时,它不再适用,因为每次获得最新版本。

    使用@SessionAttributes

    使用@SessionAttributes注释您的控制器,这指示Web处理将匹配的模型对象存储在会话中,并在绑定之前从那里检索它们。

    @SessionAttributes("yourObject")
    @Controller
    public class YourController { ... }
    

    现在在你的POST方法中添加一个SessionStatus类型的参数,当一切都很好时,调用该对象上的isComplete方法。这将清除此控制器在会话中放置的任何会话属性。

    public String handlePost(@ModelAttribute YourObject model, BindingResult result, SessionStatus status) {
        if (result.hasErrors) {
             return "yourView";
        } else {
             status.isComplete();
             yourObjectDao.save(model);
             return "redirect:your-new-view";
        }
    }