Thymeleaf简介

在Java中,模板引擎可以帮助生成文本输出。常见的模板引擎包括FreeMarker、Velocity和Thymeleaf等

Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。

Thymeleaf 和 JSP比较:

Thymeleaf目前所作的工作和JSP有相似之处,Thymeleaf和JSP都是属于服务端渲染技术,Thymeleaf比JSP功能强大许多。

Thymeleaf就是SpringBoot 官方推荐使用的模板引擎。

搭建thymeleaf环境:

1、创建一个 SpringBoot 项目

<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><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.14</version><scope>provided</scope>
</dependency>

2、编写跳转页面的 Controller

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private Integer id;private String name;private Integer age;private Date birthday;
}@Controller
public class IndexController {@RequestMapping("/index")public String index(Model model) {model.addAttribute("message", "HelloWorld");Student student = new Student(1, "李四", 23, new Date());model.addAttribute("student", student);Student student1 = new Student(1, "张三1", 23, new Date());Student student2 = new Student(2, "张三2", 23, new Date());Student student3 = new Student(3, "张三3", 23, new Date());List<Student> list = new ArrayList<>();list.add(student1);list.add(student2);list.add(student3);model.addAttribute("list", list);return "index";}
}

3、index.html 页面

在resources/templates目录创建一个index.html页面。

注意,必须加上命名空间xmlns:th="Thymeleaf",否则Thymeleaf的自定义标签没有提示。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!--使用th:text输出--><div th:text="${message}"></div><input type="text" th:id="${student.id}" th:name="${student.name}" th:value="${student.name}"/><!--循环--><table border="1"><tr><td>编号</td><td>姓名</td><td>年龄</td><td>生日</td></tr><tr th:each="student:${list}"><td th:text="${student.id}">1</td><td th:text="${student.name}">张三</td><td th:text="${student.age}">23</td><td th:text="${#dates.format(student.birthday, 'yyyy-MM-dd')}">1990-12-13</td></tr></table><!--取出集合中某一个--><div th:text="${list[0].name}"></div>
</body>
</html>

疑难问题

问题:为什么thymeleaf页面放在templates文件夹里面,并且后缀要是.html呢?

SpringBoot框架会将内置支持的功能组件放在spring-boot-autoconfigure-3.2.5.jar 包下,而 Thymeleaf 框架就是内置支持的。

所以在这个包里面可以找对应的自动配置代码,如图:

如果找默认的属性配置应该找XxxxProperties类,如图所示,Thymeleaf模板的前后缀如下:

所以Thymeleaf的页面存放在templates文件夹中,并且页面的后缀为.html。

常用标签:

  1. 数学运算

二元操作:+, - , * , / , %

一元操作: - (负)

  1. 逻辑运算

一元 : and or

二元 : !,not

  1. 比较运算(为避免转义尴尬,可以使用括号中的英文进行比较运算!)

比较:> , < , >= ,

等于:== , != ( eq , ne )

  1. 简单表达式

变量表达式: ${...}

选择变量表达式: *{...}

消息表达式: #{...}

URL 表达式: @{...}

代码段表达式: ~{...}

<body><!-- 使用th:text属性输出 --><div th:text="${message}" ></div><input type="text" th:id="${student.id}" th:name="${student.name}" th:value="${student.name}"><br/><!--循环--><table border="1"><tr><td>编号</td><td>姓名</td><td>年龄</td><td>生日</td></tr><tr th:each="student:${list}"><td th:text="${student.id}">1</td><td th:text="${student.name}">张三</td><td th:text="${student.age}">23</td><td th:text="${#dates.format(student.birthday, 'yyyy-MM-dd')}">1990-12-13</td></tr></table><!-- springmvc 保存了一个 model 对象: list --><!-- 获取所有 list --><p th:text="${list}"></p><!-- 获取 list 的第一个元素 --><p th:text="${list[0]}"></p><!-- 获取第一个 student 对象的 name 属性 --><p th:text="${list[0].name}"></p><!-- 也可以用 ['name'] 来获取第一个 student 对象的 name 属性 --><p th:text="${list[0]['name']}"></p><!-- 甚至可以调用方法! --><p th:text="${list[0].getName()}"></p><p th:text="${list[0]['name'].substring(0, 1)}"></p><!--判断Thymeleaf支持四种判断:th:if/th:unless、逻辑运算符(and、or、not)、三目运算符、switch。--><!--第一种:if & unless--><!-- 如果条件为真,执行标签内的内容 --><div th:if="${false}">天天18</div><div th:if="${list[0].name eq '张三1'}">张三1</div><div th:if="${list[0].name == '张三1'}">张三1</div><!-- 如果条件为假,执行标签内的内容 --><div th:unless="${false}">unless</div><!--第二种:and、or、not--><div th:if="${true or false}">真的18岁</div><div th:if="${not false}">真的别做梦</div><!--第三种:三目运算符--><span th:text="true ? '今年不是18岁' : '总算清醒了'"></span><br/><span th:text="${student.age eq 23} ? '今年是23' : '不是23'"></span><span th:text="${student.age eq 23 ? '今年23' : '不是23'}"></span><!--第四种:switch--><div th:switch="${student.age}"><div th:case="16">我今年16岁</div><div th:case="17">我今年17岁</div><div th:case="18">我今年18岁</div><div th:case="20">我今年20岁</div><div th:case="23">我今年23岁</div><div th:case="*">我年年18岁</div></div>
</body>

