Expression Types
Thymeleaf has several types of expressions. Each one does something different. Let's break them down so you know exactly when to use each one.
Variable Expressions ${}
The variable expression ${...} is the one you'll use most. It accesses data from the model, request parameters, or beans.
<p th:text="${username}">Guest</p>
<p th:text="${user.name}">User Name</p>
<p th:text="${list.size()}">0</p>
You can call methods, access properties, and do pretty much anything you'd do in Java. It uses Spring EL (SpEL) under the hood.
Selection Expressions *{}
Selection expressions work like variable expressions but on a previously selected object. Use th:object to select, then *{...} to access properties.
<div th:object="${user}">
<p th:text="*{name}">Name</p>
<p th:text="*{email}">Email</p>
</div>
This is cleaner when you're accessing multiple properties of the same object. No need to repeat ${user.name}, ${user.email} every time.
Message Expressions #{}
Message expressions access internationalized messages from properties files. They're great for multi-language apps.
<p th:text="#{welcome.message}">Welcome!</p>
<p th:text="#{greeting(${username})}">Hello!</p>
Thymeleaf looks up the key in your messages.properties file. You can pass parameters with parentheses for dynamic messages.
URL Expressions @{}
URL expressions build links and URLs. They handle context paths and session IDs automatically.
<a th:href="@{/home}">Home</a>
<a th:href="@{/user/{id}(id=${userId})}">Profile</a>
<form th:action="@{/search}" method="get">...</form>
The @{...} syntax ensures your URLs work correctly regardless of the application's context path. Always use it for links and form actions.