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);