カテゴリ: Thymeleaf 更新日: 2026/02/11

Thymeleaf th:checkedで条件によってチェックを設定する例

Thymeleaf th:checkedで条件によってチェックを設定する例
Thymeleaf th:checkedで条件によってチェックを設定する例

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

新人

「先輩、Thymeleafでチェックボックスに条件を付けてチェックを入れる方法ってありますか?」

先輩

「良い質問だね。Thymeleafでは、th:checkedという属性を使って、特定の条件が真(true)のときだけチェックを入れることができるんだ。」

新人

「なるほど。じゃあ、Springのコントローラとどう連携させるんですか?」

先輩

「それは後で具体的に見ていこう。まずは、Thymeleafとは何かから確認していこう。」

1. Thymeleafとは?

1. Thymeleafとは?
1. Thymeleafとは?

Thymeleaf(タイムリーフ)は、Spring Frameworkでよく使われるテンプレートエンジンの一つです。テンプレートエンジンとは、サーバー側のデータをHTMLテンプレートに埋め込んで、動的にWebページを生成する仕組みのことを指します。Thymeleafを使うと、HTML内で変数を展開したり、条件分岐や繰り返し処理を記述することができます。

例えば、次のようにth:textを使うと、サーバー側で用意した文字列をHTMLに表示することができます。


<p th:text="${message}"></p>

このようにThymeleafでは、通常のHTML構文を保ちながら、Springのデータを動的に表示できるのが特徴です。ブラウザで開いても崩れない「ナチュラルテンプレート」として動作するのも魅力です。

今回の記事では、特にチェックボックスを動的に制御する方法に焦点を当てて解説していきます。

2. th:checked属性とは?

2. th:checked属性とは?
2. th:checked属性とは?

th:checked属性は、ThymeleafでチェックボックスのON/OFFを条件によって制御したいときに使用します。通常のHTMLでは次のように記述します。


<input type="checkbox" checked>

この場合は常にチェックが入った状態で表示されますが、Thymeleafを使えば、サーバー側の値によって動的にチェックを切り替えることができます。例えば、次のような記述です。


<input type="checkbox" th:checked="${user.active}">

このコードでは、user.activetrueのときにチェックが入り、falseのときはチェックが外れた状態で表示されます。つまり、Springのモデル属性の値に応じてチェックの状態が自動的に反映される仕組みです。

このth:checked属性を使うことで、条件分岐をHTML内に直接書かなくても済むため、可読性の高いテンプレートを保つことができます。

開発環境の前提

今回の記事のサンプルは、次のような前提条件で作成しています。

  • 開発環境:pleiades を使用
  • ビルドツール:Gradle を使用(Mavenは使用しない)
  • プロジェクト作成:pleiadesの「新規Springプロジェクト」から作成し、依存関係もチェックボックスで追加
  • コントローラ:@Controllerを使用(@RestControllerは使用しない)
  • 不要な外部ライブラリ(Bootstrapなど)は使用しない純粋なSpring構成

Spring Bootを使う場合でも同様の構成で動作しますが、ここではGradleを用いた標準的なSpring MVCプロジェクトを前提とします。

チェックボックスの基本構造

Thymeleafでチェックボックスを動的に制御する場合、コントローラ側のJavaコードで値を設定し、それをHTMLテンプレートに反映させます。以下は簡単なコントローラの例です。


@Controller
public class SampleController {

    @GetMapping("/checkbox")
    public String showCheckbox(Model model) {
        User user = new User();
        user.setActive(true);
        model.addAttribute("user", user);
        return "checkbox";
    }
}

この例では、Userクラスのactiveフィールドをtrueに設定しています。その結果、HTML側のth:checkedで参照されたとき、自動的にチェックボックスにチェックが入った状態になります。

HTML側のコードは次のようになります。


<form action="#" method="post">
    <input type="checkbox" th:checked="${user.active}">
    <label>有効ユーザー</label>
</form>

このように、コントローラとThymeleafテンプレートを組み合わせることで、動的にチェック状態を制御することが可能になります。条件によってON/OFFを切り替えたい場合は、boolean型やフラグ変数を使って判定を行います。

3. コントローラ側での値設定方法(Modelへのデータ渡し)

3. コントローラ側での値設定方法(Modelへのデータ渡し)
3. コントローラ側での値設定方法(Modelへのデータ渡し)

ここからは、ThymeleafとSpringを組み合わせて実際にチェックボックスを動かす方法を見ていきます。まず理解しておきたいのは、チェックボックスのON/OFFを決める「値」がどこから来るかということです。Thymeleafのth:checkedは、Springのコントローラから渡されるModelオブジェクトの中身をもとにして判断します。

