前言
这一节我们终结springmvc
1. SSM整合配置
先导入坐标
先创建包
配置类
然后开始创建jdbc的config和mybatis的config,还有properties
SpringConfig:
jdbc.properties:
JdbcConfig:
MybatisConfig:
下面开始spring整合mvc:ServletConfig和SpringMvcConfig
ServletConfig:
SpringMvcConfig:
启动的时候会加载SpringConfig.class(根)和SpringMvcConfig.class(web)两个配置类和对应bean,但是springmvc的容器能访问spring的容器,spring的容器不能访问springmvc的容器,不想要麻烦额度话,可以都写在getServletConfigClasses这个里面
2. 功能模块开发
2.1 造表
2.2 其他
pojo的映射封装对象
就是写类了
先创建文件
BookDao:
BookService:
和dao层的方法没有什么区别,区别就是没有注解,void改boolean,然后就是要有文档注释
然后写其实现类
BookServiceImpl:
alt+回车
点第一个
还是点第一个
去掉勾就可以了
这样就不会爆红了
BookController:
就这样我们所有后台的功能就写完了
3.接口测试
我们写完之后要对service层进行测试,还要用postman对表现层进行接口测试
3.1 业务层接口测试
我们就要在test中测试了
这里插播一下,我们少导入了spring的测试坐标,不导入的话,就不能用junit测试了
这个我们写完就能用了
这里再插播一条,我们没有导入spring-jdbc的坐标所以会报错
完整的pom文件是这样的
这样我们就测试完了
3.2 表现层接口测试
部署tomcat
注意我们这里Tomcat如果URL不想写端口号的时候,端口号就要设置为80才行,因为80就是Tomcat的默认端口号
但是我们运行却会出错,就是tomcat都无法部署
这段报错交给ai,发现是没有加载上properties文件
原配置类:
我们在前面加上classpath其实就可以找到properties文件了,因为原来的范围小了,所以找不到
这样我们就可以成功部署了
我们在修改一下我们的properties文件
然后数据库还真的多了这一条数据—》f5是刷新数据库
在增加一个14的数据
3.3 事务处理
1.开启注解式事务驱动
在spring的配置中开启@EnableTransactionManagement
SpringConfig:
2.配置事务管理器
在jdbcconfig那里写
JdbcConfig:
3.添加事务,配到接口上
BookService:
在业务层接口上面添加就可以了
@Transactional
4. 表现层与前端数据传输协议定义
我们要统一数据格式
我们创建一个结果模型类,封装数据到data属性中
这又是一个问题,问题就是同一个true对应不同多个操作
所以我们要做一个标识
我们用20031表示删除
查询中20040表示查询失败
20041表示查询成功
我们用msg来存储查询失败的信息
所以data里面存传输数据,没有就是null,code表示传的是什么数据,msg是传输失败的信息
5. 表现层与前端数据传输数据协议实现
我们把这个类定义在controller下
BookController:
我们这个里面的方法全部都return成result类型的
这样的话,前端拿到我们的数据,先看code知道是一个啥操作,再看data取数据,万一失败了就看msg信息
6. 异常处理器
框架内部抛出的异常:使用不规范–》mybatis配置文件写错了
数据层:数据库相关问题
业务层:数据处理
表现层:收集数据
把所有层的异常都往上抛出去,不要处理,数据层抛到业务层,业务层抛到表现层,所以所有的异常都抛到表现层,怎么写呢,但是每个方法都单独处理,太麻烦了,我们用aop思想
异常处理器,可以其中统一处理异常
这个我们要在表现层里面去写
现在我们创建一个异常
这样就成功了
但是我们还要返回给前端看一下
ProjectExcetionAdvice:
我们这样写就可以返回这个数据了
这样就算是抛异常,也能做到格式统一了
7. 项目异常处理
我们先来定义两种自定义异常,把上面两种异常弄出来
2.在可能引发异常的地方,把这些异常进行一个处理
BookServiceImpl:
这样就把各种各样可能会出现的异常都包装成了同一个异常
这样就有了表现层和系统层面的两种异常了
但是666我们写的不专业,我们可以自己来定义
就在code中写常量,写状态码就可以了
code:
timeout是超时的意思
BookServiceImpl:
ProjectExcetionAdvice:处理器
其实我们真正处理异常不能这么做,应该把return的内容try起来才对
反正我们就是造出来了我们需要的系统异常和业务层异常
我们就在处理器这里处理这两种异常
我们现在来运行,只要单个查询没有输入1,就会出异常
实际开发的时候,我们可以用aop,来很多异常都包装成自己定义的异常
8. 前后端协议联调(列表功能)
粘贴过来还不能直接使用,我们前面说过了,我们要先放行
在创建一个配置类SpringMvcSupport
然后在springmvc中加载这个配置类
SpringMvcConfig:
books.html:
现在我们在getAll中发生ajax请求
9. 前后端协议联调(添加功能)
9.1 可见
就是新增按钮,弹出一个添加框
默认是不可显示的,我们要修改visible属性,让它改成可修改的
点击添加按钮,默认会调用这个方法
设置属性可见就可以了
9.2 点按钮传数据
就是这个方法
9. 前后端协议联调(添加功能状态处理)
就是添加数据失败该这么办呢
20011是成功,20010是失败,服务器挂了是其他情况
怎么演示失败呢
BookServiceImpl:
但是我们return true,所以一直是成功的
所以我们要根据dao的返回值来确定service层返回true还是false
BookDao:
我们dao的返回值int就是sql语句执行影响的行数
BookServiceImpl:
这样子的话我们的controller里面就可以得到false了
因为我们在在设计type的时候,长度是20,所以只要我们输入的大于20长度就可以false了
但是我们点击了确定却没有弹出一个框
我们看一下日志
这样我们就看出了它走的是sql异常,被异常处理器给拿走了
所以我们只需要在else那里弹出来就可以了
这样子我们就有弹窗了
虽然20010没有激活,先不管了
还有就是getall这个方法不管是执行失败还是成功都要执行的,所以用finally
但是有个小问题就是,我们再次点击新增,就还是上次的了
这里有一个充值表单的操作,这样的话,我们点击新增就是全新的了
然后就是一弹出弹框就调用这个方法,保证每次点击都是空白的
这样这个就可以了
失败的话就不用关闭窗口,继续检查数据就可以了
10. 前后台协议协调(修改功能)
10.1 展示修改信息
就是点击编辑按钮,可以查询
我们先看看这个row
我们点击编辑就有这个效果了,所以这个row就是JSON数据
我们在row里面查询id,在传递过去
dialogFormVisible4Edit就是那个弹层的显示属性
但是我们点击却报错了,我们来调试一下
我们发现来了一个null
为什么呢
然后我们就发现问题了,原来是因为我们以前有模拟异常的代码,去掉就可以了
这样就可以了
在来处理一下错误
我们在设置一个错误的
点击第一个的编辑按钮就可以了
10.2 修改
和添加功能基本一模一样
而且看那里确实改了
但是我们弹层没有关,因为拷贝的是原来的增加弹层的关闭
所以相比增加没什么变化
11. 前后台协议协调(删除功能)
传id删除即可
但是我们没有操作完页面刷新操作,加上finally即可
但是我们仍然没有实时更新,为什么呢,因为getall调用比删除快
所以我们把getall放在axios后面试试
这样就可以了
11.2 取消删除
12. 拦截器简介
案例我们就讲到这里,开始讲新的内容
拦截器和过滤器差不多
进去要经过拦截器,出去也要经过拦截器
springmvc的内容就是
就是这里的内容
拦截器就是在控制器前或者后执行,用来增强功能
13. 入门案例
13.1 制造拦截器功能类
我们打开以前的一个模块来测试,就是springmvc_02
现在开始写
ProjectInterceptor:
因为它是为sprnigmvc服务的,所以springmvc肯定要加载它才行
然后再开始扫描
13.2 配置拦截器执行位置
SpringMvcSupport:
原:
现在:
然后SpringMvcConfig加载这个配置类
第一定义拦截器类ProjectInterceptor,变成bean,第二写配置类,就是SpringMvcSupport,去覆盖最后一个方法
book===>save是我们的原始操作,preHandle…是在它之前执行的操作
postHandle在之后执行的操作
afterCompletion是在完成之后,在post后面
所以拦截器可以在方法的前和后执行
这个拦截器就不能拦截这个了,因为不是/books,还多了一个1
SpringMvcSupport:
可以这样写,就是所以以books开头的操作
如果这里改为false的话,就是这样了
只有这一个了。所以这个false的意思就是,可以终止原始操作的运行,一旦终止了原始操作,那么在原始操作之后的东西,也无法执行了
注意我们现在写的配置类和springmvc一直处于同一层,可以优化一下
SpringMvcConfig:
这样的话,就可以把SpringMvcSupport里面的方法拿过来了
而且也不用扫描SpringMvcSupport了
14. 拦截器参数
拦截器参数就是上面的形参
这里就是header
第一个就是我们取到的
我们来打印一下header
就是在描述这个类
这其实是一个类,就是HandleMethod
这个类封装了我们的方法
下面我们开始讲第二个方法里面的参数
多了一个modelAndView
这个其实封装了我们mvc页面跳转的数据
ex实际上可以得到原始程序出现的异常
15. 拦截器链配置
先配两个拦截器
开始配置
SpringMvcConfig:
然后我们这样写的话,就会先执行projectInterceptor,在执行projectInterceptor2,和我们配置的顺序有关,pre和定义顺序一样,post就是相反的了
然后我们把第一个的pre改成false
看得出来,只运行了第一个pre
flase直接终止了后面的拦截器
3如果返回false的话,1,2,3的pre都会执行,post都不执行,但是1,2的sfter仍然执行
2return false,就执行那个after1了
就是谁false,post一个不执行,然后它前面的after要执行
一般我们只做一个拦截器
总结
springmvc我们就讲完了