目录
步骤:
一、环境搭建
1.创建JdbcConfig配置类
2.创建JdbcConfig配置类
3.创建MybatisConfig配置类
4.创建jdbc.properties
5.创建SpringMVC配置类
6.创建Web项目入口配置类
二、功能模块开发
步骤1:创建数据库及表
步骤2:编写模型类
步骤3:编写Dao接口
步骤4:编写Service接口和实现类
步骤5:编写Contorller类
三、统一结果封装
四、统一异常处理
异常处理器的使用
步骤1:创建异常处理器类
步骤2:让程序抛出异常
步骤3:运行程序,测试
异常处理器类返回结果给前端
项目异常处理方案
步骤1:自定义异常类
步骤2:将定义的异常包成自定义异常
步骤3:在异常处理器类中处理自定义异常
总结
五、拦截器
编辑拦截器的实现
步骤1:创建拦截器类
步骤2:配置拦截器类
总结
拦截器参数
前置处理方法
后置处理方法
完成处理方法
拦截器链配置
配置多个拦截器
步骤1:创建拦截器类
步骤2:配置拦截器类
那多个拦截器是如何执行的呢?
步骤:
一、环境搭建
1.创建JdbcConfig配置类
2.创建JdbcConfig配置类
3.创建MybatisConfig配置类
4.创建jdbc.properties
5.创建SpringMVC配置类
6.创建Web项目入口配置类
二、功能模块开发
步骤1:创建数据库及表
步骤2:编写模型类
这里是以一个商品类举例的
步骤3:编写Dao接口
步骤4:编写Service接口和实现类
步骤5:编写Contorller类
三、统一结果封装
我们现在可以发现一个问题,在Controller层中增删改、查询单个、查询所有返回给前端的数据不统一。这对于前后端交互是很不方便的。
这个时候就可以使用一个类将数据返回结果统一一下。如下图所示。
这里我们设置的统一返回结果类为:
这里面用到了Code,所以也要定义一下返回码Code
修改Controller
四、统一异常处理
在代码执行中出现异常是不可避免的,异常主要分以下几种
-
框架内部抛出的异常:因使用不合规导致
-
数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
-
业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
-
表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
-
工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
-
各个层级均出现异常,异常处理代码书写在哪一层?
所有的异常均抛出到表现层进行处理
-
异常的种类很多,表现层如何将所有的异常都处理到呢?
异常分类
-
表现层处理异常,每个方法中单独书写,代码书写量巨大且意义不强,如何解决?
AOP、
SpringMVC已经为我们提供了一套解决方案
如何使用呢?
异常处理器的使用
步骤1:创建异常处理器类
步骤2:让程序抛出异常
步骤3:运行程序,测试
异常处理器类返回结果给前端
项目异常处理方案
上述的异常处理方法是一个统一的概念,没有对异常进行分类,下面我们对异常进行分类。
- 业务异常(BusinessException)
用户在页面输入内容的时候未按照指定格式进行数据填写,如在年龄框输入的是字符串
- 系统异常(SystemException)
项目运行过程中可预计但无法避免的异常比如数据库或服务器宕机
- 其他异常(Exception)
编程人员未预期到的异常,如:用到的文件不存在
将异常分类以后,针对不同类型的异常,要提供具体的解决方案:
-
业务异常(BusinessException)
-
发送对应消息传递给用户,提醒规范操作
-
大家常见的就是提示用户名已存在或密码格式不正确等
-
-
-
系统异常(SystemException)
-
发送固定消息传递给用户,安抚用户
-
系统繁忙,请稍后再试
-
系统正在维护升级,请稍后再试
-
系统出问题,请联系系统管理员等
-
-
发送特定消息给运维人员,提醒维护
-
可以发送短信、邮箱或者是公司内部通信软件
-
-
记录日志
-
发消息和记录日志对用户来说是不可见的,属于后台程序
-
-
-
其他异常(Exception)
-
发送固定消息传递给用户,安抚用户
-
发送特定消息给编程人员,提醒维护(纳入预期范围内)
-
一般是程序没有考虑全,比如未做非空校验等
-
-
记录日志
-
具体要怎么实现呢?
步骤1:自定义异常类
-
让自定义异常类继承
RuntimeException
的好处是,后期在抛出这两个异常的时候,就不用在try...catch...或throws了 -
自定义异常类中添加
code
属性的原因是为了更好的区分异常是来自哪个业务的
步骤2:将定义的异常包成自定义异常
具体的包装方式有:
-
方式一:
try{}catch(){}
在catch中重新throw我们自定义异常即可。 -
方式二:直接throw自定义异常即可
步骤3:在异常处理器类中处理自定义异常
在这里面定义的会将异常信息返回给前端
总结
项目的整个异常处理方式如下图
五、拦截器
拦截器的实现
步骤1:创建拦截器类
让类实现HandlerInterceptor接口,重写接口中的三个方法。
就是拦截器中的preHandler
方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了。
步骤2:配置拦截器类
这里配置的是对/books,
发送http://localhost/books
,就会看到如下输出
如果发送http://localhost/books/100
会发现拦截器没有被执行,原因是拦截器的addPathPatterns
方法配置的拦截路径是/book
总结
拦截器的整个执行流程如下:
当有拦截器后,请求会先进入preHandle方法,
如果方法返回true,则放行继续执行后面的handle[controller的方法]和后面的方法
如果返回false,则直接跳过后面方法的执行。
拦截器参数
前置处理方法
后置处理方法
使用率不高
完成处理方法
使用率不高
这三个方法中,最常用的是preHandle,在这个方法中可以通过返回值来决定是否要进行放行,我们可以把业务逻辑放在该方法中,如果满足业务则返回true放行,不满足则返回false拦截。
拦截器链配置
如果一个项目中有多个拦截器。该如何配置,执行顺序又是怎么样的
配置多个拦截器
步骤1:创建拦截器类
跟前面一样再定义一个拦截器类
步骤2:配置拦截器类
跟前面一样就是多写了一遍
那多个拦截器是如何执行的呢?
和栈一样,先进后出。
-
当配置多个拦截器时,形成拦截器链
-
拦截器链的运行顺序参照拦截器添加顺序为准
-
当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
-
当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作