カテゴリ: Spring 更新日: 2026/02/12

SpringのModelクラスの使い方を完全ガイド!初心者でも安心

SpringのModelクラス
SpringのModelクラス

先生と生徒の会話形式で理解しよう

生徒

「Springでコントローラーからビューにデータを渡す方法を教えてください!」

先生

「Springでは、org.springframework.uiパッケージにあるModelクラスを使ってデータをビューに渡します。」

生徒

「具体的にはどのように使えば良いですか?」

先生

「それでは、Modelクラスの基本的な使い方を詳しく見ていきましょう!」

1. SpringのModelクラスとは?

「1. SpringのModelクラスとは?」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. SpringのModelクラスとは?
1. SpringのModelクラスとは?

SpringのModelは、コントローラーで用意した値をビュー(画面)へ受け渡すための“連絡ノート”のような入れ物です。キー(名前)と値のペアで情報を持ち、MVCの流れ(Controller → Model → View)で、テンプレートエンジン(例:Thymeleaf)がその値を取り出して表示します。

例えばログイン名や商品一覧のタイトルなど、画面に出したい情報をModelに入れて返すだけで、ビュー側は${...}で読み取れます。難しい仕組みを覚えるより、「名前をつけて箱に入れる」と考えると理解しやすいでしょう。

超シンプルなサンプル(プログラミング未経験者向け)


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        // 1) "message" という名前で値を入れる(キーと値のペア)
        model.addAttribute("message", "はじめてのModel!");
        // 2) "hello" というビュー名(テンプレートファイル名)を返す
        return "hello";
    }
}

ここではmessageという名前で文字列をModelに入れています。ビュー(hello.htmlなど)では${message}と書けば中身を表示できます。まずは「コントローラーでaddAttribute、ビューで取り出す」という流れを押さえましょう。

このようにModelは「画面に渡したいデータを名前付きで持たせる仕組み」です。以降のセクションでは、用途や記述パターンを順に見ていきますが、まずは“箱に入れて渡す”というイメージが掴めれば十分です。

2. Modelクラスの主な用途

2. Modelクラスの主な用途
2. Modelクラスの主な用途

Modelは「画面に必要な材料置き場」です。ページのタイトル、あいさつ文、一覧データ、エラーメッセージ、ページ番号など、ビューに表示したい情報を“名前付き”で入れて渡します。コントローラーは材料を用意し、ビューはその名前で取り出して表示する、という役割分担になります。

  • ユーザー名やページタイトルなどの固定文言を渡す
  • 商品一覧などのコレクション(配列・リスト)を渡す
  • フォーム送信後の確認メッセージやエラー文を渡す
  • 画面の状態(現在のタブ、ページ番号、件数など)を渡す
  • 日時や計算結果など、その場で作った値を渡す

使い方はシンプルで、addAttribute(名前, 値)を呼ぶだけ。名前は後でテンプレートから参照するための“ラベル”なので、titleitemsのように意味が伝わる短い英単語にすると混乱が少なくなります。

超シンプルな用途サンプル(一覧+件数を渡す)


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Controller
public class ProductController {

    @GetMapping("/products")
    public String list(Model model) {
        // 画面に出したい材料を用意(ここでは固定のダミーデータ)
        List<String> items = List.of("りんご", "バナナ", "みかん");

        // 名前を付けてModelへ入れる
        model.addAttribute("title", "商品一覧");
        model.addAttribute("items", items);
        model.addAttribute("count", items.size()); // 件数も一緒に渡すと便利

        // productList.html を表示
        return "productList";
    }
}

ビュー側(productList.html)では、${title}${count}をそのまま表示でき、itemsは繰り返しで描画できます。最初は「必要な値に、分かりやすい名前を付けて入れる」ことだけ意識すればOKです。


<!-- Thymeleaf 例 -->
<h1 th:text="${title}">商品一覧</h1>
<p>合計 <span th:text="${count}">0</span> 件</p>
<ul>
  <li th:each="name : ${items}" th:text="${name}">商品名</li>
