【问题标题】:Spring MVC - how not to lose field values when binding to a form partiallySpring MVC - 部分绑定到表单时如何不丢失字段值
【发布时间】:2012-02-29 16:23:32
【问题描述】:

我想为 bean X 创建一个更新表单。这个 bean 可以说它有字段 A、B、C、D。 在我的表单中,我只想更新字段 A、B 并保持 C 和 D 不变。 有没有办法将 bean X 绑定到仅包含字段 A 和 B 的更新表单,这样当我提交表单 C 和 D 时就不会更改?

我知道我可以为 C 和 D 添加隐藏字段,但如果这些不是原始字段,它们是其他 bean 或集合。

我知道另一种解决方案是创建一个只有字段 A 和 B 的 XUpdateBean,并在提交表单后将字段从 XUpdateBean 复制到我的 X bean。

在 Spring 3 MVC 中还有其他更好的更新方式吗?

【问题讨论】:

标签: forms spring data-binding spring-mvc


【解决方案1】:

您可以拥有一个仅包含您需要的字段的命令对象/表单吠叫 Bean。

在控制器中,您必须加载 bean X,并且需要使用 commandObject 中的字段更新其字段。

您也可以考虑不为 commandObject 提供额外的类,而是使用类 BeanX。但是当然你需要两个 BeanX 实例,一个用于 commandObject,一个用于 bean x。

【讨论】:

    【解决方案2】:

    对不起,我不知道 SpringMVC,所以我的回答可能是错误的。

    使用另一个名为 Stripes 的绑定框架,我们通常在绑定之前“水合”数据。 这意味着您首先从 db 加载 bean,然后才将 A 和 B 值绑定到它!但它仍然具有 C 和 D 原始值,因为 bean 来自 DB(通常是 JPA 实体)。因此您不需要隐藏的 C 和 D 字段!

    SpringMVC 似乎有可能: Spring MVC 3.0: How do I bind to a persistent object

    请注意,您也可以像实际那样加载绑定到“非 DB bean”(因此,如果您不使用隐藏字段,我猜 C 和 D 字段将为空)。然后你可以简单地从数据库中加载你想要修改的bean,并在你想要的字段的绑定bean和db bean之间进行合并(在这里,你将只合并A和B,这样C和DB bean 中的 D 字段不会被修改)

    您可以在这里找到一些关于数据绑定的有趣内容。对我来说,在一些棘手的情况下,直接绑定到 DB 对象可能很危险: How to use a binding framework efficiently

    【讨论】:

      【解决方案3】:

      在我看来,尤其是在处理乐观并发控制(@Version)时,正确的方法是将模型属性临时存储在会话中。

      @Controller
      @SessionAttributes("x")
      public class MyController {
      
          @Autowired
          private XRepository xRepository;
      
          @InitBinder
          void initBinder(WebDataBinder binder) {
              binder.setDisallowedFields("id", "c", "d"); 
          }
      
          @RequestMapping("/x/{id}")
          String myForm(@PathVariable("id") long id, Model model) {
      
              X x = xRepository.findOne(id);
              model.addAttribute("x", x);
      
              return "x-edit";
          }
      
          @RequestMapping(value="/x/{id}", method= RequestMethod.POST)
          String save(@PathVariable("id") long id, @ModelAttribute X x, SessionStatus sessionStatus) {
      
              xRepository.save(x);
      
              sessionStatus.setComplete();
              return "x-edit";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 2015-08-08
        相关资源
        最近更新 更多