域对象

变量表达式的作用是:从web作用域里面取到对应的值,作用域包括 request、session、application。

@RequestMapping("/data")
public String data(HttpServletRequest request, HttpSession session) {Student student1 = new Student(1, "张三1", 23 , new Date());request.setAttribute("student1", student1);Student student2 = new Student(2, "张三2", 23, new Date());session.setAttribute("student2", student2);Student student3 = new Student(3, "张三3", 23, new Date());ServletContext application = request.getServletContext();application.setAttribute("student3", student3);return "data";
}
<body>request:<div>编号:<span th:text="${student1.id}"></span><br>姓名:<span th:text="${student1.name}"></span><br>年龄:<span th:text="${student1.age}"></span><br></div>session:<div>编号:<span th:text="${session.student2.id}"></span><br>姓名:<span th:text="${session.student2.name}"></span><br>年龄:<span th:text="${session.student2.age}"></span><br></div>application:<div>编号:<span th:text="${application.student3.id}"></span><br>姓名:<span th:text="${application.student3.name}"></span><br>年龄:<span th:text="${application.student3.age}"></span><br></div></body>

选择变量表达式

问题:取request、session、application作用域上的属性时,可以发现,我们需要重复编写student1、session.student2和application.student3三次,

如果student对象的属性有十几个怎么办?显然写十几次相同的代码不是我们想要解决方案。

针对这种问题,Thymeleaf提供了选择变量表达式来解决。

request: <br/>
<div th:object="${student1}">编号: <p th:text="*{id}"></p><br/>姓名:<p th:text="*{name}"></p> <br/>年龄:<p th:text="*{age}"></p><br/>
</div>session:<br/>
<div th:object="${session.student2}">编号: <p th:text="*{id}"></p><br/>姓名:<p th:text="*{name}"></p> <br/>年龄:<p th:text="*{age}"></p><br/>
</div>

作用域内容对象的空值处理

当获取一个作用域中不存在的对象属性,那么会返回一个null,但是有些情况下还通过点运算符获取对象属性,那么这是SpringBoot会报异常。有些情况下,就是根据某个对象是否为null来执行相应的操作。

--需求:获取session作用域中的user对象,如果不为null就输出name,如果为null,就输出空字符串,而不是报异常。

--分析:可以在调用对象或者方法的点(.)前面,使用问号(?)来判断null

编号:

内置工具对象:# 符号直接使用

除了基本对象, thymeleaf 还提供了一组工具对象,其实和java中对应的方法大同小异。

@RequestMapping(value = "/util")
public String set(Model model) {Set<String> names = new HashSet<String>() ;List<Integer> ids = new ArrayList<Integer>() ;for (int i = 0 ; i < 5 ; i ++) {names.add("boot-" + i) ;ids.add(i) ;}model.addAttribute("names", names) ;model.addAttribute("ids", ids) ;model.addAttribute("mydate", new Date()) ;return "util" ;
}
<body><p th:text="${#dates.format(mydate,'yyyy-MM-dd')}"/><p th:text="${#dates.format(mydate,'yyyy-MM-dd HH:mm:ss.SSS')}"/><hr/><p th:text="${#strings.replace('www.baidu.cn','.','$')}"/><p th:text="${#strings.toUpperCase('www.baidu.cn')}"/><p th:text="${#strings.trim('www.baidu.cn')}"/><hr/><p th:text="${#sets.contains(names,'boot-0')}"/><p th:text="${#sets.contains(names,'boot-9')}"/><p th:text="${#sets.size(names)}"/><hr/><p th:text="${#lists.contains(ids,0)}"/>
</body>

Link URL

链接 URL 表达式语法是 @{...}