たとえば、あるユーザーが「有効」かどうかを表すactiveというフィールドを持つクラスがあるとします。その値をSpringコントローラでセットしておけば、テンプレート側のth:checkedがそれを参照して動的にチェックを反映してくれます。


@Controller
public class UserController {

    @GetMapping("/user/form")
    public String showForm(Model model) {
        User user = new User();
        user.setActive(false); // 初期状態ではチェックを外す
        model.addAttribute("user", user);
        return "user_form";
    }

    @PostMapping("/user/form")
    public String handleSubmit(@ModelAttribute User user) {
        System.out.println("ユーザーの有効状態: " + user.isActive());
        return "result";
    }
}

この例では、@Controllerを使ってコントローラを定義し、Modelを介してUserオブジェクトをビューへ渡しています。Thymeleafのth:checkedは、このuser.activeを参照して動作するため、trueならチェックが入り、falseなら外れる仕組みです。

このように、コントローラのModelを介して値を渡すことで、テンプレートとサーバーサイドの状態を一致させることができます。これはSpring MVCの大きな特徴の一つであり、Thymeleafとの相性が非常に良いポイントでもあります。

4. テンプレート側でのth:checkedの条件指定方法

4. テンプレート側でのth:checkedの条件指定方法
4. テンプレート側でのth:checkedの条件指定方法

次に、Thymeleafのテンプレート側での設定方法を詳しく見ていきましょう。th:checkedは、truefalseの値をもとにして自動的にチェックの状態を切り替えます。つまり、th:checked="${user.active}"という書き方をすれば、コントローラで設定した値がそのまま反映されます。

条件をさらに細かく制御したい場合は、条件式を使って設定することもできます。たとえば次のような書き方です。


<input type="checkbox" th:checked="${user.role == 'ADMIN'}">

この例では、user.roleADMINという値を持つときだけチェックがONになります。つまり、Thymeleafではth:checkedに「式」を書くことで、柔軟な条件分岐が可能になります。

また、boolean以外の値でも、比較演算子を使って条件を表現できるため、チェックボックスの制御をデータの内容に応じて細かく行えるのが魅力です。

実際のテンプレートでの例を見てみましょう。


<form action="#" method="post" th:object="${user}">
    <label>
        <input type="checkbox" th:field="*{active}" th:checked="${user.active}">
        有効にする
    </label>
    <button type="submit">送信</button>
</form>

このコードでは、th:fieldを使ってフォーム要素とオブジェクトのフィールドをバインドしつつ、th:checkedで初期状態のON/OFFを制御しています。チェックが入っている状態で送信すると、trueがサーバーに送られます。

このように、ThymeleafではHTMLとSpringのModelを密接に連携させることで、シンプルかつ直感的に条件付きのフォームを構築できるのです。

5. 実際のHTMLフォームとチェックボックスの連携例

5. 実際のHTMLフォームとチェックボックスの連携例
5. 実際のHTMLフォームとチェックボックスの連携例

最後に、実際にThymeleafのテンプレートとSpringのコントローラを組み合わせた動作例を見てみましょう。pleiades+Gradleの環境であれば、次のようなコードをそのまま実行して動作を確認できます。


@Controller
public class CheckboxExampleController {

    @GetMapping("/settings")
    public String showSettings(Model model) {
        Setting setting = new Setting();
        setting.setNotificationEnabled(true);
        model.addAttribute("setting", setting);
        return "settings";
    }

    @PostMapping("/settings")
    public String saveSettings(@ModelAttribute Setting setting, Model model) {
        model.addAttribute("result", setting.isNotificationEnabled());
        return "result";
    }
}

<form action="#" method="post" th:object="${setting}">
    <div>
        <input type="checkbox" th:field="*{notificationEnabled}" th:checked="${setting.notificationEnabled}">
        <label>通知を有効にする</label>
    </div>
    <button type="submit">保存</button>
</form>

上記のように、Thymeleafでチェックボックスを扱うときは、th:fieldth:checkedを組み合わせるのが基本です。これにより、チェックの状態が自動的にSpringのオブジェクトにマッピングされ、送信時には値がtrueまたはfalseとして受け取られます。

また、チェック状態を初期表示で切り替えたい場合は、コントローラ側でtruefalseをセットしておけばOKです。条件付きでチェックを入れる場合も、th:checkedを使えば柔軟に対応できます。

