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

**注意:**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;
    }
}

步骤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;//查询失败
    
    // 其他 ......
    
}

**注意:**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,"查询失败");
    }
}

步骤4:启动服务测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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


项目代码

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.D.Chuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值