当前位置: 首页 > news >正文

SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)

学习本技术第一件事:你为什么要使用,解决什么问题的?

1.为什么使用(使用背景)?

首先应用场景是单体项目,如果是前后端分离就不用关注这个了,因为单体项目你前后端都是写在一个项目里面的,也就是说你访问的地址都是controller的地址,然后controller再通过是解析器ViewResolver去解析视图找到你对应的html文件,一般前后端分离项目,你浏览器地址一定是前端项目的地址,并且基本上后端controller层使用的注解都是@RestController,是返回的数据,不会走视图解析器,现在基本上都是前后端分离,但是很多小公司还是很多前后端不分离,懂得都懂,公司穷的一批,不愿意花钱,后端既担任后端,又担任前端,还担任运维和测试,他奶奶的,最恶心的还是前端的框架,他喵的混合使用了很多种一点都不规范,简直不要太屎山,要不是为了这点米,我早跑路了。简单画个图看一下。

单体项目的访问

前后端就不介绍了。
 

接下来说一下为什么使用?有这样一种场景,我当我访问后端/test/login时返回login字符串,实际上会走视图解析器就会转发到login.html,但是呢我现在后端无法通过return返回给前端数据吧,因为return返回的是一个页面,但是呢我想去动态根据一些条件去渲染页面,那此时你写的静态html文件就无法解决这个问题对吧,因为静态数据就是死的,除非你访问后端获取数据去渲染,这种一般都是后端方法上加上了@Responsebody返回数据,不走视图解析器,但是我现在就是有这样一种需求:你访问后端——>转发到前端——>前端需要动态渲染页面。这个时候就需要用到我们的thymeleaf了。

总结需求问题:你访问后端/test/login——>转发到前端login.html——>前端需要动态渲染页面

解决:通过thymeleaf去解决。它是如何解决这个问题的?

其实简单来说,我后端在转发login.html的同时,我返回给前端一个model(也就是键值对)数据,前端使用${key}的形式取出来就是了,这样就实现了。

就这么简单,一般比如按条件去动态渲染,其实就是在后端在model.addAttibute的时候,按条件去添加就可以了。

上面主要是你得理解什么时候才会用thymeleaf,单体项目前后端不分离,小公司,开发周期短,任务重,需要动态渲染页面。

2.如何在SpringBoot项目中引入Thymeleaf

2.1引入thymeleaf依赖

thymeleaf是一个模板引擎,很抽象的名词,我一般很烦这种名字,简单理解就是将动态数据和模板结合渲染生成最终的页面,再形象一点就是这类似于汽车引擎将燃料和空气转化为动力,模板引擎将数据和模板转化为网页内容。

首先SpringBoot是支持Thymeleaf的,内部已经对Thymeleaf模板的版本进行控制了。此处只需要引入起步依赖即可。可以点开看一下。

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

2.2配置application.yml文件

我们的静态html文件要放到templates目录下面,因为它默认访问的路径也就是prefix就是templates,后缀是.html,所以下面这个配置可以不用配置,此处想让大家知道,它的配置属性类是哪个,ctrl+鼠标点击prefix,会进入它的属性配置类ThymeleafProperties。

spring:thymeleaf:prefix: classpath:/templates/suffix: .html

可以看到它很多已经有默认值了,我们都不用配置,但是我们要知道怎么查看,其他的查看方式也是如此,并且查看它的所有配置属性类更有利于我们去了解这个技术。

2.3创建html文件

我这里直接告诉大家一个简单方法,因为我们创建完普通的html文件还要引入thymeleaf,你每创建一个文件都要引入比较麻烦,所以直接创建一个模板文件,这样每次直接创建这个模板文件即可

其实就加了一个东西,xmlns="http://www.thymeleaf.org",因为你不引入你就无法使用它的动态属性,这样我们再创建文件就可以右键选择我们定制的模板。

类似的还有mapper的映射文件,它的头部也需要这样定制一个模板。

2.4如何使用前端和后端

2.4.1前端

此处我只介绍某一个写法,其他可以自己去尝试或去b站看相关博主的视频系统的学习。

th:xxx="${key}",至于这个xxx是什么有很多,每种也有不同的用法和意思。

