详细介绍:Spring Boot 整合 Thymeleaf(视图层)

news/2025/12/14 19:59:46/文章来源:https://www.cnblogs.com/gccbuaa/p/19349744

Thymeleaf 是⽬前较为流⾏的视图层技术,Spring Boot 官⽅推荐使⽤ Thymeleaf。

什么是 Thymeleaf

Thymeleaf 是⼀个⽀持原⽣ THML ⽂件的 Java 模版,可以实现前后端分离的交互⽅式,即视图与业务数据分开响应,它可以直接将服务端返回的数据⽣成 HTML ⽂件,同时也可以处理 XML、JavaScript、CSS 等格式。
Thymeleaf 最⼤的特点是既可以直接在浏览器打开(静态⽅式),也可以结合服务端将业务数据填充到HTML 之后动态⽣成的⻚⾯(动态⽅法),Spring Boot ⽀持 Thymeleaf,使⽤起来⾮常⽅便。


1、创建 Maven ⼯程,不需要创建 Web ⼯程,pom.xml


4.0.0com.southwindspringbootthymeleaf1.0-SNAPSHOTorg.springframework.bootspring-boot-starter-parent2.2.4.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-thymeleaf
2application.yml
spring:thymeleaf:prefix: classpath:/templates/ #模版路径suffix: .html #模版后缀servlet:content-type: text/html #设置 Content-typeencoding: UTF-8 #编码⽅式mode: HTML5 #校验 H5 格式cache: false #关闭缓存,在开发过程中可以⽴即看到⻚⾯修改的结果
3、创建 Handler
package com.southwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/hello")
public class HelloHandler {@GetMapping("/index")public ModelAndView index() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("index");modelAndView.addObject("name", "张三");return modelAndView;}
}
4、启动类
package com.southwind;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
5HTML
Title

Index

Hello World

如果需要加载后台返回的业务数据,则需要在 HTML ⻚⾯中使⽤ Thymeleaf 模版标签来完成。
1、需要引⼊模版标签。
2、通过特定的标签完成操作。

Hello World

Thymeleaf 模版标签不同于 JSTLThymeleaf 模版标签是直接嵌⼊到 HTML 原⽣标签内部。

Thymeleaf 常⽤标签

(1)th:text

th:text ⽤于⽂本的显示,将业务数据的值填充到 HTML 标签中。

(2)th:if

th:if ⽤于条件判断,对业务数据的值进⾏判断,如果条件成⽴,则显示内容,否则不显示,具体的使⽤如下所示。
@GetMapping("/if")
public ModelAndView ifTest() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("score", 90);return modelAndView;
}

优秀

良好

(3)th:unless

th:unless 也⽤作条件判断,逻辑与 th:if 恰好相反,如果条件不成⽴则显示,否则不显示。
@GetMapping("/unless")
public ModelAndView unlessTest() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("score", 90);return modelAndView;
}

优秀

良好

(3)th:switch th:case

th:switch th:case 两个结合起来使⽤,⽤作多条件等值判断,逻辑与 Java 中的 switch-case ⼀致,当 switch 中的业务数据等于某个 case 时,就显示该 case 对应的内容。
@GetMapping("/switch")
public ModelAndView switchTest() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("studentId", 1);return modelAndView;
}

张三

李四

王五

(4)th:action

⽤来指定请求的 URL,相当于 form 表单中的 action 属性
@GetMapping("/redirect/{url}")
public String redirect(@PathVariable("url") String url, Model model) {model.addAttribute("url", "/hello/login");return url;
}
如果 action 的值直接写在 HTML 中,则需要使⽤ @{},如果是从后台传来的数据,则使⽤${}

(5)th:each

⽤来遍历集合
org.projectlomboklombok
package com.southwind.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {private Integer id;private String name;
}
@GetMapping("/each")
public ModelAndView each() {List list = Arrays.asList(new User(1, "张三"),new User(2, "李四"),new User(3, "王五"));ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("list", list);return modelAndView;
}
编号姓名

