Springboot整合Thymeleaf并详解热部署

简介: thymeleaf

前言

  • Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎
  • Spring官方支持的服务的渲染模板中,并不包含jsp。而是Thymeleaf和Freemarker等,而Thymeleaf与SpringMVC的视图技术,及SpringBoot的自动化配置集成非常完美,几乎没有任何成本,你只用关注Thymeleaf的语法即可。
  • Thymeleaf支持html原型,浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示

POM.XML

这里添加了spring-boot-devtools来使Spring Boot应用支持热部署

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><!-- 这个需要为 true 热部署才有效 --></dependency><!-- spring-boot-starter-thymeleaf --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId><version>2.2.2.RELEASE</version></dependency>

image.gif

可以看一下SpringBoot自动配置的路径

image.gif1.png

说明:

(1) devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现),实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。

即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的

(2)配置了true后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。

application.properties

#thymeleaf 配置
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
#缓存设置为false, 这样修改之后马上生效,便于调试
spring.thymeleaf.cache=false
#设置重启的目录
#spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的文件夹内容修改不重启
#spring.devtools.restart.exclude: static/**
#上下文
#server.context-path=/thymeleaf

image.gif

IDEA设置

当我们修改了Java类后,IDEA默认是不自动编译的,而spring-boot-devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译:

(1)File-Settings-Compiler-Build Project automatically

image.gif2.png

(2)ctrl + shift + alt + /,选择Registry,勾上 Compiler autoMake allow when app running

image.gif3.png

此时实现的效果就是:修改类和配置文件应用会重启,修改页面应用不会重启,但会重新加载,页面会刷新。

通常情况下我不希望一修改它就重启,所以不使用自动编译,而是手动使用Ctrl+F9来重新编译

测试ThymeLeaf

首先在templates下新建index.html页面,如果没有templates文件夹就自己新建一个

index.html:

<!DOCTYPEhtml><htmllang="en"xmlns:th="http://www.w3.org/1999/xhtml"><head><metacharset="UTF-8"><title>首页</title></head><body><pth:text="${tips}"></p></body></html>

image.gif

controller:

@Controller@RequestMapping("/indexManage")
publicclassIndexController {
@RequestMapping("/toIndex")
publicStringtoIndex(Modelmodel){
model.addAttribute("tips","Hello Thymeleaf");
return"index";
    }
}

image.gif

访问:http://localhost:8080/indexManage/toIndex

image.gif4.png