例えば、ユーザーが設定画面を開いたときに「通知を有効にする」チェックボックスがオンになっているかどうかを、ユーザー情報の内容に応じて制御できます。これは管理画面や設定ページなど、さまざまなWebアプリでよく使われるパターンです。

このように、Thymeleafのth:checked属性を使うことで、条件によるチェックボックス制御を簡単に実現でき、Spring MVCとの相性も抜群です。pleiades+Gradleの環境で手軽に動作を確認できるため、テンプレートエンジンの学習にも最適です。

6. th:checkedの注意点(boolean型やnull値を扱う際のポイント)

6. th:checkedの注意点(boolean型やnull値を扱う際のポイント)
6. th:checkedの注意点(boolean型やnull値を扱う際のポイント)

ここでは、Thymeleaf チェックボックス 条件設定を行う際に気をつけたい注意点について詳しく解説します。特に初心者がつまずきやすいのが、boolean型やnull値を扱うときの挙動です。Springのモデルで値がnullの場合、Thymeleafのth:checkedは「false」として解釈されます。そのため、意図しない未チェック状態になることがあります。

例えば、チェックボックスを初期状態でオンにしたいのに、オブジェクト生成時にbooleanが初期化されずnullのままだと、表示時にはチェックが外れた状態になります。これを防ぐには、コントローラ側で明示的に初期値を設定しておくことが重要です。


@Controller
public class CheckedInitController {

    @GetMapping("/init")
    public String showForm(Model model) {
        Setting setting = new Setting();
        // boolean値を必ず初期化
        setting.setNotificationEnabled(false);
        model.addAttribute("setting", setting);
        return "init_form";
    }
}

このように、初期化を怠らないことがポイントです。もしもboolean型をラッパークラスのBooleanとして扱う場合は、nullチェックを明示的に行うことをおすすめします。テンプレート側で条件式を使えば安全に制御できます。


<input type="checkbox" th:checked="${setting.notificationEnabled != null and setting.notificationEnabled}">

この条件式は、「nullでなく、かつtrueのときだけチェックを入れる」という意味になります。こうしておくことで、null値が渡ってもエラーにはならず、安全に動作します。特に実際のアプリケーションでは、フォームバインド時に想定外の値が渡ることもあるため、このような記述でエラーを防ぐことが重要です。

また、フォームの送信後に再表示する際、値が反映されない場合は、コントローラで@ModelAttributeのオブジェクトをそのままテンプレートに返すことを忘れないようにしましょう。これが抜けていると、th:checkedの状態が初期化されてしまうことがあります。

7. 実際のアプリ画面での挙動説明(チェックのON/OFFがどう反映されるか)

7. 実際のアプリ画面での挙動説明(チェックのON/OFFがどう反映されるか)
7. 実際のアプリ画面での挙動説明(チェックのON/OFFがどう反映されるか)

では次に、Thymeleaf チェックボックス 条件設定が実際の画面でどのように動作するのかを見ていきましょう。pleiades+Gradle環境でプロジェクトを実行すると、フォームを開いた瞬間にチェックボックスの状態がModelの値によって自動的に決まります。ユーザーがチェックを入れたり外したりして送信すると、その状態がSpringコントローラ側のオブジェクトに反映されます。

たとえば、次のような動作をイメージしてください。最初にtrueをセットしておけば、ページを開いた時点でチェックがONの状態です。そしてユーザーがチェックを外して送信すると、サーバー側ではfalseとして受け取れます。


@PostMapping("/init")
public String handleForm(@ModelAttribute Setting setting, Model model) {
    boolean state = setting.isNotificationEnabled();
    model.addAttribute("currentState", state);
    return "init_result";
}

上記のコードで、statetrueなら「チェックON」、falseなら「チェックOFF」として画面に反映できます。Thymeleafではこの値を簡単に再表示できます。


<p th:text="'現在の設定:' + (${currentState} ? 'チェックON' : 'チェックOFF')"></p>

このようにテンプレート内で条件式を記述することで、チェックボックスの状態をそのまま画面に表示できます。実際のアプリでは「設定を保存しました」「チェックを外しました」などのメッセージを表示すると、ユーザーに分かりやすくなります。

ここで注意したいのは、Thymeleafのフォーム送信時にチェックを外すと、そのフィールドが送信データから欠落することです。つまり、未チェックの場合は値そのものがサーバーに渡らないため、予期せぬ挙動を防ぐにはhiddenフィールドを併用する方法があります。


<input type="hidden" name="_notificationEnabled" value="off">
<input type="checkbox" th:field="*{notificationEnabled}">

