Thymeleaf null判定の基本と書き方まとめ|初心者向けテンプレート入門
新人
「先輩、Thymeleafでデータを表示するときに、値がnullだった場合ってどうすればいいんですか?」
先輩
「良い質問だね。Thymeleafではnull判定を使って、値が存在しない場合の表示を制御できるんだ。たとえばユーザー情報が空のときにエラーが出ないようにすることもできるよ。」
新人
「なるほど、null判定って重要なんですね。どうやって書くんですか?」
先輩
「それじゃあ、Thymeleafの基本から順番に見ていこうか。」
1. Thymeleafとは?
Thymeleaf(タイムリーフ)は、Spring Frameworkと組み合わせて使われるテンプレートエンジンです。HTMLファイルの中に、変数や条件分岐を埋め込み、動的にコンテンツを生成できます。たとえば、コントローラで渡したデータをHTML上で展開することで、画面に動的な値を表示できる仕組みになっています。
開発環境としては、pleiades+Gradle+@Controller構成を前提にしています。Spring Bootの自動設定を使うことが多いですが、この記事では初心者向けにわかりやすくThymeleafのnull判定に焦点をあてて説明します。
Thymeleafのテンプレートファイルは通常、src/main/resources/templatesフォルダに配置します。拡張子は.htmlで、通常のHTMLとしてブラウザで開いてもエラーにならないのが特徴です。
2. Thymeleafでnull判定を行う場面
Thymeleafでnull判定を行うのは、主に「オブジェクトが存在しないときにエラーを防ぐ」ためです。たとえば、コントローラから値を受け取るとき、想定どおりにデータが入っていないと、画面でエラーが出ることがあります。
具体的な例を考えてみましょう。コントローラでユーザー情報を取得してテンプレートに渡す場合、もしユーザーが存在しなかったら、変数がnullになります。そのまま${user.name}のように参照すると、Thymeleafでエラーが発生してしまいます。
そうしたときに、nullチェック(null判定)を行うことで、安全にテンプレートを表示できるようになります。これは、Webアプリのエラー回避だけでなく、ユーザー体験を良くするためにも欠かせないテクニックです。
新人
「つまり、値が存在しない場合に備えてnull判定をしておくんですね!」
先輩
「そのとおり!表示する前にnullかどうかを確認しておくことで、エラーを防げるんだ。」
3. nullチェックの基本構文
Thymeleafでは、EL式(Expression Language)を使ってnull判定を行います。最も基本的な書き方は次のとおりです。
<span th:if="${user != null}">ユーザー名:<span th:text="${user.name}"></span></span>
<span th:unless="${user != null}">ユーザー情報が存在しません。</span>
上記の例では、th:if属性を使って、userオブジェクトがnullでない場合のみユーザー名を表示します。逆に、th:unless属性を使うと、「条件が成立しないとき」、つまりnullの場合に代替メッセージを表示できます。
このようにth:ifとth:unlessを組み合わせることで、テンプレート内の表示を柔軟に切り替えることができます。
また、単純に値の存在を確認するには、${var != null}のように書くのが基本です。Thymeleafは内部でSpringの式言語(SpEL)を利用しているため、Javaの構文に近い書き方ができます。
Springコントローラの例
ここでは、pleiades+Gradle環境で動かす@Controllerのサンプルを見てみましょう。
@Controller
public class UserController {
@GetMapping("/user")
public String user(Model model) {
User user = findUser(); // ユーザー取得(nullの可能性あり)
model.addAttribute("user", user);
return "userView";
}
private User findUser() {
// データがない場合はnullを返す想定
return null;
}
}
このように、コントローラでnullを渡すことがあるため、テンプレート側では必ずnull判定を行うのが安全です。
テンプレート側の表示例
<div th:if="${user != null}">
<p th:text="'ユーザー名:' + ${user.name}"></p>
</div>
<div th:unless="${user != null}">
<p>ユーザー情報が存在しません。</p>
</div>
実行結果は次のようになります。
ユーザー情報が存在しません。
このように、存在チェックを行えばnull値によるテンプレートエラーを防ぐことができ、ユーザーにとっても安心できるUIを提供できます。
Thymeleafのnull判定は、アプリケーションの安定性を高める基本テクニックです。特にSpringで開発する場合は、@Controllerとの連携を意識して、テンプレート内での条件分岐をしっかり理解しておきましょう。
4. null判定の応用(条件分岐やth:if、th:unlessの使い方)
ここからは、Thymeleafのnull判定をより実践的に使う方法を見ていきましょう。基本構文だけでなく、条件分岐や表示制御を組み合わせることで、テンプレートの表現力を高めることができます。特に、th:ifとth:unlessをうまく活用することで、データの有無に応じた柔軟な出し分けが可能になります。
たとえば、ユーザー情報が存在する場合には「ようこそ◯◯さん」と表示し、存在しない場合には「ログインしてください」とメッセージを出すケースを考えてみましょう。
<div th:if="${user != null}">
<p th:text="'ようこそ、' + ${user.name} + 'さん!'"></p>
</div>
<div th:unless="${user != null}">
<p>ログインしてください。</p>
</div>
この例では、th:ifでuserがnullでない場合の処理を行い、th:unlessでnullの場合の代替表示を指定しています。テンプレートの中で条件に応じた表示を切り替えることで、1つのHTMLファイルで複数の状態を表現できるのです。
また、th:ifの中に論理演算子を使うこともできます。たとえば、ユーザーがnullでなく、かつ管理者フラグがtrueの場合だけ管理メニューを表示するようにできます。
<div th:if="${user != null and user.admin}">
<a href="/admin">管理メニュー</a>
</div>
このように、条件を複数組み合わせることで、表示をより細かく制御できます。Thymeleafの条件分岐はHTML属性として書けるため、可読性も高く、デザイナーや非エンジニアでもテンプレートを理解しやすいというメリットがあります。
5. 存在チェック(リスト・オブジェクトが空かどうかを確認する方法)
Thymeleafのnull判定は、単一のオブジェクトだけでなく、リストやコレクションの存在チェックにも活用できます。たとえば、ユーザー一覧や商品リストを画面に表示する際、リストが空の場合は「データがありません」と表示するようにするのが一般的です。
まずは、コントローラ側でリストを渡す例を見てみましょう。
@Controller
public class ProductController {
@GetMapping("/products")
public String products(Model model) {
List<String> items = findAllProducts(); // 商品リストを取得
model.addAttribute("items", items);
return "productList";
}
private List<String> findAllProducts() {
return List.of(); // 空のリストを返す(データなし)
}
}
次に、テンプレート側のnull判定と存在チェックを組み合わせた書き方です。
<div th:if="${items != null and #lists.isEmpty(items) == false}">
<ul>
<li th:each="item : ${items}" th:text="${item}"></li>
</ul>
</div>
<div th:unless="${items != null and #lists.isEmpty(items) == false}">
<p>商品が登録されていません。</p>
</div>
このコードでは、#lists.isEmpty(items)を使ってリストが空かどうかを確認しています。#listsはThymeleafの組み込みオブジェクトの1つで、リスト操作をサポートするユーティリティ機能を提供します。
つまり、「itemsがnullでなく、かつ空でない場合」にリストを表示し、空またはnullの場合には「商品が登録されていません」とメッセージを出すという仕組みです。
新人
「なるほど!null判定と空チェックを組み合わせると、エラーを防ぎつつ丁寧なメッセージを出せるんですね。」
先輩
「そうなんだ。特にリストの存在チェックは実務でも頻繁に使うから、覚えておくと役立つよ。」
また、#lists.isEmpty()のほかに、#arrays.isEmpty()を使えば配列の空判定もできます。これらを活用することで、nullチェックだけでなくデータの存在状態を柔軟に制御できるようになります。
6. 表示制御の具体例(データが存在する場合と存在しない場合のHTML出力)
ここまでで、Thymeleafにおけるnull判定と存在チェックの基礎を理解できました。ここでは、実際の画面でどのように出力が変わるのかを、具体的な例で見ていきましょう。
例えば、会員情報の有無に応じて、表示する内容を切り替えるサンプルを考えます。
<div th:if="${member != null}">
<h3>会員情報</h3>
<p th:text="'名前:' + ${member.name}"></p>
<p th:text="'メール:' + ${member.email}"></p>
</div>
<div th:unless="${member != null}">
<h3>ゲストユーザー</h3>
<p>ログインすると会員情報が表示されます。</p>
</div>
このように、th:ifとth:unlessをペアで使うことで、HTML全体の表示を制御できます。会員が存在する場合には詳細情報を表示し、存在しない場合はゲスト向けの案内文を表示します。
また、条件をさらに細かく指定して、特定の値が空文字かどうかを判定することも可能です。
<p th:if="${member.name != null and member.name != ''}" th:text="'こんにちは、' + ${member.name} + 'さん!'"></p>
<p th:unless="${member.name != null and member.name != ''}">名前が登録されていません。</p>
このように書くことで、null判定と空文字チェックを同時に行えます。現場では入力フォームの値や外部APIから取得したデータが空文字になることもあるため、両方を考慮しておくのが安全です。
特に、SpringとThymeleafを組み合わせて開発する場合、コントローラでnullを返すケースと、空文字を渡すケースの両方を想定してテンプレートを設計することが重要です。
また、複数の条件を扱うときには、th:switchやth:caseを使って、より読みやすい条件分岐を記述することもできます。
<div th:switch="${status}">
<p th:case="'active'">アカウントは有効です。</p>
<p th:case="'inactive'">アカウントは無効です。</p>
<p th:case="*">状態が不明です。</p>
</div>
このように、th:switchを使うと、複数の状態を分岐して出力を切り替えられます。単純なnull判定だけでなく、アプリ全体の状態に応じた柔軟なテンプレート制御が可能になるのです。
新人
「なるほど!null判定と条件分岐をうまく組み合わせると、エラーを防ぎつつきれいなHTMLを維持できるんですね!」
先輩
「そうだね。特に実務では、nullや空文字を想定したテンプレート設計が品質を左右するから、今のうちに慣れておくといいよ。」
Thymeleafのnull判定やth:ifの使い方を理解すれば、エラーのない安定したテンプレートを作ることができます。pleiades環境でもそのまま動作するので、実際に試しながら動きを確認してみましょう。
7. null判定でよくあるエラーと注意点(変数未定義やEL式のミス)
Thymeleafでnull判定を扱うとき、初心者がつまずきやすいのが「変数が未定義のまま参照してしまう」ケースです。たとえば、コントローラでmodel.addAttribute("user", user);を設定し忘れると、テンプレート上で${user.name}を参照した瞬間にエラーが発生します。
このような場合、画面上に「Exception evaluating SpringEL expression」というエラーが表示されることがあります。これはThymeleafが内部的にSpringの式言語(SpEL)を使っており、存在しない変数を評価しようとして例外が発生するためです。
こうしたエラーを防ぐには、テンプレート側で必ずth:ifを使ってnullチェックを行うか、または#object?のようなセーフナビゲーション演算子を利用する方法があります。
<p th:text="${user?.name}">名前が未設定です。</p>
上記のように「?.」を使うと、userがnullのときでもエラーにならず、単に空として扱われます。これを使うと、テンプレートをより安全に保つことができます。
ただし、この構文はThymeleafのバージョンによっては利用できないことがあるため、確実に動作させたい場合は従来のth:ifやth:unlessを使った判定が推奨です。
また、EL式内で誤って比較演算子を混同するミスもよくあります。たとえば、${user = null}と書いてしまうと、比較ではなく代入になり、常にfalse判定となるため注意が必要です。正しくは${user == null}または${user != null}を使いましょう。
このように、Thymeleafでは「存在しない変数」「間違った比較演算子」「nullチェック漏れ」が典型的なエラー原因です。初心者のうちは、必ずテンプレートの中でnullを前提にした安全な構文を心がけるとよいでしょう。
新人
「先輩、null判定を入れないだけでエラーになるんですね!ちょっと怖いです…。」
先輩
「そうなんだ。だからこそ、テンプレートを作るときには“常にnullかもしれない”と考えておくのが大事だよ。」
8. null判定を使ったテンプレート設計のベストプラクティス
ここでは、実務で役立つThymeleafのnullチェック設計パターンを紹介します。テンプレートを安全でメンテナンスしやすくするためには、いくつかのコツがあります。
まず第一に、「null判定はテンプレートの最上位要素で行う」ことです。つまり、表示ブロック全体をth:ifで囲むようにします。これにより、内部の要素で個別に判定する必要がなくなり、HTMLがすっきりします。
<div th:if="${user != null}">
<p th:text="${user.name}"></p>
<p th:text="${user.email}"></p>
</div>
次に、「null判定と空文字チェックを組み合わせる」ことも重要です。フォーム入力値や外部APIからのレスポンスでは、nullではなく空文字が返ることもあるため、${user.name != null and user.name != ''}のように書いておくと安全です。
さらに、可読性を保つために、テンプレートに複雑な条件式を直接書くのではなく、コントローラ側でboolean型のフラグを用意する設計もおすすめです。たとえば、model.addAttribute("hasUser", user != null);としておけば、テンプレートでは単純にth:if="${hasUser}"と記述できます。
この設計の利点は、テンプレートが見やすくなり、デザイナーや他の開発者も理解しやすくなる点です。ビジネスロジックに近い判定はコントローラに集約し、テンプレートでは「見せ方」に集中するのがベストプラクティスといえます。
最後に、条件分岐が多くなりがちな場合は、th:switchを活用することで見通しを良くすることができます。ステータス値に応じた分岐処理などでは特に効果的です。
<div th:switch="${user.status}">
<p th:case="'ACTIVE'">アクティブユーザーです。</p>
<p th:case="'INACTIVE'">現在は利用停止中です。</p>
<p th:case="*">状態が不明です。</p>
</div>
こうしたパターンを意識することで、Thymeleafのテンプレートは保守しやすく、エラーにも強い構成になります。特にSpring開発では、フロント側の安定性を高めることが全体の品質にも直結するため、nullチェックの徹底が大切です。
新人
「なるほど、テンプレートの中をすっきりさせるためにコントローラ側でフラグを渡すんですね!」
先輩
「そういうこと。判定ロジックをHTMLに書きすぎると混乱するから、責任分担を意識するのがプロの書き方だよ。」
9. 実際のSpringアプリケーションでのnull判定サンプル(@ControllerとHTMLの連携例)
ここまでThymeleafのnull判定の仕組みを学んできましたが、最後に実際のSpringアプリケーションでどのように使うのか、具体的な例を見てみましょう。
@Controller
public class AccountController {
@GetMapping("/account")
public String showAccount(Model model) {
Account account = findAccount();
model.addAttribute("account", account);
model.addAttribute("hasAccount", account != null);
return "accountView";
}
private Account findAccount() {
// データが存在しないケースを想定
return null;
}
}
このコントローラでは、accountオブジェクトと同時に、存在フラグhasAccountをモデルに追加しています。これにより、テンプレート側では単純な条件式で安全に表示制御が可能になります。
<div th:if="${hasAccount}">
<h3>アカウント情報</h3>
<p th:text="'名前:' + ${account.name}"></p>
<p th:text="'メール:' + ${account.email}"></p>
</div>
<div th:unless="${hasAccount}">
<h3>アカウント未登録</h3>
<p>ログインまたは新規登録を行ってください。</p>
</div>
このように、コントローラとテンプレートの責任を明確に分けることで、コードの見通しがよくなり、保守性が大幅に向上します。
また、pleiades環境ではプロジェクト作成時にThymeleaf依存を追加するだけで動作するため、初心者でも簡単に試すことができます。Gradleの設定も自動で反映されるので、環境構築に悩む必要はありません。
このnull判定パターンは、ユーザー情報・商品情報・メッセージ表示など、あらゆるWebアプリ開発で共通して役立ちます。Thymeleafのth:ifやth:unlessを正しく使いこなせば、Springアプリケーションの安定性と信頼性をぐっと高めることができます。
新人
「実際の@Controller連携を見たら、イメージがつかめました!思ったよりシンプルなんですね。」
先輩
「そうだね。Thymeleafのnullチェックは慣れると自然に使えるようになるよ。あとは実際に動かして体で覚えるのが一番だ。」
これで、Thymeleafのnull判定から表示制御、エラー対策、ベストプラクティスまで一通り学ぶことができました。次にプロジェクトを作成するときは、ぜひこの知識を活かして、より堅牢で使いやすいテンプレートを設計してみてください。