Thymeleaf模板引擎从入门到实战:Spring Boot整合与核心用法详解

在 Java Web 开发的世界里,模板引擎是连接后端数据与前端展示的重要桥梁。Thymeleaf 凭借其强大的功能和简洁的语法,逐渐成为众多开发者的首选。如果你正在寻找一款能够让你的 Web 应用开发更加高效、代码更加优雅的模板引擎,那么 Thymeleaf 绝对值得你深入了解。本文将带你从零开始,快速掌握 Thymeleaf 的基础知识和核心用法。​

一、Thymeleaf 是什么?​

Thymeleaf 是一个用于 Java 的开源模板引擎,它可以与 Spring MVC、Spring Boot 等主流 Java Web 框架无缝集成。与传统的 JSP(JavaServer Pages)相比,Thymeleaf 的一大显著优势在于它能够直接在浏览器中预览模板内容,而无需启动整个 Web 应用。这使得开发人员可以更直观地查看页面效果,大大提高了开发效率。此外,Thymeleaf 的语法简洁明了,学习成本较低,并且支持 HTML5 标准,能够很好地兼容现代前端开发工具和技术。​

Thymeleaf 的设计理念是 “自然模板”,即模板文件本身就是有效的 HTML(或 XML)文件,可以直接在浏览器中打开并查看。这意味着前端设计师和后端开发者可以更方便地协作,前端设计师可以在不依赖后端数据的情况下设计和完善页面结构与样式,而后端开发者则可以通过添加 Thymeleaf 的标签和表达式,将动态数据填充到页面中。​

二、Thymeleaf 的核心功能​

  1. 数据绑定:Thymeleaf 最核心的功能之一就是数据绑定。它支持从 Java 对象、集合、Map 等数据结构中提取数据,并将其展示在 HTML 页面上。通过使用th:text、th:utext、th:value等属性,我们可以轻松地将后端数据绑定到页面的文本、HTML 内容或表单字段中。​
  2. 条件与循环:Thymeleaf 提供了丰富的条件判断和循环语句,如th:if、th:unless、th:switch、th:each等。这些语句使得我们可以根据不同的条件动态地展示或隐藏页面元素,以及遍历集合数据并生成相应的 HTML 结构。​
  3. 表单处理:在 Web 应用中,表单是用户输入数据的重要途径。Thymeleaf 对表单处理提供了强大的支持,它可以自动绑定表单数据到后端的 Java 对象,并对表单进行验证和错误处理。通过th:object、th:field等属性,我们可以方便地创建和处理表单。​
  4. 国际化支持:随着全球化的发展,Web 应用的国际化需求越来越普遍。Thymeleaf 内置了对国际化的支持,通过配置资源文件和使用#{...}表达式,我们可以轻松实现页面内容的多语言切换。​
  5. 模板布局:Thymeleaf 支持模板布局,允许我们将页面的公共部分(如头部、导航栏、底部等)提取出来,形成一个布局模板,然后在其他页面中复用。这样可以大大减少代码的重复,提高代码的可维护性。

三、创建项目

1.org.apache.maven.archetypes:maven-archetype-quickstart选这个有什么用?

