Spring Boot 使用路径扫描方式整合Servlet三大组件

在Spring Boot中,使用路径扫描的方式整合内嵌式Servlet容器的Servlet、Filter、Listener三大组件时,首先需要在自定义组件上分别添加@WebServlet、@WebFilter和@WebListener注解进行声明,并配置相关注解属性,然后在项目主程序启动类上使用@ServletComponentScan注解开启组件扫描即可。

一、创建Spring Boot项目 - IntegrateThreeComponents02

Spring Boot 使用路径扫描方式整合Servlet三大组件_第1张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第2张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第3张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第4张图片

二、使用路径扫描方式整合Servlet三大组件

(一)创建MyServlet类

Spring Boot 使用路径扫描方式整合Servlet三大组件_第5张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第6张图片

  • 通过注解@WebServlet("/hello")给MyServlet定义了urlPattern

(二)创建CodeServlet类

Spring Boot 使用路径扫描方式整合Servlet三大组件_第7张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第8张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第9张图片

(三)创建MyFilter类

Spring Boot 使用路径扫描方式整合Servlet三大组件_第10张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第11张图片

  • 通过注解@WebFilter(value = {"/hello", "/code"})让MyFilter过滤两个指定的请求。

(四)创建MyListener类

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

Spring Boot 使用路径扫描方式整合Servlet三大组件_第12张图片

通过注解@WebListener("/")监听一切请求。

(五)修改入口类,添加ServletComponentScan注解

Spring Boot 使用路径扫描方式整合Servlet三大组件_第13张图片

(六)启动应用,测试效果

启动应用后查看控制台输出

Spring Boot 使用路径扫描方式整合Servlet三大组件_第14张图片

访问
http://localhost:8080/hello

Spring Boot 使用路径扫描方式整合Servlet三大组件_第15张图片

访问
http://localhost:8080/code

Spring Boot 使用路径扫描方式整合Servlet三大组件_第16张图片

可以看到,跟上一讲的项目,运行结果完全一致。

三、路径扫描整合Servlet三大组件小结

使用注解方式,可以省配置文件(比如ServletConfig、FilterConfig和ListenerConfig),大大简化了操作,实际应用时尽量采用此方式来整合Servlet三大组件。

学习目标

掌握利用Spring Boot实现文件上传功能

四、文件上传概述

开发Web应用时,文件上传是很常见的一个需求,浏览器通过表单形式将文件以流的形式传递给服务器,服务器对上传的数据解析处理,Spring Boot中进行文件上传与Spring MVC框架上传类似。

五、实现文件上传功能

(一)创建Spring Boot项目

创建FileUploadDemo项目,添加Web和Thymeleaf依赖

Spring Boot 使用路径扫描方式整合Servlet三大组件_第17张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第18张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第19张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第20张图片

(二)整合Bootstrap

将第11讲项目SpringMvcDemo2021的resources/static里的bootstrap-4.0.0拷贝到当前项目相应位置。

Spring Boot 使用路径扫描方式整合Servlet三大组件_第21张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第22张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第23张图片

(三)编写文件上传页面

在templates目录里创建文件上传页面 - fileupload.html

Spring Boot 使用路径扫描方式整合Servlet三大组件_第24张图片

表单method必须使用post

表单enctype必须是multipart/form-data

Spring Boot 使用路径扫描方式整合Servlet三大组件_第25张图片

(四)编写项目配置文件

Spring Boot 使用路径扫描方式整合Servlet三大组件_第26张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第27张图片

注意配置文件上传文件大小不是M做单位,而是Byte

50M = 50 * 1024 * 1024 B= 52428800 B

300M = 300 * 1024 * 1024 B = 314572800 B

(五)编写文件上传控制器

Spring Boot 使用路径扫描方式整合Servlet三大组件_第28张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第29张图片

(六)启动应用,测试效果

访问
http://localhost:8080/uploadFile

查看上传成功的文件