(6)th:value

@GetMapping("/value")
public ModelAndView value() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("value", "Spring Boot");return modelAndView;
}

(7)th:src

⽤来引⼊静态资源,相当于 HTML 原⽣标签 img、script 的 src 属性。

图⽚,css,js,静态加载的 html 都需要放置在 resources/static ⽂件中

@GetMapping("/src")
public ModelAndView src() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("src", "/1.png");return modelAndView;
}
如果 src 的值直接写在 HTML

(8)th:href

⽤作设置超链接的 href

@GetMapping("/href")
public ModelAndView href() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("href", "https://www.baidu.com");return modelAndView;
}
百度

(9)th:selected

⽤作给 HTML 元素设置选中,条件成⽴则选中,否则不选中。

@GetMapping("/select")
public ModelAndView select() {List list = Arrays.asList(new User(1, "张三"),new User(2, "李四"),new User(3, "王五"));ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("list", list);modelAndView.addObject("name", "李四");return modelAndView;
}
结合 th:each 来使⽤,⾸先遍历 list 集合动态创建 option 元素,根据每次遍历出的 user.name 与业务 数据中的 name 是否相等来决定是否要选择。

(10)th:attr

HTML 标签的任意属性赋值

@GetMapping("/attr")
public ModelAndView attr() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("attr", "Spring Boot");return modelAndView;
}

Thymeleaf 对象

Thymeleaf ⽀持直接访问 Servlet Web 原⽣资源,HttpServletRequestHttpServletResponse
HttpSessionServletContext
#request: 获取 HttpServletRequest 对象
#response: 获取 HttpServletResponse 对象
#session: 获取 HttpSession 对象
#servletContext: 获取 ServletContext 对象
@GetMapping("/servlet")
public String servlet(HttpServletRequest request) {request.setAttribute("value", "request");request.getSession().setAttribute("value", "session");request.getServletContext().setAttribute("value", "servletContext");return "test";
}

Thymeleaf ⽀持直接访问 session${#request.getAttribute('name')} 也可以简化 ${name}
@GetMapping("/servlet2")
public ModelAndView servlet2(HttpSession session) {session.setAttribute("name", "李四");ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("name", "张三");return modelAndView;
}

Thymeleaf 内置对象

(1)dates:⽇期格式化
(2)calendars:⽇期操作
(3)numbers:数字格式化
(4)strings:字符串格式化
(5)bools:boolean
(6)arrays:数组内置对象
(7)lists:List 集合内置对象
(8)sets:Set 集合内置对象
(9)maps:Map 集合内置对象
@GetMapping("/utility")
public ModelAndView utility() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("test");modelAndView.addObject("date", new Date());Calendar calendar = Calendar.getInstance();calendar.set(2020, 1, 1);modelAndView.addObject("calendar", calendar);modelAndView.addObject("number", 0.06);modelAndView.addObject("string", "Spring Boot");modelAndView.addObject("boolean", true);modelAndView.addObject("array", Arrays.asList("张三", "李四", "王五"));List list = new ArrayList<>();list.add(new User(1, "张三"));list.add(new User(2, "李四"));modelAndView.addObject("list", list);Set set = new HashSet<>();set.add(new User(1, "张三"));set.add(new User(2, "李四"));modelAndView.addObject("set", set);Map map = new HashMap<>();map.put(1, new User(1, "张三"));map.put(2, new User(2, "李四"));modelAndView.addObject("map", map);return modelAndView;
}

date 格式化:

当前日期:
当前时间:
Calendar 格式化:
number 百分比格式化:
name 是否为空:
name 长度:
name 拼接:
boolean 是否为 true:
arrays 的长度:
arrays 是否包含张三:
List 是否为空:
List 的长度:
Set 是否为空:
Set 的长度:
Map 是否为空:
Map 长度:

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

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