</ul>

まとめると、Modelの用途は「ビューが必要とする値を用途別に詰めること」。小さく試しながら、名前と中身の対応関係を丁寧にそろえていくと、画面づくりが一気に楽になります。

3. 基本的な使い方

3. 基本的な使い方
3. 基本的な使い方

以下は、Modelクラスを使ってデータをビューに渡す基本的な例です。


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class ModelExampleController {

    @GetMapping("/model-example")
    public String modelExample(Model model) {
        model.addAttribute("title", "SpringのModelクラス");
        model.addAttribute("message", "このデータはModelを使って渡されました。");
        return "exampleView";
    }
}

この例では、addAttributeメソッドを使ってキーと値のペアを追加し、それをビューで使用できるようにしています。

4. ビューでのデータの表示方法

「4. ビューでのデータの表示方法」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. ビューでのデータの表示方法
4. ビューでのデータの表示方法

上記のコードで渡したデータは、以下のようにビューで表示することができます(Thymeleafを例にします)。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="${title}"></title>
</head>
<body>
    <h1 th:text="${title}"></h1>
    <p th:text="${message}"></p>
</body>
</html>

これにより、コントローラーから渡されたtitlemessageが表示されます。

5. 動的なデータの追加

5. 動的なデータの追加
5. 動的なデータの追加

以下は、条件に応じてデータを動的に追加する例です。


@GetMapping("/dynamic-model")
public String dynamicModelExample(Model model, boolean isLoggedIn) {
    if (isLoggedIn) {
        model.addAttribute("user", "ログイン済みユーザー");
        model.addAttribute("status", "ようこそ!");
    } else {
        model.addAttribute("user", "ゲスト");
        model.addAttribute("status", "ログインしてください。");
    }
    return "dynamicView";
}

この例では、ログイン状態に応じて表示するメッセージを動的に変更しています。

6. よくある疑問

6. よくある疑問
6. よくある疑問

Q: Modelクラスはどのようにデータを管理しますか?

A: データは内部的にキーと値の形式で保存され、ビューで使用するために提供されます。

Q: ModelModelMapの違いは何ですか?

A: 両者はほぼ同じ機能を提供しますが、ModelMapjava.util.Mapを拡張したもので、より柔軟な操作が可能です。

Q: 複数のデータを追加する場合の注意点はありますか?

A: キー名が重複しないようにすることが重要です。重複すると、後から追加したデータで上書きされます。

7. Model・ModelMap・ModelAndViewの違いと選び方

「7. Model・ModelMap・ModelAndViewの違いと選び方」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. Model・ModelMap・ModelAndViewの違いと選び方
7. Model・ModelMap・ModelAndViewの違いと選び方

Modelは最もシンプルで、属性を追加してビュー名を文字列で返すパターンです。ModelMapMapの操作に慣れている場合に便利で、put系の操作感で扱えます。ModelAndViewは「ビュー名」と「データ」をひとまとめにでき、処理の途中でビュー名を切り替えるようなケースに向いています。

  • Model:よく使う基本形。迷ったらこれ。
  • ModelMap:Map操作をそのまま使いたいとき。
  • ModelAndView:1つの戻り値でビューとデータをまとめたいとき。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ChoiceController {

    // Model の例
    @GetMapping("/with-model")
    public String withModel(Model model) {
        model.addAttribute("title", "Modelの例");
        model.addAttribute("message", "最小限でシンプル");
        return "sampleView";
    }

    // ModelMap の例
    @GetMapping("/with-modelmap")
    public String withModelMap(ModelMap modelMap) {
        modelMap.put("title", "ModelMapの例");
        modelMap.put("message", "Mapライクに操作できる");
        return "sampleView";
    }

    // ModelAndView の例
    @GetMapping("/with-mav")
    public ModelAndView withModelAndView() {
        ModelAndView mav = new ModelAndView("sampleView");
        mav.addObject("title", "ModelAndViewの例");
        mav.addObject("message", "ビュー名とデータを一括管理");
        return mav;
    }
}

