12.1 内联表达式
尽管标准方言允许我们使用标签属性完成几乎任何事情,但有时候我们还是希望直接在HTML文本中写表达式。比如,我们希望写成如下形式:
<p>Hello, [[${session.user.name}]]!</p>
而不是:
<p>Hello, <span th:text="${session.user.name}">Sebastian</span>!</p>
Thymeleaf中位于[[...]]
或是[(...)]
中的表达式被认为是内联表达式,在这里面我们可以使用任何在th:text
或是th:utext
属性中合法的表达式。
注意,[[...]]
对应th:text
(结果会被HTML转义),而[(...)]
对应th:utext
,它不会执行任何HTML转义。因此假设有一个属性msg = 'This is <b>great!</b>'
,和这样一段代码:
<p>The message is "[(${msg})]"</p>
<b>
标签将不会被转义:
<p>The message is "This is <b>great!</b>"</p>
而如果进行转义:
<p>The message is "[[${msg}]]"</p>
结果将会被HTML转义:
<p>The message is "This is <b>great!</b>"</p>
注意内联文本在markup所有标签体中都是默认开启的 -- 不只是标签本身 --,因此我们无需去开启它。
内联 vs 自然模板
如果你之前使用过别的模板引擎,那里的规范是直接在文本中输出,你可能会问:为什么我们不一开始就这么做?这意味着使用比th:text
属性更少的代码!
然而,对这一点应当持谨慎态度,因为虽然你会发现内联非常有趣,但是你始终要记住内联表达式会在你静态的打开HTML文件时原封不动的展示出来,所以你也许没法使用它们作为设计原型!
使用内联和不使用内联的区别如下,不使用内联的话:
Hello, Sebastian!
使用它的话:
Hello, [[${session.user.name}]]!
在设计的可用性上二者的区别是显而易见的。
关闭内联
这个功能是可以关闭的,因为有时候我们可能真的希望打印出[[...]]
或[(...)]
,而不是将其内容作为表达式进行处理。为了关闭它,我们需要使用th:inline="none"
属性:
<p th:inline="none">A double array looks like this: [[1, 2, 3], [4, 5]]!</p>
这将会生成:
<p>A double array looks like this: [[1, 2, 3], [4, 5]]!</p>