在 spring mvc 的模型属性中保留值

Posted

技术标签:

【中文标题】在 spring mvc 的模型属性中保留值【英文标题】:Keep value in model attribute for spring mvc 【发布时间】:2013-11-13 13:55:14 【问题描述】:

当我使用 Spring MVC 控制器并通过将值设置为 modelAttribute 来提交表单时,我丢失了一些未映射到表单中的模型字段。 在这个例子中,因为我没有映射年龄和地址,所以这些用户的字段丢失了,所以它们有null 值。我不想让用户更改他们的年龄和地址,这就是这些字段不在表单中的原因。

发布用户编辑表单的方法控制器:

@RequestMapping(value = "/edit", method = RequestMethod.POST)
public String editionUser(Model model, @ModelAttribute("accountForm") User user,
  BindingResult bresult,
  RedirectAttributes redirectAttributes) 
  //user.getAge() and user.getAddress are null           

  //Save the information...

获取编辑用户页面的方法控制器:

@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String initEdit(Model model) 
  // the user fields are all filled
  User user = userService.getUserById(...);
  model.addAttribute("accountForm", user);
  return "edition";



class User 
  Long id;
  String email;
  String age;
  String address;
  String nickname;

  // ...

edition.jsp

<form:form class="form" method="POST" action="edition" modelAttribute="accountForm">
  <form:label path="email">email</form:label>
  <form:input path="email"  name='email'/>
  <form:label path="nickname">nickname</form:label>
  <form:input path="nickname"  name='nickname'/>
  <form:hidden path="id" />
  <input name="submit" type="submit"    value="valid" />  
</form:form>

不失去这些字段价值的最佳解决方案是什么? (年龄和地址)

为每个字段使用表单隐藏路径?? 在重定向到编辑页面之前将用户存储在会话中,并在发布方法控制器中设置检索用户会话以仅更改修改的字段? 有通用方法吗?

【问题讨论】:

【参考方案1】:

我会参加会议,原因很简单: 在提交表单之前隐藏表单字段can be easily manipulated 客户端,因此它们不满足您的要求

请注意,如果不将之前输入的值保存在某处,您甚至无法检测它们是否在客户端被篡改,因此绝对不能选择隐藏字段。使用会话。

【讨论】:

您对隐藏字段的看法是正确的 :) 而不是通过会话检索我也可以通过我的用户服务获取用户? (服务调用 dao 等。从数据库中检索用户) 如果我理解正确,您想保存数据库中的对象并在每次编辑时检索...这是可能的,但既不有效也不干净。 我不是每次都保存对象,我只是在保存用户之前检索用户,首先我通过我的服务检索对象,然后设置更改的字段,最后我保存对象.所以这样我不需要会话,但会话的性能可能更好【参考方案2】:

这是一个旧帖子,但也许答案会对像我这样的春季新手有所帮助

不幸的是,除非您使用@SessionAttributes("attributeName"),否则您将失去对象的其他属性。

这篇文章解释了它Spring MVC - passing variables from one page to anther

【讨论】:

【参考方案3】:

在这里查看我的答案:

Is it possible to update only a subset of attributes on an entity using Spring MVC with JPA?

这应该可以为您完成这项工作。不幸的是,没有更优雅的方法了。

附带说明一下,Spring WebFlow 似乎设法仅使用帖子中的字段来更新模型。可能它将模型存储在会话中,并且仅更新 POST 中包含的值。

【讨论】:

以上是关于在 spring mvc 的模型属性中保留值的主要内容,如果未能解决你的问题,请参考以下文章

在spring MVC中重定向期间传递模型属性并避免在URL中相同

使用 Spring MVC 访问 Javascript 中的模型属性

如何在 websocket onopen 事件中访问 spring mvc 属性值?

ASP.net MVC - 如何在各种视图中保留模型

使用 MVC Razor 语法检查视图模型属性在 Javascript 中是不是具有值

如何将模型属性从一个 Spring MVC 控制器传递到另一个控制器?