org.apache.maven.archetypes:maven-archetype-quickstart是 Maven 的一个项目原型,主要用于快速搭建一个基础的 Java 项目骨架,方便开发者在此基础上进行开发。结合你正在阅读的 Thymeleaf 入门内容,它在 Java Web 开发学习中也能起到很好的辅助作用,具体优势如下:

  • 快速搭建项目结构maven-archetype-quickstart会自动生成标准的 Maven 项目目录结构,包括src/main/java(存放 Java 源代码)、src/main/resources(存放配置文件等资源)、src/test/java(存放测试代码)和src/test/resources(存放测试相关资源)等。当你学习 Thymeleaf 时,可将 Thymeleaf 模板文件放在src/main/resources/templates目录,后端代码放在src/main/java目录,便于后续添加 Thymeleaf 依赖和进行相关开发。
  • 预配置项目基础:该原型生成的项目pom.xml文件中,已配置好基础的 Maven 项目信息,如项目坐标(groupId、artifactId、version)等。当你需要集成 Thymeleaf 到项目时,只需要在pom.xml中添加 Thymeleaf 依赖即可,无需从头配置 Maven 项目的基础信息,节省时间。
  • 提供示例代码:在src/main/java目录下,maven-archetype-quickstart会生成一个简单的 Java 类(如App.java),包含一个简单的main方法示例。虽然与 Thymeleaf Web 开发模式不同,但能帮助初学者理解 Java 代码在 Maven 项目中的基本组织形式,后续学习 Thymeleaf 时,可逐步替换和扩展代码,开发出 Web 应用的后端逻辑,实现与 Thymeleaf 模板的数据交互。
  • 便于学习 Maven 构建maven-archetype-quickstart生成的项目可以直接使用 Maven 的各种命令进行构建、编译、测试和打包等操作。在学习 Thymeleaf 的过程中,通过对这个基础项目执行 Maven 命令,能更好地掌握 Maven 的使用,例如使用mvn clean install命令将项目打包,为后续部署包含 Thymeleaf 的 Web 应用做好准备。

如果你想基于这个原型,结合 Thymeleaf 开发一个 Web 应用,后续可以添加 Spring Boot、Spring MVC 等依赖,进一步完善项目功能 。

2.导入依赖

<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>

3.编写第一个入门程序