相关文章

电脑音频录制工具(语音聊天录音软件)

日常工作与生活中,线上会议存档、课程音频记录、音乐片段收藏等音频留存需求十分常见。本文分享一款实用的电脑音频录制工具,其支持全品类软件兼容(涵盖聊天工具、会议平台、游戏客户端、音视频播放器等),可灵活实…

【模板】静态区间最值【牛客tracker 每日一题】

【模板】静态区间最值 时间限制&#xff1a;5秒 空间限制&#xff1a;1024M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff0…

Ascend C 与 CUDA 的对比分析-为异构计算开发者提供迁移指南

目录 &#x1f3af; 摘要 1. 架构哲学&#xff1a;两种不同的AI计算世界观 1.1 &#x1f504; 从"通用加速"到"AI原生"的范式转移 1.2 &#x1f3d7;️ 硬件架构的本质差异 2. 编程模型对比&#xff1a;从线程到任务块的范式革命 2.1 ⚙️ CUDA的线程…

CF1004D Sonya and Matrix - crazy-

思维,构造 题解 已知一个无限大的矩阵,其中每个格子的值表示其距离矩阵中心的曼哈顿距离。 如图是矩阵的一部分:现在另一个矩阵,已知矩阵中全部的 \(t\) 个数,试在无限大的矩阵中截取出 \(n\times m =t\) 大小的矩…

Markdown编辑完全指南

一、Markdown基础知识 1.1 什么是Markdown Markdown是一种轻量级标记语言&#xff0c;使用纯文本格式编写文档。【优点】&#xff1a; ✓ 纯文本&#xff0c;兼容性好 ✓ 语法简单&#xff0c;易学易用 ✓ 专注内容&#xff0c;不被格式干扰 ✓ 版本控制友好&#xff08;Git等…

DAY37 早停策略和模型权重的保存

浙大疏锦行 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import numpy as npirisload_iris() Xiris.data yiris.targetX_train,X_test,y_train,y_testtra…

西门子1200 PLC自由口通讯CRC校验程序实战

西门子1200plc自由口通讯CRC校验程序。 该CRC校验程序校验出来的校验码为modbus RTU协议报文最后的校验码。用于没有modbus RTU指令且没有CRC校验指令的plc&#xff0c;只能用自由口指令来实现modbus RTU通讯协议的情况。 该程序已经实测&#xff0c;功能包好。在自动化控制领域…

【求解释】智子递归架构:基于互补递归与河洛调控的智能系统框架

智子递归架构&#xff1a;基于互补递归与河洛调控的智能系统框架——简化符号、清晰表述与数学实现研究者&#xff1a;桑干河报告版本&#xff1a;1.0发布日期&#xff1a;2023年10月---摘要智子递归架构是一种基于二值递归单元&#xff08;智子&#xff09;、互补对称性与全局…

Node.js `import.meta` 深入全面讲解

import.meta 是 ES 模块&#xff08;ESM&#xff09;特有的元数据对象&#xff0c;提供当前模块的上下文信息&#xff0c;是 ES 标准的一部分&#xff08;ES2020 引入&#xff09;&#xff0c;Node.js 从 v12.2.0 开始支持&#xff08;需启用 ESM&#xff0c;v14.13.0 及以上无…

教程8:结构体的添加和使用-–-behaviac

原文 本文档描述的是3.6及以后版本&#xff0c;对于3.5及以前的老版本请参考分类“3.5”。对于结构体类型的使用&#xff0c;包括新增全新的结构体和扩展使用已有的结构体。对于新增的结构体&#xff0c;又包括编辑器是否自动生成该结构体的代码。 实际上&#xff0c;我们将新…

影刀RPA发货大杀器!亚马逊订单批量发货效率提升2000%,告别手动煎熬![特殊字符]

