使用Thymeleaf遇到的问题及解决

  1. **使用th:each时,无法作用于循环最开始处获取循环体。

虽然像大多数的循环中都是无法在循环开始处就获得循环体,但仍有时候,根据某些框架的特性,需要在开始处进行属性设置。

以下示例中,想要在每次循环中在 tr 中根据 user 中的值 ${user.id} 设置 rel属性。

1
2
3
4
5
6
7
8
<!-- 以下方式不会有用,也不会报错 -->
<tbody>
<tr th:each="user: ${users}" rel="${user.id}" >
<td th:text="${user.id}"></td>
<td th:text="${user.username}"></td>
<td th:text="${user.password}"></td>
</tr>
</tbody>

如果想要必须设置的话,就需要在后期利用JS代码手动实现。


  1. thymeleaf 提供的自定义属性设置在大多数时候不会有效。

在官方提供的例子中,用户在使用 thymeleaf 时可以对自定义属性来进行赋值。以下为官方示例:

1
2
3
4
5
6
7
8
9
10
11
<!-- 
Thymeleaf offers a default attribute processor that allows us to
set the value of any attribute, even if no specific th:* processor
has been defined for it at the Standard Dialect.
-->

<!-- So something like: -->
<span th:whatever="${user.name}">...</span>

<-- Will result in: -->
<span whatever="John Apricot">...</span>

但在实际使用过程中,这个特性不尽人意,从后台获取的值有时无法利用上面的方式作用到页面中。

有个可取的,稳定的解决方法如下所示:

1
2
3
4
5
<!-- 利用 th:attr 将需要自定义属性写在里面 -->
<span th:attr="whatever=${user.name}, another=${user.age}">...</span>

<!-- 实际效果 -->
<span whatever="John Apricot" another="23">...</span>

  1. 设置表单中的action属性时,注意花括号的引用

在设置URL地址时,thymeleaf 推荐使用@符号:@{...}

以下示例指明了需要注意的地方:

1
2
3
4
5
<!-- Will produce '/gtvg/order/details?orderId=3' -->
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>

<!-- Will produce '/gtvg/order/3/details' -->
<a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a>