13.1 文本语法

有三种Thymeleaf模版模式被认为是文本TEXTJAVASCRIPTCSS。它们区别于标记模版模式:HTMLXML.

文本模版模式与标记模版模式的关键区别在于:在文本模版里,没有标签可供我们以属性的形式插入逻辑。所以,我们不得不依赖其它的机制。

这些机制里第一位同时也是最基础的就是内联。我们在之前的章节里详细介绍过。在文本模版模式里,内联语法是输出表达式结果的最简单的方式。 所以,这是用于一封文本邮件的完全有效的模版。

  1. Dear [(${name})],
  2. Please find attached the results of the report you requested
  3. with name "[(${report.name})]".
  4. Sincerely,
  5. The Reporter.

即使没有标签,上面的例子也是一个完整有效的Thymeleaf模板。它可以在TEXT模板模式下执行。

但是,为了包含更复杂的逻辑,而不仅仅只是输出表达式,我们需要一种新的基于无标签的语法:

  1. [# th:each="item : ${items}"]
  2. - [(${item})]
  3. [/]

这实际上是如下复杂版本的压缩:

  1. [#th:block th:each="item : ${items}"]
  2. - [#th:block th:utext="${item}" /]
  3. [/th:block]

注意:这种新语法基于元素(也就是可处理的标签)。它们被声明为[#element ...],而不是<element ...>。元素像[#element ...]这样开始,像[/element]这样结束。独立标签可以用开始元素附上/声明,几乎等价于XML标签:[#element ... /]

标准方言只包含一个处理器,对应于这些元素中的其中一个:已经知道的th:block。尽管我们可以在方言里扩展它,已通常的方式创建新元素。而且,th:block元素([#th:block ...] ... [/th:block])可以简写为空字符串([# ...] ... [/]),所以上面的代码块实际上等价于:

  1. [# th:each="item : ${items}"]
  2. - [# th:utext="${item}" /]
  3. [/]

[# th:utext="${item}" /]等价于一个内联的非转义表达式,我们可以使用它减少代码。因此,我们就以上面看到的第一段代码结束了:

  1. [# th:each="item : ${items}"]
  2. - [(${item})]
  3. [/]

注意:文本语法要求完全的元素平衡(没有未关闭的标签)并且属性用引号包围————比起HTML风格,它更像是XML风格。

让我们看一个TEXT模板的更加完整的例子,一个纯文本邮件模板:

  1. Dear [(${customer.name})],
  2. This is the list of our products:
  3. [# th:each="prod : ${products}"]
  4. - [(${prod.name})]. Price: [(${prod.price})] EUR/kg
  5. [/]
  6. Thanks,
  7. The Thymeleaf Shop

执行后,结果类似于:

  1. Dear Mary Ann Blueberry,
  2. This is the list of our products:
  3. - Apricots. Price: 1.12 EUR/kg
  4. - Bananas. Price: 1.78 EUR/kg
  5. - Apples. Price: 0.85 EUR/kg
  6. - Watermelon. Price: 1.91 EUR/kg
  7. Thanks,
  8. The Thymeleaf Shop

另一个用JAVASCRIPT模板模式的例子,一个greeter.js文件。我们把它当作文本模板处理,从我们的HTML页码调用它。注意:这不是HTML模板里的<script>块,而是一个当作模板处理的.js文件:

  1. var greeter = function() {
  2. var username = [[${session.user.name}]];
  3. [# th:each="salut : ${salutations}"]
  4. alert([[${salut}]] + " " + username);
  5. [/]
  6. };

执行后,结果类似于:

  1. var greeter = function() {
  2. var username = "Bertrand \"Crunchy\" Pear";
  3. alert("Hello" + " " + username);
  4. alert("Ol\u00E1" + " " + username);
  5. alert("Hola" + " " + username);
  6. };