Thymeleaf 基本使用

news2024/12/23 6:17:56

01、Thymeleaf

      官网地址:Thymeleaficon-default.png?t=N7T8https://www.thymeleaf.org/

简介

        Thymeleaf是一种服务器端Java模板引擎,用于将数据渲染为HTML、XML、JavaScript等格式,并在Web浏览器中呈现给用户。 具体来说,Thymeleaf充当着视图层的角色,与控制器和模型一起构成了典型的MVC(模型-视图-控制器)设计模式中的视图部分。 Thymeleaf模板引擎允许我们在模板中使用HTML标记、JavaScript表达式和Thymeleaf表达式等,以动态地生成Web页面。Thymeleaf提供了一些特殊的属性和标签,以支持与控制器和模型之间的数据绑定和交互。
      相比于传统的前端技术(如HTML、CSS和JavaScript),Thymeleaf更注重后端的处理逻辑和数据交互。Thymeleaf能够从服务器端动态地生成页面,这意味着我们可以将服务器端的数据直接渲染到页面上,从而减少了大量的前端开发工作。同时,由于Thymeleaf能够与后端Java代码无缝集成,因此我们可以很方便地使用Java提供的各种类库和框架,进一步简化了开发工作。

为什么使用thymeleaf ?

    因为jsp页面存在劣势,它的本质是Servlet,还是一个类,只要是类就离不开JVM。我们无法通过浏览器直接查看JSP页面的效果,这不便于前端页面的实现。
    替代JSP:
        1、模板引擎,具备JSP的功能,但是比JSP更加强大,可以直接通过浏览器查看页面效果。
        2、前后端分离,Vue。

简介Thymeleaf 的特点

  • 动静结合:Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果,也可以通过 Web 应用程序进行访问,查看动态页面效果。
  • 开箱即用:Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,可以快速地实现表单绑定、属性编辑器、国际化等功能。
  •  SpringBoot 完美整合:SpringBoot  Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 置了视图解析器,因此 Thymeleaf 可以与 Spring Boot 完美整合。
Thymeleaf 通过在 html 标签中,增加额外属性来达到模板+数据的展示方式:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p th:text="${username}">Original Value</p>
</body>
</html>

02、物理视图和逻辑视图

    2.1、物理视图

        请求转发到一个HTML页面时,使用的完整的转发路径就是物理视图。
            例如:/pages/user/index.html
        如果我们把所有的HTML页面都放在某个统一的目录下,那么转发地址就会呈现出明显的规律:
            /pages/user/login.html
            /pages/user/login_success.html
            /pages/user/regist.html
            /pages/user/regist_success.html
        规律:路径的开头都是:/pages/user/  ,路径的结尾都是:.html 
        所以,路径开头的部分我们称之为视图前缀,路径结尾的部分我们称之为视图后缀

    2.2、逻辑视图

        物理视图=视图前缀+逻辑视图+视图后缀
视图前缀
逻辑视图
视图后缀
物理视图
/pages/user/
login
.html
/pages/user/login.html
/pages/user/
login_success
.html
/pages/user/login_success.html

03、Thymeleaf 语法

3.1、引入命令空间

       
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Index Page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p th:text="${message}">Welcome to BeiJing!</p>
</body>
</html>
注意:‘xmlns:th="http://www.thymeleaf.org"’引入Thymeleaf命名空间。

3.2、常用标签

     

     3.2.1、th:text 

       作用:替换标签的文本原始值。
<!-- 使用【字面量值】替换标签体原始值-->
<h1 th:text="HelloWorld">标签体原始值</h1>
<!-- 使用域中数据替换标签体原始值 -->
<h1 th:text="${username}">这里要显示一个动态的username</h1>

     3.2.2、th:属性名

        作用:替换指定属性的属性值
<input type="text" name="username" th:value="${username}"/>

3.3、常用表达式

语法
描述
作用
${...}
变量表达式
变量表达式 是最常用的一种表达式,它主要可以获取变量的值。
*{...}
选择表达式
消息表达式 主要是用于读取属性文件(.properties)中的值,它常常用于国际化。
#{...}
消息表达式
选择表达式 我们也称为是星号表达式,它与 变量表达式 的区别是:变量表达式 的对象取的是整个上下文中的变量,而 选择表达式 的对象取的是当前对象中的变量。这样做的好处是只需要在当前对象中取,不需要通过上下文去取,在一定程度上提高了执行效率,这也是性能上的一种优化。
@{...}
链接表达式
链接表达式 主要在页面中有链接的地方使用。
~{...}
分段表达式
分段表达式 主要用于模板布局时的引用。也就是在一个页面中引入另一个页面中的内容。

     3.3.1、案例

    
    1)、变量表达式
