Thymeleaf if elseの基本的な使い方まとめ|初心者でも理解できる条件分岐ガイド
新人
「先輩、Thymeleafのテンプレートで条件分岐をしたいんですけど、Javaみたいにif文って使えるんですか?」
先輩
「もちろん使えるよ。Thymeleafではth:if属性を使って、HTMLの中で条件分岐を実現できるんだ。」
新人
「HTMLでif文が書けるなんて不思議ですね。どういう仕組みなんですか?」
先輩
「Thymeleafはテンプレートエンジンと呼ばれる仕組みで、サーバーサイドの値をHTMLに埋め込むことができるんだ。ではまず、Thymeleafそのものから理解していこうか。」
1. Thymeleafとは?
Thymeleaf(タイムリーフ)は、Spring Frameworkでよく使われるテンプレートエンジンです。HTMLファイルの中でサーバーのデータを埋め込み、動的に画面を生成することができます。静的なHTMLをベースにしているため、Webデザイナーとエンジニアが同じテンプレートを扱いやすいのが特徴です。
例えば、Spring BootやSpring MVCのコントローラから渡したデータをThymeleafのテンプレート内で表示できます。pleiadesで作成したSpringプロジェクトでも、簡単に導入できます。
設定は非常にシンプルで、Gradleの依存関係にThymeleafを追加するだけで使えるようになります。pleiadesの「依存関係」チェック機能を使えば、自動でライブラリが追加されます。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
このように、Spring MVCとThymeleafを組み合わせると、Javaの値をHTMLに自然に埋め込めるようになります。
2. if文を使った条件分岐の基本(th:if属性の使い方)
Thymeleafでは、HTMLタグにth:ifを付与することで、条件を満たした場合のみそのタグを表示することができます。これはJavaのif文と同じような役割を持っています。
例えば、コントローラでユーザーのログイン状態を管理している場合、次のように条件分岐で表示を制御できます。
@Controller
public class UserController {
@GetMapping("/welcome")
public String welcome(Model model) {
boolean loggedIn = true;
model.addAttribute("isLoggedIn", loggedIn);
return "welcome";
}
}
テンプレート(welcome.html)側では、以下のようにth:ifを使って条件分岐を行います。
<div th:if="${isLoggedIn}">
<p>ログイン中です。ようこそ!</p>
</div>
この場合、isLoggedInがtrueのときだけ、「ログイン中です。ようこそ!」というメッセージが表示されます。Thymeleafのif条件は非常に読みやすく、HTMLの構造を保ちながら条件分岐できるのが魅力です。
3. elseのように条件が合わないときの表示方法(th:unlessの使い方)
Javaのif文にはelseがありますが、Thymeleafではth:unlessを使って同様の処理を実現します。つまり、条件が「成り立たないとき」に表示するタグです。
先ほどの例に追加して、ログインしていない場合に別のメッセージを出すには次のように書きます。
<div th:if="${isLoggedIn}">
<p>ログイン中です。ようこそ!</p>
</div>
<div th:unless="${isLoggedIn}">
<p>ログインしていません。ログインページへ移動してください。</p>
</div>
ここで、th:unlessは「条件がfalseのとき」に有効になります。つまり、isLoggedInがfalseなら、上のタグは無視され、代わりにth:unlessの方が表示されます。
このようにth:ifとth:unlessを組み合わせることで、簡単に「if-else」構造をHTML上で実現できます。
実際に動かすと次のように表示されます(ログインしていない場合)。
ログインしていません。ログインページへ移動してください。
また、条件が複雑になる場合は、th:if="${user.role == 'ADMIN'}"のように比較演算を使うこともできます。
Thymeleafのifとunlessは、Spring MVCのモデルと連携して、動的に画面の表示内容を制御するのに非常に便利です。特にpleiadesでGradle構成のSpringプロジェクトを作っている場合は、依存関係を自動追加するだけで簡単に試せるため、初心者にも扱いやすいのが特徴です。
4. 複数条件を扱う方法(th:ifとth:unlessの組み合わせ)
Thymeleafでは、単純な条件だけでなく、複数の条件を組み合わせて分岐を行うことができます。たとえば「ユーザーがログインしていて、かつ管理者権限を持っている場合のみ表示したい」といったケースです。このような条件はth:ifで論理演算子(and、or、not)を使って実現します。
以下の例では、ログイン状態とユーザー権限の両方を条件にして表示を切り替えています。
@Controller
public class RoleController {
@GetMapping("/admin")
public String admin(Model model) {
boolean isLoggedIn = true;
String role = "ADMIN";
model.addAttribute("isLoggedIn", isLoggedIn);
model.addAttribute("role", role);
return "admin";
}
}
テンプレート(admin.html)では次のように書けます。
<div th:if="${isLoggedIn and role == 'ADMIN'}">
<p>管理者専用メニューへようこそ!</p>
</div>
<div th:unless="${isLoggedIn and role == 'ADMIN'}">
<p>管理者権限がないため、このページにはアクセスできません。</p>
</div>
andを使うことで、複数の条件を同時に判定できます。また、否定条件を使いたい場合はnotを使うことも可能です。Thymeleafでは、Javaのような複雑な式もそのままHTMLに書けるので、柔軟な条件分岐が可能になります。
このように、th:ifとth:unlessを組み合わせることで、複数条件を使ったif else構造を簡単に表現できます。特に「管理者と一般ユーザーで表示を切り替える」ような処理ではよく使われます。
5. th:switch / th:caseを使った複雑な条件分岐
Thymeleafには、ifやunlessのほかにth:switchとth:caseを使った分岐方法もあります。これはJavaのswitch文に似た構文で、複数の値の中から一致するものを表示するために使用します。
たとえば、ユーザーのステータス(「ACTIVE」「PENDING」「BANNED」など)に応じてメッセージを切り替える場合に便利です。
@Controller
public class StatusController {
@GetMapping("/status")
public String status(Model model) {
String status = "PENDING";
model.addAttribute("status", status);
return "status";
}
}
テンプレート側では、th:switch構文を次のように書きます。
<div th:switch="${status}">
<p th:case="'ACTIVE'">アカウントは有効です。</p>
<p th:case="'PENDING'">現在、承認待ちです。</p>
<p th:case="'BANNED'">アカウントが停止されています。</p>
<p th:case="*">不明なステータスです。</p>
</div>
上記のコードでは、th:case="'PENDING'"が一致するため「現在、承認待ちです。」と表示されます。最後のth:case="*"は「どれにも当てはまらない場合」のデフォルトとして使います。これにより、予期しない値が来ても安全に処理できます。
このth:switch構文は、ifやunlessで条件が増えすぎたときに特に役立ちます。可読性が高く、メンテナンスしやすいテンプレートを作ることができます。
また、条件の中に数値や文字列だけでなく、オブジェクトのプロパティも使えるため、Thymeleaf 条件分岐の表現力をより広げることができます。
6. コントローラで条件を渡してテンプレートに反映する方法
Thymeleafで条件分岐を行うには、コントローラ側で適切な値をモデルに渡す必要があります。Spring MVCでは、Modelオブジェクトを使ってテンプレートへ値を受け渡します。
ここでは、ログイン状態とユーザー権限を同時にテンプレートに渡す実例を見てみましょう。
@Controller
public class ConditionController {
@GetMapping("/dashboard")
public String dashboard(Model model) {
boolean isLoggedIn = true;
String role = "USER";
model.addAttribute("isLoggedIn", isLoggedIn);
model.addAttribute("role", role);
return "dashboard";
}
}
テンプレート(dashboard.html)側では、次のように条件を使って表示を切り替えます。
<div th:if="${isLoggedIn}">
<p th:switch="${role}">
<span th:case="'ADMIN'">管理者ページにアクセス中です。</span>
<span th:case="'USER'">一般ユーザーとしてログインしています。</span>
<span th:case="*">権限が設定されていません。</span>
</p>
</div>
<div th:unless="${isLoggedIn}">
<p>ログインしていません。ログインページへ移動してください。</p>
</div>
このように、th:ifやth:switchを組み合わせることで、複数の条件を柔軟に制御できます。Thymeleafでは${}を使ってSpringのモデル変数を参照するため、コントローラ側で値を設定するだけで、テンプレート内の条件分岐に反映されます。
また、Gradle構成のpleiadesプロジェクトでは、ビルドや実行時に自動的に依存関係が解決されるため、環境構築に手間がかかりません。@RestControllerではなく@Controllerを使用する点にも注意しましょう。
初心者がThymeleafを使う際によくあるミスは、モデル変数名とテンプレート内の参照名が一致していないことです。変数名を正確に合わせることで、if文やswitch文の条件分岐が正しく動作します。
また、テンプレート内で==や!=などの比較演算子を使うことも可能です。たとえばth:if="${count > 0}"のように書けば、在庫がある場合のみ特定の要素を表示することができます。
このようにThymeleafでは、条件分岐を柔軟に表現できるため、動的なWeb画面の開発に非常に向いています。Spring MVCと組み合わせることで、Java側のロジックとHTML側の表示を明確に分離できるのも大きなメリットです。
7. 複雑な条件式(比較演算・論理演算)の使い方
Thymeleafでは、単純な真偽値だけでなく、比較演算や論理演算を使ってより複雑な条件式を記述することができます。これにより、条件の幅が広がり、実際のアプリケーションでの分岐処理が柔軟になります。
例えば、商品在庫の数や会員ランクなどに応じて表示を変える場合があります。こうした場合にth:ifやth:unlessに比較式を直接書くことが可能です。
まずはコントローラのサンプルです。
@Controller
public class StockController {
@GetMapping("/stock")
public String stock(Model model) {
int stockCount = 5;
model.addAttribute("stockCount", stockCount);
return "stock";
}
}
テンプレート(stock.html)側では、次のように比較演算子を使って条件分岐を行います。
在庫があります(残り [[${stockCount}]] 個)
在庫切れです
このように>や<などの比較演算を利用できます。また、==や!=を使えば等価・不等価の判定も可能です。
さらに、条件を複数組み合わせたい場合はandやorを使います。例えば、「在庫があり、かつ数量が10以上」の場合のみ表示したいなら次のように書けます。
十分な在庫があります
論理演算を使うことで、複雑な条件も簡潔に表現できます。Thymeleafの条件式はJavaに似ていますが、HTML属性内で記述する点に注意してください。初心者のうちは括弧の位置や比較記号を見落としがちなので、慎重に確認するのがおすすめです。
8. 実際のHTMLテンプレートでのif/else応用例
ここでは、実際のWeb画面で「ログイン状態」「権限」「在庫数」など複数の要素を組み合わせて条件分岐を行う応用例を見てみましょう。こうした場面では、th:if・th:unless・th:switchを組み合わせるのが効果的です。
まずはコントローラの設定例です。
@Controller
public class DashboardController {
@GetMapping("/shop")
public String shop(Model model) {
boolean isLoggedIn = true;
String role = "USER";
int stockCount = 0;
model.addAttribute("isLoggedIn", isLoggedIn);
model.addAttribute("role", role);
model.addAttribute("stockCount", stockCount);
return "shop";
}
}
次にテンプレート(shop.html)側を見てみましょう。条件によって表示を切り替えています。
<div th:if="${isLoggedIn}">
<h3>ようこそ、ログイン中のユーザー様</h3>
<div th:switch="${role}">
<p th:case="'ADMIN'">管理者メニューを表示中です。</p>
<p th:case="'USER'">一般ユーザーメニューを表示中です。</p>
<p th:case="*">権限が設定されていません。</p>
</div>
<div>
<p th:if="${stockCount > 0}">在庫あり:[[${stockCount}]] 個</p>
<p th:unless="${stockCount > 0}">在庫切れです。入荷をお待ちください。</p>
</div>
</div>
<div th:unless="${isLoggedIn}">
<p>ログインしていないため、購入手続きはできません。</p>
</div>
この例では、ユーザーのログイン状態・権限・在庫数という3つの条件を同時に制御しています。Thymeleafのif else構文を組み合わせることで、HTMLの構造を崩さずに複雑な条件表示ができます。
また、プレーンなHTMLとしても崩れないため、Thymeleafテンプレートは静的ファイルとしても確認可能です。これにより、デザイナーとエンジニアが同じテンプレートを共有しながら開発を進めることができます。
9. Thymeleafの条件分岐でやりがちなミスと注意点
Thymeleafの条件分岐を使う際には、初心者がつまずきやすいポイントがあります。ここでは代表的なミスとその対処法を紹介します。
① モデル属性の名前が一致していない
Spring MVCでは、コントローラでmodel.addAttribute("isLoggedIn", true)のように渡した変数を、テンプレートでは${isLoggedIn}で参照します。名前が一致していないと条件が常にfalseになり、意図した表示になりません。
② null値の判定を忘れる
Thymeleafでは、null値を扱うときにエラーになることがあります。安全に記述するにはth:if="${variable != null}"のように明示的にチェックしましょう。特にオブジェクトのプロパティにアクセスするときは注意が必要です。
③ 比較演算の書き方を間違える
HTML属性内では、比較記号>や<は特殊文字として扱われるため、必ずエスケープ(置き換え)する必要があります。たとえば、>は「greater than」、<は「less than」として書きます。
④ th:ifとth:unlessの重複
ifとunlessを同じ条件で書くと、テンプレートが冗長になりやすいです。場合によっては、th:switch構文の利用を検討することで可読性が上がります。
⑤ Spring Bootでのキャッシュに注意
テンプレートを変更しても画面が更新されない場合、Thymeleafのキャッシュが有効になっている可能性があります。開発中はspring.thymeleaf.cache=falseを設定すると便利です。
これらの注意点を意識することで、Thymeleafの条件分岐を安全かつ正確に扱うことができます。特にGradleで構成したpleiades環境では、設定が自動化されているため、初心者でも簡単に動作確認が行えます。
Thymeleafのif elseは単なる表示切り替えにとどまらず、アプリケーションのロジックをより直感的に表現する手段でもあります。比較演算や論理演算を組み合わせることで、動的なWebページの表現力を大幅に高めることができるでしょう。
新人
「なるほど、条件式ってすごく奥が深いですね!ifやswitchを組み合わせれば、ほとんどの表示パターンを作れそうです。」
先輩
「その通り。Thymeleafの条件分岐は、JavaのロジックをHTMLに自然に反映できるのが強みなんだ。慣れてきたら、複雑な条件でも整理して書けるようになるよ。」