示例1:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;public class HelloThymeLeaf {public static void main(String[] args) {//创建模版引擎TemplateEngine engine = new TemplateEngine();//准备模版String input = "<input type='text' th:value='hellothymelaef'/>";//准备数据,使用ContextContext context = new Context();//调用引擎,处理模版和数据String out = engine.process(input, context);System.out.println("结果数据:"+out);}
}

运行结果;

解释:

 创建模板引擎实例

TemplateEngine engine = new TemplateEngine();

创建了一个TemplateEngine对象,它是整个 Thymeleaf 处理流程的核心,后续对模板的解析、数据绑定等操作都依赖于这个引擎实例。

 准备模板

String input = "<input type='text' th:value='hellothymelaef'/>";

定义了一个字符串input,它包含了 Thymeleaf 模板代码。在这个例子中,模板是一个简单的 HTML 输入框,其中使用了 Thymeleaf 的th:value属性,不过当前属性值hellothymelaef只是一个静态字符串,后续可以通过数据绑定动态替换。
 

准备数据上下文

Context context = new Context();

创建了一个Context对象,用于存储要传递给模板的数据。在这个简单示例中,Context对象目前为空,没有实际数据传递。但在实际应用中,可以通过context.setVariable("变量名", 变量值)的方式向其中添加数据,这些数据将在模板处理时被 Thymeleaf 引擎使用。
 

处理模板并输出结果

String out = engine.process(input, context);
System.out.println("结果数据:"+out);

调用TemplateEngineprocess方法,将模板字符串input和数据上下文context作为参数传入。process方法会解析模板,应用数据绑定等操作,并返回处理后的结果字符串。最后,通过System.out.println将处理后的结果输出到控制台。在这个例子中,由于没有实际的数据绑定操作,输出结果可能与输入的模板字符串相似,除非后续向context中添加数据并在模板中引用。

示例2:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;public class HelloThymeleaf2 {public static void main(String[] args) {//创建模版引擎TemplateEngine engine = new TemplateEngine();//准备模版String input = "<input type='text' th:value='${name}'/>";//准备数据,使用ContextContext context = new Context();context.setVariable("name","张三");//调用引擎,处理模版和数据String out = engine.process(input, context);System.out.println("结果数据:"+out);}
}

4.使用模版文件

main.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<input type="text" th:value="${name}"/>
</body>
</html>

Test

    @Testpublic void test(){TemplateEngine engine = new TemplateEngine();//读取磁盘中的模版文件ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();//设置引擎使用resolverengine.setTemplateResolver(resolver);//指定数据Context context = new Context();context.setVariable("name","张三");//处理模版String html=engine.process("main.html",context);System.out.println("html="+html);}

配置模板解析器

ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
engine.setTemplateResolver(resolver);

  • ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();:创建一个ClassLoaderTemplateResolver对象,该解析器用于从类路径(即src/main/resources及其子目录)中查找和加载模板文件。它是 Thymeleaf 提供的多种模板解析器之一,适用于大多数基于 Maven 或 Gradle 构建的 Java 项目,因为这些项目的资源文件默认会被打包到类路径下。
  • engine.setTemplateResolver(resolver);:将创建好的模板解析器resolver设置到TemplateEngine中,这样模板引擎在处理模板时,就会使用该解析器来查找对应的模板文件

准备数据上下文

Context context = new Context();
context.setVariable("name", "张三");
  • Context context = new Context();:创建一个Context对象,它用于在模板处理过程中存储和传递数据,类似于在 Web 开发中Model的作用。
  • context.setVariable("name", "张三");:向Context中添加一个名为name的变量,并将其值设置为"张三"。这个变量将在模板处理过程中被使用,用于替换模板中相应的表达式。
  1. 处理模板并输出结果
String html = engine.process("main.html", context);
System.out.println("html=" + html);
  • String html = engine.process("main.html", context);:调用TemplateEngineprocess方法,该方法接受两个参数:模板文件名(这里是"main.html",模板引擎会根据之前设置的模板解析器,在类路径下查找该文件)和数据上下文contextprocess方法会解析模板文件,将context中的数据应用到模板中相应的表达式处,完成数据绑定和模板渲染,并返回处理后的 HTML 字符串。

5.设置模版前缀、后缀

让其再套一层目录依旧能找到

采用这两个方法

   @Testpublic void test2(){TemplateEngine engine = new TemplateEngine();ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();resolver.setPrefix("templates/");resolver.setSuffix(".html");engine.setTemplateResolver(resolver);Context context = new Context();context.setVariable("name","张三");String html = engine.process("index", context);System.out.println("html="+html);}

运行结果:

四、spring boot 中使用thymeleaf

1.创建maven 项目

2.加入依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.6.RELEASE</version>
</parent><dependencies><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency></dependencies>

3.编写application.properties

spring.thymeleaf.mode=HTML
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false

在配置文件 application. properties 中 ,可以修改的 Thymeleaf 配置 主要有以下。 

spring.thymeleaf.cache : 是否打开模板配置,默认为 true 。 

spring.thymeleaf.check-template : 是否在处理模板前检查其是否存 在,默认为 true 。

spring.thymeleaf.check-template-location : 是否检查模板位置,默认为 true 。

spring.thymeleaf.content-type : 模板的 content-type 值,默认为 text/html 

spring.thymeleaf.enabled : 是否开启视图解析,默认为 true 。 

spring.thymeleaf.encoding : 模板的编码,默认为 UTF-8。 

spring.thymeleaf.excluded-view-names : 要排除的模板名称。

spring.thymeleaf.mode : 模板模式,默认为 HTML5 

spring.thymeleaf. prefix : 模板前缀,默认为 classpath :/templates / ,用于创建模板的 URL。

spring.thymeleaf.suffix : 模板后缀,默认为.html ,用于创建模板 URL。 “前缀+模板名称+后缀”即可定位到具体的模板。

spring.thymeleaf.template-resolver-order :默认模板解析器的执行顺 序。 

spring.thymeleaf.view-names : 要解析的模板名称,用逗号隔开。

以上执行简单的两步就完成了 Spring Boot 与 Thymeleaf 的整合,实 际上都不需要配置 application.properties ,使用默认值即可,换言之,只 需要为项目加 入“spring-boot-starter thymeleaf"依赖,就能完成整合 整理一下,并解释一下

4.创建Controller

package org.example1.demo1.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HelloController {//参数:Model可以存放数据,放入到request作用域//返回值:String:表示视图@GetMapping("/hello")public String hello(Model model) {//添加数据model.addAttribute("name","李四");//指定模版视图return "index";}
}

5.index.html

有用到的东西

在这里启动

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】作业三 UI

目录 一. 单选题&#xff08;共10题&#xff0c;10分&#xff09; 1. (单选题, 1分)关于Tabs组件页签的位置设置&#xff0c;下面描述错误的是 2. (单选题, 1分)下面哪个组件不能包含子组件? 3. (单选题, 1分)ArkTS语言的实现计数器功能的组件名称是以下哪个? 4. (单选题…

《算法笔记》10.6小节——图算法专题->拓扑排序 问题 C: Legal or Not

题目描述 ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exchange their ideas. When so…

博客信息管理/博客管理

&#x1f6e0; 博客管理模块&#xff1a;设计建议 你应该以To B 的后台系统思路来设计&#xff0c;但保持简单、轻量级、自己易维护是关键。下面是针对你这个场景的建议。 &#x1f9f1; 前端页面结构&#xff08;React/Vue 可用&#xff09; 页面 说明 博客列表页 展示所有博…

全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars

一、基本介绍 MobileIMSDK是一套全平台原创开源IM通信层框架&#xff1a; 超轻量级、高度提炼&#xff0c;lib包50KB以内&#xff1b;精心封装&#xff0c;一套API同时支持UDP、TCP、WebSocket三种协议&#xff08;可能是全网唯一开源的&#xff09;&#xff1b;客户端支持iOS…

SpringBoot商城平台系统设计与开发

概述 SpringBoot商城平台系统实现了商品展示、购物车、订单管理等商城核心功能&#xff0c;适合作为计算机专业设计项目或商城项目开发参考&#xff0c;实现商城平台的核心功能&#xff0c;学习商品管理、订单处理、支付集成等关键技术实现。 主要内容 1. 前台用户功能模块 …

【网络原理】深入理解HTTPS协议

本篇博客给大家带来的是网络原理的知识点, 由于时间有限, 分三天来写, 本篇为线程第三篇,也是最后一篇. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动…

【C语言练习】018. 定义和初始化结构体

018. 定义和初始化结构体 018. 定义和初始化结构体1. 定义结构体示例1:定义一个简单的结构体输出结果2. 初始化结构体示例2:在声明时初始化结构体输出结果示例3:使用指定初始化器初始化结构体(C99及以上标准支持)输出结果3. 结构体数组示例4:定义和初始化结构体数组输出结…

3D版同步帧游戏

以下是实现一个3D版同步帧游戏的详细步骤与完整代码示例。我们将以第一人称射击游戏(FPS)为原型,重点讲解3D空间中的同步机制优化。 项目升级:3D版核心改动 1. 3D坐标系与消息结构 // common/messages.go type Vector3 struct {X float32 `json:"x"`Y float32 `…

卷积神经网络进化史:从LeNet-5到现代架构的完整发展脉络

摘要 本文系统梳理卷积神经网络(CNN)从诞生到繁荣的发展历程。从1998年Yann LeCun开创性的LeNet-5出发&#xff0c;重点解析2012年引爆深度学习革命的AlexNet&#xff0c;并详细拆解后续演进的五大技术方向&#xff1a;网络深度化(VGG)、卷积功能强化(ResNet)、检测任务迁移(F…

在 Windows 中安装 Pynini 的记录

#工作记录 概述 Pynini 是一个用于加权有限状态文法编译的 Python 库&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;领域。以下记录旨在用于回顾和帮助大家在 Windows 系统中安装 Pynini。 安装思路&#xff1a; 优先用conda虚拟环境 或 在python3.12的vir…

深挖Java之:运算符与输入器

今天我要介绍的是在Java中对于运算符与输入器的一些基础语法运算符与输入器的代码示例以及应用场景&#xff0c;他们在应用上的优势与劣势作说明介绍&#xff1a; 介绍&#xff1a;运算符与输入器是两个基础且关键的概念&#xff0c;它们共同构成了程序与用户、程序与数据之间…

动态规划之多状态问题1

题目解析&#xff1a; 也就是给一个预约数组&#xff0c;选择一些数字&#xff0c;让其总和最大&#xff0c;但不能选择相邻的两个数字 算法原理&#xff1a; 依旧可以根据经验题目 以dp[i]位置结尾时&#xff0c;巴拉巴拉 根据题目要求补充完整&#xff0c;dp[i]&#xff…

计网_可靠传输ARQ机制

2024.09.04&#xff1a;网工老姜&beokayy网工学习笔记 第5节 可靠传输机制 5.1 可靠传输5.2 ARQ机制、ARQ协议5.3 ARQ简介&#xff08;可靠传输&#xff09;5.3.1 停止等待协议&#xff08;1&#xff09;无差错情况&#xff08;2&#xff09;有差错情况确认丢失确认迟到 5.…

华为eNSP:多区域集成IS-IS

一、什么是多区域集成IS-IS&#xff1f; 多区域集成IS-IS是一种基于中间系统到中间系统&#xff08;IS-IS&#xff09;协议优化的网络架构设计&#xff0c;通过多区域协同、路径优化和扩展性增强实现高效路由管理&#xff0c;其核心特征如下&#xff1a; 1、分布式架构与多区…

自定义Dockerfile,发布springboot项目

(1) 上传jar包 把hello项目打成一个可执行的jar包 hello-1.0-SNAPSHOT.jar&#xff0c;把这个jar包上传到linux中 (2) 创建文件&#xff0c;文件名my_hello&#xff08;就是一个Dockerfile&#xff09;&#xff0c;内容如下 #1.定义父镜像(定义当前工程依赖的环境)&#xff1a;…

vscode源代码管理Tab-文件右侧标志(M、A 等)的含义

Git 常用标志(M、A 等)的含义 在 VSCode 的源代码管理&#xff08;Source Control&#xff09;标签页中&#xff0c;文件右侧显示的 Monaco 装饰徽章&#xff08;Badge&#xff09;&#xff08;如 M、A 等&#xff09;&#xff0c;本质上是对 Git 文件状态标志 的可视化呈现。…

基于 vue-flow 实现可视化流程图

vue-flow 是一个基于 Vue.js 的强大且灵活的可视化流程图库&#xff0c;它允许开发者轻松创建交互式的流程图、工作流图、节点图等。 主要特点 易于使用 &#xff1a;提供了简洁的 API 和组件&#xff0c;开发者可以快速上手并创建复杂的流程图。高度可定制 &#xff1a;支持…

【愚公系列】《Manus极简入门》015-时间管理顾问:“商业时间规划大师”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

OpenRouter:轻松集成多家AI大模型的统一接口平台指南

想象一下&#xff0c;你已经在系统中集成了 OpenAI API&#xff0c;但现在你希望通过 Google Gemini 和 Anthropic API 扩展能力。你会为每个服务商单独创建和管理账户&#xff0c;使用不同的 SDK&#xff0c;让代码变得更加复杂吗&#xff1f;还是更倾向于只用一行代码就能访问…

iOS启动优化:从原理到实践

前言 在iOS应用开发中&#xff0c;启动速度是影响用户体验的重要因素之一。研究表明&#xff0c;启动时间每增加1秒&#xff0c;用户留存率就会下降约7%。本文将深入探讨iOS启动优化的各个方面&#xff0c;从底层原理到具体实践&#xff0c;帮助开发者打造更快的应用启动体验。…