我有一个如下控制器
@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。
答案 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答案中检查以下两个。
答案 4 :(得分:-1)
@ModelAttribute
用于将对象映射到模型,通常用于使用默认值初始化表单。
在这种情况下,视图中属性的名称(&#34; myObjVO&#34;)与模型中创建的属性不匹配(&#34; myObj&#34;)。因此,调用该方法时,会发送myObjVO属性并替换myObj。
总之,没有必要使用@ModelAttribute
,因为表单是在视图中启动的,并且它不会映射到模型中创建的表单。
答案 5 :(得分:-1)
我认为this会回答你的问题。
...还添加了一个回退策略来实例化模型属性 URI模板变量,如果是名称,则来自请求参数 匹配模型属性名称,并且有适当的类型 转换策略。