• SpringMVC项目整合SSM统一结果封装


    1. 表现层与前端数据传输协议定义

    SSM整合以及功能模块开发完成后,接下来有哪些问题需要我们去解决下。首先第一个问题是:

    • Controller层增删改返回给前端的是boolean类型数据

      在这里插入图片描述

    • 在Controller层查询单个返回给前端的是对象

      在这里插入图片描述

    • 在Controller层查询所有返回给前端的是集合对象

      在这里插入图片描述

    目前我们就已经有三种数据类型返回给前端,如果随着业务的增长,我们需要返回的数据类型会越来越多。对于前端开发人员在解析数据的时候就比较凌乱了,所以对于前端来说,如果后台能够返回一个统一的数据结果,前端在解析的时候就可以按照一种方式进行解析。开发就会变得更加简单。

    所以我们就想能不能将返回结果的数据进行统一,具体如何来做,大体的思路为:

    • 为了封装返回的结果数据:创建结果模型类,封装数据到data属性中
    • 为了封装返回的数据是何种操作及是否操作成功:封装操作结果到code属性中
    • 操作失败后为了封装返回的错误信息:封装特殊消息到message(msg)属性中

    根据分析,我们可以设置统一数据返回结果类

    public class Result{
        //描述统一格式中的数据
        private Object data;
        //描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败
        private Integer code;
        //描述统一格式中的消息,可选属性
        private String msg;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    **注意:**Result类名及类中的字段并不是固定的,可以根据需要自行增减提供若干个构造方法,方便操作。

    2. 表现层与前端数据传输协议实现

    前面分析了如何封装返回结果数据,具体在项目中该如何实现,通过个例子来操作一下

    2.1 环境准备

    • 创建一个Web的Maven项目
    • pom.xml添加SSM整合所需jar包
    • 创建对应的配置类
    • 编写Controller、Service接口、Service实现类、Dao接口和模型类
    • resources下提供jdbc.properties配置文件

    最终创建好的项目结构如下:

    在这里插入图片描述

    2.2 结果封装

    对于结果封装,我们应该是在表现层进行处理,所以我们把结果类放在controller包下,当然你也可以放在domain包,这个都是可以的,具体如何实现结果封装,具体的步骤为:

    步骤1:创建Result类

    @Data
    public class Result {
        //描述统一格式中的数据
        private Object data;
        //描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败
        private Integer code;
        //描述统一格式中的消息,可选属性
        private String msg;
    
        public Result() {
        }
    
        public Result(Object data, Integer code, String msg) {
            this.data = data;
            this.code = code;
            this.msg = msg;
        }
    
        public Result(Object data, Integer code) {
            this.data = data;
            this.code = code;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    步骤2:定义返回码Code类

    //状态码
    public class ResultCode {
        // 成功 状态
        public static final Integer SAVE_SUCCES = 200; //保存成功
        public static final Integer UPDATE_SUCCES = 200; //修改成功
        public static final Integer DELETE_SUCCES = 200; //删除成功
        public static final Integer SELECT_SUCCES = 200; //查询成功
    
        // 失败
        public static final Integer SAVE_FAIL = 2001;//保存失败
        public static final Integer UPDATE_FAIL = 2002;//修改失败
        public static final Integer DELETE_FAIL = 2003;//删除失败
        public static final Integer SELECT_FAIL = 2004;//查询失败
        
        // 其他 ......
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    **注意:**code类中的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为SAVE_SUCCES,UPDATE_SUCCES,DELETE_SUCCES等。

    步骤3:修改Controller类的返回值

    //统一每一个控制器方法返回值
    @RestController
    @RequestMapping("/user")
    public class UserController {
        @Autowired
        private UserService userService;
    
        @PostMapping
        public Result save(@RequestBody User user) {
            Boolean saveBoolean = userService.save(user);
            if (saveBoolean)
                return new Result("0000",ResultCode.SAVE_SUCCES,"保存成功");
            return new Result("保存失败",ResultCode.SAVE_FAIL,"保存失败");
        }
    
        @PutMapping
        public Result update(@RequestBody User user){
            System.out.println(user);
            Boolean updateBoolean = userService.update(user);
            if (updateBoolean)
                return new Result("0000",ResultCode.UPDATE_SUCCES,"修改成功");
            return new Result("0000",ResultCode.UPDATE_FAIL,"修改成功");
    
        }
    
        @DeleteMapping("/{userId}")
        public Result delete(@PathVariable Integer userId){
            Boolean deleteBoolean = userService.delete(userId);
            if (deleteBoolean)
                return new Result("0000",ResultCode.DELETE_SUCCES,"删除成功");
            return new Result("删除失败",ResultCode.DELETE_FAIL,"删除失败");
        }
    
        @GetMapping("/{userId}")
        public Result findByUserId(@PathVariable Integer userId){
            User user = userService.findByUserId(userId);
            if (user != null){
                return new Result(user,ResultCode.SELECT_SUCCES,"查询成功");
            }
            return new Result(null,ResultCode.SELECT_FAIL,"查询失败");
        }
    
        @GetMapping
        public Result findAll(){
            List<User> userList = userService.findAll();
            if (userList != null){
                return new Result(userList,ResultCode.SELECT_SUCCES,"查询成功");
            }
            return new Result(null,ResultCode.SELECT_FAIL,"查询失败");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    步骤4:启动服务测试

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    至此,返回结果就已经能以一种统一的格式返回给前端。前端根据返回的结果,先从中获取code,根据code判断,如果成功则取data属性的值,如果失败,则取msg中的值做提示。


    项目代码

  • 相关阅读:
    智慧排水监测系统,科技助力城市排水治理
    使用docker快速搭建jenkins
    在SpringBoot项目中集成TDengine,并通过SQL对数据进行增删改查
    LeetCode允许重复选择元素的组合
    idea maven 构建本地jar包及pom文件
    【新版vscode配置自动补全括号】
    信噪比和比特误码率之间的关系通过matlab仿真计算出
    gulp 错误集锦
    LeetCode 792. 匹配子序列的单词数 二分查找
    零时科技 || EGD被黑客攻击损失超3.6万 BUSD,事件分析
  • 原文地址:https://blog.csdn.net/qq_37726813/article/details/127760570