请求参数的自动绑定似乎是默认行为,但我找不到很多关于它的文档。这是我的例子:
<form:form modelAttribute="test" action="testsubmit.do" method="POST">
Name: <form:input path="name" />
Nested Name: <form:input path="test.nestedName"/>
<input type="submit"/>
public class Test {
public String name;
public String name2;
public TestNested test;
...
public class TestNested {
public String nestedName;
...
现在我的映射:
@RequestMapping(value = "/testsubmit")
public String testSubmit(Test test){
...
test
对象绑定表单值,包括嵌套值。在我看来,这似乎是预期的行为,但我对@ModelAttribute
注释及其对指定为映射方法参数的对象的使用感到有些困惑。
15.3.2.8 Providing a link to data from the model with @ModelAttribute
说:
将它放在方法参数上时,
@ModelAttribute
会将模型属性映射到特定的带注释的方法参数(请参阅下面的processSubmit()
方法)。这是控制器获取对包含表单中输入数据的对象的引用。
当我在加载时将对象test
绑定到表单时,我将值设置为name2
。
@RequestMapping(value = "/test")
public String test(Model model) {
Test test = new Test();
test.setName2("test name2");
model.addAttribute("test", test);
return "test";
}
当我使用submit
注释test
参数时,@ModelAttribute("test")
方法无法传递此内容:
@RequestMapping(value = "/testsubmit")
public String testSubmit(@ModelAttribute("test") Test test) {
...
由于name2
未被指定为表单字段/请求参数,因此我可以预料到这一点,但它无法帮助我理解@ModelAttribute("test")
用法的含义。任何人都可以为我阐明这一点吗?
答案 0 :(得分:1)
@ModelAttribute只允许您为模型中的对象指定不同的名称/键。如果您不使用它,Spring将根据对象的类自动指定一个名称,例如在“测试”课程中“测试”。使用@ModelAttribute,您可以通过指定“@ModelAttribute(”whatever“)”将模型中对象的名称/键更改为“what”。