Spring Boot 使用路径扫描方式整合Servlet三大组件_第30张图片

修改文件上传控制器的uploadFile方法的代码

Spring Boot 使用路径扫描方式整合Servlet三大组件_第31张图片

六、控制上传文件类型

可通过上传文件的contentType(String contentType = file.getContentType();)来判断,符合要求的文件则写入磁盘,否则反馈错误信息。

文件超过指定大小也可以在控制器中进行判断,然后给前台反馈友好的提示。

前台也可以先用js做初步判断后再提交表单。

学习目标

  1. 熟悉Spring Boot的默认缓存管理
  2. 熟悉Spring Boot的缓存注解及使用

七、缓存概述

(一)引入缓存管理的重要性

缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问。在实际开发中,尤其是用户访问量较大的网站,用户对高频热点数据的访问非常频繁,为了提高服务器访问性能、减少数据库的压力、提高用户体验,使用缓存显得尤为重要,Spring Boot针对这种实际需求,对缓存提供了良好的支持。

(二)Spring Boot的缓存管理

Spring框架支持透明地向应用程序添加缓存对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能,通过使用@EnableCaching注解开启基于注解的缓存支持,Spring Boot可以启动缓存管理的自动化配置。

八、Spring Boot默认缓存

(一)数据准备

Spring Boot 使用路径扫描方式整合Servlet三大组件_第32张图片

(二)创建Spring Boot项目 - DefaultCacheDemo

Spring Boot 使用路径扫描方式整合Servlet三大组件_第33张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第34张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第35张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第36张图片

(三)创建数据库表对应的实体类

1、创建评论实体类 - Comment

Spring Boot 使用路径扫描方式整合Servlet三大组件_第37张图片

2、创建文章实体类 - Article

Spring Boot 使用路径扫描方式整合Servlet三大组件_第38张图片

(四)创建Repository接口

1、创建评论仓库接口 - CommentRepository

Spring Boot 使用路径扫描方式整合Servlet三大组件_第39张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第40张图片

2、创建文章仓库接口 - ArticleRepository

Spring Boot 使用路径扫描方式整合Servlet三大组件_第41张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第42张图片

(五)编写Service类

1、创建CommentService类

Spring Boot 使用路径扫描方式整合Servlet三大组件_第43张图片

2、创建ArticleService类

Spring Boot 使用路径扫描方式整合Servlet三大组件_第44张图片

(六)编写控制器

1、编写评论控制器 - CommentController

Spring Boot 使用路径扫描方式整合Servlet三大组件_第45张图片

2、编写文章控制器 - ArticleController

Spring Boot 使用路径扫描方式整合Servlet三大组件_第46张图片

(七)配置全局属性文件

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(八)启动应用,测试效果

1、测试查询

查询编号为1的评论记录

访问
http://localhost:8080/find/1

Spring Boot 使用路径扫描方式整合Servlet三大组件_第47张图片

2、测试更新

修改编号1的评论记录,内容改为“十分有趣,值得一读”,作者改为“无心剑”

访问 
http://localhost:8080/update?id=1&comment=十分有趣,值得一读&author=无心剑&aId=1

Spring Boot 使用路径扫描方式整合Servlet三大组件_第48张图片

再次查询编号为1的评论记录

Spring Boot 使用路径扫描方式整合Servlet三大组件_第49张图片

看,是不是评论的内容和作者都已经修改成功了?

3、测试删除

删除编号为1的评论

访问
http://localhost:8080/delete/1

Spring Boot 使用路径扫描方式整合Servlet三大组件_第50张图片

再次查询编号为1的评论记录

Spring Boot 使用路径扫描方式整合Servlet三大组件_第51张图片

查看评论表 - t_comment

Spring Boot 使用路径扫描方式整合Servlet三大组件_第52张图片

(九)课后拓展练习

完成ArticleService,ArticleController类并进行测试 - 查询、更新、删除

