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

Thymeleaf クラスの動的設定方法まとめ|初心者でもわかるSpring MVCのテンプレートエンジン入門

Thymeleaf クラスの動的設定方法まとめ
Thymeleaf クラスの動的設定方法まとめ

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

新人

「先輩、Thymeleafってよく聞きますけど、そもそもどんなものなんですか?」

先輩

「Thymeleaf(タイムリーフ)は、Spring MVCでよく使われるテンプレートエンジンの一つだよ。HTMLをそのままブラウザで表示できるのが特徴なんだ。」

新人

「テンプレートエンジンって、JSPとかと何が違うんですか?」

先輩

「JSPはサーバーサイドでHTMLを生成するけど、Thymeleafはもっと自然にHTMLに変数を埋め込めるんだ。だからデザイナーとエンジニアの協業にも向いてる。」

新人

「なるほど!Spring Bootのプロジェクトでよく使われている理由が少し分かりました。」

先輩

「そうそう。しかも今回は“クラス属性の動的設定”という便利な使い方を中心に学んでいくよ。」

1. Thymeleafとは何か(基本的な紹介)

1. Thymeleafとは何か(基本的な紹介)
1. Thymeleafとは何か(基本的な紹介)

Thymeleaf(タイムリーフ)は、Spring MVCと連携してHTMLを動的に生成するテンプレートエンジンです。通常のHTMLファイルに、th:textth:ifなどの属性を追加することで、サーバーサイドのデータを画面に反映できます。

この仕組みにより、Javaのオブジェクトから取得した値を直接HTMLに埋め込んだり、条件によって表示内容を切り替えることが可能になります。Thymeleafは静的HTMLとしても表示できるため、デザイン確認もしやすく、初心者にとって非常に扱いやすいテンプレートエンジンです。

例えば、コントローラで設定したモデルデータをHTMLで表示する基本例は次のようになります。


<p th:text="${message}">ここにメッセージが入ります</p>

このように書くと、Springの@Controllerで渡したmessageの内容が自動的にHTMLに表示されます。テンプレートエンジンであるThymeleafの基本を理解することが、これからのSpring開発の第一歩になります。

2. クラス属性(class属性)をHTMLでどのように扱うかの基本

2. クラス属性(class属性)をHTMLでどのように扱うかの基本
2. クラス属性(class属性)をHTMLでどのように扱うかの基本

HTMLでは、クラス属性(class)はスタイル指定や状態を表すために使われます。たとえば、ボタンの色を変えたり、エラーメッセージの部分を赤く表示したりするときに使用します。

通常のHTMLでは次のように記述します。


<button class="btn btn-primary">送信</button>

しかし、Thymeleafでは動的にクラスを変更することができます。たとえば、条件によってボタンのクラスを変えたい場合には、th:classth:classappendといった属性を使います。

この仕組みを理解しておくと、「状態によってボタンの色を変える」「入力エラー時に赤い枠を表示する」といったUIの改善を簡単に行えるようになります。

また、ThymeleafはHTMLテンプレートとしてブラウザで直接開いても表示が崩れない設計になっているため、デザイナーとの共同作業にも最適です。これは、JSPやVelocityなどと比べたときの大きなメリットです。

次に、実際にSpring BootのプロジェクトでThymeleafを使うための準備を確認してみましょう。

3. Spring Boot環境でThymeleafを使うための前提条件(pleiades+Gradle+@Controller構成)

3. Spring Boot環境でThymeleafを使うための前提条件(pleiades+Gradle+@Controller構成)
3. Spring Boot環境でThymeleafを使うための前提条件(pleiades+Gradle+@Controller構成)

ここでは、開発環境としてpleiades(Eclipse日本語化パッケージ)+Gradle構成を前提とします。Mavenではなく、Gradleでプロジェクトを作成し、Thymeleafを依存関係として追加します。

pleiadesで新しいSpring Bootプロジェクトを作成するとき、「Thymeleaf」にチェックを入れるだけで自動的に依存関係が追加されます。手動で設定する場合は、以下のようにbuild.gradleに追加します。


dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

そして、コントローラクラスでは@Controllerを使用してビューにデータを渡します。ここで@RestControllerを使ってはいけません。なぜなら、@RestControllerはJSONレスポンス専用であり、HTMLテンプレートを返すためには@Controllerを使う必要があるからです。


@Controller
public class SampleController {
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "こんにちは、Thymeleafの世界へようこそ!");
        return "hello";
    }
}

上記のコントローラを作成すると、resources/templates/hello.htmlにあるHTMLが自動的に呼び出されます。これがSpring MVCとThymeleafの連携の基本です。

