在控制器上使用@ModelAttribute注释是什么

时间:2018-03-26 15:11:57

标签: java spring spring-mvc

我有一个如下控制器

@RequestMapping("/getList")
    public ModelAndView getNetAllList(@ModelAttribute MYObject myObj)  {

//my code here

}

我通过表单提交将此控制器称为

<form name="myForm"  th:action="@{/getList}" th:object="${myObjVO}" method="post"

现在我的问题是,即使我删除@ModelAttribute注释,此代码也能正常运行。

这是否意味着新的春天不再需要@ModelAttribute。如果不是春天的哪个特征正在处理形式和模型之间的映射。 我正在使用带有百里香的弹簧靴2.0.0。

6 个答案:

答案 0 :(得分:0)

@ModelAttribute注释可以在方法和参数级别使用。在方法级别,它可用于在使用任何@RequestMapping方法之前配置模型属性。在参数级别,它可用于从表单中过滤特定属性(例如,应该从一组表单属性构造的Employee元素)。有关如何使用它的更多信息,请参阅this tutorial

答案 1 :(得分:0)

for (i = s.length - 1; i >= 0; i--)

指的是Model对象的属性(MVC中的M) 所以我们假设我们有一个带有表单支持对象的表单,称为“Person”然后你可以让Spring MVC通过使用@ModelAttribute注释将此对象提供给Controller方法:

@ModelAttribute

另一方面,注释用于定义应该成为模型一部分的对象。因此,如果您希望在模型中引用Person对象,则可以使用以下方法:

public String processForm(@ModelAttribute("person") Person person){
    person.getStuff();
}

这个带注释的方法将允许访问View中的Person对象,因为它会自动添加到Spring的Models中。

答案 2 :(得分:0)

作为方法论据

  

当用作方法参数时,它表示参数应该是   从模型中检索。如果不存在,应该是第一个   实例化然后添加到模型中并且一旦出现在模型中   模型,应该从所有请求填充参数字段   具有匹配名称的参数。

     

在员工模型属性后面的代码片段中   填充提交到addEmployee端点的表单中的数据。   Spring MVC在调用提交之前在幕后执行此操作   方法:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
    // Code that uses the employee object

    return "employeeView";
}
  

稍后在本文中,我们将看到如何使用的完整示例   雇员对象填充employeeView模板。

     

所以,它将表单数据与bean 绑定在一起。控制器注释为   的 @RequestMapping

     

可以使用 @ModelAttribute 注释自定义类参数。

     

这就是通常所说的Spring-MVC中的数据绑定   机制,使您不必解析每个表单域   单独

     

一般情况下,Spring-MVC将始终首先调用该方法,   在调用任何请求处理程序方法之前。也就是@ModelAttribute   在使用注释的控制器方法之前调用方法   调用@RequestMapping。序列背后的逻辑是,   必须在内部任何处理开始之前创建模型对象   控制器方法。

答案 3 :(得分:0)

首先,我认为您的代码无法运行。只有在您选择以下任一解决方案时才会有效。

解决方案1.

@RequestMapping("/getList")
    public ModelAndView getNetAllList(@ModelAttribute("myObjVO") MYObject myObj)  {

//my code here

}

<form name="myForm"  th:action="@{/getList}" th:object="${myObjVO}" method="post">

解决方案2:

@RequestMapping("/getList")
    public ModelAndView getNetAllList( MYObject myObj)  {

//my code here

}

<form name="myForm"  th:action="@{/getList}" th:object="${myObject}" method="post">

如果您仔细查看这些解决方案,您就会知道何时需要@ModelAttribute

现在回到你的问题

您不需要@ModelAttribute只是将bean用作参数。 ModelAttribute用于各种其他目的。阅读this文档,并从stackoverflow答案中检查以下两个。

What is @ModelAttribute in Spring MVC?

@ModelAttribute annotation, when to use it?

答案 4 :(得分:-1)

@ModelAttribute用于将对象映射到模型,通常用于使用默认值初始化表单。

在这种情况下,视图中属性的名称(&#34; myObjVO&#34;)与模型中创建的属性不匹配(&#34; myObj&#34;)。因此,调用该方法时,会发送myObjVO属性并替换myObj。

总之,没有必要使用@ModelAttribute,因为表单是在视图中启动的,并且它不会映射到模型中创建的表单。

答案 5 :(得分:-1)

我认为this会回答你的问题。

  

...还添加了一个回退策略来实例化模型属性   URI模板变量,如果是名称,则来自请求参数   匹配模型属性名称,并且有适当的类型   转换策略。