文本模板模式


13.1文本语法

在Thymeleaf的三种模板模式被认为是文字:TEXT,JAVASCRIPT和CSS。这使它们与标记模板模式区别开来:HTML和XML。

文本模板模式与标记模式之间的关键区别在于,在文本模板中没有标签可以以属性的形式插入逻辑,因此我们必须依赖其他机制。

这些机制中的第一个也是最基本的是内联,我们已在前一章中详细介绍过。内联语法是在文本模板模式下输出表达式结果的最简单方法,因此这是文本电子邮件的完美有效模板。

Dear [(${name})],

  Please find attached the results of the report you requested
  with name "[(${report.name})]".

  Sincerely,
    The Reporter.

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

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

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

这实际上是更详细的浓缩版本:

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

请注意这个新语法是如何基于声明为[#element ...]而不是的元素(即可处理标记)<element ...>。元素是一样开放[#element ...]和封闭状[/element],和独立标签可以通过最小化与开放元素声明/中几乎等同于XML标签的方式:[#element ... /]。

标准方言只包含其中一个元素的处理器:已知的th:block,虽然我们可以在我们的方言中扩展它并以通常的方式创建新元素。此外,允许将th:blockelement([#th:block ...] ... [/th:block])缩写为空字符串([# ...] ... [/]),因此上面的块实际上等效于:

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

并且给定[# th:utext="${item}" /]等效于内联非转义表达式,我们可以使用它来获得更少的代码。因此,我们最终得到了上面看到的第一个代码片段:

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

请注意,文本语法需要完整的元素平衡(没有未关闭的标记)和引用的属性 - 它比HTML风格更加XML风格。

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

Dear [(${customer.name})],

This is the list of our products:

[# th:each="prod : ${products}"]
   - [(${prod.name})]. Price: [(${prod.price})] EUR/kg
[/]


Thanks,
  The Thymeleaf Shop

执行后,结果可能是这样的:

Dear Mary Ann Blueberry,

This is the list of our products:

   - Apricots. Price: 1.12 EUR/kg
   - Bananas. Price: 1.78 EUR/kg
   - Apples. Price: 0.85 EUR/kg
   - Watermelon. Price: 1.91 EUR/kg

Thanks,
  The Thymeleaf Shop

另一个例子是JAVASCRIPT模板模式,一个greeter.js文件,我们作为文本模板处理,我们从HTML页面调用哪个结果。请注意,这不是