在@RequestMapping方法的spring mvc中使用哪种返回类型?

时间:2013-09-04 06:56:36

标签: java spring spring-mvc

我知道在Spring中使用@RequestMapping方法的@Controller类中的mvc我可以返回

  1. 字符串
  2. 型号
  3. 的ModelAndView
  4. 我不明白这些行为之间的差异。 你能解释一下吗?

3 个答案:

答案 0 :(得分:22)

在Spring 3.2.x中,还有更多只有那些3.请参阅Spring website上的文档。 Latests Spring(4.2.x)documentation

以下是支持的返回类型:

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

答案 1 :(得分:2)

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

因此,您必须以某种方式将框架指向View实例或将视图名称指定为返回值中的String(或依赖于隐式解析并且可能仅返回{{ 1}});如果您返回一个名称(仅作为Model或嵌入String),则会将其传递给已配置的ModelAndView以获取实际的ViewResolver实例。

View容器确实包含对ModelAndView或视图名称的引用,并且还嵌入了要使用的模型。

答案 2 :(得分:0)