Thymeleaf if文の書き方!複雑な条件式にも対応する方法を解説
新人
「Thymeleafで複雑な条件式もif文で書けるんですか?」
先輩
「もちろん。基本のif文から論理演算子や比較演算子を使った複雑な条件式まで対応できるよ。Gradle+Pleiades環境でも簡単に試せるから安心してね。」
新人
「まずは基本の書き方から教えてください」
1. Thymeleafのif文の基本的な書き方
Thymeleafのth:if属性を使うと、条件に応じてHTML要素を表示したり非表示にできます。プログラミングのif文と同じで、Thymeleafで条件によって分岐するときに使います。これはSpring Boot環境でビューを制御する基本テクニックです。例えば、${isAvailable}がtrueなら表示されます。
<div th:if="${isAvailable}">利用可能なアイテムです</div>
このようにHTMLに直接条件式を書けるので、Javaコードやコントローラ側で設定したboolean変数によって表示内容を動的に変更できます。
2. th:if属性の基本的な使い方とサンプルコード
まずはSpring BootとPleiades+Gradle環境で@Controllerにboolean値を渡す例です。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class DemoController {
@GetMapping("/demo")
public String demo(Model model) {
boolean isAvailable = true;
model.addAttribute("isAvailable", isAvailable);
return "demo";
}
}
次にビュー側のHTML。demo.htmlにth:if属性を記述します。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>商品ページ</h1>
<div th:if="${isAvailable}">この商品は購入可能です。</div>
</body>
</html>
Gradleでビルドし、Pleiades環境で起動すれば、isAvailableがtrueのときだけメッセージが表示されます。これは基本のif文ですが、これを応用して複雑な条件式にも対応できます。
3. 条件式の書き方のバリエーション(論理演算子や比較演算子の使い方など)
th:ifでは複数の条件を組み合わせて、論理演算子(AND、OR)や比較演算子を使った表現も可能です。具体的には以下のような記述ができます。
● AND(かつ)を使うとき
<div th:if="${isAvailable} and ${isAdmin}">管理者で利用可能なアイテムです</div>
この例では、isAvailableもisAdminもtrueのときにだけ、要素が表示されます。
● OR(または)を使うとき
<div th:if="${isMember} or ${isGuest}">会員またはゲスト向けのメッセージです</div>
isMemberかisGuestのどちらかがtrueなら表示される処理です。
● 比較演算子を使うとき
<div th:if="${price gt 1000}">価格が1000円より高い商品です</div>
<div th:if="${stock le 0}">在庫がない商品です</div>
gtは greater than(より大きい)、leは less or equal(以下)を表す比較演算子です。ほかにも lt、ge、eq、ne が使えます。
4. 複雑な条件式の組み合わせ方の例
複雑な条件を表現するには、論理演算子や比較演算子を組み合わせます。以下は、複数の条件をAND・ORで組み合わせた例です。
<div th:if="${isAvailable} and (${price gt 1000} or ${isAdmin})">
在庫ありで価格が高いか、管理者です
</div>
カッコを使うことで、処理の順序を明確にできます。括弧がないと評価順序が意図とずれることがあるので注意しましょう。
さらに、否定条件を加える場合はnot演算子や「!」記号を使って以下のように書くことも可能です。
<div th:if="not ${isAvailable}">現在、商品は利用できません</div>
<div th:if="!${isAdmin} and ${isAvailable}">一般ユーザー向け商品です</div>
notや「!」で否定条件を表現しつつ、制御構造を明確に記述します。
5. よくある間違いや初心者が混乱しやすいポイント
複雑な条件式を書くときに陥りやすい罠がありますので、具体的な例で確認していきましょう。
● カッコの省略による評価順のずれ
<!-- 誤り:価格が高くない管理者商品も表示される -->
<div th:if="${price gt 1000} or ${isAdmin} and ${isAvailable}">
一部意図と違う表示になる
</div>
このようにカッコが無いと、演算子の優先順位の影響で予期しない結果になります。
● 論理演算子の表記ミス
<!-- ❌ 誤った書き方 -->
<div th:if="${isMember} && ${isGuest}">会員かつゲスト</div>
Thymeleafでは「and」「or」「not」や「!」を使い、JavaScriptの「&&」や「||」は使えません。
● 比較演算子のタイプミス
<!-- ❌ price > 1000 は不可 -->
<div th:if="${price > 1000}">価格が1000円より高い商品です</div>
Thymeleafでは「gt」「lt」等を使い、Java風の記号は認識されません。
● nullチェックの落とし穴
<div th:if="${user != null and user.age gt 18}">
成人ユーザーに表示
</div>
この例はuserがnullだとNullPointerExceptionになる可能性があります。事前にnullチェックするか、コントローラ側でuserを保証しておくことが重要です。
6. 複雑な条件式を使うときの注意点とベストプラクティス
複雑な条件式を扱うときは、コードの可読性とバグを防ぐ工夫が重要です。コメントや変数名、括弧の使い方に注意して、Pleiades+Gradle環境でも安全に理解しやすく記述しましょう。
● 括弧で評価順を明確にする
カッコを使わずにand/orを混ぜると意図と違う評価になることがあります。必ず括弧でまとめて、読みやすくしましょう。
<!-- OK:conditionsグループでまとめ -->
<div th:if="(${isAvailable} and (${price gt 1000} or ${isAdmin}))">
特定条件をわかりやすく制御
</div>
● 変数名はbooleanであることがわかる名前にする
isAvailableやhasDiscountなど、booleanとわかる命名を行うことで条件式が直感的になります。
● null安全にする
モデルにnullを入れるとビューで例外が起きることがあります。可能であればnullを使わず、コントローラでbooleanとして値を渡すのが安全です。
7. 複雑な条件式のサンプルコード例
以下は、複数条件を組み合わせたサンプルのコントローラとビューです。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ComplexController {
@GetMapping("/complex")
public String complex(Model model) {
boolean isAvailable = true;
boolean isPremium = false;
int price = 1200;
model.addAttribute("isAvailable", isAvailable);
model.addAttribute("isPremium", isPremium);
model.addAttribute("price", price);
return "complex";
}
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"></head>
<body>
<div th:if="${isAvailable} and (${price gt 1000} or ${isPremium})">
プレミアムまたは高価格商品です
</div>
<div th:if="not ${isAvailable}">
商品は現在利用できません
</div>
</body>
</html>
このサンプルは、在庫と価格、プレミアム条件を組み合わせた実践的な例です。
8. 初心者へのアドバイス(実際に書いて試すことの大切さなど)
条件分岐を習得するには、実際に複数条件を組み合わせたコードを書いて、Pleiades+Gradleで動かしてみることが一番です。動作確認しながら理解を深めていきましょう。
また、コードを書くときは一度に複雑な式を書くのではなく、まず簡単な条件から始めて慣れてから複雑な条件に挑戦すると良いです。
もし条件式で意図しない結果になったときは、まずは式を分解してひとつずつ確認してください。変数名をわかりやすくしておけば、原因の特定がしやすくなります。
最後に、spring boot+Thymeleafを使った開発では、ビューとコントローラの連携が鍵です。ビュー側で条件式を試しながら、model側の値を変えて目的の表示になるよう調整してみましょう。
まとめ
Thymeleafのif文と複雑な条件式をしっかり理解するための振り返り
今回の記事では、Thymeleafにおけるif文の基本的な書き方から、
論理演算子や比較演算子を使った複雑な条件式の組み立て方まで、
実務を意識しながら丁寧に解説してきました。
Thymeleafのth:ifは、単に表示と非表示を切り替えるだけでなく、
Spring Bootと連携することで、画面の状態やユーザー権限、
商品情報や在庫状況などを柔軟に制御できる強力な仕組みです。
コントローラ側でModelに渡した値をもとに、
ビュー側で条件分岐を行うという流れは、
Thymeleafを使ったWebアプリケーション開発の基本中の基本と言えます。
特に重要なのは、Thymeleaf独自の条件式の書き方に慣れることです。 JavaやJavaScriptに慣れていると、 つい「&&」や「||」、「>」といった記号を使ってしまいがちですが、 Thymeleafでは「and」「or」「not」や 「gt」「lt」「ge」「le」などのキーワードを使う必要があります。 この違いを理解していないと、エラーになったり、 意図しない条件判定が行われたりする原因になります。 初心者のうちは、公式の書き方に沿って、 一つひとつ丁寧に条件式を書くことが大切です。
複雑な条件式を書くときに意識したい設計の考え方
条件式が複雑になるほど、可読性と保守性が重要になります。
andやorを複数組み合わせる場合は、
必ず括弧を使って評価順を明確にし、
自分だけでなく他の人が見ても理解しやすい形にしましょう。
また、boolean値を表す変数名は、
isAvailableやisAdmin、
hasDiscountのように、
trueかfalseかが直感的に分かる命名を心がけることで、
条件式全体の読みやすさが大きく向上します。
これは小さな工夫ですが、実務では非常に効果的です。
さらに、nullに対する考慮も忘れてはいけません。 ビュー側でnullチェックを行うと条件式が複雑になりがちなので、 可能であればコントローラ側で値を保証し、 Thymeleafでは単純なboolean判定だけを行う構成が理想です。 Spring BootとThymeleafを組み合わせた開発では、 「ロジックはコントローラ側、表示制御はビュー側」 という役割分担を意識することで、 全体の設計がすっきりとまとまります。
条件式の理解を深めるためのサンプルコード再確認
ここで、今回の記事内容を踏まえた、 複雑な条件式を使ったThymeleafのif文の基本形を、 あらためて確認しておきましょう。 在庫状態、価格、ユーザー種別といった複数条件を組み合わせることで、 実際のWebアプリケーションに近い制御が可能になります。
<div th:if="${isAvailable} and (${price gt 1000} or ${isPremium})">
在庫があり、高価格またはプレミアム向けの商品です
</div>
<div th:if="not ${isAvailable}">
現在この商品は利用できません
</div>
このような書き方をベースに、 条件を少しずつ増やしていくことで、 無理なく複雑な分岐処理を表現できるようになります。 いきなり難しい条件式を書くのではなく、 まずは単純なif文から始めて、 動作を確認しながら段階的に発展させていくのが上達への近道です。
生徒
「Thymeleafのif文って、最初は簡単そうに見えましたけど、 複雑な条件になると意外と奥が深いですね。」
先生
「そうだね。でも、基本の書き方とルールを押さえれば、 落ち着いて読める条件式が書けるようになるよ。」
生徒
「andやor、gtやltを使う理由も分かってきました。 Javaとは少し違うんですね。」
先生
「その違いに気づけたのは大きいよ。 あとは括弧と変数名を意識すれば、実務でも十分通用する。」
生徒
「まずはシンプルな条件から書いて、 PleiadesとGradleで動かしながら慣れていきます。」
先生
「それが一番いい学び方だね。 手を動かしながら理解を積み重ねていこう。」