SpringのModelクラスの使い方を完全ガイド!初心者でも安心
生徒
「Springでコントローラーからビューにデータを渡す方法を教えてください!」
先生
「Springでは、org.springframework.uiパッケージにあるModelクラスを使ってデータをビューに渡します。」
生徒
「具体的にはどのように使えば良いですか?」
先生
「それでは、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メソッドを使って簡単に追加できます。また、ビュー名の指定はコントローラーの戻り値で行います。
将来を見据えて、+αのスキルを身につけたい方へ
JavaやLinuxを学んでいても、「このままで市場価値は上がるのか」 「キャリアの選択肢を広げたい」と感じる方は少なくありません。
AIを学ぶならアイデミープレミアム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. ビューでのデータの表示方法
上記のコードで渡したデータは、以下のようにビューで表示することができます(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の違いと選び方
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を深く理解していきましょう!」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
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です。
Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。
Spring Framework超入門をAmazonで見る※ Amazonアソシエイト・プログラムを利用しています