开发学院

您的位置:首页>教程>正文

教程正文

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} &gt; 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>

  预处理字符串__可以使用\_\_在属性中转义。