<!-- 获取 name 变量的值 -->
<p th:text="${name}"></p>
    2)、选择表达式
<!-- book 中从上下文中取的一个变量 -->
<div th:object="${book}">
<!-- title 是 book 中的属性 -->
<span th:text="*{title}"></span> </div>
    其中 th:object 的意思是:用来接受后台传过来的对象。
    3)、消息表达式
<!-- 读取属性文件中 key 为 name 的值 -->
<p th:text="#{name}"></p>
    
    注意: 我们必须先要配置属性文件所在位置,在项目配置文件中配置以下内容:
spring:
    messages:
        basename: msg
    4)、链接表达式
<a th:href="@{/result}">...</a>
<!--整个页面 href和src属性的标签自动拼接项目地址  http://ip:端口/项目名/ -->
<base th:href="@{/}" th:src="@{/}">
    5)、分段表达式
    首先我们准备两个页面,分别是 result.html 和 foot.html,我们在 result.html 中引入 foot.html 的内容。
    result.html
<body>
    <p>这是 result.html 页面</p>
    <div th:insert="~{foot :: copy}"></div>
</body>
    foot.html
<body>
    <div th:fragment="copy">
        &copy; 2020 <a href="http://www.baidu.com">百度</a>
    </div>
</body>

3.4、内置对象

    
    所谓内置对象其实就是在Thymeleaf的表达式中可以直接使用的对象。
基本对象:
对象
描述
#ctx
上下文对象
#vars
同#ctx,表示上下文变量
#locale
上下文本地化(特定的地理区域)变量,可参考:java.util.Locale
#request
HttpServletRequest 对象,可参考:javax.servlet.http.HttpServletRequest
#response
HttpServletResponse 对象,可参考:javax.servlet.http.HttpServletResponse
#session
HttpSession 对象,可参考:javax.servlet.http.HttpSession
#servletContext
ServletContext 对象,可参考:javax.servlet.ServletContext
工具类对象:
对象
描述
#dates
日期时间工具类
#strings
字符串工具类
#lists
List集合工具类
#numbers
数字工具类
#calendars
日历工具类
#objects
对象工具类
#bools
布尔工具类
#arrays
数组工具类
#sets
Set工具类
#maps
Map工具类
处理空值, 通过加问号来判断前面的值是否为空,防止报错。
<p th:text="${data?.name}"></p>
示例:
    #ctx
<!-- zh_CN -->
<p th:text="${#ctx.getLocale()}"></p>
<!-- Welcome to BeiJing! -->
<p th:text="${#ctx.getVariable('message')}"></p>
<!-- true -->
<p th:text="${#ctx.containsVariable('message')}"></p>
    #vars
<!-- zh_CN -->
<p th:text="${#vars.getLocale()}"></p>
<!-- Welcome to BeiJing! -->
<p th:text="${#vars.getVariable('message')}"></p>
<!-- true -->
<p th:text="${#vars.containsVariable('message')}"></p>
    #locale
<!-- zh_CN -->
<p th:text="${#locale}"></p>
<!-- CN -->
<p th:text="${#locale.country}"></p>
<!-- 中国 -->
<p th:text="${#locale.displayCountry}"></p>
<!-- zh -->
<p th:text="${#locale.language}"></p>
<!-- 中文 -->
<p th:text="${#locale.displayLanguage}"></p>
<!-- 中文 (中国) -->
<p th:text="${#locale.displayName}"></p>
    #request
