我已经在许多教程和其他地方注意到,提交表单时,使用名为“ SpringWeb”的默认模型属性将所有jsp元素映射到Java POJO。
例如,在以下教程中,@ModelAttribute("SpringWeb")
映射到Student对象。
@RequestMapping(value = "/addStudent", method = RequestMethod.POST)
public String addStudent(@ModelAttribute("SpringWeb")Student student,
ModelMap model) {
model.addAttribute("name", student.getName());
model.addAttribute("age", student.getAge());
model.addAttribute("id", student.getId());
return "result";
}
@RequestMapping(value = "/student", method = RequestMethod.GET)
public ModelAndView student() {
return new ModelAndView("student", "command", new Student());
}
http://www.tutorialspoint.com/spring/spring_mvc_form_handling_example.htm
即使如示例中的GET方法未返回“
new ModelAndView("student", "command", new Student())
”对象,当回发表单时,“ SpringWeb”模型属性仍然存在。例如-在GET请求中,如果我写
model.addAttribute ("xyz", "123)
并仅返回视图名称,则不会在jsp标记中使用“路径”映射表单字段。当表单回发时,表单字段仍将通过“ SpringWeb”映射到java对象。github中也没有“ SpringWeb”的搜索结果:
https://github.com/spring-projects/spring-framework/search?utf8=%E2%9C%93&q=SpringWeb&type=
我确实知道可以使用自定义模型属性并将其映射到表单元素,而不是使用
@ModelAttribute("SpringWeb")
。但是,我在stackoverflow中找不到任何相关的问题,这些问题可以详细解释什么是“ SpringWeb”以及使用它是好还是不好的做法?
我在“ POST”请求上调试了模型对象,发现“ SpringWeb”在“ BindingAwareModelMap”模型对象中自动作为“键”和“值”对存在。但是,在下面的链接中找不到任何与“ SpringWeb”相关的文档。
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/support/BindingAwareModelMap.html
什么是“ SpringWeb”?我目前的理解是,这是一个“包罗万象”的模型属性,当提交表单时,它将由spring自动映射。
如果是,那么如何发现它并决定在没有任何文档的情况下使用它? (至少我找不到任何东西)
最佳答案
表单标签的默认模型属性是command。在引用的示例中,“魔术”发生在此处:
@RequestMapping(value = "/student", method = RequestMethod.GET)
public ModelAndView student() {
// the second and third parameter:
// a new Student is binded to the form-tags default modelattribute
return new ModelAndView("student", "command", new Student());
}
ModelAndView的Constructor的第二个和第三个参数负责将新的Student-Object绑定到表单标签的默认modelattribute“ command”
在接收后方法中,模型属性注释“ SpringWeb”的名称-值
@ModelAttribute("SpringWeb") Student student
也可以删除
@ModelAttribute Student student