Java充电社
专辑
博文
联系我
本人继续续收门徒,亲手指导
SpringMVC教程
-> 返回json格式数据 & 通用返回值设计
1、Helloword
2、@Controller、@RequestMapping
3、接口测试利器
4、如何接受请求中的参数?
5、@RequestBody接收Json格式数据
6、多文件上传
7、返回页面常见的5种方式
8、返回json格式数据 & 通用返回值设计
9、SpringMVC返回null是什么意思?
10、异步处理请求
11、如何集成静态资源?
12、拦截器怎么用?
13、统一异常处理
14、实战篇:通用返回值 & 异常处理设计
15、全注解的方式 & 原理解析
16、源码解析SpringMVC处理请求的流程
17、源码解析SpringMVC容器的启动过程
18、RequestBodyAdvice:对@ReuqestBody进行增强
19、ResponseBodyAdvice:对@ResponseBody进行增强
20、RESTful接口详解
21、接口调用利器RestTemplate
22、参数解析器HandlerMethodArgumentResolver解密
23、@RequestParam用法及原理详解
24、@RequestBody原理解密
25、@RequestHeader详解
26、@CookieValue详解
27、@RequestAttribute详解
28、@SessionAttribute详解
29、重定向和转向详解
30、Converter转换器详解
31、跨域问题详解
32、类容协商,颠覆你的认知
33、终章
34、CORS通信
35、浏览器安全策略 & CORS
36、Http中的Content-Type详解
上一篇:返回页面常见的5种方式
下一篇:SpringMVC返回null是什么意思?
<div style="display:none"></div> **大家好,我是路人,本文如果对你有帮助,点个在看,顺便忙转发一下,非常需要大家的支持,对java有兴趣的朋友欢迎加我微信itsoku交流。** 目前比较流行前后端分离,后端只需为前端提供restfull接口,所有的接口都返回json格式的数据,前端接收到json数据之后再进行处理。 那么在SpringMVC中如何向前端输出json格式的数据呢? 常见的有3种方式,我们来了解下。 ## 1、方式1:方法上添加@ResponseBody ### 需求 使用springmvc提供一个接口,以json格式输出用户列表。 ### 3个步骤 #### step1:maven配置引入jackjson > jackjson用于将java对象转换为json格式的字符串,也可以将json格式的字符串转换为java对象 > > 我们的接口需要将java对象转换为json格式的字符串输出到客户端,所以我们需要用到这个包。 ```xml <!-- 添加jackson配置 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.11.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.4</version> </dependency> ``` #### step2:springmvc配置文件中添加注解驱动 ```xml <!-- 添加mvc注解驱动 --> <mvc:annotation-driven/> ``` > 添加了这段代码之后,springmvc就被赋予了将java对象转换为json格式字符串输出到客户端的能力。 #### step3:处理器的方法上添加@ResponseBody注解 > 如下代码,我们希望list()方法用于向客户端以json格式输出用户列表。 > > 此时只需要在这个方法上面添加一个`@ResponseBody`注解,SpringMVC发现这个方法上有`@ResponseBody`这个注解,并且方法返回值是一个普通的java对象的时候,会将方法的返回值使用jackson转换为json格式的字符串,然后输出到客户端。 ```java @Controller public class UserController { /** * 用户列表(用户id->用户信息) */ Map<Long, UserDto> userDtoMap = new ConcurrentHashMap<>(); { userDtoMap.put(1L, new UserDto(1L, "路人", 30)); userDtoMap.put(2L, new UserDto(2L, "张三", 20)); userDtoMap.put(3L, new UserDto(3L, "李四", 18)); } @GetMapping("/user/list.do") @ResponseBody public Collection<UserDto> list() { return this.userDtoMap.values(); } } ``` ### 验证效果 谷歌浏览器中访问下这个接口 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/219/80d88201-f633-4826-b810-e9e416217ca5.png) F12看一下接口的响应头,如下,可以看到response的`Content-Type`的值为`application/json;chatset=UTF-8`,这个说明响应结果的内容格式是json格式。 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/219/9b58bf26-e824-4915-87ca-1566dce53ad3.png) ## 2、方式2:Controller上添加@ResponseBody注解 当我们controller中方法很多的时候,且所有方法都要求返回json格式的数据的时候,如果按照方式1,我们需要在每个方法上都要添加`@ResponseBody`注解,此时有更简单的方法,将所有方法上的`@ResponseBody`注解都去掉,然后在Controller上加上`@ResponseBody`就可以了。 比如下面这段代码,我们可以将2个方法上面的`@ResponseBody`干掉,然后在类上添加`@ResponseBody`注解就可以了。 ```java @Controller public class UserController { Map<Long, UserDto> userDtoMap = new ConcurrentHashMap<>(); { userDtoMap.put(1L, new UserDto(1L, "路人", 30)); userDtoMap.put(2L, new UserDto(2L, "张三", 20)); userDtoMap.put(3L, new UserDto(3L, "李四", 18)); } @GetMapping("/user/list.do") @ResponseBody public Collection<UserDto> list() { return this.userDtoMap.values(); } @GetMapping("/user/{id}.do") @ResponseBody public UserDto user(@PathVariable("id") Long id) { return this.userDtoMap.get(id); } } ``` 调整之后如下 ```java @Controller @ResponseBody public class UserController { Map<Long, UserDto> userDtoMap = new ConcurrentHashMap<>(); { userDtoMap.put(1L, new UserDto(1L, "路人", 30)); userDtoMap.put(2L, new UserDto(2L, "张三", 20)); userDtoMap.put(3L, new UserDto(3L, "李四", 18)); } @GetMapping("/user/list.do") public Collection<UserDto> list() { return this.userDtoMap.values(); } @GetMapping("/user/{id}.do") public UserDto user(@PathVariable("id") Long id) { return this.userDtoMap.get(id); } } ``` ## 3、方式3:Controllers上使用@RestController 我们回头再看下上面代码,如下图,UserController上有2个注解`@Controller`和`@ResponseBody`,而SpringMVC提供了一个更好的注解`@RestController`,相当于这2个注解的合体,所以可以用来替换这2个注解。 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/219/c3dcef44-6f95-4751-8084-f67bfba0611c.png) ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/219/c48ffe73-28e9-47aa-b3ab-a34b42ff87a4.png) ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/219/c9729993-1f00-40ad-8305-e7b54c34aec6.png) ## 4、restfull接口通用返回值 客户端调用服务器端接口的时候,接口有可能会发生异常,这些异常信息需要返回给调用者,通常我们会为错误定义错误码以及提示信息。 一般我们会定义通用的返回值类型,格式如下: ```java /** * rest接口通用返回值数据结构 * @param <T> */ public class ResultDto<T> { //接口状态(成功还是失败) private Boolean success; //错误码 private String code; //提示信息 private String msg; //数据 private T data; public static <T> ResultDto<T> success(T data) { return success(data, "操作成功!"); } public static <T> ResultDto<T> success(T data, String msg) { ResultDto<T> result = new ResultDto<>(); result.setSuccess(Boolean.TRUE); result.setMsg(msg); result.setData(data); return result; } //省略get、set方法 } ``` 控制器中所有的方法都返回ResultDto类型的结果,如下代码 ```java @RestController public class UserController { Map<Long, UserDto> userDtoMap = new ConcurrentHashMap<>(); { userDtoMap.put(1L, new UserDto(1L, "路人", 30)); userDtoMap.put(2L, new UserDto(2L, "张三", 20)); userDtoMap.put(3L, new UserDto(3L, "李四", 18)); } @GetMapping("/user/list.do") public ResultDto<Collection<UserDto>> list() { return ResultDto.success(this.userDtoMap.values()); } @GetMapping("/user/{id}.do") public ResultDto<UserDto> user(@PathVariable("id") Long id) { return ResultDto.success(this.userDtoMap.get(id)); } } ``` ## 5、案例代码 ```html git地址:https://gitee.com/javacode2018/springmvc-series ``` ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/219/6ca8839c-b604-4072-93a8-10cd38bbc5f6.png) ## 6、总结 - 掌握@ResponseBody的用法,用来返回json格式的数据,注意需要在springmvc配置文件中添加注解驱动的配置,否则调用会报错 ```xml <!-- 添加mvc注解驱动 --> <mvc:annotation-driven/> ``` - 掌握通用接口返回值的用法 <a style="display:none" target="_blank" href="https://mp.weixin.qq.com/s/_S1DD2JADnXvpexxaBwLLg" style="color:red; font-size:20px; font-weight:bold">继续收门徒,亲手带,月薪 4W 以下的可以来找我</a> ## 最新资料 1. <a href="https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect" target="_blank">尚硅谷 Java 学科全套教程(总 207.77GB)</a> 2. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect" target="_blank">2021 最新版 Java 微服务学习线路图 + 视频</a> 3. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484573&idx=1&sn=7f3d83892186c16c57bc0b99f03f1ffd&scene=21#wechat_redirect" target="_blank">阿里技术大佬整理的《Spring 学习笔记.pdf》</a> 4. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484544&idx=2&sn=c1dfe907cfaa5b9ae8e66fc247ccbe84&scene=21#wechat_redirect" target="_blank">阿里大佬的《MySQL 学习笔记高清.pdf》</a> 5. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485167&idx=1&sn=48d75c8e93e748235a3547f34921dfb7&scene=21#wechat_redirect" target="_blank">2021 版 java 高并发常见面试题汇总.pdf</a> 6. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485664&idx=1&sn=435f9f515a8f881642820d7790ad20ce&scene=21#wechat_redirect" target="_blank">Idea 快捷键大全.pdf</a> ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/1/2883e86e-3eff-404a-8943-0066e5e2b454.png)
#custom-toc-container