内容简介:前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目。不清楚的朋友可以看看之前的文章:今天来说一说Spring的@Controller和@RestController控制器, 他们是如何响应客户端请求,如何返回json数据。Spring中有Controller,RestController的两种控制器,都是用来表示Spring某个类的是否可以接收HTTP请求。
前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目。不清楚的朋友可以看看之前的文章: https://www.cnblogs.com/zhangweizhong/category/1657780.html 。
今天来说一说Spring的@Controller和@RestController控制器, 他们是如何响应客户端请求,如何返回json数据。
一、@Controller和@RestController 两种控制器
Spring中有Controller,RestController的两种控制器,都是用来表示Spring某个类的是否可以接收HTTP请求。
但是不同的是:
1、Controller:标识一个Spring类是Spring MVC controller处理器。
2、RestController: 主要用于Restfull接口,返回客户端数据请求。
所以RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。
二、@Controller的用法
1、创建pojo 包,并创建User 对象
package com.weiz.pojo; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import java.util.Date; public class User { private String name; @JsonIgnore private String password; private Integer age; @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8") private Date birthday; @JsonInclude(JsonInclude.Include.NON_NULL) private String desc; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
2、创建UserController 控制器
package com.weiz.controller; import com.weiz.pojo.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.Date; @Controller @RequestMapping("/user") public class UserController { @RequestMapping("/getUser") @ResponseBody public User getUser(){ User u = new User(); u.setName("weiz"); u.setAge(18); u.setBirthday(new Date()); u.setPassword("weiz"); return u; } }
3、运行查看数据返回,在浏览器中输入: http://localhost:8080/user/getUser ,返回数据可以看到控制器自动将user对象转换为json数据格式。
三、@RestController的用法
其实 RestController是Controller和ResponseBody的结合体,两个标注合并起来的作用。
所以,将上面的UserController 修改如下即可:
package com.weiz.controller; import com.weiz.pojo.JSONResult; import com.weiz.pojo.User; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; //@Controller @RestController // RestController = Controller + ResponseBody @RequestMapping("/user") public class UserController { @RequestMapping("/getUser") //@ResponseBody public JSONResult getUser(){ User u = new User(); u.setName("weiz222"); u.setAge(20); u.setBirthday(new Date()); u.setPassword("weiz222"); return u; } }
四、统一返回
其实 RestController 给客户端返回数据时,一般会用jackson序列化返回。而不是直接返回整个pojo类对象。下面就简单介绍下如何统一返回json数据格式:
1、pojo类相关增加序列化格式配置,如上面的User对象的定义
2、增加Json通用的封装类JsonUtils ,下面这个就是比较常用的json数据封装类。
package com.weiz.utils; import java.util.List; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /** * * @Title: JSONResult.java * @Package com.weiz.utils * @Description: 自定义响应数据结构 * 这个类是提供给门户,ios,安卓,微信商城用的 * 门户接受此类数据后需要使用本类的方法转换成对于的数据类型格式(类,或者list) * 其他自行处理 * 200:表示成功 * 500:表示错误,错误信息在msg字段中 * 501:bean验证错误,不管多少个错误都以map形式返回 * 502:拦截器拦截到用户token出错 * 555:异常抛出信息 * Copyright: Copyright (c) 2016 * * @author weiz * @date 2016年4月22日 下午8:33:36 * @version V1.0 */ public class JSONResult { // 定义jackson对象 private static final ObjectMapper MAPPER = new ObjectMapper(); // 响应业务状态 private Integer status; // 响应消息 private String msg; // 响应中的数据 private Object data; private String ok; // 不使用 public static JSONResult build(Integer status, String msg, Object data) { return new JSONResult(status, msg, data); } public static JSONResult ok(Object data) { return new JSONResult(data); } public static JSONResult ok() { return new JSONResult(null); } public static JSONResult errorMsg(String msg) { return new JSONResult(500, msg, null); } public static JSONResult errorMap(Object data) { return new JSONResult(501, "error", data); } public static JSONResult errorTokenMsg(String msg) { return new JSONResult(502, msg, null); } public static JSONResult errorException(String msg) { return new JSONResult(555, msg, null); } public JSONResult() { } public JSONResult(Integer status, String msg, Object data) { this.status = status; this.msg = msg; this.data = data; } public JSONResult(Object data) { this.status = 200; this.msg = "OK"; this.data = data; } public Boolean isOK() { return this.status == 200; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } /** * * @Description: 将json结果集转化为LeeJSONResult对象 * 需要转换的对象是一个类 * @param jsonData * @param clazz * @return * * @author weiz * @date 2016年4月22日 下午8:34:58 */ public static JSONResult formatToPojo(String jsonData, Class<?> clazz) { try { if (clazz == null) { return MAPPER.readValue(jsonData, JSONResult.class); } JsonNode jsonNode = MAPPER.readTree(jsonData); JsonNode data = jsonNode.get("data"); Object obj = null; if (clazz != null) { if (data.isObject()) { obj = MAPPER.readValue(data.traverse(), clazz); } else if (data.isTextual()) { obj = MAPPER.readValue(data.asText(), clazz); } } return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj); } catch (Exception e) { return null; } } /** * * @Description: 没有object对象的转化 * @param json * @return * * @author weiz * @date 2016年4月22日 下午8:35:21 */ public static JSONResult format(String json) { try { return MAPPER.readValue(json, JSONResult.class); } catch (Exception e) { e.printStackTrace(); } return null; } /** * * @Description: Object是集合转化 * 需要转换的对象是一个list * @param jsonData * @param clazz * @return * * @author weiz * @date 2016年4月22日 下午8:35:31 */ public static JSONResult formatToList(String jsonData, Class<?> clazz) { try { JsonNode jsonNode = MAPPER.readTree(jsonData); JsonNode data = jsonNode.get("data"); Object obj = null; if (data.isArray() && data.size() > 0) { obj = MAPPER.readValue(data.traverse(), MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj); } catch (Exception e) { return null; } } public String getOk() { return ok; } public void setOk(String ok) { this.ok = ok; } }
3、如何调用
最后
以上,就把Spring Boot中的Controller及如何返回json数据介绍完了。
这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号( 架构师精进 ),回复: springboot源码 获取这个系列课程的完整源码。
以上所述就是小编给大家介绍的《SpringBoot入门系列(二)如何返回统一的数据格式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Spring Boot从入门到实战:统一异常处理
- Spring Boot2从入门到实战:统一异常处理
- 统一预训练语言模型
- SpringBoot统一异常处理
- SpringBoot统一配置中心
- 多账户的统一登录
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
构建高性能Web站点
郭欣 / 电子工业出版社 / 2012-6 / 75.00元
《构建高性能Web站点(修订版)》是畅销修订版,围绕如何构建高性能Web站点,从多个方面、多个角度进行了全面的阐述,几乎涵盖了Web站点性能优化的所有内容,包括数据的网络传输、服务器并发处理能力、动态网页缓存、动态网页静态化、应用层数据缓存、分布式缓存、Web服务器缓存、反向代理缓存、脚本解释速度、页面组件分离、浏览器本地缓存、浏览器并发请求、文件的分发、数据库I/O优化、数据库访问、数据库分布式......一起来看看 《构建高性能Web站点》 这本书的介绍吧!