更新时如果给定的参数值中有中文,写入数据库是乱码,查询资料,解决乱码问题

(十)测试未启用缓存的效果

访问
http://localhost:8080/find/2,查看刷新页面效果

Spring Boot 使用路径扫描方式整合Servlet三大组件_第53张图片

说明:页面每刷新一次,控制台会输出一次SQL语句,即每查询一次,就会访问一次数据库,大大增加了数据库的负担。

(十一)开启默认缓存

1、在入口类上加注释@EnableCaching

该注解一般使用在类上,通常使用在入口 类上

Spring Boot 使用路径扫描方式整合Servlet三大组件_第54张图片

2、在服务类需要启用缓存的方法上加注解@Cacheable

@Cacheable注解既可用在方法上,也可用在类上

Spring Boot 使用路径扫描方式整合Servlet三大组件_第55张图片

(十二)测试启用默认缓存后的效果

启动应用,访问
http://localhost:8080/find/2,并刷新页面查看效果

Spring Boot 使用路径扫描方式整合Servlet三大组件_第56张图片

说明:第一次访问页面时控制台会有SQL语句输出,往后刷新时则不会继续输出SQL语句,即不再连接数据库取数据,而是从缓存中取数据。

九、Spring Boot默认缓存小结

(一)使用缓存的作用

缓存一般用在查询方法上,可以减轻数据库服务器的压力。

(二)常用注解

1、@EnableCaching注解

该注解一般使用在Spring Boot项目的入口类上,开启项目的缓存功能

2、@Cachable注解

  • @Cacheable注解也是由Spring框架提供的,可以作用于类或方法(通常用在数据查询方法上),用于对方法结果进行缓存存储。
  • @Cacheable注解的执行顺序是,先进行缓存查询,如果为空则进行方法查询,并将结果进行缓存;如果缓存中有数据,不进行方法查询,而是直接使用缓存数据。
  • @Cacheable可以指定三个属性,value、key和condition。

(1)value属性

value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache。

(2)key属性

key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。

(3)condition属性

  • 有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。
  • 案例演示:只有当comment的id为偶数时才会进行缓存。

Spring Boot 使用路径扫描方式整合Servlet三大组件_第57张图片

3、@CachePut注解

  • 在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
  • @CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
  • @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

Spring Boot 使用路径扫描方式整合Servlet三大组件_第58张图片

4、@CacheEvict注解

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。

其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。

下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。

(1)allEntries属性

allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(2)beforeInvocation属性

清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

学习目标

  1. 了解Spring Boot支持的缓存组件
  2. 掌握基于注解的Redis缓存实现
  3. 掌握基于API的Redis缓存实现

十、Spring Boot支持的缓存组件

Spring Boot内部嵌入了支持的一系列缓存管理组件,并按照顺序查找加载有效的缓存组件进行缓存管理,如果没有任何缓存组件,会默认使用最后一个Simple默认缓存管理组件进行管理。在实际开发中,通常会使用专业的第三方缓存插件进行缓存管理。

如果开启了缓存,Spring Boot会按照以下顺序去查找缓存组件:

  1. Generic
  2. JCache (JSR-107) (EhCache 3、Hazelcast、Infinispan等)
  3. EhCache 2.x
  4. Hazelcast
  5. Infinispan
  6. Couchbase
  7. Redis
  8. Caffeine
  9. Simple(默认)

十一、基于注解的Redis缓存实现

(一)安装与启动Redis

(二)创建Spring Boot项目 - RedisCacheDemo01

设置组标识、项目标识、包名

Spring Boot 使用路径扫描方式整合Servlet三大组件_第59张图片

添加Spring Web、Spring Data JPA、MySQL Driver、Spring Data Redis依赖

Spring Boot 使用路径扫描方式整合Servlet三大组件_第60张图片

设置项目名及保存位置

Spring Boot 使用路径扫描方式整合Servlet三大组件_第61张图片

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看pom.xml文件

