her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人!
博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正。
今天进入SpringMCV最关键部分的学习——SSM整合。
目录
一、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。