反斜杠 ”/“ 开头,代表static目录下的静态资源文件

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" th:href="@{/bootstrap-3.3.7-dist/css/bootstrap.css}"><script type="text/javascript" th:src="@{/jquery-2.1.4.js}"></script><script type="text/javascript" th:src="@{/mylayer.js}"></script>
</head>
<body><a class="btn btn-primary" href="/">返回首页</a> <br/><a class="btn btn-primary" href="#" th:href="@{/}">返回首页</a> <br/><a href="/student/search">访问StudentController下面的search方法</a> <br/><a href="#" th:href="@{/student/search}">访问StudentController下面的search方法</a><br/><!-- 会生成 url: http://localhost:8888/student/search?id=2&name=zhangsan --><a href="#" th:href="@{/student/search(id=${student.id},name=${student.name})}">访问UrlController下面的demo方法带参数</a>
</body>
</html>
@Controller
@RequestMapping("/student")
public class StudentController {@RequestMapping("/search")public String search(Integer id, String name) {System.out.println("StudentController.search");System.out.println("id: " + id);System.out.println("name: " + name);return "index";}
}

如何引入另一个html页面:

header.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div th:fragment="common_resource"><link rel="stylesheet" th:href="@{/bootstrap-3.3.7-dist/css/bootstrap.css}"><script type="text/javascript" th:src="@{/jquery-2.1.4.js}"></script><script type="text/javascript" th:src="@{/mylayer.js}"></script></div>
</body>
</html>
<head><meta charset="UTF-8"><title>Title</title><!--<link rel="stylesheet" th:href="@{/bootstrap-3.3.7-dist/css/bootstrap.css}"><script type="text/javascript" th:src="@{/jquery-2.1.4.js}"></script><script type="text/javascript" th:src="@{/mylayer.js}"></script>--><div th:replace="header::common_resource"></div>
</head>

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

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

相关文章

(论文阅读)RNNoise 基于递归神经网络的噪声抑制库

RNNoise 是一个基于递归神经网络的噪声抑制库。 有关该算法的描述见以下论文&#xff1a; J.-M. Valin, A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement, Proceedings of IEEE Multimedia Signal Processing (MMSP) Workshop, arXiv:1709.08…

DevOps-文章目录

01什么是DevOps 02DevOps基础环境准备 03-DevOps-安装并初始化Gitlab 04-DevOps-安装并初始化Jenkins 05-DevOps-Jenkins自动拉取构建代码1 05-DevOps-Jenkins自动拉取构建代码2 06-DevOps-自动构建Docker镜像 07-DevOps-安装部署Harbor镜像仓库 08-DevOps-向Harbor上传自定义镜…

UML 状态图:以网络媒体教学系统为例解析

目录 一、系统概述 二、状态图分析 &#xff08;一&#xff09;登录认证模块 &#xff08;二&#xff09;课程选择模块 &#xff08;三&#xff09;视频播放模块 &#xff08;四&#xff09;退出登录状态 三、UML状态图绘画 四、总结 UML状态图是一种行为图&#xff0c…

交易模式革新:Eagle Trader APP上线,助力自营交易考试效率提升

近年来&#xff0c;金融行业随着投资者需求的日益多样化&#xff0c;衍生出了众多不同的交易方式。例如&#xff0c;为了帮助新手小白建立交易基础&#xff0c;诞生了各类跟单社区&#xff1b;而与此同时&#xff0c;一种备受瞩目的交易方式 —— 自营交易模式&#xff0c;正吸…

Elasticsearch BBQ 与 OpenSearch FAISS:向量搜索性能对比

作者&#xff1a;来自 Elastic Ugo Sangiorgi Elasticsearch BBQ 与 OpenSearch FAISS 的性能对比。 带有二值量化的向量搜索&#xff1a;使用 BBQ 的 Elasticsearch 比使用 FAISS 的 OpenSearch 快 5 倍。Elastic 收到了来自社区的请求&#xff0c;希望澄清 Elasticsearch 与 …

Vue 3.4 新特性详解:Composition API 与 Effect 作用域 API 实战

一、Vue 3.4 核心特性概览 Vue 3.4 代号「🏀 Slam Dunk」,带来多项关键升级: 模板解析器性能翻倍:单文件组件(SFC)构建效率提升 44%,解析速度提升 2 倍。响应式系统优化:计算属性和 watchEffect 触发更精准,减少无效渲染。Effect 作用域 API 稳定:通过 effectScope…

【day8】调用AI接口,生成自动化测试用例

1、项目结构建议 project/ ├── api_docs/ # 存放接口文档 │ └── XX系统.swagger.json ├── ai_generator/ # AI测试用例生成模块 │ └── test_case_generator.py ├── tests/ # 生成的测试用例 │ └── test_user_api.py ├── conftest.py # pytest配置 ├─…