扩展:Thymeleaf其他用法

    • thymeleaf引入js、css文件:
    <scripttype="text/javascript"src="../js/jquery.js"th:src="@{../js/jquery.js}"></script>

    image.gif

    使用 @这种方式引入,在渲染后的html 里会自动生成 上下文路径,此demo没有上下文路径。

    如果使用浏览器直接打开当前的 hello.html, 依然可以看到css 和 js 效果,因为前面正常的src语句会起作用

    image.gif5.png

      • 几种常用的语法

      1、获取对象的属性值

       新建POJO

      publicclassStudent {
      privateIntegerid;
      privateStringsname;
      privateIntegerage;
      getter...  setter...
      }

      image.gif

      修改Controller:

      @Controller@RequestMapping("/indexManage")
      publicclassIndexController {
      @RequestMapping("/toIndex")
      publicStringtoIndex(Modelmodel){
      Studentstudent=newStudent();
      student.setSname("亚瑟");
      model.addAttribute("student",student);
      return"index";
          }
      }

      image.gif

      在页面中获取对象的属性值:

      你好!<pth:text="${student.sname}"></p>

      image.gif

      image.gif6.png

      2、包含其他页面

      th:fragment   th:replace

      新建include.html

      <!DOCTYPEhtml><htmllang="en"xmlns:th="http://www.w3.org/1999/xhtml"><head><metacharset="UTF-8"><title>Title</title></head><body><footerth:fragment="footerOne">Copyright</footer><footerth:fragment="footerTwo(start,end)"><pth:text="|${start} - ${end} All Rights Reserved|"></p></footer></body></html>

      image.gif

      在index页面使用

      <div><divth:replace="include::footerOne"></div><divth:replace="include::footerTwo(2014,2020)"></div></div>

      image.gif

      image.gif7.png

      3、条件判断 th:if

      Thymeleaf 的条件判断是 通过 th:if 来做的,只有为真的时候,才会显示当前元素

      在model中添加一个boolean数据

      booleanflag=true;
      model.addAttribute("flag",flag);

      image.gif

      在index页面中外层div使用:

      <divth:if="${flag}"><divth:replace="include::footerOne"></div><divth:replace="include::footerTwo(2014,2020)"></div></div>

      image.gif

      取反可以用th:if="${not flag}, 或者用th:unless="${flag}

      不只是布尔值的 true 和 false, th:if 表达式返回其他值时也会被认为是 true 或 false,规则如下:

      boolean 类型并且值是 true, 返回 true

      数值类型并且值不是 0, 返回 true

      字符类型(Char)并且值不是 0, 返回 true

      String 类型并且值不是 "false", "off", "no", 返回 true

      不是 boolean, 数值, 字符, String 的其他类型, 返回 true

      值是 null, 返回 false

      4、th:each 遍历

      修改controller    记得在Student中添加构造方法

      @RequestMapping("/toIndex")
      publicStringtoIndex(Modelmodel){
      List<Student>students=newArrayList<>();
      students.add(newStudent(1,"张三",16));
      students.add(newStudent(2,"李四",17));
      students.add(newStudent(3,"王五",18));
      model.addAttribute("students",students);
      return"index";
          }

      image.gif

      index页面:

      <table><thead><tr><th>id</th><th>姓名</th><th>年龄</th></tr></thead><tbody><trth:each="student: ${students}"><tdth:text="${student.id}"></td><tdth:text="${student.sname}"></td><tdth:text="${student.age}"></td></tr></tbody></table>

      image.gif

      image.gif8.png

      相关文章
      |
      缓存 Java Spring
      IDEA中配置HTML和Thymeleaf热部署的步骤
      以上就是在IntelliJ IDEA中配置HTML和Thymeleaf热部署的步骤。这样的配置可以大大提高你的开发效率,让你更专注于代码的编写,而不是等待应用的重启。希望这个指南对你有所帮助!
      1212 21
      |
      SQL Java 测试技术
      在Spring boot中 使用JWT和过滤器实现登录认证
      在Spring boot中 使用JWT和过滤器实现登录认证
      1311 0
      |
      JSON fastjson Java
      FastJson 完全学习指南(初学者从零入门)
      摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
      3994 77
      |
      11月前
      |
      机器学习/深度学习 人工智能 前端开发
      终端里的 AI 编程助手:OpenCode 使用指南
      OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
      61185 11
      |
      缓存 监控 数据可视化
      |
      缓存 安全 Java
      Spring Boot 3 集成 Spring Security + JWT
      本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
      8058 14
      Spring Boot 3 集成 Spring Security + JWT
      |
      存储 前端开发 JavaScript
      毕业设计|基于SpringBoot+VUE的开源云盘系统
      毕业设计|基于SpringBoot+VUE的开源云盘系统
      1679 2
      |
      JSON 安全 数据可视化
      Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
      Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
      6919 0
      |
      网络协议 Java 应用服务中间件
      Tomcat中的WebSocket是如何实现的?
      【10月更文挑战第7天】本文介绍了WebSocket在Tomcat中的实现,包括其全双工通信、单个TCP连接、协议升级和事件驱动的特点。通过Spring Boot项目整合WebSocket,展示了如何配置依赖、创建WebSocket处理类和配置类。详细解析了WebSocket的原理,包括ServerEndpointExporter的注册过程和请求处理流程。总结了WebSocket与HTTP请求处理的区别,并提供了进一步学习的资源。
      Tomcat中的WebSocket是如何实现的?
      |
      Kubernetes 负载均衡 网络协议
      K8s如何实现服务发现与配置管理
      K8s在实现负载均衡与配置管理上的原理是咋样的呢?

      热门文章

      最新文章