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:用于循环中控制循环序号的对象,比较常用。