(三)创建评论实体类 - Comment

要实现缓存,实体类必须要实现序列化接口Serializable

Spring Boot 使用路径扫描方式整合Servlet三大组件_第62张图片

(四)创建评论仓库接口 - CommentRepository

Spring Boot 使用路径扫描方式整合Servlet三大组件_第63张图片

自定义方法添加注解@Modifying实现数据更新操作

Spring Boot 使用路径扫描方式整合Servlet三大组件_第64张图片

(五)创建评论服务类 - CommentService

Spring Boot 使用路径扫描方式整合Servlet三大组件_第65张图片

(六)创建评论控制器 - CommentController

Spring Boot 使用路径扫描方式整合Servlet三大组件_第66张图片

(七)配置系统属性文件 - application.properties

Spring Boot 使用路径扫描方式整合Servlet三大组件_第67张图片

Spring Boot 使用路径扫描方式整合Servlet三大组件_第68张图片

(八)在入口类添加注解@EnableCaching开启缓存

Spring Boot 使用路径扫描方式整合Servlet三大组件_第69张图片

(九)Redis可视化工具连接Redis服务

在命令行窗口,启动Redis服务

Spring Boot 使用路径扫描方式整合Servlet三大组件_第70张图片

启动Redis可视化管理工具

Spring Boot 使用路径扫描方式整合Servlet三大组件_第71张图片

(十)启动应用,测试效果

1、测试各个方法的观察点

  • 浏览器返回值
  • 控制台输出数据
  • Redis数据数据变化
  • MySQL数据库数据变化

2、基于注解的Redis查询缓存测试

MySQL数据库评论表原始数据

Spring Boot 使用路径扫描方式整合Servlet三大组件_第72张图片

Redis数据库原始数据

Spring Boot 使用路径扫描方式整合Servlet三大组件_第73张图片

访问
http://localhost:8080/find/1

Spring Boot 使用路径扫描方式整合Servlet三大组件_第74张图片

查看控制台输出的SQL语句

Spring Boot 使用路径扫描方式整合Servlet三大组件_第75张图片

查看Redis数据库缓存的数据

Spring Boot 使用路径扫描方式整合Servlet三大组件_第76张图片

此时,刷新页面,控制台不会输出SQL语句,也就是说不再查询数据库,直接使用Redis缓存数据

3、基于注解的Redis更新缓存测试

Spring Boot 使用路径扫描方式整合Servlet三大组件_第77张图片

查看控制台输出的SQL语句

Spring Boot 使用路径扫描方式整合Servlet三大组件_第78张图片

查看Redis数据库缓存的数据

Spring Boot 使用路径扫描方式整合Servlet三大组件_第79张图片

查看MySQL数据库中的评论表

Spring Boot 使用路径扫描方式整合Servlet三大组件_第80张图片

4、基于注解的Redis删除缓存测试

访问
http://localhost:8080/delete/1

Spring Boot 使用路径扫描方式整合Servlet三大组件_第81张图片

查看控制台输出的SQL语句

Spring Boot 使用路径扫描方式整合Servlet三大组件_第82张图片

查看查看Redis数据库,缓存的数据已被删除

Spring Boot 使用路径扫描方式整合Servlet三大组件_第83张图片

查看MySQL数据库中的评论表,id为1的评论已被删除

目录

一、创建Spring Boot项目 - IntegrateThreeComponents02

二、使用路径扫描方式整合Servlet三大组件

三、路径扫描整合Servlet三大组件小结

四、文件上传概述

五、实现文件上传功能

六、控制上传文件类型

七、缓存概述

八、Spring Boot默认缓存

九、Spring Boot默认缓存小结

十、Spring Boot支持的缓存组件

十一、基于注解的Redis缓存实现


Spring Boot 使用路径扫描方式整合Servlet三大组件_第84张图片

你可能感兴趣的:(spring,java,spring,boot)