SSM框架学习——SpringMVC之SSM整合

her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人!

博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正。

今天进入SpringMCV最关键部分的学习——SSM整合。

目录

一、SSM整合

1.1 SSM整合流程

1.2 Spring整合MyBatis

1.3 Spring整合SpringMVC

二、表现层数据封装

设置统一数据返回结果类:

设置统一数据返回结果编码:

三、异常处理器

四、项目异常处理方案

4.1 项目异常分类:

4.2 项目异常处理方案:

4.3 项目异常处理


一、SSM整合

1.1 SSM整合流程

具体文件如何配置代码如何编写都在之前的学习当中,在这里只是整合之前学习的内容。

流程:

①创建工程

②SSM整合
1.Spring

  • SpringConfig

2.MyBatis

  • MybatisConfig
  • JdbcConfig
  • jdbc.properties

3.SpringMVC

  • ServletConfig
  • SpringMvcConfig

③功能模块
1.表与实体类
2.dao(接口+自动代理)

3.service(接口+实现类)

  • 业务层接口测试(整合JUnit )

4.controller

  • 表现层接口测试( PostMan )

1.2 Spring整合MyBatis

配置

  • SpringConfig
  • JdbcConfig、jdbc.properties
  • MyBatisconfig

模型

  • Book

数据层标准开发

  • BookDao

业务层标准开发

  • BookService
  • BookServiceImpl

测试接口

  • BookServiceTest

事务处理

  • JdbcConfig

1.3 Spring整合SpringMVC

web配置类

  • ServletContainerInitConfig

SpringMVC配置类

  • SpringMvcConfig

基于Restful的controller开发

  • BookController

二、表现层数据封装

前端接收数据格式:

  • 增删改
true
  • 查单条
{
    "name": "我是神",
    "price": 35.5,
    "id": 1,
    "type": "玄幻"
}
  • 查全部
[
    {
        "name": "我是神",
        "price": 35.5,
        "id": 1,
        "type": "玄幻"
    },
    {
        "name": "明朝那些事儿",
        "price": 60.0,
        "id": 2,
        "type": "历史"
    },
    {
        "name": "无机化学",
        "price": 70.0,
        "id": 3,
        "type": "化学"
    }
]

这就有三种不同的格式,还可能有更多的格式,发给前端很麻烦处理,那么我们需要整合变成统一的格式。如何做呢?

创建结果模型类,封装数据到data属性中。封装操作结果到code属性中。封装特殊消息到message(msg)属性中。

设置统一数据返回结果类:

public class Result {
private Object data;
private Integer code;
private String msg;
}

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

设置统一数据返回结果编码:

public class Code {
    public static final Integer SAVE_OK =20011;
    public static final Integer DELETE_OK =20021;
    public static final Integer UPDATE_OK =20031;
    public static final Integer GET_OK =20041;

    public static final Integer SAVE_ERR =20010;
    public static final Integer DELETE_ERR =20020;
    public static final Integer UPDATE_ERR =20030;
    public static final Integer GET_ERR =20040;
}

Code类的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_OK,GET_ALL_OK,GET_PAGE_OK

三、异常处理器

程序开发过程中不可避免的会遇到异常现象。

出现异常现象的常见位置与常见诱因如下:

  • 框架内部抛出的异常:因使用不合规导致
  • 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
  • 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
  • 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
  • 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)

???

那么问题来了。

各个层级均出现异常,异常处理代码书写在哪一层?

——所有的异常均抛出到表现层进行处理。

问题又来了。

表现层处理异常,每个方法中单独书写,代码书写量巨大且意义不强,如何解决?

AOP思想,Spring给我们提供了异常处理器,集中的、统一的处理项目中出现的异常。

@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler(Exception.class)
    public Result doException(Exception e){
        System.out.println("异常你哪里跑?");
        return new Result(500,null,"有异常");
    }
}

名称:@RestControllerAdvice
类型:类注解
位置:Rest风格开发的控制器增强类定义上方

作用:为Rest风格开发的控制器类做增强
说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能

名称:@ExceptionHandler

类型:方法注解
位置:专用于异常处理的控制器方法上方
作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行
说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常

四、项目异常处理方案

4.1 项目异常分类:

业务异常(BusinessException)

  • 规范的用户行为产生的异常
  • 不规范的用户行为操作产生的异常

系统异常(SystemException)

  • 项目运行过程中可预计且无法避免的异常

其他异常(Exception)

  • 编程人员未预期到的异常

4.2 项目异常处理方案:

业务异常(BusinessException)

  • 发送对应消息传递给用户,提醒规范操作

系统异常(SystemException)

  • 发送固定消息传递给用户,安抚用户
  • 发送特定消息给运维人员,提醒维护
  • 记录日志

其他异常(Exception)

  • 发送固定消息传递给用户,安抚用户
  • 发送特定消息给编程人员,提醒维护(纳入预期范围内)
  • 记录日志

4.3 项目异常处理

①自定义项目系统级异常

public class SystemException extends RuntimeException {
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }

}

②自定义项目业务级异常

与上面的类似不再展示。

③自定义异常编码(持续补充)

public class Code {
    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer SYSTEM_UNKNOW_ERR = 50001;
    public static final Integer BUSINESS_ERR = 50002;
}

④触发自定义异常

⑤拦截并处理异常

@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException e) {
        //记录日志
        //发送信息给运维
        //发送邮寄给开发人员
        return new Result(e.getCode(), null, e.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doSystemException(BusinessException e) {
        return new Result(e.getCode(), null, e.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public Result doException(Exception e) {
        //记录日志
        //发送信息给运维
        //发送邮寄给开发人员,ex对象发给开发人员
        return new Result(Code.SYSTEM_UNKNOW_ERR, null, "系统繁忙,请稍后再试!");
    }
}

结语:

SSM整合的学习到此结束,我是Lyle,我们下次继续深入学习SpringMVC。

你可能感兴趣的:(SSM框架学习,springmvc)