• 【在Spring MVC框架和Spring Boot项目中,控制器的响应结果】


    目录

    1. 控制器的响应结果

    2. 相关配置

    3. 使用枚举优化代码


    1. 控制器的响应结果

    当控制器处理了请求之后,向客户端响应的结果中,应该至少包含:

    • 业务状态码:通常是数值类型的,客户端可以根据此数值来判断操作成功与否,或者,失败时是哪一种失败,具体值应该是由服务器端和客户端协商的
    • 消息:是字符串类型的,客户端可以将此消息直接显示在软件的界面中(例如显示在网页中、显示在手机APP中……),有了这个数据,客户端就不必自行组织语言来描述操作结果

     由于响应结果只有1个,但是需要同时包含业务状态和消息,应该使用JSON格式来组织这样的结果,例如:

    {
        "state": 1,
        "message": "添加相册成功!"
    }

    或者:

    {
        "state": 2,
        "message": "添加相册失败,尝试添加的相册名称已经被使用!"
    }

    2. 相关配置

    在Spring MVC框架中,当需要响应JSON格式的字符串时,需要:

    • 使用自定义的数据类型作为处理请求的方法的返回值类型,并返回自定义数据类型的对象
    • 需要在项目中添加jackson-databind依赖项
      • spring-boot-starter-web中已经包含jackson-databind
    • 需要开启注解驱动
      • 在基于XML配置的Spring MVC项目中,需要在XML配置中添加标签
      • 在基于注解配置的Spring MVC项目中,需要在配置类上添加@EnableWebMvc注解
      • 在Spring Boot项目中,不需要额外配置

    则在项目的根包下创建web.JsonResult类,在类中声明JSON结果中对应的属性:

    1. package cn.tedu.csmall.product.web;
    2. import lombok.Data;
    3. @Data
    4. public class JsonResult {
    5. private Integer state;
    6. private String message;
    7. public static JsonResult ok() {
    8. JsonResult jsonResult = new JsonResult();
    9. jsonResult.state = ServiceCode.OK;
    10. return jsonResult;
    11. }
    12. }

    然后,调整控制器中处理请求的方法的返回结果:

    1. @ApiOperation("添加相册")
    2. @PostMapping("/add-new")
    3. public JsonResult addNew(AlbumAddNewDTO albumAddNewDTO) {
    4. albumService.addNew(albumAddNewDTO);
    5. return JsonResult.ok();
    6. }
    1. if (response.data.state == 1) {
    2. // 成功
    3. } else if (response.data.state == 2) {
    4. // 失败:名称被占用
    5. alert(response.data.message);
    6. }
    1. login(){
    2. axios.post("/login",v.user).then(function (response) {
    3. if (response.data==1){
    4. location.href="/admin.html"; //跳转到后台管理页面
    5. }else if(response.data==2){
    6. v.\$message.error("用户名不存在!");
    7. }else{
    8. v.\$message.error("密码错误!");
    9. }
    10. })
    11. }

    3. 使用枚举优化代码

    JsonResult中设计了Integer state属性,用于表示“业务状态码”,由于此值是可以由客户端和服务器端协商的值,所以,值的大小不一定是固定的,例如“成功”,可以使用1表示,也可以使用200表示,只要协商一致即可,所以,在应用时,不应该直接将数值常量赋值到state属性上,否则,代码的可读性较差!

    **反例:**jsonResult.state = 200;

    应该将数值声明为常量来使用,以增加代码的可读性!

    **正例:**jsonResult.state = ServiceCode.OK;

    在设计方法时,如果使用Integer state作为参数,方法的调用者仍可能不使用声明的常量,而是直接传入某个未协商的直接常量值,例如,当设计了fail()方法时:

    1. public static JsonResult fail(Integer state, String message) {
    2. // ...
    3. }

    则可能调用时传入错误的值:

    JsonResult.fail(99999, e.getMessage());

    由于state对应的值是相对有限的,是可以穷举的,则可以使用枚举来解决问题!

    1. package cn.tedu.csmall.product.web;
    2. public enum ServiceCode {
    3. OK(200),
    4. ERR_NOT_FOUND(404),
    5. ERR_CONFLICT(409);
    6. private Integer value;
    7. ServiceCode(Integer value) {
    8. this.value = value;
    9. }
    10. public Integer getValue() {
    11. return value;
    12. }
    13. }

    如果将方法的参数设计为以上枚举类型,则方法的调用者只能传入以上列举的3个值中的某1个!例如将方法调整为:

    1. public static JsonResult fail(ServiceCode serviceCode, String message) {
    2. // ...
    3. }

    调用时则是:

    JsonResult.fail(ServiceCode.ERR_CONFLICT, e.getMessage());

    个人主页:居然天上楼

    感谢你这么可爱帅气还这么热爱学习~~

    人生海海,山山而川

    你的点赞👍 收藏⭐ 留言📝 加关注✅

    是对我最大的支持与鞭策

  • 相关阅读:
    港科夜闻|香港科技大学颁授荣誉大学院士予五位杰出人士
    python速成2——流程控制与基本数据结构
    前端程序员是怎么做物联网开发的
    什么是 Node.js
    第8章 Spring(一)
    欧盟ROHS2.0检测标准费用,rohs认证是什么,rohs测试
    OpenCV 图像与视频的基础操作
    深入理解Redis:工程师的使用指南
    C语言中宏定义的盲区有哪些?
    xctf攻防世界 Web高手进阶区 web2
  • 原文地址:https://blog.csdn.net/weixin_72612071/article/details/128139547