ここまでで、Thymeleafの基本概念と開発環境の準備ができました。次回は、実際にクラス属性を条件によって動的に切り替える方法を詳しく見ていきましょう。

4. Thymeleafでクラス属性を動的に設定する基本構文(th:class, th:classappend)

4. Thymeleafでクラス属性を動的に設定する基本構文(th:class, th:classappend)
4. Thymeleafでクラス属性を動的に設定する基本構文(th:class, th:classappend)

ここからは、Thymeleafでクラス属性を動的に切り替える方法を学びましょう。HTMLのclass属性を状況に応じて変更したい場合、Thymeleafではth:classth:classappendという2つの属性を使います。

th:classはクラス属性全体を上書きする構文で、th:classappendは既存のクラスに対してクラス名を追加する構文です。

まず、基本的な使い方の例を見てみましょう。


<button th:class="'btn ' + ${isActive} ? 'btn-success' : 'btn-secondary'">送信</button>

この例では、isActiveという変数がtrueであれば「btn-success」、falseであれば「btn-secondary」というクラスが設定されます。Thymeleafは三項演算子を使って条件分岐ができるため、HTML内で簡潔に書けるのが特徴です。

一方、th:classappendを使うと、既に指定されているクラスに対して動的にクラス名を追加できます。


<div class="alert" th:classappend="${error} ? ' alert-danger' : ' alert-info'">
    メッセージを表示します
</div>

このようにth:classappendを使うことで、デフォルトのクラスを維持しつつ、状態に応じたクラスを追加できます。これにより、CSSデザインを保ったまま柔軟な見た目変更が可能になります。

この仕組みは、入力フォームやエラーメッセージなどの状態変化を視覚的に表現するときに特に役立ちます。初心者がThymeleafを使ってWebページの状態を動的に制御する上で、最も理解しておくべきポイントです。

5. 条件によってクラスを切り替える方法(if文・三項演算子の使い方)

5. 条件によってクラスを切り替える方法(if文・三項演算子の使い方)
5. 条件によってクラスを切り替える方法(if文・三項演算子の使い方)

Thymeleafでは、単純な真偽値の判定だけでなく、条件分岐によってクラスを柔軟に変更することができます。ここで重要なのが「三項演算子」と「条件式」の活用です。

例えば、ユーザーのログイン状態によってボタンのクラスを切り替えるケースを考えてみましょう。


<button th:class="${loggedIn} ? 'btn-logout' : 'btn-login'">
  [[${loggedIn} ? 'ログアウト' : 'ログイン']]
</button>

このように、Thymeleafの中で? :の三項演算子を使うことで、Javaと同じ感覚で条件分岐が可能です。loggedIntrueなら「btn-logout」クラスが適用され、ボタンの表示文字も「ログアウト」になります。

また、より複雑な条件を扱いたい場合には、th:ifth:unlessを組み合わせて書くこともできます。


<p th:if="${age >= 20}" class="adult">成人ユーザー</p>
<p th:unless="${age >= 20}" class="child">未成年ユーザー</p>

このように書くと、ageが20以上であれば「成人ユーザー」が表示され、それ以外の場合は「未成年ユーザー」が表示されます。条件に応じてクラスや要素そのものを切り替えることができるのがThymeleafの強みです。

「条件分岐でクラスを変える」という考え方を理解しておくと、エラー表示、入力チェック、ボタンの活性・非活性など、さまざまなUIパターンを実現できます。

6. コントローラからモデルデータを渡してクラスを変更する実例

6. コントローラからモデルデータを渡してクラスを変更する実例
6. コントローラからモデルデータを渡してクラスを変更する実例

Thymeleafの魅力は、Spring MVCの@ControllerModelを使ってサーバー側の値をテンプレートに反映できる点です。ここでは、実際にコントローラからフラグを渡して、HTMLのクラスを切り替えるサンプルを見てみましょう。


@Controller
public class StatusController {

    @GetMapping("/status")
    public String status(Model model) {
        boolean isOnline = true;
        model.addAttribute("isOnline", isOnline);
        return "status";
    }
}

次に、status.htmlでこのデータを使って動的にクラスを設定します。


<div th:class="${isOnline} ? 'status-online' : 'status-offline'">
    [[${isOnline} ? '現在オンラインです' : '現在オフラインです']]
</div>

このコードでは、サーバー側でisOnlinetrueなら「status-online」クラスが設定され、表示メッセージも「現在オンラインです」となります。反対にfalseなら「status-offline」となり、メッセージも切り替わります。

