今日内容
一、SSM整合【重点】
1 SSM整合配置
问题导入
请描述“SSM整合流程”中各个配置类的作用?
1.1 SSM整合流程
- 创建工程
- SSM整合
- Spring
- MyBatis
- MybatisConfig
- JdbcConfig
- jdbc.properties
- SpringMVC
- ServletConfig
- SpringMvcConfig
- 功能模块
- 表与实体类
- dao(接口+自动代理)
- service(接口+实现类)
- controller
1.2 SSM整合配置
1.2.1 创建工程,添加依赖和插件
1.2.2 Spring整合Mybatis
1.2.3 Spring整合SpringMVC
- ServletConfig配置类,加载SpringMvcConfig和SpringConfig配置类
2 功能模块开发
2.1 数据层开发(BookDao)
2.2 业务层开发(BookService/BookServiceImpl)
2.3 表现层开发(BookController)
3 接口测试
3.1 Spring整合Junit测试业务层方法
3.2 postman测试表现层接口
这里就以保存图书为例,其他接口同学们自己测试
二、表现层数据封装【重点】
问题导入
目前我们表现层响应给客户端的数据有哪几种?
1 表现层响应数据的问题
问题:我们表现层增删改方法返回true或者false表示是否成功,getById()方法返回一个json对象,getAll()方法返回一个json对象数组,这里就出现了三种格式的响应结果,极其不利于前端解析。
解决:我们需要统一响应结果的格式
2 定义Result类封装响应结果
2.1 Result类封装响应结果
注意事项:
Result类中的字段并不是固定的,可以根据需要自行增减
2.2 Code类封装响应码
注意事项:
Code类的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_OK,GET_ALL_OK,GET_PAGE_OK
3 表现层数据封装返回Result对象
三、异常处理器【理解】
问题导入
问题1:项目各个个层级均可能出现异常,异常处理代码书写在哪一层?
1 异常介绍
- 程序开发过程中不可避免的会遇到异常现象,我们不能让用户看到这样的页面数据
- 出现异常现象的常见位置与常见诱因如下:
- 框架内部抛出的异常:因使用不合规导致
- 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
- 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
- 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
- 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
2 异常处理器
2.2.1 编写异常处理器
使用异常处理器之后的效果
2.2.2 @RestControllerAdvice注解介绍
2.2.3 @ExceptionHandler注解介绍
- 名称:@ExceptionHandler
- 类型:方法注解
- 位置:专用于异常处理的控制器方法上方
- 作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行
- 说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常
四、项目异常处理方案【理解】
问题导入
请说出项目当前异常的分类以及对应类型异常该如何处理?
1 项目异常分类
- 业务异常(BusinessException)
- 规范的用户行为产生的异常
- 不规范的用户行为操作产生的异常
- 系统异常(SystemException)
- 其他异常(Exception)
2 项目异常处理方案
- 业务异常(BusinessException)
- 系统异常(SystemException)
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给运维人员,提醒维护
- 记录日志
- 其他异常(Exception)
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给编程人员,提醒维护(纳入预期范围内)
- 记录日志
3 项目异常处理代码实现
3.1 根据异常分类自定义异常类
3.1.1 自定义项目系统级异常
3.1.2 自定义项目业务级异常
3.2 自定义异常编码(持续补充)
3.3 触发自定义异常
3.4 在异常通知类中拦截并处理异常
测试:在postman中发送请求访问getById方法,传递参数-1,得到以下结果:
五、SSM整合页面开发【重点】
1 准备工作
为了确保静态资源能够被访问到,需要设置静态资源过滤
2 列表查询功能
3 添加功能
4 修改功能
5 删除功能
六、拦截器【理解】
1 拦截器简介
问题导入
问题1:拦截器拦截的对象是谁?
问题2:拦截器和过滤器有什么区别?
1.1 拦截器概念和作用
- 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
- 作用:
- 在指定的方法调用前后执行预先设定的代码
- 阻止原始方法的执行
- 总结:增强
- 核心原理:AOP思想
1.2 拦截器和过滤器的区别
- 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
- 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
2 入门案例
问题导入
定义拦截器需要实现什么接口?
2.1 拦截器代码实现
【第一步】定义拦截器
做法:定义一个类,实现HandlerInterceptor接口即可
【第二步】配置加载拦截器
使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)
2.2 拦截器流程分析
3 拦截器参数
问题导入
postHandle()和afterCompletion()方法都是处理器方法执行之后执行,有什么区别?
3.1 前置处理
3.2 后置处理
- 参数
modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行跳转
注意:如果处理器方法出现异常了,该方法不会执行
3.3 完成后处理
- 参数
ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
注意:无论处理器方法内部是否出现异常,该方法都会执行。
4 拦截器链配置
问题导入
什么是拦截器链?
4.1 多个拦截器配置
4.2 多个连接器工作流程分析
- 当配置多个拦截器时,形成拦截器链
- 拦截器链的运行顺序参照拦截器添加顺序为准
- 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
- 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作