【初心者必見】Thymeleaf(タイムリーフ)における th:if と th:unless の違いと注意点

こんにちは。ゆうせいです。

今日は Thymeleaf(タイムリーフ)における th:ifth:unless の違いと注意点 について解説していきますね。

まず結論からお伝えします。

th:unless は単体でも使用可能です!
ただし、「==」を使った条件式でうまく動作しないと感じた場合、Javaのオブジェクト比較の特性やThymeleafの式評価の仕様が関係している可能性があります。

それでは、順を追って見ていきましょう。


th:ifth: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.nameequals() で一致していても、参照が異なれば表示されない可能性があります

解決方法①: !=== を使わず、 ! を使って否定する

<!-- これは 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:ifth:unless は最終的に「ブール値」に評価されます。その前提を意識して式を書くようにすると、ミスが減ります。
  • 文字列比較は常に equals() を使うクセをつけておくと安心です!

何かうまく動かない具体的なコードがあれば、貼ってくだされば一緒に検証できますよ!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

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