ここで重要なのは、HTMLにロジックを直接書くのではなく、コントローラ側で状態を管理している点です。Thymeleafはサーバーサイドの値を安全にHTMLに埋め込むため、ビューとロジックを明確に分離できます。

また、ThymeleafではHTMLタグの中に複数の動的属性を同時に指定できるため、クラスだけでなくテキストやスタイルを連動させることも可能です。たとえば次のように書けば、見た目とメッセージの両方を一括で制御できます。


<div th:class="${isOnline} ? 'status-online' : 'status-offline'"
     th:text="${isOnline} ? 'サーバーは稼働中です' : 'サーバーは停止中です'">
</div>

このように、ThymeleafはSpringのModelと連携して、動的なクラス設定を非常に直感的に扱うことができます。初心者でも一度書いてみると、そのシンプルさとパワフルさが実感できるはずです。

さらに、フラグを複数使うことで、複数の状態に対応したクラス設定も可能です。たとえば、オンライン・メンテナンス中・停止中の3状態を切り替える場合、次のように記述します。


<div th:class="${status == 'online'} ? 'online' :
               (${status == 'maintenance'} ? 'maintenance' : 'offline')">
    [[${status} == 'online' ? '稼働中' :
      (${status} == 'maintenance' ? 'メンテナンス中' : '停止中')]]
</div>

三項演算子をネストすることで、複数の条件を一度に表現することもできます。やや見づらくなりますが、簡単な状態切り替えなら十分に活用できます。

このように、Thymeleafのth:classth:classappendを使えば、Spring MVCアプリケーションで柔軟にHTMLの見た目を制御できます。コントローラ側ではデータや状態をModelに詰め、テンプレート側ではその値に応じてクラスを動的に切り替える、という流れをしっかり理解しておきましょう。

7. th:classappendとth:classの違いを具体例で比較

7. th:classappendとth:classの違いを具体例で比較
7. th:classappendとth:classの違いを具体例で比較

ここでは、Thymeleaf クラス 動的変更 の代表的な2つの方法である th:classth:classappend の違いを丁寧に見ていきましょう。見た目は似ていますが、動作の仕方が異なります。初心者がよく混乱しやすいポイントなので、しっかり理解しておくことが大切です。

新人

「先輩、どっちを使えばいいのか分からなくなります。見た目が同じに見えるんですけど…」

先輩

「良い質問だね。まず th:class はクラス全体を上書きするのに対して、th:classappend は既にあるクラスに追加するという違いがあるんだ。」

例えば、次のようなHTMLを考えてみましょう。


<!-- th:classを使う場合 -->
<p class="base" th:class="${active} ? 'highlight' : 'normal'">サンプル1</p>

<!-- th:classappendを使う場合 -->
<p class="base" th:classappend="${active} ? ' highlight' : ' normal'">サンプル2</p>

上の例で、th:classを使うと「base」は上書きされて消えてしまいます。一方、th:classappendでは、既存の「base」クラスに「highlight」や「normal」が追加されます。つまり、見た目の基本スタイルを維持したまま状態に応じた変化を付けたい場合には、th:classappendを使うのがベストです。

HTML テンプレート Spring MVC では、th:classappendを利用することでレイアウトを崩さず動的変更ができるため、特にフォームやメッセージ表示などで多く使われます。

8. 複数条件を組み合わせたクラス設定(AND/OR条件)

8. 複数条件を組み合わせたクラス設定(AND/OR条件)
8. 複数条件を組み合わせたクラス設定(AND/OR条件)

実務では「一つの条件」だけでなく、複数の状態を同時に判断してクラスを変えるケースもあります。例えば「ログイン中かつ管理者であるときだけ特別なスタイルを適用する」といったシーンです。

Thymeleafでは、Javaと同じようにAND(and)やOR(or)を使って条件を組み合わせることができます。


<div th:class="${loggedIn and admin} ? 'admin-mode' : 'user-mode'">
    [[${loggedIn and admin} ? '管理者モード' : '一般ユーザーモード']]
</div>

上の例では、ログイン済みかつ管理者である場合に「admin-mode」クラスが適用されます。もしどちらかの条件が満たされない場合は「user-mode」となります。OR条件を使う場合は、orを使って次のように書けます。


<div th:class="${loggedIn or guest} ? 'welcome' : 'hidden'">
    [[${loggedIn or guest} ? 'ようこそ!' : '表示されません']]
</div>

このように複数条件を扱うことで、ページ全体の動作を柔軟に制御できます。特に、複雑な画面ロジックをシンプルに表現できるのがThymeleafの強みです。th:classth:classappendに条件を直接書けるため、Javaのコードを増やさずにテンプレート内で見た目をコントロールできます。

