Thymeleaf is a popular server-side template engine for Java-based web and standalone applications. It is used for processing XML, HTML, JavaScript, CSS, and other documents.
In this quick article, you'll learn how to iterate through common Java collections like a Map
, List
, Set
and array in a Thymeleaf and Spring Boot application. For more information about Thymeleaf integration with Spring Boot, take a look at the introductory tutorial.
Java Model Class
Before we jump to actual work — iterating collections in Thymeleaf, let us first create a simple Java model class called User.java
that stores the user information as shown below:
User.java
public class User implements Serializable {
private String firstName;
private String lastName;
private String email;
private int age;
private Date created;
// constructor, getters, and setters removed for brevity
}
Thymeleaf th:each
Attribute
The th:each
attribute is a special attribute provided by Thymeleaf template engine to loop through different data collections. Here is the example:
<div th:each="iter : ${iterableObject}">
<!-- do whatever you wan to do here -->
</div>
Iterable values
The th:each
attribute is not just limited to List
or Map
. Several objects qualify as an iterable that can be iterated over using the Thymeleaf's th:each
attribute:
- An object implementing
java.util.Iterable
- An object implementing
java.util.Enumeration
- An object implementing
java.util.Iterator
, whose values will be used as they are returned by the iterator, without the need to cache all values in memory. - An object implementing
java.util.Map
. When iterating maps,iter
variables will be of typejava.util.Map.Entry
. - An array
- Any other object will be treated as if it were a single-valued list containing the object itself.
Iteration Status
Thymeleaf also provides a way to keep track of the iteration process by using the status variable in th:each
statement. For example, you can pass another local variable next to iter
to get the iteration statistics:
<div th:each="iter, stats : ${iterableObject}">
<!-- do whatever you wan to do here -->
</div>
As you can see above, stats
is the status variable that contains the following properties:
index
— The current iteration index, starting with 0.count
— The number of elements processed so far.size
— The total amount of elements in the iterated variable.even/odd
— Check if the current iteration index is even or odd.first
— Check if the current iteration is the first one.last
— Check if the current iteration is the last one.
Iterating through Map
Let us look at an example that uses the th:each
attribute to loop through a Java Map<String, User>
object:
<table>
<thead>
<tr>
<th>#</th>
<th>ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Email</th>
<th>Age</th>
<th>Created</th>
</tr>
</thead>
<tbody>
<tr th:each="entry, stats : ${usersMap}" th:with="user=${entry.value}">
<td th:text="${stats.index + 1}">1</td>
<td th:text="${entry.key}">100</td>
<td th:text="${user.firstName}">John</td>
<td th:text="${user.lastName}">Doe</td>
<td th:text="${user.email}">john.doe@example.com</td>
<td th:text="${user.age}">27</td>
<td th:text="${#dates.format(user.created, 'MMMM dd, yyyy')}">January 15, 2020</td>
</tr>
</tbody>
</table>
Iterating through List
The following example demonstrates how you can loop through a Java List<User>
object by using th:each
attribute in Thymeleaf:
<div th:each="user, stats : ${usersList}">
<div th:text="${stats.index + 1}">1</div>
<div th:text="${user.firstName}">John</div>
<div th:text="${user.lastName}">Doe</div>
<div th:text="${user.email}">john.doe@example.com</div>
<div th:text="${user.age}">27</div>
<div th:text="${#dates.format(user.created, 'MMMM dd, yyyy')}">January 15, 2020</div>
</div>
Iterating through Set
Iterating through a Java Set<User>
collection is very much similar to a List<User>
collection as shown below:
<div th:each="user, stats : ${usersSet}">
<div th:text="${stats.index + 1}">1</div>
<div th:text="${user.firstName}">John</div>
<div th:text="${user.lastName}">Doe</div>
<div th:text="${user.email}">john.doe@example.com</div>
<div th:text="${user.age}">27</div>
<div th:text="${#dates.format(user.created, 'MMMM dd, yyyy')}">January 15, 2020</div>
</div>
Iterating through Array
The th:each
attribute also accepts a Java array object as an iterable. Here is an example that shows how you can iterate a User[]
array object in Thymeleaf:
<div th:each="user, stats : ${usersArray}">
<div th:text="${stats.index + 1}">1</div>
<div th:text="${user.firstName}">John</div>
<div th:text="${user.lastName}">Doe</div>
<div th:text="${user.email}">john.doe@example.com</div>
<div th:text="${user.age}">27</div>
<div th:text="${#dates.format(user.created, 'MMMM dd, yyyy')}">January 15, 2020</div>
</div>
Conclusion
In this article, we looked at how iteration works in Thymeleaf templates. Thymeleaf provides th:each
attribute that can be used to loop through different Java collection objects like Map
, List
, Set
and array.
Thymeleaf offers powerful features that make it ideal for modern HTML5 Java-based web development. If you want to learn more about how to start working with Thymeleaf in Spring Boot, check out the this guide.
✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.