Thymeleaf特点(2)- 数据类型

本文最后更新于:2 年前

这次我们学习 Thymeleaf 支持的数据类型。

字符串型: 'one text' , 'Another one!' ,…

小数及整数:0 , 34 , 3.0 , 12.3 ,…

布尔值:true , false

空值:null

文字标记:one text , 34 ,…

字符串型

就像这样:

1
2
3
<p>
Now you are looking at a <span th:text="'working web application'">template file</span>.
</p>

字符串型的数据需要用单引号引起来,不能用双引号。如果单引号也是字符串的一部分,必须要用转义字符 \'

数字型

就像这样:

1
2
<p>The year is <span th:text="2013">1492</span>.</p>
<p>In two years, it will be <span th:text="2013 + 2">1494</span>.</p>

纯正的数字不需要任何单引号或双引号。此处的双引号是 th:text 的语法要求。

布尔型

就像这样:

1
<div th:if="${user.isAdmin()} == false"> ...

双引号内的值若是 false ,该元素不会被解析;只有是 true 时元素才会显示在浏览器上。

和下列代码等效:

1
<div th:if="${user.isAdmin() == false}"> ...

它们的区别是 == false 在大括号外的是 Thymeleaf 的语法。而 == false 在大括号内的是OGNL/SpringEL 的语法。

空值

就像这样:

1
<div th:if="${variable.something} == null"> ...

null 值可以用来比较。

文字标记

数字、布尔值、空值实际上是文字标记的一种特殊情况。那文字标记有什么优点呢?

1
2
<div th:class="content">...</div> <!--文字标记-->
<div th:class="'content'">...</div>

可以省去单引号。

数据类型是值和操作的集合,接下来讲一下基本操作。

字符串拼接 +

无论是文本值还是变量值,都可以用 + 进行拼接。

1
<span th:text="'The name of the user is ' + ${user.name}+."/>

文字替换 |

用文字替换实现上述字符串拼接,等效于

1
<span th:text="|The name of the user is, ${user.name}|+."/>

也可以混着用

1
<span th:text="${user.enname}+|${user.enname},${user.cnname}|+."/>

但是文字替换操作仅限 ${…} , *{…} , #{…} 三个表达式。下面的代码会抛出异常。

1
<span th:text="The name are+|${user.enname},${user.cnname}|+."/>

给 The name are 用单引号引起是可行的。

1
<span th:text="'The name are'+|${user.enname},${user.cnname}|+."/>

算术运算 + , - , * , / 和 %

其中 / 有文本别名 div% 有文本别名 mod ,在实际代码中两者等效。

1
<div th:with="isEven=(${prodStat.count} % 2 == 0)">

算术运算就是数学运算。

1
<div th:with="isEven=${prodStat.count % 2 == 0}">

当把 == 放进花括号中,代码将由 OGNL 执行,之前学过了。

比较 > < >= <= ! == !=

> (gt) ,<(lt) ,>=(ge) ,<=(le) ,!(not) ,==(eq) ,!=(neq / ne)

符号和英文别名等效。

要注意,>(gt) 和 <(lt) 不能直接用在属性值的比较中,要用 &gt 和 &lt 代替。

1
<p th:text="'字符串'" th:if="${user.cnname} &lt; 超杰"></p>

; 分割前后两个比较值,字符串也可比较。

1
<span th:text="'Execution mode is ' + ( (${user.enname} == 'CJ')? 'Development' : 'Production')+'.'"/>

通过比较选择可快速选择显示哪个字符串,(${user.enname} == 'CJ') 为 True 时,显示 : 前的字符串 ; 为 False 时,显示 : 后的字符串。

条件表达式

If-then-else: (if) ? (then) : (else)

1
<tr th:class="${user.cnname}? 'even' : 'odd'"> ... </tr>

条件成立就选 'even' 否则选 'odd' 。如果省去(else),没有 : 'odd' ,那么当条件不成立时则会返回 null 。

(if) (then) (else) 可以是 ${…} *{…} #{…} @{…} '…'

条件表达式可以嵌套:

1
<tr th:class="${user.enname}? (${user.cnname}? 'first' : 'even') : 'odd'"> ... </tr>

Default: (value) ?: (defaultvalue)

1
<p th:text="${user.cnname}?: '佚名'"></p>

默认表达式是一种特殊的条件表达式,当 (value) 值为 null 时,选择 : 后面的值,否则就选择其本身的值,如果本身值为 false ,就选择 false 。默认表达式也可以嵌套。

1
<p th:text="${user.cnname}?: (${user.enname}?: '佚名')"></p>

先判断用户有没有中文名,有就显示中文名;否则再去判断有没有英文名,有就显示英文名;如果都没有就显示佚名。

把 佚名 放外面,用 _ 替代 '佚名':

1
<p th:text="${user.ename}?: _">佚名</p>

也会有上面的效果,这样做的好处是更简洁和通用(官方说的)。

所有这些特点都可以被组合和嵌套

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

除了处理表达式的特点,thymeleaf 还有预处理表达式的特点。

如果有一个配置文件 Messages_fr.properties ,保存了一个 OGNL 表达式,是用来指定语言的静态方法。

1
article.text=@myapp.translator.Translator@translateToFrench({0}) 

当我们根据本地设置来编写代码时,首先要通过预处理选择该表达式:

1
<p th:text="${__#{article.text('textVar')}__}">Some text here...</p>

相比(不使用预处理)

1
<p th:text="${@myapp.translator.Translator@translateToFrench(textVar)}">Some text here...</p>

而言,要简洁的多,预处理符号 __ 可用 \_\_ 代替。双花括号是格式化的语法,仅适用于 ${…}*{…}


— 【参考资料 —— Thymeleaf文档20181029 - 29 October 2018