1. Introduction
In this quick tutorial, we’re going to look at how to work with boolean values in Thymeleaf.
Before we dive into the details, Thymeleaf basics can be found in this writeup.
2. Evaluating Expressions as Booleans
In Thymeleaf, any value can be evaluated to a boolean. We have a few values interpreted as false:
- null
- the boolean value false
- the number 0
- the character \0
- the strings “false”, “off”and “no”
Any other value is evaluated to true.
3. Using Booleans as a Rendering Conditions
To render an HTML element conditionally, we have two options: the th:if and the th:unless attributes.
Their effect is exactly the opposite – Thymeleaf will render an element with a th:if attribute only if the attribute’s value is true and with th:unless attribute only if its value is false:
<span th:if="${true}">will be rendered</span> <span th:unless="${true}">won't be rendered</span> <span th:if="${false}">won't be rendered</span> <span th:unless="${false}">will be rendered</span>
4. Logical and Conditional Operators
In addition, we can use the three classic logic operators in Thymeleaf:
- and
- or
- negation with the keyword not or the “!” symbol
We can use these operators inside variable expressions or combining multiple variable expressions with them:
<span th:if="${isRaining or isCold}">The weather is bad</span> <span th:if="${isRaining} or ${isCold}">The weather is bad</span> <span th:if="${isSunny and isWarm}">The weather is good</span> <span th:if="${isSunny} and ${isWarm}">The weather is good</span> <span th:if="${not isCold}">It's warm</span> <span th:if="${!isCold}">It's warm</span> <span th:if="not ${isCold}">It's warm</span> <span th:if="!${isCold}">It's warm</span>
We can also use conditional operators: the if-then, if-then-else, and the default operators.
The if-then-else operator is the usual ternary, or ?: operator:
It's <span th:text="${isCold} ? 'cold' : 'warm'"></span>
Moreover, the if-then operator is the simplified version where we don’t have an else part:
<span th:text="${isRaining or isCold} ? 'The weather is bad'"></span>
The default operator returns the first operand if it’s not null and the second otherwise:
<span th:text="'foo' ?: 'bar'"></span> <!-- foo --> <span th:text="null ?: 'bar'"></span> <!-- bar --> <span th:text="0 ?: 'bar'"></span> <!-- 0 --> <span th:text="1 ?: 'bar'"></span> <!-- 1 -->
The default operator is also called the Elvis operator because of its strong resemblance to Elvis’ hairstyle.
Note, that the Elvis operator only does a null check, it doesn’t evaluate the first operand as boolean.
5. #bools Utility Object
The #bools is a utility object which is available in expressions by default and has some handy methods:
- #bools.isTrue(obj) returns whether the argument is evaluated to true
- #bools.isFalse(obj) returns whether the argument is evaluated to false
- #bools.xxxIsTrue(collection) converts the elements of the argument to booleans with #bools.isTrue() then collects them to the same type of collection
- #bools.xxxIsFalse(collection) converts the elements of the argument to booleans with #bools.isFalse() then collects them to the same type of collection
- #bools.xxxAnd(collection) returns true if all elements in the argument is evaluated to true
- #bools.xxxOr(collection) returns true if any element in the argument is evaluated to true
In the methods above xxx can be either array, list or set, depending on the method’s argument (and return value in case of xxxIsTrue() and xxxIsFalse()).
6. Conclusion
In this article, we’ve seen how Thymeleaf interprets values as booleans, also how we can render elements conditionally and work with boolean expressions.
As usual, the code (with more examples) is available over on Github.