gpt4 book ai didi

java - Spring MVC 中的返回类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:04 25 4
gpt4 key购买 nike

我是 Spring MVC 的新手,正在尝试从 Spring MVC Docs 中学习概念:

A ModelAndView object, with the model implicitly enriched with command objects and the results of @ModelAttribute annotated reference data accessor methods.

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

A Model object, with the view name implicitly determined through a RequestToViewNameTranslator and the model implicitly enriched with command objects and the results of @ModelAttribute annotated reference data accessor methods.

这里Spring中 View 名称是如何确定的?

A Map object for exposing a model, with the view name implicitly determined through a RequestToViewNameTranslator and the model implicitly enriched with command objects and the results of @ModelAttribute annotated reference data accessor methods.

这里也是一样, View 名称是怎么确定的?

最佳答案

What does it mean that "model implicitly enriched with command object" and also the "results of @ModelAttribute annotated reference data accessor methods"?

命令对象是Spring根据请求参数创建的对象。换句话说,假设你有

public ModelAndView doSomething(SomeFoo foo, @ModelAttribute SomeBar bar) {
return new ModelAndView("view-name");
}

Spring 会隐式添加对象 foobar正在引用 ModelAndView回。请注意,尽管 SomeFoo没有用 @ModelAttribute 注释, Spring 仍会将其视为模型属性。你必须调查HandlerMethodArgumentResolver了解原因。

您还可以使用 @ModelAttribute 注释方法这些将被调用并将创建的对象添加到 Model@Controller 处理的每个请求上你的方法在里面。这就是 results of @ModelAttribute annotated reference data accessor methods 的意思.

How the view name is determined in Spring here?

它准确地告诉您它是如何确定的:它使用 RequestToViewNameTranslator ,默认值为 DefaultRequestToViewNameTranslator .阅读 javadoc 了解更多详情。

Same is the case here, how the view name is determined?

同上。


为了回答您评论中的问题,Spring 注册了一个数字 HandlerMethodArgumentResolver解析传递给您的参数的实例 @RequestMapping注释的方法。它以特定顺序注册它们,优先考虑特定类型的参数,如 Model , ModelMap , ModelAndView等,然后是带注释的参数(例如 @PathVariable@RequestParam 等的处理程序)。然后 Spring 遍历这个列表并使用它找到的第一个可以处理参数的列表。

其中之一 HandlerMethodArgumentResolver ServletModelAttributeMethodProcessor 处理 @ModelAttribute注释参数。 Spring 注册了其中的两 (2) 个。一个用于实际用 @ModelAttribute 注释的参数一个用于未注释的参数。这样你就可以注入(inject)你自己的 HandlerMethodArgumentResolver以您的方式处理参数。

HandlerMethodArgumentResolver的注册顺序

...
ServletModelAttributeMethodProcessor for @ModelAttribute annotated parameters
...
your own HandlerMethodArgumentResolver
...
ServletModelAttributeMethodProcessor for parameters not annotated with ModelAttribute

关于java - Spring MVC 中的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20774241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com