8. @ModelAttributeでフォーム入力と連携する

8. @ModelAttributeでフォーム入力と連携する
8. @ModelAttributeでフォーム入力と連携する

フォーム入力を受け取るときは、@ModelAttributeでフォーム用オブジェクトにバインドします。初期表示では空のオブジェクトをモデルに入れ、送信時は同じ名前で受け取るのがポイントです。


// フォーム用のDTO
public class UserForm {
    private String name;
    private Integer age;
    // getter / setter を省略
}

@Controller
public class FormController {

    // 初期表示:空のフォームをModelへ
    @GetMapping("/user/new")
    public String showForm(Model model) {
        model.addAttribute("userForm", new UserForm());
        return "userForm";
    }

    // 送信処理:フォーム入力を受け取り、再度Modelに詰める
    @PostMapping("/user/new")
    public String submit(
            @ModelAttribute("userForm") UserForm form,
            Model model) {
        // バリデーションや保存処理をここで実行
        model.addAttribute("result", "登録が完了しました");
        return "userResult";
    }
}

Thymeleafのフォーム側では、オブジェクトをth:objectで指定し、各入力にth:fieldを使います。


<form th:action="@{/user/new}" th:object="${userForm}" method="post">
    <label>名前</label>
    <input type="text" th:field="*{name}">
    <label>年齢</label>
    <input type="number" th:field="*{age}">
    <button type="submit">送信</button>
</form>

9. リダイレクト時のデータ受け渡し(RedirectAttributesとフラッシュ属性)

9. リダイレクト時のデータ受け渡し(RedirectAttributesとフラッシュ属性)
9. リダイレクト時のデータ受け渡し(RedirectAttributesとフラッシュ属性)

リダイレクト後に1回だけ表示したいメッセージは、RedirectAttributesaddFlashAttributeを使います。URLに露出させたくない一時的な値に最適です。

  • addAttribute:クエリパラメータとしてURLに付与される
  • addFlashAttribute:セッション経由で1回だけ取り出せる(URLには出ない)

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
public class RedirectController {

    @PostMapping("/save")
    public String save(RedirectAttributes ra) {
        // 保存処理...
        ra.addFlashAttribute("notice", "保存が完了しました");
        return "redirect:/list";
    }
}

リダイレクト先のビューでは、通常のモデル属性と同様に参照できます。


<!-- list.html -->
<div th:if="${notice}">
    <p th:text="${notice}"></p>
</div>

まとめ

「まとめ」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

まとめ
まとめ

SpringのModelクラスは、ビューにデータを渡すための非常に重要な役割を果たします。このクラスを使用することで、コントローラーの可読性が向上し、ビューでのデータ管理が容易になります。また、addAttributeメソッドを使って動的にデータを追加できるため、さまざまな場面で利用できます。今回の記事では、Modelクラスの基本的な使い方から、動的データの管理方法までを詳しく解説しました。

データの管理において、キー名の一貫性を保つことや、適切なビュー名を設定することが重要です。また、ModelMapModelAndViewとの違いを理解することで、Springのデータ管理をさらに効率的に行えるようになります。

以下は、記事で紹介したコードを応用した例です。


@GetMapping("/summary-example")
public String summaryExample(Model model) {
    model.addAttribute("pageTitle", "まとめページ");
    model.addAttribute("summary", "SpringのModelクラスは、データをビューに渡すための強力なツールです。");
    model.addAttribute("nextStep", "次は、ModelMapを学んでみましょう!");
    return "summaryView";
}

以上の例では、複数のデータをModelクラスに追加し、ビューでそれらを使用できるようにしています。このように、Modelクラスを活用することで、ビューとコントローラー間のデータ連携がスムーズになります。

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

生徒

「今日のまとめをお願いします!」

先生

「SpringのModelクラスは、コントローラーからビューにデータを渡すための基本的なツールです。addAttributeメソッドを使えば、簡単にデータを追加できます。」

生徒

「動的なデータ管理も可能なんですね!」

先生

