Thymeleaf
是一个不错的模板引擎,也是Spring
可以集成的几大主力模板引擎之一,比起原生的JSP
引擎自然是强大很多。不过我一直没有系统的研究过Thymeleaf
,为了更方便的使用Spring
进行开发,自然要好好的整理一下Thymeleaf
的用法。
Spring 2.4.4
中附带的Thymeleaf
版本是3.0.12
,还包括Thymeleaf
与Spring 5
的整合。所以文档自然要看3.0
版本的。
官网文档页面有各种格式的文档可以下载,我下载了一份MOBI
的通过kindle
进行转换,再搞一份EPUB
的传入neat reader
中。到3.0.11
版本的文档一看,感叹这个工具的稳定性,文档版本还是2018
年10
月29
日的。
Thymeleaf
简介
Thymeleaf
是一个模板引擎,按照文档的说法,支持HTML
、XML
、TEXT
、JAVASCRIPT
、CSS
、RAW
。这里只关注HTML
。
Thymeleaf
的模板语言是来自于一种Object-Graph Navigation Language
的变体,更广义的说,是一种Java
的表达式语言,Spring EL
也属于这种语言。在文档中,Thymeleaf
把自己的这种模板语言称为Standard Expression Syntax
,看名字很唬人,我下边就直接称其为模板语言。
Thymeleaf
在HTML
中,是通过在页面的根标签,也就是HTML
标签中添加一个属于Thymeleaf
的命名空间,一般叫做th
。
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
这个属性不会对页面产生任何影响,只是给IDE
和模板引擎来看的。Thymeleaf
的设计理念是不影响原有页面的格式和内容,没有被模板引擎解析的时候,就是一个正常的HTML(5)
文档,被解析之后,就有了动态内容。
模板引擎只会解析标签上的以th
开头的属性内容,不过像th:href
这种标签,其实并不符合HTML5
的标准,如果想使用HTML5
的风格,Thymeleaf
还支持把属性写成如下格式:
<p data-th-text="${testData}">HTML5格式的属性</p>
既然要用Thymeleaf
,那么两大块内容就需要了解:
- 模板渲染属性的作用,比如
th:if
起到什么作用 - 模板语言的语法
由于属性非常多,用到的时候再来总结,现在
模板语言语法
先学会语法,才能够灵活运用。先来看看模板语法的几大内容:
简单的表达式
- 变量表达式:
${...}
,经常用于渲染一个变量的内容到网页上 - 选择变量表达式:
*{...}
,这个需要结合th:object
来使用 - 消息表达式:
#{...}
,这个专门是用于显示消息,和上边的变量表达式不同 URL
表达式:@{...}
,用于操作URL
,拼接属性等操作Fragment
表达式:~{...}
,这个之前已经使用过了
字面量
- 字符串字面量,用单引号括住:
'one text'
,'Another one!'
- 数字字面量,直接写即可,比如:
42
,3.0
,12.3
- 布尔值字面量,小写的字母:
true
,false
Null
对象,直接写字母即可:null
- 变量名,将变量名直接以字符序列写在表达式中即可,比如
${var}
字符串拼接
字符串拼接有两种方式:
- 字符串拼接操作符:
+
- 字符串拼接的替代方法,用
|
符号包裹要拼接的字符串:|The name is ${name}|
数学运算符
+
,-
,*
,/
,%
布尔操作符
- 布尔操作符与和或,直接写即可:
and
,or
- 非操作符,可以写成
not
,也可以用一个!
号
比较运算符
发现Thymeleaf
很灵活,在很多运算符方面都提供了多种选择。
- 大于小于,大于等于,小于等于,可以用符号,也可以用文字:
> < >= <= (gt, lt, ge, le)
- 判断相等的运算符,可以用等号或者文字:
== != (eq ne)
条件判断
条件判断可以采用类似于三元操作符的形态:
if
判断成功则执行then
:(if ? then)
- 类似于三元操作符的分支:
(if ? then : else)
- 提供默认值:
(value ?: defaultvalue)
“什么都不干”运算符
No-Operation
,是一个下划线_
,类似于默认值。
这些运算符,在一个表达式中可以复合使用,官方给了一个例子:
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
${...}
表达式
变量表达式${...}
用来渲染上下文中的变量名称,对于Spring
开发来讲,就是渲染放到Model(ModelAndView)
的变量,不过渲染变量的功能很强大,详细来看看。
从对象中取值并渲染
除了在控制器中直接放入一个键值对,也可以放入一个对象,然后可以从其中取值渲染,对象还可以是Map
,Collection
对象,都有办法取值,当然,这也是模板语言的基本能力。
${cony.owl.name}
,可以多级取属性,内部是调用Getter()
来获取属性${cony['own']['name']}
,取属性的时候还可以使用方括号,其中的键可以用字符串字面量,也可以用其他变量- 对于一个
Map
类型的对象,使用方括号和.
操作符的效果是一样的${animals['owl'].name}
、 - 对于集合项目,可以用方括号加索引来取值:
${animals[0].name}
- 大概这个是最屌的功能,就是表达式中可以执行方法,带参数也可以:
${animals.getFirstOwl()}
可以使用的特殊对象
Thymeleaf
提供了一些以#
号开头的特殊文件,无需通过控制器传入页面即可使用,很多是一些工具类,非常实用。官网文档Appendix B
列出了这些对象的详细操作方法。
这里列出来一些常用的:
#execInfo
:模板的基础信息#messages
:用户获取消息的对象,可以从外部加载消息对象,多用于多语言配置。目前我的项目里用不到。#uris
:uri
工具#dates
:dates
工具,经常会用到其中日期格式化输出的功能。#calendars
:和dates
工具很像,内部是Calendar
对象。#numbers
:常用到其中的格式化输出功能。#strings
:字符串工具类,也很常用。#bools
:判断一些布尔值的工具类。#arrays
:Array
工具类。#lists
:List
工具类。#sets
:Set
工具类。#maps
:Map
工具类。#aggregates
:用于快捷对集合进行操作的对象,比较常用。#ids
:用于循环中控制循环序号的对象,比较常用。