java封装后果集
存在问题
一个用户的操作,比方登录,就可能会有很多种状况,用户层面的:账号谬误、明码谬误;服务器层面的:数据库谬误等等状况。然而咱们失常的是间接把一个参数解析成json对象返回给前端,那咱们如何去判断是哪一种状况,并给用户一个反馈信息呢?
解决思路
咱们平时能够间接解析一个java对象成json返回前端
//1. 创立一个user对象User user = new User();//2。 解析成json对象String json = JSONObject.toJSONString(user);//3. 返回前端PrintWriter writer = response.getWriter();writer.write(json);writer.close();
既然能够间接解析一个java对象,那咱们能不能新建一个类,外面能够存java对象(data:前端须要的数据),编码信息(code:提供前端判断)和提示信息(msg:提醒用户的信息)。
解决办法
package cn.stopyc.constant;/** * @program: return-project * @description: 返回值包装 * @author: stop.yc * @create: 2022-04-01 12:24 **/public class Result<T> { /** * 编号 */ private Integer code; /** * 信息 */ private String msg; /** * 数据 */ private T data; public Result() { super(); } public Result(Integer code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; } public Result(Integer code, String msg) { this.code = code; this.msg = msg; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } @Override public String toString() { return "Result{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}'; }}@WebServlet("/user/*")public UserServlet extends BaseServlet { public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException { //1. 获取前端信息 BufferedReader reader = req.getReader(); String userStr = reader.readLine(); //2. json对象封装成java对象 User user = JSON.parseObject(userStr, User.class); //3.获取service对象 UserService userService = new UserServiceImpl(); //4.调用service层的登录性能,获取处理结果集(通过名字和明码进行登录) Result<User> userResult = userService.login(user); String json = JSONObject.toJSONString(userResult); //5. 返回前端 PrintWriter writer = response.getWriter(); writer.write(json); writer.close(); }}//省略接口书写public UserServiceImpl implements UserService { @Override public Result<User> login(User user) { //具体的业务逻辑实现。。。(只做演示应用,具体的逻辑是否正确不思考) if(){ //1.胜利,返回一个对象,外面封装了编码,提示信息,数据. return new Result<>(400200,"登录胜利",user); }else if(){ //2. 明码谬误 return new Result<>(400210,"明码谬误",user); }else if(){ //3. 账号谬误 return new Result<>(400220,"账号谬误",user); } }}
const _this = this;axios({ method: "post", url: "http://localhost:8080/user/login", data: _this.user, }).then(function (resp) { //那么前端就能够依据你的编码进行判断一些须要执行的操作,比方明码谬误须要执行什么操作,登录胜利须要执行什么操作... if (resp.data.code === 400200) { _this.position = resp.data.data; _this.$message({ message: resp.data.msg, type: 'success' }); } else if (resp.data.code === 400210) { _this.$message.error(resp.data.msg); }else if (resp.data.code === 400220) { _this.$message.error(resp.data.msg); } else { _this.$message.error('未知谬误,请分割管理员'); } })
然而,编码这么多,都是本人轻易写的,那怎么办呢?而且怎么做到前后端对立呢?那么咱们能够保护一个枚举类,对立编码信息。
package cn.stopyc.constant;/*** @Description: 后果集枚举* @Param:* @return:* @Author: stop.yc* @Date: 2022/4/28*/public enum ResultEnum { //自定义 //通用 UNKNOWN_ERROR(-1,"未知谬误"), SUCCESS(200,"胜利"), SERVER_INTERNAL_ERROR(500,"服务器外部谬误"), RESOURCE_NOT_FOUND(404,"资源未找到"), PARAMETER_NOT_VALID(400,"参数不非法"), DATABASE_ERROR(600,"数据库操作谬误"), //用户模块 5002XX PASSWORD_FAILED(500200,"明码谬误"), REPEAT_NAME(500210,"用户名反复"), FIND_USER_FAILED(500220,"用户名不存在"), CHECK_CODE_ERROR(500230,"验证码谬误"), //工作模块 6002XX NO_TASK(600200,"以后没有工作"), //....... ; /** * 编号 */ private Integer code; /** * 信息 */ private String msg; ResultEnum(Integer code, String msg) { this.code = code; this.msg = msg; } public Integer getCode() { return code; } public String getMsg() { return msg; }}
那么当前的service层封装后果集的时候,间接调用枚举
return new Result<>(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), user);