​​​​​​​

例如:th:text="${titleName}",就是给标签的内容赋值,如果你后端的model没有titleName前端也不会报错。容错性也很好,不会说没有导致前端页面瘫痪。

2.4.2后端

2.4.3结果展示

可见“默认的title”已经被动态的替换掉了。

3.总结

你可以不熟练,毕竟我们是搞后端的,而且就算是全栈,也是前后端分离的,也不会用thymeleaf,直接就是返回数据,但是呢,我们要能看懂别人写的,毕竟有的公司项目已经经过了很多人的手了,能看懂它写的就行,然后慢慢去模仿他们使用就行,接下来自己去学习一下thymeleaf的各种常用的属性操作即可。

相关文章:

SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)

学习本技术第一件事&#xff1a;你为什么要使用&#xff0c;解决什么问题的&#xff1f; 1.为什么使用&#xff08;使用背景&#xff09;&#xff1f; 首先应用场景是单体项目&#xff0c;如果是前后端分离就不用关注这个了&#xff0c;因为单体项目你前后端都是写在一个项目…...

Docker突然宣布:涨价80%

从11月15日起&#xff0c;Docker的付费订阅中Pro和Team的价格都将大幅上调&#xff1a;Pro从原来的5美元每月激增到9美元每月&#xff0c;直接涨了80%&#xff1b;而Team也从之前的9美元每月来到15美元每月&#xff0c;涨价66.7%。只有Business保持此前的24美元每月不变。 同时…...

工厂方法模式和抽象工厂模式

工厂方法模式 一个工厂只能创建一种产品 工厂方法模式的结构 工厂方法模式包含以下4个角色 Product&#xff08;抽象产品&#xff09; ConcreteProduct&#xff08;具体产品&#xff09; Factory&#xff08;抽象工厂&#xff09; ConcreteFactory&#xff08;具体工厂…...

【星海出品】go语言环境兼install

官网 https://golang.google.cn/dl/ go的安装包下载地址 https://go.dev/dl/ set GO111MODULEon //是否以Go modules的模式运行项目 auto,on,off set GOARCHamd64 //目标可执行程序操作系统构架 包括 386&#xff0c;amd64&#xff0c;arm set GOBIN //项目的第三方可执行文件目…...

Spring 源码解读:自定义实现BeanPostProcessor的扩展点

引言 在Spring的生命周期管理中&#xff0c;BeanPostProcessor是一个非常重要的扩展点。它允许开发者在Bean初始化的前后插入自定义的逻辑&#xff0c;从而实现更灵活的Bean管理。BeanPostProcessor是Spring框架中用于对Bean实例进行修改的机制之一。通过实现该接口&#xff0…...

Spring Boot-分布式系统问题

Spring Boot 在分布式系统中的常见问题及解决方案 随着互联网的发展&#xff0c;系统规模和复杂度越来越大&#xff0c;分布式系统成为应对高并发、大数据量场景的重要架构选择。Spring Boot 作为一种轻量级的开发框架&#xff0c;广泛应用于构建微服务和分布式系统中。然而&a…...

面试题总结(三) -- 内存管理篇

面试题总结(三) – 内存管理篇 文章目录 面试题总结(三) -- 内存管理篇<1> C 中堆内存和栈内存的区别是什么&#xff1f;<2> 如何在 C 中手动管理内存&#xff08;new/delete 操作符&#xff09;&#xff1f;<3> C 中内存泄漏的原因和避免方法<4> 谈谈…...

Qt 定时器-定时备份

定时备份 在Qt 中&#xff0c;可以使用QTimer类来实现定时备份功能。以下是一个示例代码&#xff0c;每隔一段时间自动执行备份操作&#xff1a; #include <QTimer>QTimer timer; int backupInterval 24 * 60 * 60 * 1000;//备份间隔为24小时connect(&timer, &…...

天融信把桌面explorer.exe删了,导致开机之后无windows桌面,只能看到鼠标解决方法

