乐趣区

关于java: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);
退出移动版