代码之家  ›  专栏  ›  技术社区  ›  vdenotaris

弹簧注释@ModelAttribute和@Valid

  •  12
  • vdenotaris  · 技术社区  · 10 年前

    使用的优点是什么 @ModelAttribute @Valid ?

    有哪些区别?

    可以一起使用吗?

    2 回复  |  直到 10 年前
        1
  •  19
  •   CodeChimp    10 年前

    @ModelAttribute 用于将方法参数或方法返回类型映射/绑定到命名模型属性。看见 @ModelAttribute s JavaDoc。这是一个Spring注释。

    @Valid 是标记对象的注释 JSR-303 bean validation 看见 @Valid s JavaDoc。它是JavaEE6的一部分,但我认为Hibernate有一个大多数人使用的早期实现。

    使用的优势 @模型属性 您可以将表单的输入映射到bean。的优点 @有效 您可以利用JSR-303 bean验证来确保所生成的bean根据一些规则进行验证。

    是的,您可以使用 @模型属性 @有效 在一起

    将数据从表单(sic视图)传输到模型对象的最佳方法是使用Spring遵循典型/传统的MVC设计模式。我个人的首选方法是在JSP中使用Spring JSTL创建表单 <form:*> 标记,带有 modelAttribute 设置在Controller上,有一个处理程序从具有匹配项的表单接受POST @模型属性 这是一个表示表单输入的bean。然后,我会将“表单Bean”传递给服务层来做一些事情,包括在需要时将“表单Bean”转换为任何模型(如果表单直接创建模型对象,则不需要),并通过DAO保存/更新等。这只是一种做事的方式,但这可能是我在日常工作中使用Spring所做的大部分工作。

    我会的 非常 建议阅读Spring参考资料并遵循教程。这些参考资料写得很好,很容易理解,并且包含了很多关于你在春天做事情的各种方式的例子,通常有很多关于你如何在春天做的选择。

        2
  •  11
  •   Bassem Reda Zohdy    10 年前

    请检查以下部分 spring reference documentation :

    除了数据绑定之外,您还可以使用自己的自定义验证器调用验证,该验证器传递用于记录数据绑定错误的同一BindingResult。这允许数据绑定和验证错误在一个地方累积,然后报告给用户:

    @RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) {
        new PetValidator().validate(pet, result);
        if (result.hasErrors()) {
        return "petForm";
        }
    
        // ...
    }
    

    或者可以通过添加JSR-303@Valid注释自动调用验证:

    @RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
    public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result)             {
        if (result.hasErrors()) {
            return "petForm";
        }
    
        // ...
    
    }