深色模式
4.3 选择表达式(星号语法)
变量表达式不仅可以写成 ${...},还能使用 *{...} 形式(星号语法)。
二者的核心区别在于:星号语法针对“选中对象”(selected object)求值,而美元语法针对整个上下文求值。 也就是说,只要没有选中对象,${...}和*{...}的效果完全一致。
什么是“选中对象”?
选中对象是通过 th:object 属性执行表达式后得到的结果。我们以用户资料页(userprofile.html)为例,看看它的用法:
html
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>这段代码完全等价于不使用选中对象的${...}写法:
html
<div>
<p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>两种语法可以在同一个选中对象作用域内混合使用,效果不受影响:
html
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>当设置了选中对象后,还可以通过 ${#object} 这个表达式变量,在${...}中引用该选中对象:
html
<div th:object="${session.user}">
<p>Name: <span th:text="${#object.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>正如前文所说,若未通过 th:object 设置选中对象,*{...}会退化为和${...}完全等价的形式,此时需要写全变量路径:
html
<div>
<p>Name: <span th:text="*{session.user.name}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{session.user.surname}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{session.user.nationality}">Saturn</span>.</p>
</div>核心语法解释
- th:object 的核心作用:
- 为其所在标签的子标签划定“选中对象作用域”,子标签内的
*{...}表达式会基于该对象求值; - 仅作用于直接/间接子标签,超出作用域后
*{...}会恢复为全局上下文求值。
- 为其所在标签的子标签划定“选中对象作用域”,子标签内的
- 星号语法的优势: 当需要多次访问同一个对象的不同属性时(如
session.user的firstName/lastName/nationality),无需重复写session.user前缀,简化模板代码,提升可读性。 - #object 的本质: 是 Thymeleaf 内置的“选中对象引用变量”,仅在
th:object作用域内有效,等价于th:object绑定的对象(如上例中的session.user)。
总结
*{...}选择表达式依赖th:object绑定的“选中对象”,可简化同一对象多属性的访问语法;无选中对象时,与${...}完全等价。th:object仅影响其子标签的*{...}表达式,作用域外的星号语法会退化为全局上下文求值。- 选中对象可通过
${#object}在美元语法中引用,实现两种语法的灵活混用。
