尽管标准方言允许我们使用标签属性来做几乎所有的事情,但在有些情况下,我们更愿意将表达式直接写进我们的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 变量:
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>
结果中,<b> 标签将被 html 转义:
<p>The message is "This is <b>great!</b>"</p>
注意,默认情况下,每个标签正文中的内联表达式都是激活的,不需要我们进行特别配置去开启内联表达式。
如果你使用过其他模板引擎,其中这种通过内联输出文本的方式是常态,你可能会问。为什么我们不从一开始就这样做呢?这比使用 th:text 属性的代码要少得多!
好吧,因为尽管你可能觉得内联很有趣,但你应该永远记住,当你打开你的静态 HTML 文件时,内联表达式会逐字显示,所以你可能无法再把它们作为设计原型来使用了
浏览器如何在不使用内联的情况下静态显示代码片段之间的区别。如下:
Hello, Sebastian!
使用内联表达式,设置用户名称:
Hello, [[${session.user.name}]]!
上面代码一看便知,在实用性方面,不可取啊……完全不能当做原型使用。
在 Thymeleaf 中,内联表达式机制是可以被禁用的,因为实际上可能有一些场合我们确实想输出 [[...]] 或 [(...)] 序列,而不将其内容作为表达式处理。为此,我们将使用 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>