8a01f83a2db9532b4d64a94ca0faf254.png

Thymeleaf将局部变量称为为模板的特定片段定义的变量,并且仅可用于该片段内部的评估。

我们已经看到的示例是商品产品列表页面中的迭代变量:

<tr th:each="prod : ${prods}">
    ...
</tr>

prod 变量仅在 <tr> 标记范围内可用。特别的:

  • th:* 标签可用于在该标签中执行的所有其它属性,该属性的优先级低于 th:each(这意味着它们将在 th:each 之后执行)。
  • 它将可用于 <tr> 标签的任何子元素,例如任何 <td> 元素。

Thymeleaf提供了一种使用 th:with 属性声明局部变量而无需迭代的方法,其语法类似于属性值分配的语法:

<div th:with="firstPer=${persons[0]}">
  <p>
    The name of the first person is <span th:text="${firstPer.name}">Julius Caesar</span>.
  </p>
</div>

th:with 被处理时, firstPer 变量被创建为一个局部变量,并加入到上下文变量映射中,使得它可用于与在上下文中声明的任何其它变量一起评估,但仅在 <div> 标记内有效 。

可以使用通常的多重赋值语法同时定义几个变量:

<div th:with="firstPer=${persons[0]},secondPer=${persons[1]}">
  <p>
    The name of the first person is <span th:text="${firstPer.name}">Julius Caesar</span>.
  </p>
  <p>
    But the name of the second person is 
    <span th:text="${secondPer.name}">Marcus Antonius</span>.
  </p>
</div>

th:with 属性允许重用在同一属性中定义的变量:

<div th:with="company=${user.company + ' Co.'},account=${accounts[company]}">...</div>

使用一下:

<p>
  Today is: 
  <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 february 2011</span>
</p>

好吧,如果我们希望 "dd MMMM yyyy" 取决于实际的语言环境呢?例如,我们可能想向我们添加以下信息home_en.properties

date.format=MMMM dd'','' yyyy

和等同的 home_es.properties:

date.format=dd ''de'' MMMM'','' yyyy

现在,让我们使用 th:with 将本地化的日期格式转换为变量,然后在 th:text 表达式中使用它:

<p th:with="df=#{date.format}">
  Today is: <span th:text="${#calendars.format(today,df)}">13 February 2011</span>
</p>

简单吧?实际上,考虑到 th:with 优先级大于 th:text,我们可以在 span 标记中解决所有问题:

<p>
  Today is: 
  <span th:with="df=#{date.format}" 
        th:text="${#calendars.format(today,df)}">13 February 2011</span>
</p>

关于优先级的问题,下一章再讲。

我是银河架构师,十年饮冰,难凉热血,愿历尽千帆,归来仍是少年!

如果文章对您有帮助,请举起您的小手,轻轻【三连】,这将是笔者持续创作的动力源泉。当然,如果文章有错误,或者您有任何的意见或建议,请留言。感谢您的阅读!


文章不定时更新,可微信搜索「银河架构师」,精彩内容,先睹为快!
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