カテゴリ: Thymeleaf 更新日: 2025/10/13

Thymeleaf null判定の基本と書き方まとめ|初心者向けテンプレート入門

Thymeleaf null判定の基本と書き方まとめ
Thymeleaf null判定の基本と書き方まとめ

新人と先輩の会話形式で理解しよう

新人

「先輩、Thymeleafでデータを表示するときに、値がnullだった場合ってどうすればいいんですか?」

先輩

「良い質問だね。Thymeleafではnull判定を使って、値が存在しない場合の表示を制御できるんだ。たとえばユーザー情報が空のときにエラーが出ないようにすることもできるよ。」

新人

「なるほど、null判定って重要なんですね。どうやって書くんですか?」

先輩

「それじゃあ、Thymeleafの基本から順番に見ていこうか。」

1. Thymeleafとは?

1. 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判定を行う場面

2. Thymeleafでnull判定を行う場面
2. Thymeleafでnull判定を行う場面

Thymeleafでnull判定を行うのは、主に「オブジェクトが存在しないときにエラーを防ぐ」ためです。たとえば、コントローラから値を受け取るとき、想定どおりにデータが入っていないと、画面でエラーが出ることがあります。

具体的な例を考えてみましょう。コントローラでユーザー情報を取得してテンプレートに渡す場合、もしユーザーが存在しなかったら、変数がnullになります。そのまま${user.name}のように参照すると、Thymeleafでエラーが発生してしまいます。

そうしたときに、nullチェック(null判定)を行うことで、安全にテンプレートを表示できるようになります。これは、Webアプリのエラー回避だけでなく、ユーザー体験を良くするためにも欠かせないテクニックです。

新人

「つまり、値が存在しない場合に備えてnull判定をしておくんですね!」

先輩

「そのとおり!表示する前にnullかどうかを確認しておくことで、エラーを防げるんだ。」

3. nullチェックの基本構文

3. 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:ifth: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の使い方)

4. null判定の応用(条件分岐やth:if、th:unlessの使い方)
4. null判定の応用(条件分岐やth:if、th:unlessの使い方)

ここからは、Thymeleafのnull判定をより実践的に使う方法を見ていきましょう。基本構文だけでなく、条件分岐表示制御を組み合わせることで、テンプレートの表現力を高めることができます。特に、th:ifth:unlessをうまく活用することで、データの有無に応じた柔軟な出し分けが可能になります。

たとえば、ユーザー情報が存在する場合には「ようこそ◯◯さん」と表示し、存在しない場合には「ログインしてください」とメッセージを出すケースを考えてみましょう。


<div th:if="${user != null}">
    <p th:text="'ようこそ、' + ${user.name} + 'さん!'"></p>
</div>
<div th:unless="${user != null}">
    <p>ログインしてください。</p>
</div>

この例では、th:ifuserが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. 存在チェック(リスト・オブジェクトが空かどうかを確認する方法)

5. 存在チェック(リスト・オブジェクトが空かどうかを確認する方法)
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出力)

6. 表示制御の具体例(データが存在する場合と存在しない場合のHTML出力)
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:ifth: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:switchth: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式のミス)

7. null判定でよくあるエラーと注意点(変数未定義やEL式のミス)
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:ifth:unlessを使った判定が推奨です。

また、EL式内で誤って比較演算子を混同するミスもよくあります。たとえば、${user = null}と書いてしまうと、比較ではなく代入になり、常にfalse判定となるため注意が必要です。正しくは${user == null}または${user != null}を使いましょう。

このように、Thymeleafでは「存在しない変数」「間違った比較演算子」「nullチェック漏れ」が典型的なエラー原因です。初心者のうちは、必ずテンプレートの中でnullを前提にした安全な構文を心がけるとよいでしょう。

新人

「先輩、null判定を入れないだけでエラーになるんですね!ちょっと怖いです…。」

先輩

「そうなんだ。だからこそ、テンプレートを作るときには“常にnullかもしれない”と考えておくのが大事だよ。」

8. null判定を使ったテンプレート設計のベストプラクティス

8. 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の連携例)

9. 実際のSpringアプリケーションでのnull判定サンプル(@Controllerと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:ifth:unlessを正しく使いこなせば、Springアプリケーションの安定性と信頼性をぐっと高めることができます。

新人

「実際の@Controller連携を見たら、イメージがつかめました!思ったよりシンプルなんですね。」

先輩

「そうだね。Thymeleafのnullチェックは慣れると自然に使えるようになるよ。あとは実際に動かして体で覚えるのが一番だ。」

これで、Thymeleafのnull判定から表示制御、エラー対策、ベストプラクティスまで一通り学ぶことができました。次にプロジェクトを作成するときは、ぜひこの知識を活かして、より堅牢で使いやすいテンプレートを設計してみてください。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Spring認証(Spring Security)
Spring BootでCORSを設定する方法を完全解説!初心者でもわかるセキュリティ対策
New2
Spring認証(Spring Security)
パスワードをハッシュ化する理由とは?セキュリティ対策の基本をSpring Securityで学ぼう
New3
SpringのWeb開発(Spring MVC)
HTTPリクエストとレスポンスの基本を完全解説!Spring MVC初心者がWeb通信の仕組みをやさしく理解
New4
Spring認証(Spring Security)
ブラウザからのフォーム送信とは?HTTPリクエストの基礎を初心者向けに解説!
人気記事
No.1
Java&Spring記事人気No1
SpringのWeb開発(Spring MVC)
ルーティングとは?基本概念(Spring MVCのURL制御を理解)
No.2
Java&Spring記事人気No2
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.3
Java&Spring記事人気No3
Springの基本
application.properties と YAML の基本をやさしく解説!初心者向けSpring Boot設定ファイル入門
No.4
Java&Spring記事人気No4
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.5
Java&Spring記事人気No5
Springの基本
Spring Bootの環境変数の設定方法をやさしく解説!初心者向けapplication.propertiesの使い方
No.6
Java&Spring記事人気No6
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方
No.7
Java&Spring記事人気No7
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.8
Java&Spring記事人気No8
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み