SpringのModelクラスの使い方を完全ガイド!初心者でも安心
生徒
「Springでコントローラーからビューにデータを渡す方法を教えてください!」
先生
「Springでは、org.springframework.uiパッケージにあるModelクラスを使ってデータをビューに渡します。」
生徒
「具体的にはどのように使えば良いですか?」
先生
「それでは、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クラスの主な用途
Modelは「画面に必要な材料置き場」です。ページのタイトル、あいさつ文、一覧データ、エラーメッセージ、ページ番号など、ビューに表示したい情報を“名前付き”で入れて渡します。コントローラーは材料を用意し、ビューはその名前で取り出して表示する、という役割分担になります。
- ユーザー名やページタイトルなどの固定文言を渡す
- 商品一覧などのコレクション(配列・リスト)を渡す
- フォーム送信後の確認メッセージやエラー文を渡す
- 画面の状態(現在のタブ、ページ番号、件数など)を渡す
- 日時や計算結果など、その場で作った値を渡す
使い方はシンプルで、addAttribute(名前, 値)を呼ぶだけ。名前は後でテンプレートから参照するための“ラベル”なので、titleやitemsのように意味が伝わる短い英単語にすると混乱が少なくなります。
超シンプルな用途サンプル(一覧+件数を渡す)
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. 基本的な使い方
以下は、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. ビューでのデータの表示方法」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
上記のコードで渡したデータは、以下のようにビューで表示することができます(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>
これにより、コントローラーから渡されたtitleとmessageが表示されます。
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. よくある疑問
Q: Modelクラスはどのようにデータを管理しますか?
A: データは内部的にキーと値の形式で保存され、ビューで使用するために提供されます。
Q: ModelとModelMapの違いは何ですか?
A: 両者はほぼ同じ機能を提供しますが、ModelMapはjava.util.Mapを拡張したもので、より柔軟な操作が可能です。
Q: 複数のデータを追加する場合の注意点はありますか?
A: キー名が重複しないようにすることが重要です。重複すると、後から追加したデータで上書きされます。
7. Model・ModelMap・ModelAndViewの違いと選び方
「7. Model・ModelMap・ModelAndViewの違いと選び方」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
Modelは最もシンプルで、属性を追加してビュー名を文字列で返すパターンです。ModelMapはMapの操作に慣れている場合に便利で、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でフォーム入力と連携する
フォーム入力を受け取るときは、@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とフラッシュ属性)
リダイレクト後に1回だけ表示したいメッセージは、RedirectAttributesのaddFlashAttributeを使います。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クラスの基本的な使い方から、動的データの管理方法までを詳しく解説しました。
データの管理において、キー名の一貫性を保つことや、適切なビュー名を設定することが重要です。また、ModelMapやModelAndViewとの違いを理解することで、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メソッドを使えば、簡単にデータを追加できます。」
生徒
「動的なデータ管理も可能なんですね!」
先生
「その通りです。ログイン状態や条件に応じてデータを変更する場合にも活躍します。ModelMapやModelAndViewとの違いを理解すると、さらに応用範囲が広がりますよ。」
生徒
「次回は、ModelMapについて学びたいです!」
先生
「いいですね。次回も一緒にSpringを深く理解していきましょう!」