变量表达式不仅可以写成 ${...},也可以写成 *{...}。
但有一个重要的区别:*{...} 语法针对选定对象而不是整个上下文计算表达式。也就是说,只要没有选定的对象,${...} 和 *{...} 语法的作用就完全相同。
那么什么是选择对象呢?是一个使用 th:object 属性的表达式的结果。让我们在我们的用户配置文件(userprofile.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>
上述代码中,th:object="${session.user}" 表示选择了 session 对象中的 user 对象。这相当于:
<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>
使用选择对象明显可以简化表达式,避免编写类似 ${session.user.firstName} 繁琐的表达式。
当然,${...} 和 *{...} 语法可以混合使用,如下:
<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 表达式变量提供给 ${...} 表达式,如下:
<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>
如上所述,如果没有执行任何对象选择,则 ${...} 和 *{...} 语法是等价的。如下:
<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>