@RequestMapping方法中弹簧mvc使用哪种返回类型?

2022-09-03 12:26:02

我知道在春季mvc@Controller课上@RequestMapping方法我可以返回

  1. 字符串
  2. ModelAndView

我不明白这些行为之间的区别。你能给我解释一下吗?


答案 1

在春季3.2.x中,还有更多。请参阅春季网站上的文档。最新春季 (4.2.x) 文档

以下是支持的返回类型:

  • 一个 ModelAndView 对象,其中模型隐式地丰富了命令对象和带批注的引用数据访问器方法的结果。@ModelAttribute
  • 一个 Model 对象,其视图名称通过 RequestToViewNameTranslator 隐式确定,模型隐式地使用命令对象和带批注的引用数据访问器方法的结果进行丰富。@ModelAttribute
  • 用于公开模型的 Map 对象,其视图名称通过 RequestToViewNameTranslator 隐式确定,模型隐式丰富了命令对象和带批注的引用数据访问器方法的结果。@ModelAttribute
  • 一个 View 对象,其模型通过命令对象和带批注的引用数据访问器方法隐式确定。处理程序方法还可以通过声明 Model 参数以编程方式丰富模型(见上文)。@ModelAttribute
  • 一个 String 值,它被解释为逻辑视图名称,通过命令对象和带批注的引用数据访问器方法隐式确定模型。处理程序方法还可以通过声明 Model 参数以编程方式丰富模型(见上文)。@ModelAttribute
  • 如果该方法处理响应本身(通过直接编写响应内容,为此目的声明类型为 ServletResponse /HttpServletResponse 的参数),或者如果视图名称应该通过 RequestToViewNameTranslator 隐式确定(不在处理程序方法签名中声明响应参数),则为 void
  • 如果使用@ResponseBody对方法进行批注,则返回类型将写入响应 HTTP 正文。返回值将使用 HttpMessageConverters 转换为声明的方法参数类型。请参阅“使用注释映射响应正文”一节。@ResponseBody
  • 一个 HttpEntity** 或 **ResponseEntity 对象,用于提供对 Servlet 响应 HTTP 标头和内容的访问。实体正文将使用 HttpMessageConverters 转换为响应流。请参阅“使用 HttpEntity”一节。
  • 当应用程序希望在 Spring MVC 管理的线程中异步生成返回值时,可以返回 Callable
  • 当应用程序想要从自己选择的线程生成返回值时,可以返回延迟结果。
  • 任何其他返回类型都被视为要向视图公开的单个模型属性,使用在方法级别通过 指定的属性名称(或基于返回类型类名称的默认属性名称)。该模型通过命令对象和带批注的引用数据访问器方法的结果隐式丰富。@ModelAttribute@ModelAttribute

答案 2

除非您的返回类型是 或者您用 注释了方法,否则 Spring MVC 将尝试解析 a 以呈现响应。void@ResponseBodyView

因此,您必须以某种方式将框架指向实例或视图的名称,如返回值中所示(或依赖于隐式解析,并且可能仅返回 );如果返回一个名称(作为纯粹名称或嵌入在 中),则该名称将传递给配置为获取实际实例的名称。ViewStringModelStringModelAndViewViewResolverView

容器保存对 或 视图名称的引用,并且还嵌入要使用的模型。ModelAndViewView


推荐