目录
概述
用途
使用案例
用 @ResponseBody 设置返回值
概述
- @ResponseBody注解的作用是将方法返回的对象,通过适当的转换器(HttpMessageConverter)转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据
用途
本质:
- @ResponseBody的作用其实是将java对象转为json格式的数据,然后直接写入HTTP response的body中;一般在异步获取数据时使用
注意:
- 在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据
- @ResponseBody 是作用在方法上的
- @ResponseBody 表示该方法的返回结果直接写入 HTTP response body中,一般在异步获取数据时使用(也就是AJAX)
- 在使用 @RequestMapping 后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中
- 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据
使用案例
- 登录小案例分析
- 比如我要在登陆的时候跳转到一个“success.html”页面,当你加上@ResponseBody注解后,代码在执行的时候,它就不会给你解析成跳转路径,它会给你返回success字符串
success.html
Controller:
运行结果:
当你不加@ResponseBody的时候,代码在执行的时候,它就会给你解析成跳转路径进行对应的跳转
运行结果:
- @ResponseBody也是可以直接作用在类上的,最典型的例子就是 @RestController 这个注解(它无非是用
@Controller
和@ResponseBody
标记的元注解),它就包含了 @ResponseBody 这个注解 - 在类上用@RestController,其内的所有方法都会默认加上@ResponseBody,也就是默认返回JSON格式;如果某些方法不是返回JSON的,就只能用@Controller了,这也是它们俩的区别
用 @ResponseBody 设置返回值
(1)用HttpServletResponse返回内容
- 即使将返回值设置为void,仍然可以通过添加HttpServletResponse作为参数直接写入响应内容
- 其行为本身与返回值为 String 时相同,但这种写法也可以用于下载文件,稍后会介绍
(2)指定内容类型
- 内容类型可以在 @RequestMapping 的 Produces 属性中指定
- 内容类型常量在 org.springframework.http.MediaType 类中定义,所以使用它们来指定类型
(3)指定HTTP状态和响应头
- 如果要指定除 HTTP 状态或内容类型之外的响应标头,请将返回值设置为 ResponseEntity
- ResponseEntity 是一个具有主体、标头和状态的类,类型 T 指定主体的类型
(4)返回JSON
- 返回JSON时,返回值可以是任意类
- 通过这样做,Spring Boot 将使用名为 Jackson 的 JSON 处理库将其转换为 JSON 格式
- 例如,如果创建一个User类,其中包含String类型的成员变量id和name,并返回它们的列表,则可以编写如下方法:
- 此方法生成类似于以下内容的 JSON 数据:
(5)下载文件
- 要下载文件,您可以使用 HttpServletResponse,如下所示:
- 另一种选择是使用 org.springframework.core.io.Resource 作为返回值
- 这会自动设置Content-Length,这样你就可以写得更简洁