“模型隐含地丰富了命令对象”是什么意思
以及“@ModelAttribute 注释参考数据的结果
访问器方法”?
Command 对象是 Spring 根据请求参数创建的对象。换句话说,假设你有
public ModelAndView doSomething(SomeFoo foo, @ModelAttribute SomeBar bar) {
return new ModelAndView("view-name");
}
Spring 将隐式添加对象foo 和bar 引用返回的ModelAndView。请注意,虽然SomeFoo 没有用@ModelAttribute 注释,但Spring 仍将其视为模型属性。您必须查看 HandlerMethodArgumentResolver 才能了解原因。
您还可以使用@ModelAttribute 注释方法,这些方法将被调用,并且在您的方法所在的@Controller 处理的每个请求上,创建的对象将添加到Model。这就是results of @ModelAttribute annotated reference data accessor methods 的含义.
这里的Spring是如何确定视图名的?
它准确地告诉你它是如何确定的:它使用RequestToViewNameTranslator,默认是DefaultRequestToViewNameTranslator。阅读 javadoc 了解更多详情。
这里也是这样,视图名是怎么确定的?
同上。
为了回答您评论中的问题,Spring 注册了许多 HandlerMethodArgumentResolver 实例来解析要传递给您的 @RequestMapping 注释方法的参数。它以特定顺序注册它们,优先考虑特定类型的参数,如Model、ModelMap、ModelAndView 等,然后是注释参数(例如,@PathVariable、@RequestParam 等的处理程序)。然后 Spring 遍历这个列表并使用它找到的第一个可以处理参数的列表。
其中一个HandlerMethodArgumentResolver 是ServletModelAttributeMethodProcessor,它处理@ModelAttribute 注释参数。 Spring 记录了其中的两 (2) 个。一种用于实际使用@ModelAttribute 注释的参数,另一种用于未注释的参数。这样你就可以注入你自己的HandlerMethodArgumentResolver 来处理你的参数。
HandlerMethodArgumentResolver的注册顺序
...
ServletModelAttributeMethodProcessor for @ModelAttribute annotated parameters
...
your own HandlerMethodArgumentResolver
...
ServletModelAttributeMethodProcessor for parameters not annotated with ModelAttribute