java封装结果集
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);