In this quick article, we will look at different kinds of conditionals available in Thymeleaf. Thymeleaf is a popular server-side template engine widely used by developers for Java-based web applications.
Thymeleaf provides several conditional attributes like th:if
, th:unless
, and th:switch
that can be used to conditionally hide or show parts of your template in the result. To learn more about how to use Thymeleaf with Spring Boot, check out this tutorial.
Before we discuss how conditionals work in Thymeleaf, let us first define a simple model class named User.java
that we will use throughout the article:
User.java
public class User implements Serializable {
private long id;
private String name;
private String gender;
private String active;
// constructor, getters, and setters removed for brevity
}
Simple Conditionals: "if" and "unless"
Sometimes you only want to display a fragment from your template in the result if a certain condition is met. Thymeleaf provides th:if
and th:unless
conditional attributes to exclude elements based on a provided condition in the rendered document.
For example, imagine you only want to display those users who are active in the user table. In order to do this, you can use th:if
attribute to test the condition along with th:each
attribute to iterate over list of users as shown below:
<table>
<caption>List of Users</caption>
<thead>
<tr>
<th>#</th>
<th>ID</th>
<th>Name</th>
<th>Gender</th>
</tr>
</thead>
<tbody>
<tr th:each="user, stats : ${users}" th:if="${user.active}">
<td th:text="${stats.index + 1}">1</td>
<td th:text="${user.id}">100</td>
<td th:text="${user.name}">John Doe</td>
<td th:text="${user.gender}">M</td>
</tr>
</tbody>
</table>
Thymeleaf engine will evaluate the condition th:if="${user.active}"
defined on the tr
HTML element. When the evaluated value is false
(for inactive users), it will skip the tr
tag with all its child tags from the result.
The th:if
attribute is not just limited to boolean conditions (true
/false
). In the following table, you can find all scenarios for which the conditional th:if=${value}
expression evaluates to boolean true
when it is not null:
Description | Variable | Example |
---|---|---|
The value is a boolean and is true |
boolean status = true; |
<th:block th:if="${status}"></th:block> |
The value is a number and is non-zero | int age = 25; |
<th:block th:if="${age}"></th:block> |
The value is a character and is non-zero | char ch = 'A'; |
<th:block th:if="${ch}"></th:block> |
The value is a String and is not "false", "off" or "no" | String str = "Java"; |
<th:block th:if="${str}"></th:block> |
The value is not a boolean, a number, a character or a String | Object obj = new Object(); |
<th:block th:if="${obj}"></th:block> |
If the value
is null, it always evaluates to boolean false
.
th:unless
is a negative counterpart of th:if
attribute that can be used instead of adding not
statement before conditionals. For example, instead of using th:if=${not user.active}
, you can also use th:unless=${user.active}
statement.
Let us look at another example that uses both th:if
and th:unless
attributes to display descriptive user's gender:
<td>
<th:block th:if="${user.gender eq 'M'}">Male</th:block>
<th:block th:unless="${user.gender eq 'M'}">Female</th:block>
</td>
Multiple Conditions
Thymeleaf allows you to combine multiple conditions together using and
and or
operators.
For example to get a list of active users whose name starts with 'john' prefix, you can do the following:
<tr th:each="user, stats : ${users}" th:if="${user.active and #strings.startsWith(user.name, 'john')}">
<!-- child nodes here -->
</tr>
Similarly to get a list of active users who are either female or are at least 25 years old, use the following condition:
<tr th:each="user, stats : ${users}" th:if="${user.active and (#strings.equals('F') or user.age gt 25)}">
<!-- child nodes here -->
</tr>
Switch Statements
Thymeleaf also provides a way to display content conditionally using the equivalent of a switch
statement in Java: the th:switch
and th:case
attributes.
The th:switch
and th:case
attributes are useful when there are more than two outcomes of an expression. These attributes work not only for constant variables like an enum but also for any other data types such as string or number. Here is an example:
<div th:each="user : ${users}">
<div th:text="${user.name}"></div>
<div th:switch="${user.gender}">
<p th:case="'F'">Female</p>
<p th:case="'M'">Male</p>
<p th:case="*">Not specified</p>
</div>
</div>
Note that as soon as one th:case
attribute is evaluated as true
, every other th:case
attribute in the same switch context is evaluated as false
. th:case="*"
is used to specify the default option in th:switch
statement.
Elvis Operator
Elvis operator, usually written as X ?: Y
, X or Y
or X || Y
, is a binary operator that returns its first operand X
if that operand evaluates to a true
value, and otherwise evaluates and returns its second operand Y
.
Here is an example:
<div th:each="user : ${users}">
<div th:text="${user.gender} ?: '(not specified)'"></div>
</div>
In the example above, when the gender is specified (empty or null), it will display (not specified)
instead of empty space.
The Elvis operator is basically a variant of the ternary conditional operator, X ? X : Y
, in the sense that the evaluated result returned by the Elvis operator is approximately equivalent to the result of the ternary conditional operator.
Here is an example of ternary conditional operator that renders an arbitrary text depending on a boolean expression:
<div th:text="${user.active} ? 'Active' : 'Suspended'"></div>
Conclusion
In this article, we covered different conditionals provided by the Thymeleaf template engine. We also looked at simplified examples to learn how to use these conditionals in the Thymeleaf templates.
Thymeleaf is a highly flexible and easy to use template engine. It allows us to write a condition in multiple ways just like Java. It is up to you to choose the method you want to use to evaluate a certain condition.
Read Next: How to use Thymeleaf with Spring Boot
✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.