Spring Boot的作用
1:简化Spring应用开发的框架;
2:整个Spring技术栈的一个大整合;
3:J2EE开发的一站式解决方案;
Spring Boot 是 Spring 家族中的一个全新的框架,它用来简化 Spring 应用程序的创建和 开发过程,也可以说 Spring Boot 能简化我们之前采用 SpringMVC + Spring + MyBatis 框架进行开发的过程。 在以往我们采用 SpringMVC + Spring + MyBatis 框架进行开发的时候,搭建和整合三大框架,我们需要做很多工作,比如配置 web.xml,配置 Spring,配置 MyBatis,并将它们整合在 一起等,而 Spring Boot框架对此开发过程进行了革命性的颠覆,完全抛弃了繁琐的 xml 配置过程,采用大量的默认配置简化我们的开发过程。 所以采用 Spring Boot 可以非常容易和快速地创建基于 Spring 框架的应用程序,它让编码变简单了,配置变简单了,部署变简单了,监控变简单了。正因为 Spring Boot 它化繁为简,让开发变得极其简单和快速,所以在业界备受关注。
单体服务(all in one)
一个项目包含所有功能的应用程序,通常称为单体应用,或单体服务。
微服务
微服务是一种系统架构的设计风格,主旨是将原本复杂的系统拆分成多个独立的小型服务,每个服务维护自身的业务逻辑、数据处理及部署,服务与服务之间通过简单的通信协议进行通信(比如restfulAPI),不要求每个微服务使用同一种编程语言编写。现代开发模式正在从单体服务向微服务转变。
Java 微服务框架普遍用的是 Spring Cloud。微服务将系统拆分成多个小型服务,如果每个小型服务都用SSM搭建,那么多的配置,而且是重复配置和重复的搭建ssm不就麻烦了吗?所以这时候就使用到了Spring Boot来解决SSM搭建应用时候大量的手工配置问题,所以Spring Boot是一个快速搭建应用的框架,解决了SSM大量手工配置,不需要再去配置各种各样的文件了,直接一个Spring Boot构建起来就可以运行了。
1.创建一个工程,如图:
2.创建web模块
先创建一个模块
如图选择:
设置GAV坐标以及pom配置信息
选择 Spring Boot 版本及依赖
设置模块名称、Content Root 路径及模块文件的目录
点击 Finish,如果是第一次创建,在右下角会提示正在下载相关的依赖
项目创建完毕,如下图
static:存放静态资源,如图片、CSS、JavaScript 等
templates:存放 Web 页面的模板文件
application.properties/application.yml 用于存放程序的各种依赖模块的配置信息,比如Spring、springMVC、Mybatis、Redis 等。默认是空的。
mvn|mvnw|mvnw.cmd:使用脚本操作执行 maven 相关命令,可删除
gitignore:使用版本控制工具 git 的时候,设置一些忽略提交的内容,可删除
Springboot001Application.java:SpringBoot 程序执行的入口,执行该程序中的 main 方法,SpringBoot 就启动了
Spring Boot自动生成了POM文件,文件内容解析如下
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.0version>
<relativePath/>
parent>
<groupId>com.kaifamiaogroupId>
<artifactId>springboot001artifactId>
<version>0.0.1-SNAPSHOTversion>
<name>springboot001name>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>11java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
需求:浏览器发送hello请求,服务器接受请求并处理,响应hello spring boot字符串;
在Springboot001Application类所在的包下创建子包controller,在controller包中创建类Hello。
注意:新创建的类一定要位于 Springboot001Application同级目录或者下级目录,否则SpringBoot 加载不到。
package com.ltw.springboot001.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class Hello {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
return "hello spring boot";
}
}
解析:这个Controller就是SpringMVC中的Controller。hello方法返回的字符串被转换为json后响应给客户端。
Spring Boot为应用自动创建了Springboot001Application类,该类用于启动Spring Boot应用
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class Springboot001Application {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(Springboot001Application.class, args);
}
}
在 IDEA 中右键,运行 Springboot001Application类中的 main 方法。
通过在控制台的输出,可以看到启动 SpringBoot 框架,会启动一个内嵌的 tomcat,端 口号为 8080,上下文根为空
使用命令行也可以启动springboot,方法如下
第一步:打包
maven面板中双击生命周期中的package命令,自动打包
打包后的jar文件在target目录中
第二步:启动
打开控制台,进入打包后文件的目录,执行: java -jar xxxx.jar命令,启动spring boot项目
在浏览器中输入 http://localhost:8080/hello访问
父项目
父项目的作用:统一管理jar包的版本
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.0version>
<relativePath/>
parent>
他的父项目是
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.6.0version>
parent>
他来真正管理Spring Boot应用里面的所有依赖版本;
以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖还是需要声明版本号的)
启动器starter
启动器的作用:导入依赖的jar包
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring‐boot‐starter‐webartifactId>
dependency>
spring-boot-starter是spring-boot启动器,spring‐boot‐starter‐web帮我们导入了web模块正常运行所依赖的jar包;
Spring Boot将所有的功能都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter 相关功能的所有依赖都会导入进来。要用什么功能就导入什么功能的启动器。
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class Springboot001Application {
public static void main(String[] args) {
//Spring应用启动起来
SpringApplication.run(Springboot001Application.class, args);
}
}
@SpringBootApplication注解标注在某个类上,说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用;
将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到Spring容器;因此
注意:新创建的类一定要位于 Springboot001Application同级目录或者下级目录,否则SpringBoot 加 载不到。
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
application.properties(默认采用该文件)
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
需求:更改spring boot 端口号为8888,上下文路径为springboot
使用两种方式实现
新建模块,名称:springboot002
修改application.properties配置文件
server.port=8888
server.servlet.context-path=/springboot
首先注释掉application.properties配置文件
#server.port=8888
#server.servlet.context-path=/springboot
然后创建application.yml文件,并配置如下
server:
port: 8888
servlet:
context-path: /springboot
注意:
1:当两种格式配置文件同时存在,properties 配置文件优先级高于yml配置文件;
2:两种配置文件以增量配置的方式改变springboot的默认运行行为;
可以导入配置文件处理器,以后编写配置就有提示了
<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring‐boot‐configuration‐processorartifactId>
<optional>trueoptional>
dependency>
YAML(YAML Ain’t Markup Language)
yml 是一种 yaml 格式的配置文件,主要采用一定的空格、换行等格式排版进行配置。 yaml 是一种直观的能够被计算机识别的的数据序列化格式,容易被人类阅读,yaml 类 似于 xml,但是语法比 xml 简洁很多,值与前面的冒号配置项必须要有一个空格, yml 后缀也可以使用 yaml 后缀。
在实际开发的过程中,我们的项目会经历很多的阶段(开发->测试->上线),每个阶段 的配置也会不同,例如:端口、上下文路径、数据库等,那么这个时候为了方便在不同的环境之间切换,SpringBoot 提供了多环境配置,具体步骤如下:
1.为每个环境创建一个配置文件,命名必须以 application-环境标识.properties
application-dev.properties
#开发环境,端口号8082
server.port=8082
application-product.properties
#生产环境,端口号8080
server.port=8080
application-test.properties
#测试环境,端口号8083
server.port=8083
2.激活核心配置文件
在总配置文件 application.properties 进行环境的激活
#激活开发环境
#spring.profiles.active=dev
#激活生产环境
#spring.profiles.active=product
#激活测试环境
spring.profiles.active=test
1.为每个环境创建一个配置文件,命名必须以 application-环境标识.yml
application-dev.yml
#开发环境,端口号8082
server:
port: 8082
application-product.yml
#生产环境,端口号8080
server:
port: 8080
application-test.yml
#测试环境,端口号8083
server:
port: 8083
2.激活核心配置文件
#激活开发环境
spring:
profiles:
active: dev
问:你开发的电子商务系统,在用户集中高并发访问期间发生丢单,你又该如何快速、准确地进行定位分析和解决呢?
答:查阅日志找出问题,解决问题。日志对一个系统运行状况的记录是是否重要的,是一个系统的重要模块。
问:那么日志应该记录什么呢?
答: 时间- 线程名 - 日志等级 -日志输出位置(全类名,可以精确到方法名):日志信息
例如:
2021-01-01 11:49:20.296-[Thread-initRedis21504][INFO]-
com.ltw.LoginController.initLogInfo:ycdl[User] is logining
问:如何对不同的日志信息进行等级划分?
答:日志等级通常分为六种:TRACE、DEBUG、INFO、WARN、ERROR、FATAL。依次从低到高,在开发过程中哪些信息需要设置为哪种等级有赖于开发者的自己判断。
紧急错误 fatal,表示需要立即被处理的系统级错误,这属于最严重的日志级别
错误 error,影响到程序正常运行、当前请求正常运行的异常情况,如
资源依赖加载失败导致程序无法启动代码抛出未处理的异常,导致程序终止
警告 warn,应该出现但是不影响程序、当前请求正常运行的异常情况,一般打在有容错机制的时候出现的错误情况,如请求参数未按照预定格式传入,系统资源占用达到警戒线
信息 info,记录程序运行的信息,如流程步骤、调用参数、调用结果等,如调用第三方服务时,info信息是十分必要的,因为我们很难追溯到第三方模块发生的问题对于复杂的业务逻辑,需要记录程序的运行流程,检测程序是否按正常逻辑执行
调试 debug,用于开发调试代码,可以记录想要知道的全部信息,但是不能一直出现在生产环境,需要通过开关控制或者在上线前移除调试日志
追踪 trace,特别详细的系统运行完成信息,一般不要出现在生产环境
抽象层框架有:
JCL(Jakarta Commons Logging)
SLF4j(Simple Logging Facade for Java)
jboss-logging
实现层框架有:
Log4j
JUL(java.util.logging)
Log4j2
Logback
一般使用日志框架时,选择一个抽象层框架,再选择一个实现层框架,一起使用。日志记录方法的调用,不应该来直接调用实现层日志的方法,而是调用抽象层日志的方法;
SpringBoot选用的是 SLF4j和logback组合,顺便告诉你SpringBoot底层的Spring框架默认用的是JCL框架。
日志记录模板
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
Logger logger = LoggerFactory.getLogger(UserService.class);
public void save(User user){
logger.info("日志内容");
}
}
SpringBoot选用的是 SLF4j和logback组合作为默认日志框架。
spring boot默认已经配置好了日志。
当我们启动spring boot框架时,在控制台就输出了spring boot默认配置的日志,如下图:
spring boot如果需要引入其他框架(如spring框架),其他框架中也有默认的日志框架,导致日志框架冲突,怎么办呢?
办法是所有框架统一使用spring boot的SLF4J框架。
例如
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring‐coreartifactId>
<exclusions>
<exclusion>
<groupId>commons‐logginggroupId>
<artifactId>commons‐loggingartifactId>
exclusion>
exclusions>
dependency>
由于spring boot已经配置好了日志框架,我们在spring boot中可以直接使用spring boot配置好的日志。
记录日志首先创建日志记录器,由日志记录器负责具体记录日志。
//日志记录器logger
Logger logger = LoggerFactory.getLogger(类名.class);
LoggerFactory是日志记录器工厂类,负责创建日志记录器
在getLogger()方法中传入哪个类的元数据,就记录哪个类的日志
在测试类中输出日志
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot006ApplicationTests {
//日志记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
try}
//记录器记录日志和日志级别
logger.trace("跟踪运行轨迹日志");
logger.debug("调试日志");
logger.info("信息日志");
logger.warn("警告日志");
}catch(Exception e){
logger.error("错误日志");
}
}
}
运行测试类,输出信息如下
在开发中,我们使用日志记录器就可以记录开发中的日志信息了。
观察日志结果,只看到了info,warn,error级别的日志输出。
spring boot默认输出info级别的日志,当输出info级别日志时,高于info级别的日志都会输出。
调整日志输出级别,需要在application.properties配置文件中配置输出级别。
application.properties中配置日志输出级别
#com.ltw包下的类输出trace级别的日志
logging.level.com.ltw=trace
配置了com.ltw包下的类输出级别为trace
发现高于trace级别的日志都输出了。
在application.properties中将Mapper接口所在的包设置日志输出级别为info
logging.level.com.kaifamiao.mapper=info
就实现了在spring boot中输出mybatis的sql语句
默认日志输出到了控制台,控制台的日志清空后就不见了,那你以后维护系统时就查不到日志了。
在application.properties配置文件中可以配置日志输出到文件中,以永久保存日志。
#日志文件保存到当前项目根目录下的springboot006.log文件中
logging.file.name=springboot006.log
再次测试,在项目的根目录下生成一个名称为springboot006.log的日志文件,打开该文件,里面记录的日志如下:
还可以指定日志文件的绝对路径,修改application.properties配置文件,设置日志文件存储在D:/springboot006.log
#日志文件保存到d:/springboot006.log
logging.file.name=d:/springboot006.log
还可以使用logging.file.path指定日志文件存储的位置
#此设置将日志文件保存到当前项目根目录下的springboot/log目录下,
#文件名是springboot指定的默认文件名,为spring.log
logging.file.path=springboot/log
如果logging.file.path和logging.file.name同时设置,
logging.file.name配置生效,
logging.file.path不生效。
提示:
日志输出到控制台:适合于开发模式
日志输出到文件,适合于生产模式
Spring Boot 官方推荐优先使用logback-spring.xml文件名作为你的日志配置文件,并且放在src/main/resources 目录下。
spring boot自动加载logback-spring.xml配置文件,并按照该配置文件输出日志。
logback-spring.xml配置文件参考代码
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<property name="LOG_HOME" value="app/log" />
<property name="appName" value="springboot">property>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debuglevel>
filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ---> [%thread] --->
%-5level %logger{50} - %msg%npattern>
springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} === [%thread] ===
%-5level %logger{50} - %msg%npattern>
springProfile>
layout>
appender>
<appender name="appLogAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${appName}.logfile>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-
%i.logfileNamePattern>
<MaxHistory>365MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ]
[ %logger{50} : %line ] - %msg%npattern>
layout>
appender>
<logger name="com.kaifamiao.mapper" level="debug">logger>
<root level="INFO">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
root>
configuration>
解析:
每个一< appender>标签表示一种日志的输出位置,本例配置了两个日志输出位置
< appender-ref ref=“stdout” />配置了日志输出到控制台
< appender-ref ref=“appLogAppender” />配置了日志输出到文件
< root level=“INFO”>配置的是默认输出级别INFO
模板引擎作用:
(1)将html和数据绑定
(2)实现前后端分离。前后分离要求前端是非编译型的模板,因此非编译型的模板有取代编译型的模板的趋势。JSP是编译型的,Thymeleaf是非编译型的模板。
springboot支持的模板引擎
JSP
Velocity
Freemarker
Thymeleaf(spring boot推荐的模板引擎)
新建模块,名称:springboot003
由于springboot默认支持的模板是thymeleaf,因此jsp作为模板引擎时需要手动设置,设置内容如下:
(1)导入springboot内嵌的 Tomcat 对 JSP 的解析包
<dependency>
<groupId>org.apache.tomcat.embedgroupId>
<artifactId>tomcat-embed-jasperartifactId>
dependency>
(2)导入servlet-api 的jar包
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
dependency>
(3)导入jsp-api的jar包
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
(4)导入jstl的jar包
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
dependency>
在 src/main 下创建一个 webapp 目录
以在File>Project Structure中指定webapp 为 Web Resource Directory
SpringBoot 要求 jsp 文件必须编译到指定的 META-INF/resources 目录下才能访问,否则 访问不到。
<resources>
<resource>
<directory>src/main/webappdirectory>
<targetPath>META-INF/resourcestargetPath>
<includes>
<include>**/*.*include>
includes>
resource>
resources>
配置jsp的前后缀,相当于springmvc里的视图解析器。
在application.properties中配置
#配置端口号和上下文路径
server.port=9090
server.servlet.context-path=/
#配置 SpringMVC 视图解析器。其中:/ 表示目录为 src/main/webapp
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
在yml中配置
#配置端口号和上下文路径
server:
port: 9090
servlet:
context-path: /
#配置 SpringMVC 视图解析器,其中:/ 表示目录为 src/main/webapp
spring:
mvc:
view:
prefix: /
suffix: .jsp
@Controller
public class Hello {
@RequestMapping("/hello")
public String hello(Model model){
model.addAttribute("message","hello spring boot");
return "hello";
}
}
在webapp目录下创建hello.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${message}
</body>
</html>
Thymeleaf 是一个流行的模板引擎,该模板引擎采用 Java 语言开发。
模板引擎是一个技术名词,是跨领域跨平台的概念,在 Java 语言体系下有模板引擎, 在 C#、PHP 语言体系下也有模板引擎,甚至在 JavaScript 中也会用到模板引擎技术,Java 生 态下的模板引擎有Thymeleaf 、Freemaker、Velocity、Beetl(国产) 等。
Thymeleaf 对网络环境不存在严格的要求,既能用于 Web 环境下,也能用于非 Web 环 境下。在非Web 环境下,他能直接显示模板上的静态数据;在 Web 环境下,它能像 Jsp 一 样从后台接收数据并替换掉模板上的静态数据。它是基于HTML 的,以 HTML 标签为载体, Thymeleaf 要寄托在 HTML 标签下实现。
SpringBoot 集成了 Thymeleaf 模板技术,并且 Spring Boot 官方也推荐使用 Thymeleaf 来 替代 JSP技术,Thymeleaf 是另外的一种模板技术,它本身并不属于 Spring Boot,Spring Boot 只是很好地集成这种模板技术,作为前端页面的数据展示,在过去的 Java Web 开发中,我 们往往会选择使用 Jsp 去完成页面的动态渲染,但是 jsp 需要翻译编译运行,效率低。
新建模块,名称:springboot004
选择Spring Web模块
选择Thymeleaf模块
按照这种方式创建后,pom.xml 文件下会自动引入thymeleaf和web依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
在 Spring boot 的核心配置文件 application.properties 中对 Thymeleaf 进行配置
配置前缀
#thymeleaf 模版前缀,默认可以不写
spring.thymeleaf.prefix=classpath:/templates/
配置后缀
#thymeleaf 模版后缀,默认可以不写
spring.thymeleaf.suffix=.html
注意: Springboot 使 用 thymeleaf 作 为 视 图 展 示 , 约 定 将 模 板 文 件 放 置 在src/main/resource/templates 目录下,静态资源放置在 src/main/resource/static 目录下
(1)创建控制器
@Controller
public class Hello {
@RequestMapping("/hello")
public String hello(Model model){
model.addAttribute("name","thymeleaf");
model.addAttribute("age","20");
return "index";
}
}
(2)创建index.html文件
在 src/main/resources 的 templates 下新建一个 index.html 页面用于展示数据
(3)导入thymeleaf的名称空间
在index.html页面中导入命名空间
<html lang="en" xmlns:th="http://www.thymeleaf.org">
(4)使用thymeleaf显示数据
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${name}">时迁</h1>
<h1 th:text="${age}">30</h1>
</body>
</html>
解析:
首先重新启动Spring Boot,测试/hello,运行下面代码,观察运行结果。
<body>
<h1 th:text="${name}">时迁</h1>
<h1 th:text="${age}">30</h1>
</body>
现在向页面中添加一个年龄新行
<body>
<h1 th:text="${name}">时迁</h1>
<h1 th:text="${age}">30</h1>
<h1 th:text="${age}">30</h1>
</body>
刷新/hello页面,数据没有更新,原因是Thymeleaf显示的是缓存数据。
重写启动SpringBoot应用,再次刷新页面,数据更新了。
如果每次修改的html页面都要重新启动SpringBoot显得太麻烦。
通过以下两步解决刷新问题
提示:在开发模式下建议关闭缓存,在生产模式下建议开启缓存
第一步:关闭缓存
#thymeleaf 页面的缓存开关,默认 true 开启缓存
#建议在开发阶段关闭 thymeleaf 页面缓存,否则刷新页面时不会获取最新数据,而是使用缓存的数据。在生产阶段开启缓存
spring.thymeleaf.cache=false
第二步:设置update操作
设置后重新启动SpringBoot应用
然后刷新/hello页面,显示了最新数据
现在再添加一行显示年龄
<body>
<h1 th:text="${name}">时迁</h1>
<h1 th:text="${age}">30</h1>
<h1 th:text="${age}">30</h1>
<h1 th:text="${age}">30</h1>
</body>
然后刷新页面,缓存没有了,页面数据更新了。
提示:如果不禁用缓存,就需要每次更新页面后要重新启动Spring boot。
提示:手动也可以清除浏览器缓存,对于chrome浏览器,使用快捷键ctrl+shift+del,或者在菜单中执行清除浏览数据
关于Thymeleaf的语法规则,在下一篇博客里面Thymeleaf语法规则