<!-- HTTP/1.1 -->
<p th:text="${#request.protocol}"></p>
<!-- http -->
<p th:text="${#request.scheme}"></p>
<!-- localhost -->
<p th:text="${#request.serverName}"></p>
<!-- 8080 -->
<p th:text="${#request.serverPort}"></p>
<!-- GET -->
<p th:text="${#request.method}"></p>
<!-- /standard-expression-syntax/variables -->
<p th:text="${#request.requestURI}"></p>
<!-- http://localhost:8080/standard-expression-syntax/variables -->
<p th:text="${#request.requestURL}"></p>
<!-- /standard-expression-syntax/variables -->
<p th:text="${#request.servletPath}"></p>
<!-- java.util.Collections$3@203646fe -->
<p th:text="${#request.parameterNames}"></p>
<!-- {q=[Ljava.lang.String;@3308c69f} -->
<p th:text="${#request.parameterMap}"></p>
<!-- q=expression -->
<p th:text="${#request.queryString}"></p>
    注意,请求地址的 URL 参数直接通过#request.x是取不出来的,需要使用param.x语法来取出。如,URL:/standard-expression-syntax/variables?q=expression,取出 q 参数的正确方式:
<p th:text="${param.q}"></p>
    #response
<!-- 200 -->
<p th:text="${#response.status}"></p>
<!-- 8192 -->
<p th:text="${#response.bufferSize}"></p>
<!-- UTF-8 -->
<p th:text="${#response.characterEncoding}"></p>
<!-- text/html;charset=UTF-8 -->
<p th:text="${#response.contentType}"></p>
    #session
<!-- 2BCB2A0EACFF2D9D249D9799431B5127 -->
<p th:text="${#session.id}"></p>
<!-- 1499786693244 -->
<p th:text="${#session.lastAccessedTime}"></p>
<!-- fanlychie -->
<p th:text="${#session.getAttribute('user').name}"></p>
    注意,放到会话里面的对象直接通过#session.x是取不出来的,需要使用session.x语法来取出。如,取出会话里面的 user 对象的正确方式:
<p th:text="${session.user.name}"></p>
    #dates
<!--2022年9月18日 GMT+08:00 下午1:40:48-->
<p th:text="${#dates.format(myDate)}"></p>
<!--2022-09-18-->
<p th:text="${#dates.format(myDate, 'yyyy-MM-dd')}"></p>
<!--2022-09-18 13:40:48-->
<p th:text="${#dates.format(myDate, 'yyyy-MM-dd HH:mm:ss')}"></p>
<!--2022-->
<p th:text="${#dates.year(myDate)}"></p>
<!--9-->
<p th:text="${#dates.month(myDate)}"></p>
<!--Sun Sep 18 13:40:49 GMT+08:00 2022-->
<p th:text="${#dates.createNow()}"></p>
    #strings
<!--HELLO WORLD-->
<p th:text="${#strings.toUpperCase(myStr)}"></p>
<!--2-->
<p th:text="${#strings.indexOf(myStr,'ll')}"></p>
<!--llo-->
<p th:text="${#strings.substring(myStr, 2, 5)}"></p>
<!--hello worldJava-->
<p th:text="${#strings.concat(myStr, 'Java')}"></p>
<!--11-->
<p th:text="${#strings.length(myStr)}"></p>
<!--5-->
<p th:text="${#strings.length('happy')}"></p>
<!--true-->
<p th:text="${#strings.contains(myStr, 'hello')}"></p>
    #lists
<!--3-->
<p th:text="${#lists.size(myList)}"></p>
<!--true-->
<p th:text="${#lists.contains(myList, 1)}"></p>
<!--false-->
<p th:text="${#lists.isEmpty(myList)}"></p>
<!--[1, 2, 3]-->
<p th:text="${#lists.sort(myList)}"></p>
    #numbers
<!--¥12.25-->
<p th:text="${#numbers.formatCurrency(myNumber)}"></p>
<!--0012.2-->
<p th:text="${#numbers.formatDecimal(myNumber, 4, 1)}"></p>

3.4、字符串拼接

     在Thymeleaf中,可以使用+运算符进行字符串拼接。例如:
<p th:text="'Hello, ' + ${user.name} + '!'">默认问候</p>

3.5、条件比较

     Thymeleaf支持常见的条件比较,如==、!=、<、>等。例如:
<div th:if="${user.age} > 18">成年用户</div>

3.6、switch多分支

     Thymeleaf支持switch语句,用于多分支条件判断。例如:
<div th:switch="${user.role}">
    <p th:case="'admin'">管理员</p>
    <p th:case="'user'">普通用户</p>
    <p th:case="*">未知角色</p>
</div>

3.7、循环

     Thymeleaf支持th:each属性,用于遍历集合。例如:
<ul>
    <li th:each="item : ${items}" th:text="${item.name}">默认列表项</li>
</ul>

3.8、逻辑运算符

     在Thymeleaf中,我们可以使用加(+)、减(-)、乘(*)、除(/)和取余(%)等基本算术运算符来进行数值计算。这些运算符的使用方法与传统的编程语言类似,可以直接应用在表达式中,实现数值的加减乘除等操作。 例如:
<p th:text="${user.age} + 1">年龄加一</p>

3.9、内联

    Thymeleaf支持内联表达式,用于在文本和属性中直接插入表达式。这种表达式允许我们在文本内容和HTML属性中直接插入动态数据,从而实现页面内容的灵活定制。例如:
<p>你好,[[${user.name}]]!</p>

04、Thymeleaf 与 springboot整合

    

    4.1、导入依赖

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

    4.2、页面引入命名空间

xmlns:th="http://www.thymeleaf.org"
到这里页面就可以使用thymeleaf的语法,注意:页面要经过控制器。

    4.3、静态资源项目名直接访问

    添加配置
#开放静态资源目录,这个配置目录会覆盖默认配置:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"
spring:
    resources:
      static-locations: classpath:/static/,file:${file.dir}
#资源目录
file:
  #资源根目录
  dir: D:/data
    这样D盘的data目录下的资源直接可以使用:http://IP地址:端口/资源名

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

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

相关文章

代码随想录day19(1)二叉树:对称二叉树(leetcode101)

题目要求&#xff1a;判断一棵二叉树是否轴对称 思路&#xff1a;如果二叉树是对称二叉树&#xff0c;说明此二叉树是可以左右翻转的&#xff0c;所以判断的时候我们同时遍历两棵子树&#xff0c;比较两棵子树的内、外侧是否相等&#xff0c;比较的时候我们实际上比较的是左孩…

Leedcode刷题——5 DFS+回溯

注&#xff1a;以下代码均为c 1. 电话号码的字母组合 思路&#xff1a; 例如&#xff1a;”23“ //1. 我自己写的 vector<string> letterCombinations(string digits) {if(digits "")return {};vector<string> state {""};string s;vecto…

读取txt文件并统计每行最长的单词以及长度

读取txt文件并统计每行最长的单词以及长度 题目 在 D:\\documant.txt 文本中,文件中有若干行英文文本,每行英文文本中有若干个单词&#xff0c;每个单词不会跨行出现每行至多包含100个字符,要求编写一个程序,处理文件,分析各行中的单词,找到每行中的最长单词&#xff0c;分别…

cmd 输入pip 提示不是内部或外部命令,也不是可运行的程序 或批处理文件。

解决办法&#xff1a; 把pthon的安装路径加入到环境变量中&#xff0c;重新打开cmd运行即可 比如&#xff1a;C:\Users\huanhuan\AppData\Local\Programs\Python\Python311\Scripts

测试环境搭建整套大数据系统(十:测试环境minio单节点部署)

一&#xff1a;部署minio 创建安装目录。 mkdir -p /data/server/minio/{bin,data,config,log}bin&#xff1a;二进制文件目录data&#xff1a;数据存储目录config&#xff1a;配置文件目录log&#xff1a;日志文件路径下载二进制安装包到bin目录&#xff0c;或者提前下载好拷…

edm邮件是什么意思:与普通邮件有何不同?

edm邮件是什么意思&#xff1f;如何优化邮件内容以提高转化率&#xff1f; edm邮件因其独特的营销价值而备受关注。那么&#xff0c;edm邮件究竟是什么意思呢&#xff1f;它与普通邮件又有哪些不同呢&#xff1f;下面&#xff0c;AokSend就来为大家介绍一下。 edm邮件的概念与…

KMP算法——解决字符串匹配问题

一般来说在你没学过KMP算法前&#xff0c;你解决字符串匹配问题会采用BF算法——BF算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配&#xff0c;若相等&#xff0c;…

这三个长辈必备的手机模式,你给他们设置了吗?

您是否曾听家里长辈说过手机图标字体太小看起来很吃力&#xff1f;是否曾担心家里长辈在手机上误安装恶意软件&#xff1f;是否曾因为各种骚扰和推销电话而感到困扰&#xff1f;现在&#xff0c;这些问题不再是难题&#xff0c;因为有了华为手机的长辈关怀功能——一键开启放大…

运维打工人,兼职跑外卖的第二个周末

北京&#xff0c;晴&#xff0c;西南风1级。 前序 今天天气还行&#xff0c;赶紧起来&#xff0c;把衣服都洗洗&#xff0c;准备准备&#xff0c;去田老师吃饭早饭了。 一个甜饼、一个茶叶蛋、3元自助粥花费7.5。5个5挺吉利的。 跑外卖的意义 两个字减肥&#xff0c;记录刚入…

HCIP --- BGP 综合实验

目录 实验拓扑图&#xff1a; 实验要求&#xff1a; 实验步骤&#xff1a; 1.划分IP地址 R1的配置 R2的配置 R3的配置 R4的配置 R5的配置 R6的配置 R7的配置 R8的配置 2.检测查询IP地址 3.OSPF 建邻 4.查询OSPF 建邻是否成功 5.AS 2 内部BGP 建邻 a. AS 2 内部 IBG…

淘宝扭蛋机小程序:探索未知的惊喜之旅

你是否曾在商场里被那闪闪发光的扭蛋机吸引&#xff0c;却因为种种原因无法下手&#xff1f;现在&#xff0c;淘宝扭蛋机小程序带给你全新的扭蛋体验&#xff0c;让你随时随地都能感受到那份未知的惊喜。 淘宝扭蛋机小程序是一款集娱乐与购物于一体的全新应用。它汇聚了众多热…

(开源项目)OpenHarmony、社区共建Sample合入要求

1.新增Sample功能不能重复于当前已有Sample的功能&#xff1b; 2.新增Sample的工程推荐使用ArkTS语言编写&#xff1b; 3.新增Sample的工程推荐使用Stage模型编写&#xff1b; 4.新增Sample的工程中需要包含UI自动化用例&#xff08;ohosTest工程模块&#xff09;&#xff0…

Windows11安装NodeJS18并配置环境变量

从官网下载&#xff0c;或者从百度网盘下载 解压下载的zip包&#xff1a; 重命名为nodejs&#xff1a; 在nodejs中添加cache和global两个目录&#xff1a; 将nodejs和nodejs\global添加到环境变量&#xff1a; 打开终端&#xff0c;输入&#xff1a; node -v接着配置…

AI新工具(20240312) Midjourney官方发布角色一致性功能;免费且开源的简历制作工具;精确克隆语调、控制声音风格

1: Midjourney角色一致性功能 使人物画像在多方面高度一致成为可能。 Midjourney的角色一致性功能的使用方法如下&#xff1a; ⭐在你的输入指令后面加上 --cref URL&#xff0c;其中URL是你选择的角色图像的链接。 ⭐你可以通过 --cw 参数来调整参照的强度&#xff0c;范围…

基于Spring Boot的校园管理系统 ,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1767745870094217218

高频:spring知识

1、bean的生命周期&#xff1f; 主要阶段 初始化 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext67424e82: startup date []; root of context hi…

品牌升级 | 图扑物联正式启用新LOGO

为进一步提升品牌形象&#xff0c;提高品牌影响力&#xff0c;2024年&#xff0c;我们迎来了一次重要的品牌升级——LOGO迭代。此次升级&#xff0c;在传承与创新中既保留了公司的核心精神&#xff0c;又融入了新的视觉语言&#xff0c;不仅代表了公司的新形象、新面貌&#xf…

当运维深陷“困境”,如何“破旧立新”?

背景 先来看下运维小伙伴们遇到的几种境遇&#xff1a; 投产变更&#xff0c;流程流于形式 投产步骤特别复杂&#xff0c;几百套系统几百种投产方式&#xff0c;公司的测试环境流于形式&#xff0c;经常会有投产文档和真实操作不一致的情况 几百套系统&#xff0c;几十种操作…

rhce证书含金量高吗?rhce考试包括哪些内容?考完工资多少?

rhce证书含金量 高吗&#xff1f; 随着目前国内IT职业的飞速发展&#xff0c;RHCE已经成为IT职业的首选认证、高薪亮点。Linux人才出现大比例短缺的状况&#xff0c;企业对Linux人才的需求也继续升温。那相关认证RHCE现在具有怎样的含金量呢&#xff0c;本期小编给大家分析分析…

Docker入门笔记(1)

Docker入门笔记&#xff08;1&#xff09; 容器技术入门 之前我的WIT问卷管理系统在阿里云上部署需要好多配置&#xff0c;各个环境耦合的比较紧密&#xff0c;花了不少时间去做部署和调配。 现在有了Docker以后&#xff0c;我们可以把各种组件配置好&#xff0c;然后打包成…