我是Spring MVC的新手并尝试从Spring MVC Docs学习概念:
一个ModelAndView对象,模型隐含地用命令丰富 对象和@ModelAttribute带注释的引用数据的结果 访问方法。
有人可以帮我理解这个吗? “使用命令对象隐式丰富的模型”以及“@ModelAttribute带注释的参考数据访问器方法的结果”是什么意思?
一个Model对象,通过一个隐式确定的视图名称 RequestToViewNameTranslator和隐式丰富的模型 命令对象和@ModelAttribute注释引用的结果 数据访问方法。
如何在Spring中确定视图名称?
用于公开模型的Map对象,隐式显示视图名称 通过RequestToViewNameTranslator和模型确定 隐含地丰富了命令对象和结果 @ModelAttribute带注释的引用数据访问器方法。
此处的情况相同,视图名称是如何确定的?
答案 0 :(得分:3)
“用命令对象隐式丰富的模型”是什么意思 以及“@ModelAttribute带注释的参考数据的结果 存取方法“?
命令对象是Spring从请求参数创建的对象。换句话说,说你有
public ModelAndView doSomething(SomeFoo foo, @ModelAttribute SomeBar bar) {
return new ModelAndView("view-name");
}
Spring会隐式添加对象foo
,而bar
引用返回的ModelAndView
。请注意,尽管SomeFoo
未使用@ModelAttribute
注释,但Spring仍将其视为模型属性。你必须调查HandlerMethodArgumentResolver
以了解原因。
您还可以使用@ModelAttribute
注释方法,并且在您的方法所使用的Model
处理的每个请求中,将调用这些方法,并将创建的对象添加到@Controller
。这就是由results of @ModelAttribute annotated reference data accessor methods
表示。
如何在Spring中确定视图名称?
它确切地告诉您如何确定:它使用RequestToViewNameTranslator
,其中默认值为DefaultRequestToViewNameTranslator
。阅读javadoc以获取更多详细信息。
此处的情况相同,视图名称是如何确定的?
与上述相同。
为了回答评论中的问题,Spring注册了许多HandlerMethodArgumentResolver
个实例来解析传递给@RequestMapping
注释方法的参数。它按特定顺序注册它们,优先考虑特定类型的参数,例如Model
,ModelMap
,ModelAndView
等,然后注释参数(例如@PathVariable
的处理程序,{{ 1}}等。 Spring然后遍历此列表并使用它找到的第一个可以处理参数的列表。
其中一个@RequestParam
是ServletModelAttributeMethodProcessor
,它处理HandlerMethodArgumentResolver
个带注释的参数。 Spring注册了其中的两(2)个。一个用于实际使用@ModelAttribute
注释的参数,另一个用于未注释的参数。通过这种方式,您可以注入自己的@ModelAttribute
来处理参数。
HandlerMethodArgumentResolver
HandlerMethodArgumentResolver
答案 1 :(得分:2)
Q1:"模型隐含地丰富了命令对象和@ModelAttribute注释参考数据访问器方法的结果"意味着吗 的
Here你可以看到,"该模型是一个地图,允许使用按名称" 键入的多个对象。我们可以通过视图页面中的名称从模型中检索这些对象。
我们通常希望在视图页面中传递命令对象或引用数据,并通过使用上述将它们放入模型对象的机制将它们传递给视图。
我们可以通过向任何引用数据或命令(或它们的加速器)添加@ModelAttribute
注释来显式地将对象放入模型中。除此之外,我们在请求服务方法中使用而没有使用@ModelAttribute
标记的命令对象也会自动添加到模型中。
例如,请参阅以下代码块:
@ModelAttribute
public getSchool(){ //implicitly added to model by invoking this getter
return new School();
}
@RequestMapping("/saveStudent.html")
public ModelAndView saveStudent(ClassRoom classRoom, // implicitly added to model
@ModelAttribute Student student, // implicitly added to model
Model model) {
model.addAttribute("abc", new Abc()); //explicitly added to model
return new ModelAndView("myView", model);
}
当您尝试通过名称" school"," classRoom"," student"," abc"从您的视图中获取对象时分别,您将获得这些对象的引用,因为这些对象已添加到您的模型中。
Q2&问题3:当我们没有在控制器方法的返回类型中明确提及视图名称时,如何确定视图名称
Spring总是倾向于优先考虑配置。有一个名为RequestToViewNameTranslator
的bean。如果未明确提及视图名称,则RequestToViewNameTranslator
会根据请求的URL生成逻辑视图名称。假设您的请求网址为/home.html
,并且您未提及控制器中的任何视图名称,则RequestToViewNameTranslator
生成逻辑视图名称" home" 并尝试解决它。 Here你会发现它更精细。
谢谢你,编码愉快!