二、Spring-Boot高级
1. 服务端表单数据校验
1.1 什么是服务端表单数据效验?
服务端对浏览器端传来的数据进行格式的验证
1.2 SpringBoot 如何对表单数据校验?
SpringBoot 中使用了 Hibernate-validate 校验框架
1.3 SpringBoot 对表单数据校验的校验规则
@NotBlank: 判断字符串是否为 null 或者是空串(包含首尾空格)。
@NotEmpty: 判断字符串是否 null 或者是空串。
@Length: 判断字符的长度(最大或者最小)
@Min: 判断数值最小值
@Max: 判断数值最大值
@Email: 判断邮箱是否合法
1.4SpringBoot 表单数据校验步骤
1.4.1 在实体类中添加校验规则
1.4.2 在 Controller 中开启校验
1.4.3 在页面中获取提示信息
1.4.4 修改PageContoller类
目的:th:error与其他的thymeleaf语法不一样,如果为空,或没有,会出异常。
故在跳转页面的方法中注入一个对象,来解决问题。
1.4.5 测试
2.SpringBoot 中异常处理
2.1 创建自定义异常类,实现HandlerExceptionResolver 接口,重写resolveException()方法
2.2 创建不同的展示页面
error1:
error2:
2.3 测试
3. SpringBoot 热部署
3. 1 什么是SpringBoot 热部署
服务未关闭,代码有改变,刷新是能够呈现修改后的代码
3.2 SprigBoot 的热部署方式
1)通过SpringLoader 插件
2)通过DevTools 工具
3.2.1 SpringLoader 插件的使用
步骤:
1)创建项目
2)添加maven插件
3)创建controller
4)编写页面
5)创建启动类
6)通过maven命令启动服务
spring-boot:run
7)打开任务管理器,关闭服务。
注意: : 这种方式的缺点是 Springloader 热部署程序是在系统后台以进程的形式来运行。 需要手动关闭该进程
3.2.2 DevTools 工具的使用
3.2.2.1 什么是DevTools ?
DevTools 是spring-boot下的用户项目重新部署的API
3.2.2.2 SpringLoader 与 DevTools 的区别
SpringLoader:SpringLoader 在部署项目时使用的是热部署的方式。
DevTools:DevTools 在部署项目时使用的是重新部署的方式
3.2.2.3 DevTools 的使用
在项目中添加 spring-boot-devtools 非常简单,只需要添加以下依赖项即可:
4. Spring-Boot整合Spring-data-jpa
4.1 创建项目
4.2 添加坐标
4.3 在类路径下创建配置文件application.properties
4.4 创建dao接口,继承JpaSpecificationExecutor,JpaRepository接口
4.5 测试
5. Spring Boot 缓存技术
5.1 Spring Boot 整合 Ehcache
5.1.1 什么是Ehcache
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题。
5.1.2 Ehcache 缓存机制
当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值存放在缓存中,等到下次利用同样的参数调用该方法时将直接从缓存中获取结果。
5.1.3 ehcache的缓存配置(ehcache.xml)
name:缓存名称。
maxElementsInMemory:内存中最大缓存对象数。
maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大。
eternal:true表示对象永不过期,此时忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false。
timeToIdleSeconds:设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了设定值,这个对象就会过期。如果该属性值为0,则表示对象可以无限期地处于空闲状态。
timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了设定值,这个对象就会过期。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于等于timeToIdleSeconds属性,才有意义。
overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)
5.1.4 Spring Boot 整合 Ehcache
5.1.4.1 创建项目
5.1.4.2 修改 pom 文件
5.1.4.3 创建 Ehcache 的配置文件
位置:src/main/resources/ehcache.xml
5.1.4.4 在配置文件application.properties指定ehcache.xml的位置
5.1.4.5 修改启动类
5.1.4.6 创建业务层
@Cacheable 作用:把方法的返回值添加到 Ehcache 中做缓存
5.1.4.7 修改实体类 Users
5.1.4.8 测试
5.1.4.9 结果
5.1.5 @CacheEvict 注解的作用?
@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空
5.1.5.1 @CacheEvict 使用的目的
使缓存中的数据与数据库中的数据同步
例如:
当方法中有增加的操作后,此时再查询相同的条件,仍会走缓存,结果和没有实现增加的操作前的结果一致,此时缓存和数据库是不同步的,为了让缓存和数据库数据同步,需要将缓存中的内容清空。
5.1.5.2 使用@CacheEvict 清除缓存
6.Spring Boot 整合 Spring Data Redis
6.1修改 pom 文件添加 Spring Data Redis 的坐标
6.2 编写 Spring Data Redis 的配置类(重点)
6.3 在 src/main/resource/ 目 录 下 新 建 一 个 配 置 文件:application.properties
6.4 测试
7 spring-boot 整合Spring Data Redis 集群
7.1 修改application.properties
7.2 创建cluster配置类
7.3 测试
8.Spring Boot 定时任务
8.1 Scheduled 定时任务器
8.1.1 什么是Scheduled 定时任务器?
Scheduled 定时任务器:是 Spring3.0 以后自带的一个定时任务器。
8.1.2 spirng-boot 与Scheduled 定时任务器的整合
8.1.2.1 创建maven项目
8.1.2.2 在 pom 文件中添加 Scheduled 的坐标
8.1.2.3 编写定时任务类
8.1.2.4 编写启动类
8.1.2.5 启动任务
8.1.3 cron 表达式讲解
Cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义
Cron 有如下两种语法格式:
(1) Seconds Minutes Hours Day Month Week Year
(2)Seconds Minutes Hours Day Month Week
星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;
●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;
●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;
●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;
●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;
●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;
●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;
●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;
●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;
● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。
Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。
8.2 Quartz 定时任务框架
8.2.1 什么是Quartz?
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:
持久性作业 - 就是保持调度定时的状态;
作业管理 - 对调度作业进行有效的管理;
8.2.2 Quartz 的使用思路
1)job - 任务 - 你要做什么事?
2)Trigger - 触发器 - 你什么时候去做?
3)Scheduler - 任务调度 - 你什么时候需要去做什么事?