このように記述しておくと、チェックが外れたときも「off」という値が送られるため、コントローラ側で正しくfalseとして認識されます。これもth:checkedを使うときのよくある落とし穴の一つです。

実際にpleiadesでプロジェクトを実行して確認すると、チェックを外して保存したあと再読み込みした際に、反映された状態が正しく保持されていることがわかるでしょう。初心者の方は、まずこの「状態の往復」が正しく動くことを確認してみてください。

8. よくあるエラーと解決方法(チェックされない・常にONになる場合など)

8. よくあるエラーと解決方法(チェックされない・常にONになる場合など)
8. よくあるエラーと解決方法(チェックされない・常にONになる場合など)

最後に、th:checked エラー 対処としてよくあるトラブルとその解決方法を紹介します。Thymeleafでチェックボックスを扱うとき、思ったように動かないケースがいくつかあります。

まず最も多いのが「チェックが反映されない」というケースです。これは、テンプレート側のバインド指定が間違っていることが多く、th:fieldth:checkedを両方指定せずに片方だけ記述していると発生します。正しい構成では次のように記述します。


<input type="checkbox" th:field="*{active}" th:checked="${user.active}">

次に多いのが「常にチェックがONになる」パターンです。この場合、boolean値の初期化が正しく行われていないか、条件式の書き方に問題がある可能性があります。特にth:checked="${user.active = true}"のように代入演算子を使ってしまうと、常にtrueが設定されてしまうため、注意が必要です。正しくは比較演算子==を使います。

また、フォーム送信後にチェック状態がリセットされる場合は、コントローラで再度Modelに値を設定し直すことを忘れていないか確認してください。Spring MVCでは、リダイレクト後にModelの情報が消えるため、再表示用の値を再セットする必要があります。

さらに、テンプレート内で条件式をネストしすぎると、式の評価が意図しない結果になることがあります。可能な限りシンプルな式で状態を表現するのがThymeleafのベストプラクティスです。

もし「th:checkedが効かない」場合は、テンプレートがキャッシュされている可能性もあります。開発環境ではspring.thymeleaf.cache=falseを設定しておくと、テンプレート更新が即時反映されてトラブルを防げます。


spring.thymeleaf.cache=false

この設定はapplication.propertiesに記述します。pleiadesのGradleプロジェクトであれば、src/main/resources配下にファイルを作成して設定可能です。これでテンプレート変更のたびに再起動しなくても反映されるようになります。

以上のように、th:checkedを使う際にはbooleanの初期値・Modelの再設定・キャッシュ設定など、いくつかのポイントを押さえておく必要があります。慣れてくると、これらの注意点は自然に理解できるようになりますが、最初は「なぜ動かないのか」を一つずつ確認する姿勢が大切です。

特に、Thymeleaf チェックボックス 条件設定は一見シンプルですが、実際の開発では小さな見落としが大きな不具合につながることもあります。今回紹介したエラー対処法を覚えておけば、フォーム入力の信頼性を高め、安定したWebアプリケーションを構築できるでしょう。

まとめ

まとめ
まとめ

ここまで、Thymeleafのth:checked属性を活用して、条件に応じたチェックボックスの動的制御を行う方法について詳しく解説してきました。Spring Framework(特にSpring Boot)とThymeleafを組み合わせた開発において、チェックボックスの制御は避けて通れない要素です。単にチェックを入れるだけでなく、サーバー側のデータ状態を正確にUIへ反映させ、ユーザーの操作結果を再びサーバーへ戻すという「双方向のデータの流れ」を理解することが、実務レベルのスキルアップへの近道となります。

Thymeleafでのチェックボックス制御の要点

今回の内容を振り返ると、重要なポイントは以下の3点に集約されます。

  • th:checkedによる動的判定: サーバーから渡されたBoolean値や比較式の結果によって、HTMLのchecked属性を自動的に付与・削除できる。
  • th:fieldとの連携: Springのフォームバインド機能であるth:fieldを併用することで、HTML要素とJavaオブジェクトのフィールドを紐付け、値の受け渡しを簡略化できる。
  • 初期化とNull対策: Java側でのデフォルト値設定や、テンプレート側でのNull安全な条件式(${val != null and val}など)を記述することで、予期せぬ表示エラーを防ぐ。

実践的なサンプルプログラム

最後に、今回学んだ内容を凝縮した実践的なコード例を紹介します。複数の条件を組み合わせた、より実務に近い形での実装イメージです。


