Thymeleaf is a popular server-side template engine for Java-based web and standalone environments. In this article, you'll learn how to use enum constant values in Thymeleaf templates.

We'll first look at how to display all enum values in a drop-down list and then how to compare enum constants in Thymeleaf. Let us say we have the following enum class named Topic.java that represents several blog topics:

Topic.java

package com.attacomsian.runner.domains.constants;

public enum Topic {
    TECH,
    DESIGN,
    STARTUP,
    WEB,
    DEVTOOLS;
}

We have another model class called Post.java that stores a reference to the enum class to present the post topic:

Post.java

package com.attacomsian.runner.domains;

import com.attacomsian.runner.domains.constants.Topic;
import java.io.Serializable;

public class Post implements Serializable {

    private int id;
    private String title;
    private String body;
    private Topic topic;

    // constructor, getters, and setters removed for brevity
}

Finally, we have the following controller method that handles all GET requests at the / endpoint and returns a new Post object stored in Model:

@GetMapping("/")
public String homePage(Model model) {

    // add a new post object
    model.addAttribute("post", new Post());

    return "index";
}

How to display all enum constants

Let us now create an index.html Thymeleaf template in the src/main/resources/templates/ folder that renders an HTML form to allow users to create a new post as shown below:

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Spring Boot Enum Example</title>

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
</head>
<body>

<div class="container my-5">
    <div class="row">
        <div class="col-8 mx-auto">
            <h1>Create New Post</h1>
            <form th:action="@{/save-post}" th:object="${post}" method="post">
                <div class="form-row">
                    <div class="col-md-6">
                        <div class="form-group">
                            <label for="title">Title</label>
                            <input type="text" id="title" th:field="*{title}" class="form-control">
                        </div>
                    </div>
                    <div class="col-md-6">
                        <div class="form-group">
                            <label for="topic">Select Topic</label>
                            <select class="form-control" id="topic" th:field="*{topic}">
                                <option th:each="topic : ${T(com.attacomsian.runner.domains.constants.Topic).values()}"
                                        th:value="${topic}" th:text="${topic}"></option>
                            </select>
                        </div>
                    </div>
                </div>
                <div class="form-group">
                    <label for="body">Body</label>
                    <textarea id="body" th:field="*{body}" class="form-control"></textarea>
                </div>
                <button type="submit" class="btn btn-primary btn-block">Submit</button>
            </form>
        </div>
    </div>
</div>

</body>
</html>

As you can see above, we are generating a drop-down list with all topics available to select. The Topic enum class provides the values() method that returns all enum constants as an array.

The T operator is a part of SpEL (Spring Expression Language) for accessing a type and invoking static methods or getting static properties. We used it for accessing all the values from our enum class Topic.

Now, if you run the application, you will see the following HTML form rendered in the browser:

Thymeleaf Enum Dropdown

How to compare enum constants

You can easily compare enum constants using Thymeleaf conditionals to control what you want to display to the visitor.

Using the th:if attribute

The following example demonstrates how you can use the Thymeleaf th:if conditional attribute to conditionally display a text:

<th:block th:each="topic : ${T(com.attacomsian.runner.domains.constants.Topic).values()}">
    <div th:if="${topic eq T(com.attacomsian.runner.domains.constants.Topic).WEB}">
        Hey, I am a web developer!
    </div>
</th:block>

Alternatively, you can also use string literal for comparison, as shown below:

<th:block th:each="topic : ${T(com.attacomsian.runner.domains.constants.Topic).values()}">
    <div th:if="${topic.name() eq 'WEB'}">
        Hey, I am a web developer!
    </div>
</th:block>

Using the th:switch attribute

Another way to compare enum constants in Thymeleaf is by using the th:switch attribute, as shown below:

<div th:each="topic : ${T(com.attacomsian.runner.domains.constants.Topic).values()}">
    <span th:text="${topic}"></span>
    <th:block th:switch="${topic}" th:with="Topic=${T(com.attacomsian.runner.domains.constants.Topic)}">
        <span th:case="${Topic.TECH}">- Technology Tutorials</span>
        <span th:case="${Topic.DESIGN}">- Design Tutorials</span>
        <span th:case="${Topic.WEB}">- Web Development Tutorials</span>
        <span th:case="${Topic.STARTUP}">- Startups Tutorials</span>
        <span th:case="${Topic.DEVTOOLS}">- Development Tools Tutorials</span>
    </th:block>
</div>

Notice the local variable Topic we have declared above. So instead of writing the T() expression for every case, we only defined it once and then used the local variable everywhere.

Conclusion

That's all. In this article, we have learned how to use Java enum constants in Thymeleaf to render a drop-down list and compare them using conditionals to display additional texts.

Read Next: How to use Thymeleaf in Spring Boot

✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.