springboot2江南一点雨博客总结
Springboot:
入门:
@ComponentScan注解:
1 |
DispatcherServlet:
Just a moment…
springmvc流程图:
**_Front Controller _**主要职责包括:
- 拦截传入请求
- 将请求的有效负载(请求的有效载荷就是请求中的数据部分,也就是请求体部分)转换为数据的内部结构
- 将数据发送到_模型_进行进一步处理
- 从模型中获取处理后的数据_,_并将该数据推进到_视图_进行渲染
DispatcherServlet 在架构中扮演着 Front Controller 的角色。该图既适用于典型的 MVC 控制器,也适用于 RESTful 控制器,但有一些细微的差异(如下所述)。
在传统方法中,MVC 应用程序不是面向服务的;因此,有一个 V_iew 解析器_,它根据从 Controller 接收的数据呈现最终视图。
RESTful 应用程序被设计为面向服务并返回原始数据(通常为 JSON/XML)。由于这些应用程序不执行任何视图渲染,因此没有_视图解析器,并且通常期望控制器_通过 HTTP 响应直接发送数据。
ServletContext:
1.一个web应用只有一个ServletContext。
2,在web应用部署成功后,servlet容器为应用创建了ServletContext实例,当服务器关闭时,其才被释放。在web中,一个用户可以有多个request;一个用户有一个session,而ServletContext,是所有的用户共用一个。所以,ServletContext的存在,就是为了存放必须的、重要的、所有用户需要共享的、线程又是安全的一些资源信息,这样不仅节省了空间,还提高了效率。
消息转换器:
https://cloud.tencent.com/developer/article/1666635
Just a moment…
1.@RestController 注解即可将返回的数据结构转换成 Json 格式;@ResponseBody 注解是将返回的数据结构转换为 Json 格式。
2.要自定义JSON转换可以在相关配置类中重写configureMessageConverters方法。
基础配置:
application.properties配置文件的位置和顺序:
- 当前项目根目录下的 config 目录下
- 当前项目的根目录下
- resources 目录下的 config 目录下
- resources 目录下
按如上顺序,四个配置文件的优先级依次降低。如下:
SpringBoot 启动配置文件加载和参数配置修改问题_springboot 动态修改properties-CSDN博客
通过配置文件实现属性注入:
修改SpringBoot默认的启动图案_springboot项目启动动画-CSDN博客
properties版本:
法1:
法2:自定义属性配置文件
法3:
yaml文件的数组注入:
YAML 语言教程 - 阮一峰的网络日志
YAML文件是有序的。这意味着在YAML文件中,键值对的顺序是被保留的,并且在读取配置文件时会按照它们的出现顺序进行处理。
配置文件多环境区分:
嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种? - 爱撒谎的男孩 - 博客园
1.创建不同环境的配置文件:
既然每个环境的配置都不相同,索性将不同环境的配置放在不同的配置文件中,因此需要创建三个不同的配置文件,分别是application-dev.properties、application-test.properties、application-prod.properties。
「注意」:配置文件的名称一定要是application-name.properties或者application-name.yml格式。这个name可以自定义,主要用于区分。
此时整个项目中就有四个配置文件,加上application.properties。
2.指定运行的环境
虽然你创建了各个环境的配置文件,但是Spring Boot 仍然不知道你要运行哪个环境,有以下两种方式指定:
配置文件中指定:
在application.properties或者application.yml文件中指定,内容如下:
1 | 指定运行环境为测试环境 |
如果没有指定运行的环境,Spring Boot 默认会加载application.properties文件,而这个的文件又告诉Spring Boot 去找test环境的配置文件。
运行 jar 的时候指定:
Spring Boot 内置的环境切换能够在运行Jar包的时候指定环境,命令如下:
1 | java -jar xxx.jar --spring.profiles.active=test |
以上命令指定了运行的环境是test。
springboot关于tomcat的配置:
SpringBoot - 内置的Tomcat服务器配置详解(附:启用HTTPS服务) - 11014p - 博客园
1 | server.port:配置 Web 容器的端口号(默认为 8080) |
其中tomcat的配置选项还有https的配置选项。
自定义一个start:
整合视图:
整合web开发:
静态资源配置:
/** 表示可以匹配任意层级的路径;
1 |
|
在 Spring Boot 中,默认情况下,一共有5个位置可以放静态资源,五个路径分别是如下5个:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- /
第5个 / 其实就是表示 webapp 目录中的静态资源;如果同一个文件分别出现在五个目录下,那么优先级也是按照上面列出的顺序。
@ControllerAdvice 注解
以实现三个方面的功能:
- 全局异常处理
- 全局数据绑定
- 全局数据预处理
1 |
|
全局数据绑定功能可以用来做一些初始化的数据操作,我们可以将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样,在每一个 Controller 的接口中,就都能够访问导致这些数据。
全局数据预处理:
Model,ModelMap,ModelAndView的区别:
Model, ModelMap, and ModelAndView in Spring MVC | Baeldung
Model、ModelMap和ModelAndView的使用详解-CSDN博客(完整)
Model是一个接口,ModelMap类,ModelAndView是容器:
1 | Model is an interface that defines a holder for model attributes and is primarily designed for adding attributes to the model. It can supply attributes used for rendering views. To provide a view with usable data, we simply add this data to its Model object. Additionally, maps with attributes can be merged with Model instances. |
@ModelAttribute:
【Spring】@ModelAttribute三种使用场景_@modelattribute @valid-CSDN博客
1.用在Controller的方法上:
每次执行方法时都会先执行@ModelAttribute注解的方法(此时该注解修饰的方法是用来准备数据的),并将结果添加到model中。
@ModelAttribute(“top”)中的top是该Model的名字;
控制台结果:
2**.用在方法的参数上:**可以直接从指定的模型中中取值.标注在方法参数上的@ModelAttribute说明了该方法参数的值将由model中取得。如果model中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中所有名称匹配的参数都会填充到该参数中。
3.**用在ControllerAdvice的方法中:**每个Controller中的方法执行前都会先执行 @ModelAttribute注解标注的方法,并将返回值添加到model
SpringBoot2教程29整合SpringMVC之@InitBinder处理请求参数的绑定(一)
自定义异常处理:
springboot错误处理原理:
-
- SpringBoot 会自适应处理错误,响应页面或JSON数据
- 2.** SpringMVC的错误处理机制依然保留,MVC处理不了,才会交给boot进行处理**
静态异常页面:
动态异常页面:
动态页面模板,不需要开发者自己去定义控制器,直接定义异常页面即可 ,Spring Boot 中自带的异常处理器会自动查找到异常页面。
如果动态页面和静态页面同时定义了异常处理页面,例如 classpath:/static/error/404.html 和 classpath:/templates/error/404.html 同时存在时,默认使用动态页面。
自定义异常视图:
Custom Error Message Handling for REST API | Baeldung
解决跨域问题:
【精选】跨域请求被拒绝时,会进入后端接口执行吗? 对跨域有个全面的认知_跨域请求被拦截后怎么判断请求到达后端_Yionr的博客-CSDN博客(较长,有点废话)
1.所谓同源是指协议、域名以及端口要相同。
- 浏览器的跨域请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。
- 所谓跨域是指浏览器当前访问的界面和请求的界面不是同一个源
- 如果服务器没有配置CORS,则简单跨域请求可以成功执行,但是返回的内容会被浏览器拦截!
- 当我们使用阿里OSS存储访问图片的时候,大都情况下是访问图片的请求是跨域请求;但是阿里云后端解决了跨域问题,所以访问前端可以直接访问图片,而不用处理跨域问题。
解决跨域问题:
Springboot处理CORS跨域请求的三种方法_springmvc 中的请求转发 重定向 导致 cors-CSDN博客
法1:
1 | 1.可以通过 注解配置某一个方法(contrller类)接受某一个域的请求, |
法2:全局配置:
1 |
|
1 | 这里的.maxAge(30 * 1000)方法的含义是设置预检请求的响应可以被客户端缓存的时间,单位是毫秒。 |
自定义系统启动定时任务:
1.往spring容器中注入实现CommandLineRunner接口的bean.并重写run方法。
1 |
|
- 首先通过 @Compoent 注解将 MyCommandLineRunner1 注册为Spring容器中的一个 Bean。
- 添加 @Order注解,表示这个启动任务的执行优先级,因为在一个项目中,启动任务可能有多个,所以需要有一个排序。@Order 注解中,数字越小,优先级越大,默认情况下,优先级的值为 Integer.MAX_VALUE,表示优先级最低。
- 在 run 方法中,写启动任务的核心逻辑,当项目启动时,run方法会被自动执行。
- run 方法的参数,来自于项目的启动参数,即项目入口类中,main方法的参数会被传到这里。
其中启动项目参数的设置:
另一种方式,则是将项目打包,在命令行中启动项目,然后启动时在命令行传入参数,如下:
1 | java -jar devtools-0.0.1-SNAPSHOT.jar 三国演义 西游记 |
2.实现ApplicationRunner
ApplicationRunner 可以接收更多类型的参数(ApplicationRunner 除了可以接收 CommandLineRunner 的参数之外,还可以接收 key/value形式的参数)。
1 |
|
当项目启动时,这里的 run 方法就会被自动执行,关于 run 方法的参数 ApplicationArguments ,我说如下几点:
- args.getNonOptionArgs();可以用来获取命令行中的无key参数(和CommandLineRunner一样)。
- args.getOptionNames();可以用来获取所有key/value形式的参数的key。
- args.getOptionValues(key));可以根据key获取key/value 形式的参数的value。
- args.getSourceArgs(); 则表示获取命令行中的所有参数。
ApplicationRunner 定义完成后,传启动参数也是两种方式,参数类型也有两种,第一种和 CommandLineRunner 一致,第二种则是 –-key=value 的形式
或者使用 如下启动命令:
1 | java -jar devtools-0.0.1-SNAPSHOT.jar 三国演义 西游记 --age=99 |
整合Swagger2:
返回JSON数据:
@JsonIgnore
@JsonFormat
文件上传:
当个文件上传:
上传后实际文件的路径:
上面的文件夹是服务器每次重启后都会新建一个。之前我做过一个项目是将上传头像的功能,上传的头像放在静态资源的路径下,但是每次上传成功后头像要系统重启后才能访问!会产生这种情况的原因是:静态资源在web访问启动后会被打包在target目录的class目录下。更新的头像更新了原静态文件夹的内容,但是这是没有更新class目录下的图片,只能重启重新打包在 class文件下。因为前端访问的静态资源是打包后class路径下的静态资源,而非服务器我们创建用来存放头像的静态资源。我们可以通过把头像放在上面tomcat生成的文件夹,从而实现文件的实时更新。
理解tomcat启动创建的文件夹:
上面的文件夹是web服务启动时,在temp目录下创建的。
SpringBoot设置tomcat临时文件目录必要性 - 马非白即黑 - 博客园
tomcat temp目录作用-掘金
文件上传form表单中的entype="multipart/form-data"的理解:
multipart是多部分的意思。
entype="multipart/form-data"是一种指定表单数据的编码方式,它可以让表单同时发送文本和二进制数据,比如文件、图片等。这种编码方式将表单数据分成多个部分,每个部分都有自己的头信息和内容,这样服务器就可以根据头信息来解析不同类型的数据1。
配置类和XML:
拦截器:
整合Servlet,Filter,Listener:
路径映射:
配置AOP:
数据持久化:
JdbcTemplate:
mybatis:
【精选】使用tk-mapper(通用mapper)自动生成mybatis的mapper/实体/接口_mybatis tkmapper生成接口-CSDN博客
JPA:
nativeQuery = true是什么意思?_@query(nativequery = true_有翅膀的猫的博客-CSDN博客
Just a moment…
整合NoSql:
REST:
1.REST风格服务端不储存session,相关的信息要么要么通过客户端的token保存,要么保存在特点的redis中。
WebSocket:
SpringBoot + Vue 实现基于 WebSocket 的聊天室 - 掘金
STOMP 是一种简单的可互操作协议,设计用于通过中介服务器在客户端之间传递异步消息。它为这些客户端和服务器之间传递的消息定义了基于文本的有线格式。STOMP官方文档
1 | Spring Boot提供了WebSocket的支持,可以使用 注解来标注一个类, |