Thymeleaf Loop or Iteration Example with Spring Boot - th:each Attribute

🎓 Top 15 Udemy Courses (80-90% Discount): My Udemy Courses - Ramesh Fadatare — All my Udemy courses are real-time and project oriented courses.

▶️ Subscribe to My YouTube Channel (178K+ subscribers): Java Guides on YouTube

▶️ For AI, ChatGPT, Web, Tech, and Generative AI, subscribe to another channel: Ramesh Fadatare on YouTube

Thymeleaf is a Java-based template engine used for processing HTML, XML, JS, and many other documents. In this tutorial, we will learn how to iterate over a list of objects in the Thymeleaf HTML page using th:each attribute.
Learn Thymeleaf at https://www.javaguides.net/p/thymeleaf-tutorial.html
In this example, we will create a Spring boot project to demonstrate the iteration in Thymeleaf.

Iteration attribute th:each

Thymeleaf comes with a special attribute th:each, used to iterate over collections of different object types.
There are several objects that Thymeleaf considered iterable:
  • objects implementing java.util.Iterable interface,
  • objects implementing java.util.Enumeration interface,
  • objects implementing java.util.Iterator interface,
  • objects implementing java.util.Map interface,
  • and also arrays.

Thymeleaf Loop or Iteration Example with Spring Boot

Let's assume that we want to display a list of employees in a simple HTML table using the Thymeleaf engine.

Maven Dependency

Let's add the below dependency to integrate Thymeleaf with Spring boot:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Employee Model Class

In our example application Employee object will have the following structure:
package net.javaguides.springboot;

public class Employee {
    private String firstName;
    private String lastName;
    private String email;

    public Employee(String firstName, String lastName, String email) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

Spring MVC Controller - EmployeeController.java

EmployeeController class was defined to handle all GET requests to /iteration URI and return a rendered page iteration.html as an output (which is our Thymeleaf template located in /resources/templates)
package net.javaguides.springboot;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class EmployeeController {

    @GetMapping("/iteration")
    public String iteration(Model model) {
        List < Employee > employees = new ArrayList < > ();
        employees.add(new Employee("Ramesh", "Fadatare", "ramesh@gmail.com"));
        employees.add(new Employee("John", "Cena", "john@gmail.com"));
        employees.add(new Employee("Tom", "Cruise", "tom@gmail.com"));
        employees.add(new Employee("Tony", "Stark", "tony@gmail.com"));
        model.addAttribute("employees", employees);
        return "iteration";
    }
}

Thymeleaf template - iteration.html

We will use th:each to iterate through the list of employees:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="ISO-8859-1">
    <title>Add Bootstrap CSS Demo</title>

    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet" />
</head>

<body>
    <div class="container">
        <div class="row">
            <h1>Employees</h1>

            <table class="table">
                <thead>
                    <tr>
                        <th>Employee First Name</th>
                        <th>Employee Last Name</th>
                        <th>Employee Email</th>
                    </tr>
                </thead>
                <tbody>
                    <tr th:each="employee : ${employees}">
                        <td th:text="${employee.firstName}"></td>
                        <td th:text="${employee.lastName}"></td>
                        <td th:text="${employee.email}"></td>
                    </tr>
                </tbody>
            </table>
        </div>

    </div>
</body>

</html>

Status Variable

Thymeleaf also enables a useful mechanism to keep track of the iteration process via the status variable.
The status variable provides the following properties:
  • index: the current iteration index, starting with 0 (zero)
  • count: the number of elements processed so far
  • size: the total number of elements in the list
  • even/odd: checks if the current iteration index is even or odd
  • first: checks if the current iteration is the first one
  • last: checks if the current iteration is the last one
Let's see how the status variable works in our example:
<tr th:each="employee : ${employees}"
 th:style="${employeeStat.odd}? 'font-weight: bold;'"
 th:alt-title="${employeeStat.even}? 'even' : 'odd'">
 <td th:text="${employee.firstName}"></td>
 <td th:text="${employee.lastName}"></td>
 <td th:text="${employee.email}"></td>
</tr>
Here, we included the employeeStat.odd property to evaluate the condition and set a bold style for the current row.
The employeeStat is the aggregation of the variable employee with the suffix Stat.

My Top and Bestseller Udemy Courses. The sale is going on with a 70 - 80% discount. The discount coupon has been added to each course below:

Comments

Spring Boot 3 Paid Course Published for Free
on my Java Guides YouTube Channel

Subscribe to my YouTube Channel (165K+ subscribers):
Java Guides Channel

Top 10 My Udemy Courses with Huge Discount:
Udemy Courses - Ramesh Fadatare