win10开机进入桌面&#xff0c;发现桌面无了&#xff0c;但是可以ctrlaltdelete调出任务管理器 用管理员权限打开cmd&#xff0c;输入&#xff1a; sfc /scanfilec:\windowslexplorer.exe 在运行C:\windows\Explorer.exe&#xff1b;可以进入桌面&#xff0c;但是隔离几秒钟…...

视频分割操作教程

1、打开剪映 2、点击开始创作上面的“”&#xff0c;选择视频&#xff0c;点击添加按钮&#xff0c;导入一个视频素材到剪映 3、滑动视频&#xff0c;让视频竖线到合适位置 4、点击视频&#xff0c;出现白色边框 5、点击工具栏“分割”&#xff0c;然后点击需要删除的视频部分 …...

唯品会大数据面试题及参考答案(3万字长文)

synchronized 和 volatile 的区别 synchronized是 Java 中的关键字,用于实现同步机制,确保在同一时刻只有一个线程可以访问被它修饰的代码块或方法。volatile也是 Java 中的关键字,主要用于保证变量的可见性。 功能方面: synchronized可以保证原子性、可见性和有序性。它通…...

使用容器技术快速入门MinIO

使用容器技术快速入门MinIO 使用容器技术&#xff08;docker或者podman&#xff09;快速部署一个单节点单磁盘 MinIO 服务器&#xff0c;用于对MinIO对象存储及其兼容 S3 的 API 层进行早期的开发和评估。 1. 准备工作 机器已经安装了 Podman 或者 Docker 。 对用于持久卷的…...

ros2教程(一):使用python和C++发布摄像头原始图像和压缩图像

1. 使用python发布图像 在ROS 2中&#xff0c;可以通过使用rclpy库来发布压缩图像和原始图像。发布原始图像可以使用sensor_msgs.msg.Image消息类型&#xff0c;压缩图像则使用sensor_msgs.msg.CompressedImage消息类型。 #!/usr/bin/env python3# function: usbcam publish r…...

【自动化测试】UI自动化的分类、如何选择合适的自动化测试工具以及其中appium的设计理念、引擎和引擎如何工作

引言 UI自动化测试主要针对软件的用户界面进行测试&#xff0c;以确保用户界面元素的交互和功能符合预期 文章目录 引言一、UI自动化的分类1.1 基于代码的自动化测试1.2 基于录制/回放的自动化测试1.3 基于框架的自动化测试1.4 按测试对象分类1.5 按测试层次分类1.6 按测试执行…...

深入理解Python中的“_,”:一个实用的语法特性

在Python编程中&#xff0c;你可能经常会看到一个特殊的标识符“_”。这个符号在Python中有多种用途&#xff0c;其具体含义依上下文而定。本文将探讨其中一种常见用法——作为一个临时性的占位符——并解释它在实际编程中的实用性和应用场景。 1. “_”作为占位符 在Python中…...

Mac清理其他文件:释放存储空间的高效指南

每个Mac用户都可能遇到存储空间不足的问题&#xff0c;尤其是当“其他”文件积累到一定体积时。在Mac上&#xff0c;“其他”文件通常包括各种系统文件、缓存、文档以及不被归类为应用程序、照片、电影或音乐的其他类型的文件。这些文件往往不易被注意&#xff0c;但逐渐占用了…...

html+css+js网页设计 旅游 龙门石窟4个页面

htmlcssjs网页设计 旅游 龙门石窟4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…...

CISSP一站通关

依托轻速云维护了一个专注于CISSP备考通关的在线学习平台&#xff0c;提供知识串讲视频&#xff0c;配合大量针对性的习题和重难点习题解析&#xff0c;帮助备考学习者高效学习和巩固知识点。已经帮助100考友顺利通过考试。 知识串讲视频是我主讲的5天直播课程的录屏&#xff0…...