ただし、条件が増えすぎると可読性が下がるため、場合によってはコントローラ側で状態を整理してからモデルに渡す方が良いでしょう。


@Controller
public class UserController {

    @GetMapping("/user")
    public String user(Model model) {
        boolean loggedIn = true;
        boolean admin = false;
        model.addAttribute("loggedIn", loggedIn);
        model.addAttribute("admin", admin);
        return "user";
    }
}

このようにしておけば、HTML側では条件を簡潔に書けるようになります。Thymeleaf クラス 動的変更 の設計では、「条件をテンプレートに書く量を減らす」ことが読みやすいコードへの第一歩です。

9. 実践的なサンプル:エラーメッセージや入力フォームの状態でクラスを変更する例

9. 実践的なサンプル:エラーメッセージや入力フォームの状態でクラスを変更する例
9. 実践的なサンプル:エラーメッセージや入力フォームの状態でクラスを変更する例

最後に、実際の業務で役立つ実践的なサンプルを紹介します。ここでは、入力フォームでエラーが発生した場合にクラスを赤枠に変更する例を取り上げます。

新人

「エラーのときだけ赤くしたいんですが、CSSを書き換えなくてもできるんですか?」

先輩

「もちろんできるよ。th:classappendを使えば、Springの検証結果に応じてクラスを動的に追加できるんだ。」

まず、コントローラ側でエラーフラグを渡します。


@Controller
public class FormController {

    @GetMapping("/form")
    public String showForm(Model model) {
        boolean hasError = true;
        model.addAttribute("hasError", hasError);
        return "form";
    }
}

次に、テンプレート側でクラスを動的に変更します。


<form action="/submit" method="post">
    <input type="text" name="username"
           class="input-field"
           th:classappend="${hasError} ? ' input-error' : ''" />
    <p th:if="${hasError}" class="error-message">入力内容に誤りがあります。</p>
</form>

この例では、hasErrortrueのときだけ「input-error」クラスが追加され、入力欄が赤く表示されます。同時に、エラーメッセージの表示も制御できます。Spring MVC のフォームバリデーションと組み合わせれば、より実用的なエラーハンドリングが可能です。

このような仕組みを使うことで、ユーザーがどの入力項目で間違えたのかを直感的に分かりやすく表示できます。特に企業向けアプリケーションなどでは、視覚的なフィードバックが重要になるため、Thymeleafでのクラス動的制御は非常に役立ちます。

また、単一のエラーだけでなく、複数の状態を組み合わせてクラスを設定することも可能です。例えば、「エラーかつ未入力のときは赤枠+点滅表示」という条件も次のように書けます。


<input type="text" name="email"
       th:classappend="${hasError and emptyField} ? ' input-error blink' :
                       (${hasError} ? ' input-error' : '')" />

このように、ANDやOR条件を組み合わせることで柔軟な表示制御ができます。HTML テンプレート Spring MVC の開発では、こうした細やかな視覚的制御がユーザー体験を大きく向上させます。

最後に、初心者の方が覚えておきたいポイントとして、「Thymeleafの動的クラス設定はHTMLそのものを壊さず自然な書き方ができる」という点があります。静的なHTMLファイルとしても開けるため、デザイン確認や修正も簡単です。

つまり、th:classは「上書き」、th:classappendは「追加」という考え方を軸に、状況に合わせて使い分けるのがコツです。これを理解しておくと、実際のSpring MVCアプリケーションでもより柔軟でメンテナンス性の高いコードが書けるようになります。

この章で紹介したテクニックを活用すれば、フォーム、ダッシュボード、メッセージ表示など、さまざまな画面で動的なスタイル切り替えを実現できます。ぜひ自分のプロジェクトでも試してみてください。

まとめ

まとめ
まとめ

ここまで、Spring BootとThymeleafを組み合わせた「クラス属性の動的設定」について詳しく解説してきました。Thymeleaf(タイムリーフ)は、Javaエンジニアにとって非常に親しみやすく、かつ強力なテンプレートエンジンです。特にHTMLの属性を直接操作できるth:classth:classappendの機能は、モダンなWebアプリケーションのUI構築において欠かせない要素となっています。

今回の学習ポイントの振り返り

重要なポイントを改めて整理しましょう。まず、クラス全体を条件に応じて差し替えたい場合はth:classを使用します。一方で、デザインのベースとなるクラス(例えばBootstrapのbtnなど)を維持したまま、状態に応じて特定のクラスだけを付け足したい場合にはth:classappendが最適です。この使い分けができるようになると、CSSの管理が格段に楽になります。