「その通りです。ログイン状態や条件に応じてデータを変更する場合にも活躍します。ModelMapModelAndViewとの違いを理解すると、さらに応用範囲が広がりますよ。」

生徒

「次回は、ModelMapについて学びたいです!」

先生

「いいですね。次回も一緒にSpringを深く理解していきましょう!」

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

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

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

SpringのModelクラスとは何ですか?

SpringのModelクラスは、コントローラーからビューにデータを渡すためのツールです。データをキーと値のペア形式で管理し、ビューで簡単に使用できるようになります。

Modelクラスを使うとどのようなメリットがありますか?

Modelクラスを使用することで、コントローラーのコードを簡潔にし、ビューへのデータ渡しを効率化できます。また、動的なデータ管理も簡単になります。

addAttributeメソッドとは何ですか?

addAttributeメソッドは、Modelクラスにデータを追加するためのメソッドです。キーと値を指定するだけでデータを簡単に追加でき、ビューで利用可能になります。

ビューでModelクラスのデータをどのように表示しますか?

Thymeleafなどのテンプレートエンジンを使用し、ビューでデータを表示します。例えば、タイトルやメッセージを表示する際は、${title}や${message}のように記述します。

動的にデータをModelクラスに追加する方法を教えてください。

条件分岐を使用してデータを動的に追加できます。例えば、ログイン状態に応じて異なるメッセージを表示する場合、if文を使ってaddAttributeメソッドでデータを追加します。

ModelクラスとModelMapクラスの違いは何ですか?

Modelクラスは基本的なデータ渡しを行うためのインターフェースで、ModelMapはMapを拡張したクラスです。より柔軟なデータ管理が必要な場合にはModelMapが役立ちます。

Modelクラスで複数のデータを追加するときの注意点はありますか?

複数のデータを追加する際は、キー名が重複しないように注意してください。同じキー名を使用すると、後から追加したデータが上書きされます。

Modelクラスを使用する際に推奨されるベストプラクティスは何ですか?

データを追加する際は、明確で一貫性のあるキー名を使用し、適切なビュー名を指定することが重要です。また、コードの可読性を保つために、データの追加は一箇所にまとめると良いでしょう。

Thymeleaf以外のテンプレートエンジンでもModelクラスは使えますか?

はい、Thymeleaf以外のテンプレートエンジン(例: JSPやFreeMarker)でもModelクラスを使ってデータをビューに渡すことができます。

SpringのModelクラスはREST APIでも使えますか?

REST APIではModelクラスを使用することは一般的ではありません。代わりに、@ResponseBodyやResponseEntityを使ってJSON形式でデータを返すのが一般的です。

ビュー名を処理途中で切り替えたいときは何を使うべきですか?

処理の条件によってビュー名を後から変更したい場合は、ModelAndViewを使うとsetViewName()で柔軟に切り替えられます。

ユニットテストでModelの中身を検証する最も簡単な方法は?

MockMvcを使い、andExpect(model().attribute("key", value))のようにアサートします。軽量テストならModelMapを受けるハンドラを直接呼び出して中身を確認してもOKです。
カテゴリの一覧へ
新着記事
New1
Servlet
JavaのPart.writeメソッドの使い方を完全ガイド!初心者でもわかるファイル保存の基本
更新記事
New2
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
更新記事
New3
Servlet
JavaのCookieクラスのgetDomainメソッドを完全解説!Servlet開発でCookieのドメインを取得する方法
更新記事
New4
Spring
Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring
Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
No.3
Java&Spring記事人気No3
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.4
Java&Spring記事人気No4
Thymeleaf
Thymeleaf(タイムリーフ)の使い方入門!初心者でもわかるth:textの基礎
No.5
Java&Spring記事人気No5
Spring
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方
No.6
Java&Spring記事人気No6
Thymeleaf
Thymeleafのth:checkedの使い方!チェックボックスON/OFFを動的に制御する方法
No.7
Java&Spring記事人気No7
Spring
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.8
Java&Spring記事人気No8
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門