React应用开发学习指南

AI生成研究报告&#xff1a;关键词 React应用开发 React 已经成为前端 Web 开发领域的主导力量&#xff0c;它是一个免费且开源的 JavaScript 库&#xff0c;主要用于构建用户界面 (UI) 1。其多功能性延伸到为 Web 和原生应用程序创建 UI&#xff0c;使其成为行业内备受追捧的…

MSTP+VRRP+DHCP(ENSP)

下载链接 通过网盘分享的文件&#xff1a;MSTPVRRPDHCP拓扑图 链接: https://pan.baidu.com/s/1ehRwRQ-WzKC8PsUHsTe70Q?pwd345d 提取码: 345d PC1 PC2 PC5 AR1 为AR1各端口配置IP地址 <Huawei>sys [Huawei]un in en [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/…

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 下载安装Qt&#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV&#xff1a;https://opencv.org/releases/ 下载安装CMake&#xff1a;Downl…

深入解析 Python 中的装饰器 —— 从基础到实战

1. 装饰器基础 1.1 什么是装饰器&#xff1f; 装饰器本质上是一个 Python 函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象。 1.2 语法糖&#xff1a; 符号 Python 提供了 符号作为装饰器的语法糖&#xff0c…

研究生面试常见问题

研究生面试是考研复试的重要环节&#xff0c;面试表现直接关系到录取结果。以下从面试流程、常见问题分类及回答技巧等方面为您整理了相关内容&#xff0c;帮助您更好地准备面试。 一、研究生面试的基本流程 自我介绍&#xff1a;通常需要准备1分钟左右的中文或英文自我介绍&a…

无人机避障与目标识别技术分析!

一、无人机避障技术 1. 技术实现方式 传感器融合&#xff1a; 视觉传感&#xff08;RGB/双目/红外相机&#xff09;&#xff1a;基于SLAM&#xff08;同步定位与地图构建&#xff09;实现环境建模&#xff0c;但依赖光照条件。 激光雷达&#xff08;LiDAR&#xff09;&…

Facebook隐私保护:从技术到伦理的探索

在这个数字化时代&#xff0c;隐私保护已成为公众关注的焦点。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;其用户隐私保护问题更是引起了广泛的讨论。本文将从技术层面和伦理层面探讨 Facebook 在隐私保护方面的努力和挑战。 技术层面的隐私保护 在技术…

vmware17 虚拟机 ubuntu22.04 桥接模式,虚拟机无法接收组播消息

问题描述&#xff1a; 在一个项目中&#xff0c;宿主机win10中&#xff0c;使用的vmware17pro 虚拟机安装的ubuntu22.04&#xff0c;按照网上的教程使用Qt绑定组播消息&#xff0c;在另外一个Ubuntu工控机上发送用wiresahrk抓包的组播消息 sudo tcpreplay -i enp1s0 --loop0 y…

《Operating System Concepts》阅读笔记:p735-p737

《Operating System Concepts》学习第 62 天&#xff0c;p735-p737 总结&#xff0c;总计 3 页。 一、技术总结 1.distributed system (1)定义 A collection of loosely coupled nodes interconnected by a communication network(一组通过通信网络相互连接的松散耦合节点)…

NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)

一个具有n个顶点的连通图&#xff0c;其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说&#xff0c;若砍去⼀条边就会使图不连通图&#xff1b;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个&#xff0c;将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…

小白从0学习网站搭建的关键事项和避坑指南(2)

以下是针对小白从零学习网站搭建的 进阶注意事项和避坑指南&#xff08;第二期&#xff09;&#xff0c;覆盖开发中的高阶技巧、常见陷阱及解决方案&#xff0c;帮助你在实战中提升效率和质量&#xff1a; 一、进阶技术选型避坑 1. 前端框架选择 误区&#xff1a;盲目追求最新…

Java的Servlet的监听器Listener 笔记250417

Java的Servlet的监听器Listener 笔记250417 分类1: 一、生命周期监听器 监听容器&#xff08;如 Tomcat&#xff09;中应用、会话或请求的创建与销毁。 监听器接口触发事件典型用途ServletContextListener应用启动 (contextInitialized)、关闭 (contextDestroyed)全局资源管…

网络安全领域的AI战略准备:从概念到实践

网络安全领域的AI准备不仅涉及最新工具和技术的应用&#xff0c;更是一项战略必需。许多企业若因目标不明确、数据准备不足或与业务重点脱节而未能有效利用AI技术&#xff0c;可能面临严重后果&#xff0c;包括高级网络威胁数量的激增。 AI准备的核心要素 构建稳健的网络安全…