返回Spring MVC中的类型

时间:2013-12-25 15:23:26

标签: java spring-mvc

我是Spring MVC的新手并尝试从Spring MVC Docs学习概念:

  

一个ModelAndView对象,模型隐含地用命令丰富   对象和@ModelAttribute带注释的引用数据的结果   访问方法。

有人可以帮我理解这个吗? “使用命令对象隐式丰富的模型”以及“@ModelAttribute带注释的参考数据访问器方法的结果”是什么意思?

  

一个Model对象,通过一个隐式确定的视图名称   RequestToViewNameTranslator和隐式丰富的模型   命令对象和@ModelAttribute注释引用的结果   数据访问方法。

如何在Spring中确定视图名称?

  

用于公开模型的Map对象,隐式显示视图名称   通过RequestToViewNameTranslator和模型确定   隐含地丰富了命令对象和结果   @ModelAttribute带注释的引用数据访问器方法。

此处的情况相同,视图名称是如何确定的?

2 个答案:

答案 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注释方法的参数。它按特定顺序注册它们,优先考虑特定类型的参数,例如ModelModelMapModelAndView等,然后注释参数(例如@PathVariable的处理程序,{{ 1}}等。 Spring然后遍历此列表并使用它找到的第一个可以处理参数的列表。

其中一个@RequestParamServletModelAttributeMethodProcessor,它处理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你会发现它更精细。

谢谢你,编码愉快!