【初心者必見】Thymeleaf(タイムリーフ)における th:if と th:unless の違いと注意点
こんにちは。ゆうせいです。
今日は Thymeleaf(タイムリーフ)における th:if
と th:unless
の違いと注意点 について解説していきますね。
まず結論からお伝えします。
th:unless
は単体でも使用可能です!
ただし、「==」を使った条件式でうまく動作しないと感じた場合、Javaのオブジェクト比較の特性やThymeleafの式評価の仕様が関係している可能性があります。
それでは、順を追って見ていきましょう。
✅ th:if
と th:unless
の違い
th:if とは?
これは「条件が true
のときに表示する」というものです。
<div th:if="${user.name != 'admin'}">一般ユーザーです</div>
この場合、${user.name}
が "admin"
でなければ表示されます。
th:unless とは?
こちらは「条件が false
のときに表示する」です。
<div th:unless="${user.name == 'admin'}">一般ユーザーです</div>
つまり th:unless
は !()
のような否定と同じ意味になります。
❓ よくあるミスや落とし穴
1. ==
と equals()
の違い
Javaでは、==
は「参照の一致」を意味します。一方で、文字列の値の比較は equals()
を使います。
たとえば、以下のようなコードを書いた場合:
<div th:unless="${user.name == 'admin'}">管理者以外です</div>
これは、user.name
と "admin"
の「参照」が一致しないと表示されてしまいません。つまり、'admin'
という文字列と user.name
が equals()
で一致していても、参照が異なれば表示されない可能性があります。
解決方法①: !=
や ==
を使わず、 !
を使って否定する
<!-- これは OK -->
<div th:unless="${user.name.equals('admin')}">管理者以外です</div>
もしくは:
<!-- これでもOK -->
<div th:if="${!user.name.equals('admin')}">管理者以外です</div>
解決方法②: th:if
で否定する方が柔軟
th:unless
は便利ですが、複雑な条件や equals()
を使いたい場合は th:if
に !()
を組み合わせた方が確実です。
📌 まとめ表
条件の意図 | 使用例 | 備考 |
---|---|---|
値が "admin" でない場合表示 | <div th:if="${user.name != 'admin'}"> | 条件式に注意 |
値が "admin" のとき非表示 | <div th:unless="${user.name == 'admin'}"> | == は参照比較、文字列なら注意が必要 |
equals() を使いたい場合 | <div th:unless="${user.name.equals('admin')}"> | これなら確実 |
🔍 今後の学習のヒント
==
とequals()
の違いをもう一度おさらいしてみましょう。th:if
とth:unless
は最終的に「ブール値」に評価されます。その前提を意識して式を書くようにすると、ミスが減ります。- 文字列比較は常に
equals()
を使うクセをつけておくと安心です!
何かうまく動かない具体的なコードがあれば、貼ってくだされば一緒に検証できますよ!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。