また、Thymeleaf内での三項演算子の活用も大きな武器です。${条件} ? '真の場合' : '偽の場合'というシンプルな記述で、HTMLの構造を複雑にすることなくロジックを組み込めます。さらに、andorを用いた複数条件の判定を組み合わせれば、管理者権限の有無やフォームのバリデーション結果に応じた、きめ細やかな画面表示が可能になります。

実践的なサンプルプログラム:動的なステータスカード

最後に、これまでの知識を総動員した実践的なコード例を紹介します。ユーザーのプラン(無料・有料)と有効期限の状態によって、カードの背景色とバッジのクラスを動的に切り替えるサンプルです。


// コントローラ側でのデータ設定例
@GetMapping("/dashboard")
public String dashboard(Model model) {
    model.addAttribute("planType", "premium"); // premium or free
    model.addAttribute("isExpired", false);
    return "dashboard";
}

<div class="card shadow-sm" 
     th:classappend="${planType == 'premium'} ? ' border-primary' : ' border-secondary'">
    <div class="card-body">
        <h5 class="card-title">ユーザープラン情報</h5>
        
        <span class="badge" 
              th:classappend="${isExpired} ? ' bg-danger' : ' bg-success'"
              th:text="${isExpired} ? '期限切れ' : '有効なアカウント'">
            ステータス
        </span>

        <p class="mt-3">
            現在のプラン:
            <strong th:class="${planType == 'premium'} ? 'text-primary' : 'text-muted'"
                    th:text="${planType == 'premium'} ? 'プレミアムプラン' : '無料プラン'">
                プラン名
            </strong>
        </p>
        
        <div th:if="${planType == 'premium' and !isExpired}" class="alert alert-info mt-2">
            プレミアム会員限定の特典が利用可能です!
        </div>
    </div>
</div>

このように、Spring MVCのモデルから受け取った値を元に、HTMLのクラスやテキストを自在に操ることができるのがThymeleafの魅力です。最初は三項演算子の書き方に戸惑うかもしれませんが、一度慣れてしまえば、JavaScriptを多用しなくてもサーバーサイドのロジックだけでかなりの表現が可能になります。

今回学んだ手法は、業務システムのエラーハンドリングや、ECサイトの在庫状況に応じた表示切り替えなど、あらゆる場面で応用が効きます。ぜひ、ご自身のプロジェクトでも積極的にth:classappendを活用して、保守性の高い、美しいテンプレートコードを目指してみてください。

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

生徒

「先生、今回のまとめでth:classth:classappendの使い分けがやっと腑に落ちました!最初は全部上書きしちゃって、Bootstrapのレイアウトが崩れて焦ったんです(笑)」

先生

「ははは、それは誰もが通る道だね。既存のクラスを活かしたい時は『append(追加)』、というルールを覚えておけばもう大丈夫。三項演算子での条件分岐はどうだった?」

生徒

「Javaのif文みたいに書けるので、思っていたより直感的でした。特にandを使って『プレミアム会員かつ期限内』みたいに条件を絞り込めるのは、実際のアプリ開発でめちゃくちゃ使えそうです!」

先生

「その通り。ただし、HTMLの中にロジックを詰め込みすぎると読みづらくなるから、複雑になりそうな時はコントローラ側で判定用のフラグを作ってからModelに渡すのがコツだよ。」

生徒

「なるほど。見通しの良いコードを書くために、ビューとロジックのバランスも意識してみます。次はフォームのバリデーション結果を動的に表示する機能に挑戦してみます!」

先生

「いい意気込みだね。Thymeleafを使いこなせば、ユーザーに優しい動的な画面がどんどん作れるようになるよ。頑張って!」

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

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

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

タイムリーフ(Thymeleaf)とはどのようなツールですか?特徴を教えてください。

タイムリーフ(Thymeleaf)は、ジャバ(Java)のフレームワークであるスプリングエムブイシー(Spring MVC)と一緒に使われるテンプレートエンジンです。最大の特徴は、サーバーサイドで動的にHTMLを生成しながらも、作成したファイルをそのままブラウザで表示できる「ナチュラルテンプレート」である点です。デザイナーが作成した静的なHTMLデザインを壊すことなく、エンジニアがプログラムの変数を埋め込めるため、チーム開発や協業において非常に強力なメリットを発揮します。初心者にとっても、ブラウザで見た目を確認しながら開発を進められるため、非常に学習しやすく扱いやすいテンプレートエンジンと言えます。
コメント
コメント投稿は、ログインしてください

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

カテゴリの一覧へ
新着記事
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の繰り返し処理の使い方