Using Thymeleaf 01:基础语法与渲染变量

Using Thymeleaf 01:基础语法与渲染变量

一边写系统,一边好好看模板引擎

Thymeleaf是一个不错的模板引擎,也是Spring可以集成的几大主力模板引擎之一,比起原生的JSP引擎自然是强大很多。不过我一直没有系统的研究过Thymeleaf,为了更方便的使用Spring进行开发,自然要好好的整理一下Thymeleaf的用法。

Spring 2.4.4中附带的Thymeleaf版本是3.0.12,还包括ThymeleafSpring 5的整合。所以文档自然要看3.0版本的。

官网文档页面有各种格式的文档可以下载,我下载了一份MOBI的通过kindle进行转换,再搞一份EPUB的传入neat reader中。到3.0.11版本的文档一看,感叹这个工具的稳定性,文档版本还是20181029日的。

Thymeleaf简介

Thymeleaf是一个模板引擎,按照文档的说法,支持HTMLXMLTEXTJAVASCRIPTCSSRAW。这里只关注HTML

Thymeleaf的模板语言是来自于一种Object-Graph Navigation Language的变体,更广义的说,是一种Java的表达式语言Spring EL也属于这种语言。在文档中,Thymeleaf把自己的这种模板语言称为Standard Expression Syntax,看名字很唬人,我下边就直接称其为模板语言。

ThymeleafHTML中,是通过在页面的根标签,也就是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,那么两大块内容就需要了解:

  1. 模板渲染属性的作用,比如th:if起到什么作用
  2. 模板语言的语法

由于属性非常多,用到的时候再来总结,现在

模板语言语法

先学会语法,才能够灵活运用。先来看看模板语法的几大内容:

简单的表达式

  1. 变量表达式:${...},经常用于渲染一个变量的内容到网页上
  2. 选择变量表达式:*{...},这个需要结合th:object来使用
  3. 消息表达式:#{...},这个专门是用于显示消息,和上边的变量表达式不同
  4. URL表达式:@{...},用于操作URL,拼接属性等操作
  5. Fragment表达式:~{...},这个之前已经使用过了

字面量

  1. 字符串字面量,用单引号括住:'one text''Another one!'
  2. 数字字面量,直接写即可,比如:423.012.3
  3. 布尔值字面量,小写的字母:truefalse
  4. Null对象,直接写字母即可:null
  5. 变量名,将变量名直接以字符序列写在表达式中即可,比如${var}

字符串拼接

字符串拼接有两种方式:

  1. 字符串拼接操作符:+
  2. 字符串拼接的替代方法,用|符号包裹要拼接的字符串:|The name is ${name}|

数学运算符

+-*/%

布尔操作符

  1. 布尔操作符与和或,直接写即可:andor
  2. 非操作符,可以写成not,也可以用一个!

比较运算符

发现Thymeleaf很灵活,在很多运算符方面都提供了多种选择。

  1. 大于小于,大于等于,小于等于,可以用符号,也可以用文字:> < >= <= (gt, lt, ge, le)
  2. 判断相等的运算符,可以用等号或者文字:== != (eq ne)

条件判断

条件判断可以采用类似于三元操作符的形态:

  1. if判断成功则执行then: (if ? then)
  2. 类似于三元操作符的分支:(if ? then : else)
  3. 提供默认值:(value ?: defaultvalue)

“什么都不干”运算符

No-Operation,是一个下划线_,类似于默认值。

这些运算符,在一个表达式中可以复合使用,官方给了一个例子:

'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))

${...}表达式

变量表达式${...}用来渲染上下文中的变量名称,对于Spring开发来讲,就是渲染放到Model(ModelAndView)的变量,不过渲染变量的功能很强大,详细来看看。

从对象中取值并渲染

除了在控制器中直接放入一个键值对,也可以放入一个对象,然后可以从其中取值渲染,对象还可以是MapCollection对象,都有办法取值,当然,这也是模板语言的基本能力。

  1. ${cony.owl.name},可以多级取属性,内部是调用Getter()来获取属性
  2. ${cony['own']['name']},取属性的时候还可以使用方括号,其中的键可以用字符串字面量,也可以用其他变量
  3. 对于一个Map类型的对象,使用方括号和.操作符的效果是一样的${animals['owl'].name}
  4. 对于集合项目,可以用方括号加索引来取值:${animals[0].name}
  5. 大概这个是最屌的功能,就是表达式中可以执行方法,带参数也可以:${animals.getFirstOwl()}

可以使用的特殊对象

Thymeleaf提供了一些以#号开头的特殊文件,无需通过控制器传入页面即可使用,很多是一些工具类,非常实用。官网文档Appendix B列出了这些对象的详细操作方法。
这里列出来一些常用的:

  1. #execInfo:模板的基础信息
  2. #messages:用户获取消息的对象,可以从外部加载消息对象,多用于多语言配置。目前我的项目里用不到。
  3. #urisuri工具
  4. #datesdates工具,经常会用到其中日期格式化输出的功能。
  5. #calendars:和dates工具很像,内部是Calendar对象。
  6. #numbers:常用到其中的格式化输出功能。
  7. #strings:字符串工具类,也很常用。
  8. #bools:判断一些布尔值的工具类。
  9. #arraysArray工具类。
  10. #listsList工具类。
  11. #setsSet工具类。
  12. #mapsMap工具类。
  13. #aggregates:用于快捷对集合进行操作的对象,比较常用。
  14. #ids:用于循环中控制循环序号的对象,比较常用。
LICENSED UNDER CC BY-NC-SA 4.0
Comment