// コントローラ側:ユーザーの権限とステータスをモデルに詰める
@GetMapping("/profile/edit")
public String editProfile(Model model) {
    UserAccount user = new UserAccount();
    user.setRole("EDITOR");      // 役割
    user.setSubscribed(true);    // メルマガ購読フラグ
    user.setAccountLocked(false); // アカウントロック状態

    model.addAttribute("user", user);
    return "profile_form";
}

<form th:action="@{/profile/update}" th:object="${user}" method="post">
    <div>
        <label>
            <input type="checkbox" th:field="*{subscribed}" th:checked="${user.subscribed}">
            メールマガジンを購読する
        </label>
    </div>

    <div>
        <label>
            <input type="checkbox" name="roleEditor" 
                   th:checked="${user.role == 'EDITOR'}" 
                   th:disabled="${user.accountLocked}">
            編集者権限を有効にする(ロック時は操作不可)
        </label>
    </div>

    <button type="submit" class="btn btn-primary">設定を保存</button>
</form>

このように、th:checkedは単純な真偽値だけでなく、文字列の比較や他の属性(th:disabledなど)との組み合わせにより、非常に柔軟な画面制御が可能になります。PleiadesなどのIDEを利用して、実際にコードを書きながら挙動を確認してみてください。最初は戸惑うこともあるかもしれませんが、基本的な仕組みさえ掴んでしまえば、複雑なフォーム作成もスムーズに行えるようになるはずです。

先生と生徒の振り返り会話

先生

「さて、一通りThymeleafでのチェックボックス制御について学んだけど、どうだったかな?」

生徒

「はい!最初はth:checkedth:fieldの使い分けが少し難しそうだなと思いましたが、実際にコードを書いてみると、サーバー側の値がそのまま画面に反映される感覚が掴めてきました。」

先生

「それは良かった。特に注意してほしいのは、ユーザーがチェックを外して送信した時の挙動だよ。HTMLの仕様で、チェックがないと値そのものが送られないことがあるからね。」

生徒

「あ、記事にあったhiddenタグの話ですね!Springのth:fieldを使っていれば自動で裏側で処理してくれることも多いですが、仕組みを知っておくのは大事だと思いました。」

先生

「その通り。あとはNull値の扱いだね。データベースから取得した値がNullの時に画面がエラーにならないよう、テンプレート側でも安全な書き方を心がけると、より堅牢なプログラムになるよ。」

生徒

「分かりました。まずは自分のプロジェクトで、色々な条件式を試して動かしてみます。ありがとうございました!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Thymeleaf(タイムリーフ)とは一体どのような役割を持つツールなのですか?プログラミング初心者にも分かりやすく教えてください。

Thymeleaf(タイムリーフ)は、JavaのフレームワークであるSpring Frameworkで非常によく利用される「テンプレートエンジン」という種類のツールです。テンプレートエンジンとは、サーバー側(Java側)で持っているデータや計算結果を、HTMLのテンプレートファイルの中に埋め込んで、ユーザーのブラウザに表示するためのWebページを動的に作り出す仕組みのことです。Thymeleafの大きな特徴は、通常のHTMLの書き方を壊さずにプログラムの処理を記述できる「ナチュラルテンプレート」である点にあります。そのため、ブラウザで直接HTMLファイルを開いてもデザインが崩れにくく、デザイナーとエンジニアが分業しやすいというメリットがあります。今回の記事では、このThymeleafを使ってチェックボックスのオン・オフを動的に制御する方法について解説しています。
コメント
コメント投稿は、ログインしてください

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

カテゴリの一覧へ
新着記事
New1
Springの基本
Spring Bootの@ConfigurationPropertiesScanとは?設定クラス自動検出の仕組みを解説
New2
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQLでResolverを理解しよう!初心者でもわかるデータ取得の基本
New3
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQL入門!Query・Mutation・Subscriptionの基本を初心者向けに解説
New4
SpringのDB操作
JPQLのパラメータバインド(:name / ?1)の使い方を完全解説!初心者でも迷わない基本の考え方
人気記事
No.1
Java&Spring記事人気No1
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.2
Java&Spring記事人気No2
SpringのWeb開発(Spring MVC)
DispatcherServletの仕組みを理解する!初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.4
Java&Spring記事人気No4
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.5
Java&Spring記事人気No5
SpringのWeb開発(Spring MVC)
Spring Bootでの@GetMappingと@PostMappingの基本を完全解説!初心者でも理解できる使い方
No.6
Java&Spring記事人気No6
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み
No.7
Java&Spring記事人気No7
SpringのWeb開発(Spring MVC)
@Controller と @RestController の違いを完全解説!初心者向けSpring MVC入門
No.8
Java&Spring記事人気No8
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方