Golang | Leetcode Golang题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; func reconstructQueue(people [][]int) (ans [][]int) {sort.Slice(people, func(i, j int) bool {a, b : people[i], people[j]return a[0] > b[0] || a[0] b[0] && a[1] < b[1]})for _, person : range people {idx : pe…...

【我的Android进阶之旅】解决CardView四个圆角有白边的问题

文章目录 一、问题描述二、分析CardView出现白边的原因三、如何解决这个问题?3.1 如何修复?3.2 为什么这样可以修复?3.3 示例代码3.4 总结一、问题描述 在实现一个RecycleView的Item时候,样式需要用到卡片式效果,于是想到用CardView来实现,但是最终发现运行出来的效果,…...

学习笔记JVM篇(四)

垃圾回收器 说完垃圾回收算法接下来就需要对应的垃圾回收器去回垃圾回收器。接下来介绍几种垃圾回收器 1、Serial 串行回收器&#xff0c;是单线程版本&#xff0c;暂停所有的应用。在单CPU的情况下效率是很高的&#xff0c;因为不涉及线程的上下文切换。适用于小型程序和客…...

828 华为云征文|华为 Flexus 云服务器搭建萤火商城 2.0

《828 华为云征文&#xff5c;华为 Flexus 云服务器搭建萤火商城 2.0》 在 2024 年 9 月 14 日这个特别的日子&#xff0c;我着手利用华为 Flexus 云服务器搭建轻量级、高性能、前后端分离的电商系统萤火商城 2.0&#xff0c;开启了一段充满挑战与惊喜的旅程。 华为 Flexus 云服…...

centos7安装MySQL5.7.44

下载压缩文件 命令&#xff1a; #放到在/usr/local目录下 cd /usr/local #上传命令选择安装包 rz #解压缩包 tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz #给包重命名为mysql mv mysql-5.7.44-linux-glibc2.12-x86_64 mysql #查看mysql目录下有什么东西 [rootlocal…...

HTTP 请求处理的完整流程到Servlet流程图

HTTP 请求处理的完整流程。从 TCP 三次握手开始&#xff0c;一直到 Servlet 处理请求并返回响应。 首先&#xff0c;让我解释一下 response.setContentType("text/html;charsetUTF-8"); 这行代码&#xff1a; 这行代码设置了 HTTP 响应的 Content-Type 头。它告诉浏…...

spingboot中创建简单的WebSocket服务和使用OKHttp创建socket客户端接收数据

背景 springboot 中使用okhttp3创建webSocket服务端 server1 和客户端 client1&#xff0c;客户端clinet1调用server1用于发送图片&#xff0c;创建客户端client2接收此图片. 在Spring Boot中使用OkHttp3创建WebSocket服务端和客户端&#xff0c;涉及到两个不同的操作&#xff…...

Redis入门2

在java中操作Redis Redis的Java客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种: Jedis Lettuce Spring Data Redis Spring Data Redis 是 Spring 的一部分&#xff0c;对 Redis 底层开发包进行了高度封装。 在 Spring 项目中&#xff0c;可以使用Spring Data R…...

嵌入式Linux:信号是什么?

目录 1、信号的来源 2、信号的处理方式 3、信号的异步性 4、信号编号 信号是Linux系统中用于通知进程事件发生的一种机制&#xff0c;可以将其视为一种软件中断。信号类似于硬件中断&#xff0c;能够打断进程当前的执行流程&#xff0c;从而实现对中断机制的一种软件层面的…...

教你搭建一个wifi贴系统

大家好&#xff0c;我是鲸天科技千千&#xff0c;大家都知道我是做小程序开发的&#xff0c;平时会给大家分享一些互联网相关的创业项目&#xff0c;感兴趣的可以跟我关注一下。 搭建一个首先就是要搭建一个自己的wifi贴小程序&#xff0c;我们自己的工作就是把这个小程序推广…...

C#中的LINQ语句

LINQ&#xff08;Language Integrated Query&#xff09;是 .NET Framework 中的一个功能强大的查询语言&#xff0c;它允许开发者使用类似 SQL 的语法来查询和操作数据。在 C# 中&#xff0c;LINQ 可以用于查询数组、列表、集合、XML 文档、关系数据库等。以下是一些常见的 LI…...

【C++】——string(模拟实现)

文章目录 string类构造string类拷贝构造string类析构string类运算符重载string类部分常用接口的模拟实现 这篇博客中构造、拷贝构造、析构、还有一些短小频繁调用的函数就不用做函数和定义分离&#xff0c;因为在类中&#xff0c;这种函数会默认是内联函数 string类构造 构造函…...