影刀RPA发货大杀器&#xff01;亚马逊订单批量发货效率提升2000%&#xff0c;告别手动煎熬&#xff01;&#x1f680;每天处理几百个亚马逊订单发货到手软&#xff1f;复制粘贴物流单号到怀疑人生&#xff1f;别硬扛了&#xff01;今天我用影刀RPA打造智能发货机器人&#xff0…

CF1009F Dominant Indices - crazy-

dsu-on-tree,双端队列 题意 给定一棵有 \(n\) 个顶点的有根树,以顶点 \(1\) 作为根。 定义顶点 \(x\) 的深度数组为一个无限序列 \([d_{x, 0}, d_{x, 1}, d_{x, 2}, \dots]\),其中 \(d_{x, i}\) 表示满足以下两个条件…

蓄电池与超级电容器混合储能并网的Simulink仿真探索

蓄电池与超级电容器混合储能并网 Matlab/Simulink仿真模型&#xff0c;波形正确。 1.混合储能并网&#xff0c;能量管理&#xff0c;蓄电池与超级电容混合储能并网&#xff0c;混合储能采用低通滤波器进行功率分配&#xff0c;有效抑制系统功率波动&#xff0c;实现母线电压稳定…

macOS 的两款好用的免费截图软件: shottr 和 snipaste

snipaste https://www.snipaste.com/ shottr https://shottr.cc/ 也有免费版本 好友版本更多更丰富的功能。

教程9:枚举的添加和使用-–-behaviac

原文 本文档描述的是3.6及以后版本&#xff0c;对于3.5及以前的老版本请参考分类“3.5”。对于枚举类型的使用&#xff0c;包括新增全新的枚举和扩展使用已有的枚举。对于新增的枚举&#xff0c;又包括编辑器是否自动生成该枚举的代码。 实际上&#xff0c;我们将新增枚举&am…

QSharedMemory 变量在对象析构的时候要怎么处理

在Qt中使用QSharedMemory时&#xff0c;对象析构时的正确处理至关重要&#xff0c;主要涉及共享内存的释放和跨进程同步问题。以下是关键处理原则和步骤&#xff1a; 1. 自动析构行为&#xff08;Qt内置机制&#xff09; 自动detach()&#xff1a;当QSharedMemory对象销毁时&…

TikTok达人合作订单太繁琐?影刀RPA一键智能处理,效率飙升10倍![特殊字符]

TikTok达人合作订单太繁琐&#xff1f;影刀RPA一键智能处理&#xff0c;效率飙升10倍&#xff01;&#x1f680;作为影刀RPA的资深布道者&#xff0c;我深知MCN机构在达人订单管理上的"手忙脚乱"。今天&#xff0c;就带你用RPA技术打造达人合作"智能中台"&…

投机推理原理及设计

投机推理的核心思想是所谓的“草稿-验证”范式:快速生成多个草稿token,然后利用大语言模型的并行计算性一次验证所有草稿token,并决定接受多少token。例如,我们利用一个只有1B的小模型快速生成了8个草稿token draf…

前端保存用户登录信息 深入全面讲解

前端保存用户登录信息的核心目标是持久化登录状态&#xff08;减少重复登录&#xff09;、提升用户体验&#xff0c;同时必须兼顾安全性&#xff08;防止信息泄露、伪造、劫持&#xff09;。本文从存储方案选型、安全防护、最佳实践、常见问题等维度&#xff0c;全面解析前端登…

影刀RPA颠覆传统!TikTok售后工单智能处理,效率提升500%[特殊字符]

影刀RPA颠覆传统&#xff01;TikTok售后工单智能处理&#xff0c;效率提升500%&#x1f680;每天被海量TikTok售后工单淹没&#xff1f;重复复制粘贴到凌晨&#xff1f;别慌&#xff01;今天我用影刀RPA打造智能工单处理机器人&#xff0c;让你从此告别加班&#xff0c;体验什么…