@RequestMapping 方法中的 spring mvc 中使用哪种返回类型?
Posted
技术标签:
【中文标题】@RequestMapping 方法中的 spring mvc 中使用哪种返回类型?【英文标题】:Which return type use in spring mvc in @RequestMapping method? 【发布时间】:2013-09-07 13:46:27 【问题描述】:我知道在@RequestMapping方法中@Controller类中的spring mvc我可以返回
-
字符串
型号
模型和视图
我不明白这些操作之间的区别。 能解释一下吗?
【问题讨论】:
【参考方案1】:在 Spring 3.2.x 中,不仅仅是这 3 个。请参阅Spring website 上的文档。最新 Spring (4.2.x) documentation.
以下是支持的返回类型:
一个 ModelAndView 对象,模型隐含地丰富了命令对象和@ModelAttribute
带注释的引用数据访问器方法的结果。
一个 Model 对象,视图名称通过 RequestToViewNameTranslator 隐式确定,模型隐式丰富了命令对象和 @ModelAttribute
带注释的引用数据访问器方法的结果。
用于公开模型的 Map 对象,视图名称通过 RequestToViewNameTranslator 隐式确定,模型隐式地丰富了命令对象和 @ModelAttribute
带注释的参考数据访问器方法的结果。李>
一个 View 对象,模型通过命令对象和@ModelAttribute
带注释的参考数据访问器方法隐式确定。处理程序方法还可以通过声明模型参数以编程方式丰富模型(见上文)。
一个String 值,被解释为逻辑视图名称,模型通过命令对象和@ModelAttribute
带注释的参考数据访问器方法隐式确定。处理程序方法还可以通过声明模型参数以编程方式丰富模型(见上文)。
void 如果方法本身处理响应(通过直接编写响应内容,为此目的声明 ServletResponse / HttpServletResponse 类型的参数)或者视图名称应该通过 RequestToViewNameTranslator (未在处理程序方法签名中声明响应参数)。
如果方法使用 @ResponseBody 注释,则返回类型将写入响应 HTTP 正文。返回值将使用 HttpMessageConverters 转换为声明的方法参数类型。请参阅“使用 @ResponseBody
注释映射响应正文”部分。
HttpEntity** 或 **ResponseEntity 对象提供对 Servlet 响应 HTTP 标头和内容的访问。实体主体将使用 HttpMessageConverters 转换为响应流。请参阅“使用 HttpEntity”一节。
当应用程序想要在 Spring MVC 管理的线程中异步生成返回值时,可以返回一个 Callable。
当应用程序想要从自己选择的线程中产生返回值时,可以返回 DeferredResult。
任何其他返回类型都被认为是要暴露给视图的单个模型属性,使用方法级别通过@ModelAttribute
指定的属性名称(或基于返回类型类名称的默认属性名称)。该模型隐含地丰富了命令对象和 @ModelAttribute
带注释的参考数据访问器方法的结果。
【讨论】:
【参考方案2】:除非您的返回类型是 void
或者您使用 @ResponseBody
注释您的方法,否则 Spring MVC 将尝试解析 View
以呈现响应。
因此,您必须在返回值中以某种方式将框架指向View
实例或视图名称为String
(或依赖隐式解析,也许只返回Model
);如果您返回一个名称(仅作为 String
或嵌入在 ModelAndView
中),然后将传递给已配置的 ViewResolver
以获取实际的 View
实例。
ModelAndView
容器确实包含对 View
或视图名称的引用,并且还嵌入了要使用的模型。
【讨论】:
【参考方案3】:一切都在文档中:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-return-types
【讨论】:
以上是关于@RequestMapping 方法中的 spring mvc 中使用哪种返回类型?的主要内容,如果未能解决你的问题,请参考以下文章
@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别