Spring注释@ModelAttribute和@Valid

时间:2014-03-26 10:46:24

标签: spring spring-mvc spring-data spring-annotations

使用@ModelAttribute@Valid有什么好处?

有哪些区别?

是否可以一起使用它们?

2 个答案:

答案 0 :(得分:16)

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

@Valid是一个注释,用于标记JSR-303 bean validation的对象。请参阅@Valid的JavaDoc。它是JavaEE 6的一部分,但我认为Hibernate具有大多数人使用的早期实现。

使用@ModelAttribute的优点是您可以将表单的输入映射到bean。 @Valid的优点是您可以利用JSR-303 bean验证来确保根据某些规则验证所生成的bean。

是的,您可以一起使用@ModelAttribute@Valid

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

高度建议阅读Spring参考资料并按照教程进行操作。参考资料写得很好,易于理解,并且包含了很多关于Spring中可以做各种事情的例子,而且在Spring中你通常会有很多选择。

答案 1 :(得分:9)

请检查以下部分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";
    }

    // ...

}
相关问题