Thymeleaf 3.0教程:4 标准表达式语法(3)
4.6 文字
文本文字
文本文字是在单引号之间指定的字符串。它们可以包含任何字符,但是应该使用\ '转义其中的任何单引号。
<p> Now you are looking at a <span th:text="'working web application'">template file</span>. </p>
数字文字
<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>
布尔文字
<div th:if="${user.isAdmin()} == false"> ...
在本例中,== false写在括号外,所以Thymeleaf负责处理它。如果写在括号内,这将是OGNL/SpringEL引擎的责任:
<div th:if="${user.isAdmin() == false}"> ...
空文字
<div th:if="${variable.something} == null"> ...
文字符号
数字、布尔和空文字实际上是文字标记的一种特殊情况。
这些标记允许在标准表达式中进行一点简化。它们的工作原理与文本文字完全相同(“...”),但它们只允许字母(a-z和A-Z)、数字(0-9)、括号([和])、圆点(。)、连字符(-)和下划线(_)。所以没有空格,没有逗号,等等。
好的部分?标记不需要任何引号。所以我们可以这样做:
<div th:class="content">...</div>
而不是:
<div th:class="'content'">...</div>
4.7追加文本
无论文本是文字还是变量或消息表达式的计算结果,都可以使用+运算符轻松添加:
<span th:text="'The name of the user is ' + ${user.name}">
4.8 字面替换
文字替换允许对包含变量值的字符串进行简单格式化,而不需要用'...' + '...'附加文字。
这些替换必须由竖线(|)包围,例如:
<span th:text="|Welcome to our application, ${user.name}!|">
这相当于:
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
文字替换可以与其他类型的表达式结合使用:
<span th:text="${onevar} + ' ' + |${twovar}, ${threevar}|">
仅变量/消息表达式s (${...}, *{...}, #{...}) 被允许进入|...|文字替换。不允许其他文字('...')、如布尔/数字标记、条件表达式等。
4.9 算术运算
Thymeleaf也支持算术运算:+、-、*、/和%。
<div th:with="isEven=(${prodStat.count} % 2 == 0)">
请注意,这些运算符也可以应用于OGNL变量表达式本身(在这种情况下,将由OGNL执行,而不是Thymeleaf标准表达式引擎):
<div th:with="isEven=${prodStat.count % 2 == 0}">
请注意,有些运算符存在文本别名:div (/),mod (%)。
4.10 比较运算
表达式中的值可以与>、<、> =和< =符号以及==和!=运算符可用于检查相等性(或不相等)。请注意,XML确定<和>符号不应用于属性值中,因此它们应由& lt替换。和>;。
<div th:if="${prodStat.count} > 1"> <span th:text="'Execution mode is ' + ( (${execMode} == 'dev')? 'Development' : 'Production')">
一个更简单的替代方法可能是使用文本别名,这些别名存在于某些运算符中:gt(>)、lt(<)、ge (>=)、le (<=),而不是(!)。还有eq (==)、neq/ne(!=)。
4.11 条件表达式
条件表达式的意思是根据条件的计算结果(它本身就是另一个表达式),只计算两个表达式中的一个。
让我们看看一个示例片段(引入另一个属性修饰符th:class):
<tr th:class="${row.even}? 'even' : 'odd'"> ... </tr>
条件表达式的所有三个部分(条件,then and else)本身都是表达式,这意味着它们可以是变量(${...}、*{...}),消息(#{...}),网址(@{...})或文字(“...”)。
条件表达式也可以使用括号嵌套:
<tr th:class="${row.even}? (${row.first}? 'first' : 'even') : 'odd'"> ... </tr>
Else表达式也可以省略,在这种情况下,如果条件为false,则返回空值:
<tr th:class="${row.even}? 'alt'"> ... </tr>
4.12 默认表达式(Elvis运算符)
默认表达式是一种特殊的条件值,没有then部分。它相当于某些语言(如Groovy)中的猫王运算符,允许您指定两个表达式:如果第一个表达式没有计算为空,则使用第一个表达式,如果计算为空,则使用第二个表达式。
让我们在用户配置文件页面中看到它的运行情况:
<div th:object="${session.user}"> ... <p>Age: <span th:text="*{age}?: '(no age specified)'">27</span>.</p> </div>
如你所见,操作符是?:,我们在此使用它来指定名称的默认值(在本例中为文字值),前提是评估*{age}的结果为null。因此,这相当于:
<p>Age: <span th:text="*{age != null}? *{age} : '(no age specified)'">27</span>.</p>
如同条件值一样,它们可以在括号中包含嵌套表达式:
<p> Name: <span th:text="*{firstName}?: (*{admin}? 'Admin' : #{default.username})">Sebastian</span> </p>
4.13 无操作标记
无操作标记由下划线符号(_)表示。
这个标记背后的思想是指定表达式的期望结果是什么也不做,即完全像可处理属性(例如:th:text)根本不存在一样做。
在其他可能性中,这允许开发人员使用原型文本作为默认值。例如,代替:
<span th:text="${user.name} ?: 'no user authenticated'">...</span>
我们可以直接使用“no user authenticated”作为原型文本,这样从设计角度来看,代码会更加简洁和通用:
<span th:text="${user.name} ?: _">no user authenticated</span>
4.14 数据转换/格式化
Thymeleaf为变量(${...})和选择(*{...})表达式,允许我们通过配置的转换服务应用数据转换。
基本上是这样的:
<td th:text="${{user.lastAccessDate}}">...</td>
注意到那里的双括号了吗?:${{...}}。它指示Thymeleaf将用户的结果. lastAccessDate表达式传递给转换服务,并要求它在写入结果之前执行格式化操作(转换为字符串)。
假设user.lastAccessDate是java.util.Calendar类型,如果转换服务(IStandardConversionService的实现)已注册并包含Calendar -> String的有效转换,将应用该转换服务。
IstandardConversionServiCe(standardConversionServiCe类)的默认实现只是执行。转换为字符串的任何对象上的toString()。有关如何注册自定义转换服务实现的更多信息,请参见“更多配置”部分。
thymeleaf-spring3和thymeleaf-spring4的正式集成包透明地将Thymeleaf的转换服务机制与spring自己的转换服务基础架构集成在一起,这样spring配置中声明的转换服务和格式化程序将自动提供给${{...}}和*{{...}}表达式。
4.15 预处理
除了用于表达式处理的所有这些特征之外,Thymeleaf还具有预处理表达式的特征。
预处理是在正常表达式之前执行表达式,允许修改最终要执行的表达式。
预处理表达式与普通表达式完全一样,但周围有一个双下划线符号 (如 __${expression}__)。
假设我们有一个i18n消息属性条目,其中包含一个调用特定语言静态方法的OGNL表达式,比如:
article.text=@myapp.translator.Translator@translateToFrench({0})
和等效的消息属性:和等效的消息属性:
article.text=@myapp.translator.Translator@translateToSpanish({0})
我们可以创建一个标记片段,根据语言环境评估一个表达式或另一个表达式。为此,我们将首先选择表达式(通过预处理),然后让Thymeleaf执行它:
<p th:text="${__#{article.text('textVar')}__}">Some text here...</p>
请注意,法语区域设置的预处理步骤将创建以下等效内容:
<p th:text="${@myapp.translator.Translator@translateToFrench(textVar)}">Some text here...</p>
预处理字符串__可以使用\_\_在属性中转义。