![Spring Boot实战:从0开始动手搭建企业级项目](https://wfqqreader-1252317822.image.myqcloud.com/cover/850/40107850/b_40107850.jpg)
8.5 Thymeleaf语法讲解
8.5.1 Thymeleaf语法
Thymeleaf官方对于标准表达式特性的总结如下所示。
(1)表达式语法
①变量表达式:${...}
②选择变量表达式:*{...}
③信息表达式:#{...}
④链接URL表达式:@{...}
⑤分段表达式:~{...}
(2)字面量
①字符串:'one text'、'Another one!' ......
②数字:0, 34、3.0、12.3 ......
③布尔值:true、false
④Null值:null
⑤字面量标记:one、sometext、main ......
(3)文本运算
①字符串拼接:+
②字面量置换: |The name is ${name}|
(4)算术运算
①二元运算符:+、-、*、/、%
②负号(一元运算符):(unary operator): -
(5)布尔运算
①二元运算符:and、or
②布尔非(一元运算符):!、not
(6)比较运算
①比较:>、<、>=、<= (gt、lt、ge、le)
②相等运算符:==、!= (eq、ne)
比较运算符也可以使用转义字符,比如大于号,可以使用Thymeleaf语法gt,也可以使用转义字符“>”。
(7)条件运算符
①If-then: (if) ? (then)
②If-then-else: (if) ? (then) : (else)
③Default: (value) ?: (defaultvalue)
(8)特殊语法
无操作:_
接下来通过编码的方式实践这些知识点,并将知识点进行串联以接近实际开发情况。
8.5.2 Thymeleaf简单语法实践
在templates目录下新建simple.html模板页面。该案例主要介绍字面量及简单的运算操作,包括字符串、数字、布尔值等常用的字面量及常用的运算和拼接操作,代码如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/163-1.jpg?sign=1738960188-3IBCrujMjxESlRD7QYOzCTXK5gcDZ8s3-0-b69e2e424638c7bb4384d221b439c164)
在浏览器中打开simple.html模板页面,结果如图8-12所示。
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/164-1.jpg?sign=1738960188-d6GOxmH0pl0fAWhkVbFCiP4f1Jflfo2T-0-7a50bba05849b424bc1cc5a3e75dceff)
图9-12 simple.html页面默认显示效果
模板文件包含的部分变量为后台设置的值,并与字面量结合进行了计算和显示。在ThymeleafController类中新增对应的simple()方法并将请求转发至simple.html模板页面,代码如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/164-2.jpg?sign=1738960188-3T9wdO8NXaQ61BW0mXX2Vf5IvmUs9CGP-0-733455beb4e8fdb6a38f4a81851ec47b)
在编码完成后,重启Spring Boot项目。在项目启动成功后,可以打开浏览器并访问如下地址:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/164-3.jpg?sign=1738960188-P5x6pudNxJpDFoKGaGr4ACs82dx7T74A-0-e48d27b1557aed78dc0e1fe4e50deca0)
得到的页面结果如图8-13所示。
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/165-1.jpg?sign=1738960188-8dSOKYESx9G0xtKh3QikMJj11W4VfWsO-0-99c4343e1f73e28c516743ca1a3967b0)
图8-13 simple.html模板引擎渲染后的显示效果
图8-12为静态html结果,图8-13为Thymeleaf模板引擎渲染的结果,可以看到字面量的展示及运算结果。以上为Thymeleaf语法中变量的使用方法和简单的运算操作,读者可以参考以上代码进行学习并适当修改数值以尽快掌握该知识点。
8.5.3 Thymeleaf表达式
Thymeleaf表达式包括:变量表达式${...}、选择变量表达式*{...}、信息表达式#{...}、链接URL表达式@{...}、分段表达式~{...}。这些表达式一般只写在Thymeleaf模板文件的th标签中,否则不会生效。表达式语法的主要作用就是获取变量值、获取绑定对象的变量值、国际化变量取值、URL拼接与生成、Thymeleaf模板布局。接下来笔者会选择一些常用的表达式进行介绍和实践。
1. 变量表达式
变量表达式即OGNL表达式或Spring EL表达式,其作用是获取模板中与后端返回数据所绑定对象的值,写法为${...}。这是最常见的一个表达式,在取值赋值、逻辑判断、循环语句中都可以使用该表达式,示例如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/165-2.jpg?sign=1738960188-klvP2gDcOkcKO6xNLx65wnyKWRhDgdjW-0-fb772fb6930064cfa11ec7cd1cbca137)
变量表达式也可以使用内置的基本对象,如下所示。
①ctx:上下文对象
②vars:上下文变量
③locale:上下文语言环境
④request:在Web环境下的HttpServletRequest对象
⑤response:在Web环境下的HttpServletResponse对象
⑥session:在Web环境下的HttpSession对象
⑦servletContext:在Web环境下的ServletContext对象
代码示例如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/166-2.jpg?sign=1738960188-CQZZhj6NNAqfLSQQMXCLr5uSBDQ1rT7Z-0-64f0f823c3393c1737c0528f828842b4)
同时,Thymeleaf还提供了一系列Utility工具对象(内置于Context中),可以通过#直接访问,工具对象如下所示。
①dates:java.util.Date的功能方法类
②calendars:类似#dates,面向java.util.Calendar
③numbers:格式化数字的工具方法类
④strings:字符串对象的工具方法类,contains、startWiths、prepending/appending等
⑤bools:求布尔值的工具方法
⑥arrays:数组的工具方法
⑦lists:java.util.List的工具方法
⑧sets:java.util.Set的工具方法
⑨maps:java.util.Map的工具方法
在项目开发中,可以将这些方法视为工具类,通过这些方法可以使得Thymeleaf模板引擎在操作变量时更加方便。
2. 选择(星号)表达式
选择表达式与变量表达式类似,不过它会用一个预先选择的对象代替上下文变量容器来执行。语法为*{goodsName}。被指定的对象由th:object标签属性在外层进行定义。前文读取goodsDetail对象的goodsName字段可以替换为:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/167-1.jpg?sign=1738960188-xpRKxYfpcFAFnBekepNmnEgsBhePOto4-0-299f38efd358b0f9bfb4efebec92d6a8)
如果在不考虑上下文的情况下,两者没有区别,使用${...}读取的内容也完全可以替换为使用*{...}进行读取。唯一的区别是使用*{...}前可以预先在父标签中通过th:object定义一个对象并进行操作,代码如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/167-2.jpg?sign=1738960188-Jd89AK0hXf7BaHCuYKl6zivIxheiFd0p-0-fb777e50b533442bf38d296ed1b64376)
3. URL表达式
th:href对应的是html中的href标签,它将计算并替换href标签中的URL地址,th:href可以直接设置为静态地址,也可以使用表达式语法对读取的变量值动态拼接为URL地址。
比如一个详情页的URL地址:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/167-3.jpg?sign=1738960188-doV6H5N98oIuggt3lILA8Rx1OgXD1VdP-0-b4cc133e2f7133b94f345cee887a56f2)
当使用URL表达式时,可以写成这样:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/167-4.jpg?sign=1738960188-ARONY1LdKvUWLWjp19gVbcHSzjywvnQ7-0-5d61c22b9a9d37bbbc89303b89eb3453)
也可以根据id值进行替换,写法为:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/167-5.jpg?sign=1738960188-cHE9BSJrCTpyp6iwQR0CQFFl9D5MHysw-0-972c8ceef3c35ac1a14fe1500a9d346f)
或者也可以写成这样:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/167-6.jpg?sign=1738960188-TEBFoz7r6YlZyNPvZFhrJoOIL3LSI2Nb-0-9c67b5c5b6ed3d5fb3f7d958ea5f36d3)
以上三种表达式生成的URL结果都是相同的。开发人员可以自己使用字符串拼接的方法组装URL(第二种写法),也可以使用URL表达式提供的语法进行URL组装(第三种写法)。如果有多个参数可以自行拼装字符串,或者使用逗号进行分隔,写法如下:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/168-1.jpg?sign=1738960188-bvRpjNAXAlyVr8q5IsbITf9qJNh9QHyg-0-c82ad48f7e96da8ce3b028384a7fcf0c)
最终生成的URL为“http://localhost:8080/goods/1?title=iPhone13&tag=手机”。另外,URL中以"/" 开头的路径(比如/goods/1),默认生成的URL会加上该项目的当前地址形成完整的URL。
4. Thymeleaf复杂语法实践
这里将结合前文中的知识点进行更加复杂的语法实践,主要涉及后续实战章节会出现的一些方法,比如判断语句、循环语句、工具类使用等。
在templates目录下新建complex.html模板文件,代码如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/168-2.jpg?sign=1738960188-GyrEphA4oYBT7eEmTMwCr1IE5elRFUoi-0-2ede9fca8872b60ccf3b004456311952)
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/169-1.jpg?sign=1738960188-My8VoVH95YViMJy9Au7Yh11MMbZhypTc-0-ab4008f3c4ae1f3710cffd055de751d0)
在ThymeleafController类中新增对应的complex()方法并将请求转发至complex.html模板页面,代码如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/170-1.jpg?sign=1738960188-fJlVVId6wjDujbySQp7nGMpDIrFkfaAl-0-e59b70bad0ed8768570cf252c5bcfdfe)
在编码完成后,重启Spring Boot项目。在项目启动成功后,可以打开浏览器并访问如下地址:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/170-2.jpg?sign=1738960188-RwBUhFf8oWp9jBll8p2DebaPk9aJGdcx-0-eaa6e3ff4f2453c8f9c3b5f11163af7f)
得到的页面结果如图8-14所示。
在strings工具类测试中,首先使用了th:if标签进行逻辑判断。th:if="${not #strings.isEmpty(testString)}"即为一条判断语句。${...}表达式会返回一个布尔值结果,如果为true则该div中的内容会继续显示,否则将不会显示th:if所在的主标签。#strings.isEmpty的作用为字符串判空,如果testString为空则会返回true,而表达式前面的not则表示逻辑非运算,即如果testString不为空则继续展示该div中的内容。与th:if类似的判断标签为th:unless,它与th:if标签刚好相反,即当表达式中返回的结果为false时,它所在标签中的内容才会继续显示。这里在#lists工具类测试使用了th:unless标签,读者在调试代码时可以比较二者的区别。
Thymeleaf模板引擎的循环语句语法为th:each="i:${testList}",类似于JSP中的c:foreach表达式,主要表示循环的逻辑,很多页面逻辑在生成时会使用到该语法。还有读取Map对象的方式为${testMap.get('title')},与Java语言也很类似。
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/171-1.jpg?sign=1738960188-l442V8bJoRev0K1CrqgPhL5n0LCFDBZa-0-117b52ab77f818d8b2a4f04753060c31)
图8-14 complex.html模板引擎渲染后的显示效果
逻辑判断、循环语句这两个知识点是系统开发中比较常用也是比较重要的内容,希望读者能够结合代码练习并牢牢掌握这些知识点。
本章讲解内容较多,且多为实践内容,完整的代码目录如图8-15所示。
读者可以参考本章提供的源码和案例进行练习。Thymeleaf模板引擎的知识和语法实践这里讲解完成,后续在项目开发的章节中不再进行单独介绍。为了后续学习能够更顺畅,建议读者一定要多练习Thymeleaf模板引擎的基础语法。
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/172-1.jpg?sign=1738960188-cAFawW87Keoo4D7K0w9jtb3LIqSyOFAl-0-f63edaccf767d6d296e706d185e5dcaa)
图8-15 Thymeleaf模板引擎实例代码的完整目录结构