Spring MVCのModel/ModelMap/ModelAndViewの違いと使い分けを徹底解説!ビューへの値の渡し方ベストプラクティス
生徒
「Spring MVCでコントローラーからビューに値を渡したいんですが、ModelとかModelMapとかModelAndViewとか、どれを使えばいいんですか?」
先生
「それぞれに特徴があるので、シチュエーションによって使い分けると便利ですよ。実際に見ていきましょう。」
生徒
「違いがよくわからないので、初心者にもわかるように教えてください!」
先生
「もちろんです!それぞれの特徴とベストプラクティスを丁寧に解説していきますね。」
1. Spring MVCで値をビューに渡す基本的な方法とは
Spring MVCでは、コントローラーからビューにデータを渡すためにModel、ModelMap、ModelAndViewの3つの仕組みがあります。これらはすべて、HTMLのビュー(たとえばThymeleafなど)で動的にデータを表示するために使われる重要な機能です。
この3つは目的は同じですが、使い方や拡張性に少しずつ違いがあります。初心者が混乱しやすいポイントですが、実際のコードと共に学べば理解が深まります。
2. Modelを使った値の渡し方
Modelはインターフェースで、Springが内部で用意している仕組みを通じて、簡潔にビューに値を渡せます。非常によく使われる方法です。
例えば以下のように使います。
@Controller
public class SampleController {
@GetMapping("/greeting")
public String greeting(Model model) {
model.addAttribute("message", "こんにちは、Spring MVC!");
return "greeting";
}
}
このコードでは、"message"というキーで"こんにちは、Spring MVC!"という値をビューに渡しています。
3. ModelMapの特徴と使い方
ModelMapは、Modelと似ていますが、Mapのような操作性を持っています。キーと値のペアでデータを管理するため、Mapに慣れている人には使いやすいでしょう。
@Controller
public class SampleController {
@GetMapping("/welcome")
public String welcome(ModelMap modelMap) {
modelMap.addAttribute("user", "山田太郎");
return "welcome";
}
}
ModelMapを使うと、内部的にはLinkedHashMapで値が保持されます。
4. ModelAndViewの基本と使い方
ModelAndViewは、ビュー名と値の両方を同時に設定できる便利なクラスです。やや冗長にはなりますが、ひとつのオブジェクトで完結できる点が特徴です。
@Controller
public class SampleController {
@GetMapping("/info")
public ModelAndView info() {
ModelAndView mav = new ModelAndView("info");
mav.addObject("email", "user@example.com");
return mav;
}
}
このようにModelAndViewは柔軟にビューとデータをセットできます。
5. どれを使うべき?Model・ModelMap・ModelAndViewの違いとベストプラクティス
それぞれの違いをまとめると以下のようになります。
- Model:最もシンプルで推奨される方法。迷ったらこれ!
- ModelMap:Map的な操作を使いたい場合に便利。
- ModelAndView:条件分岐などでビュー名を動的にしたいときに向いている。
一般的にはModelの使用が推奨されています。Springの公式ドキュメントでも、柔軟性とコードの可読性からModelの利用が中心です。
6. Spring Boot + Thymeleafでの具体的なビュー表示例
例えば、Modelを使ってコントローラーから"message"というキーで文字列を渡したとします。Thymeleafテンプレートでは次のように表示できます。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Greeting</title>
</head>
<body>
<h1 th:text="${message}">デフォルトメッセージ</h1>
</body>
</html>
th:textでModelに設定した"message"の値を表示しています。Spring MVCとThymeleafは非常に親和性が高く、動的なページが簡単に作成できます。
7. 複数の値を渡したいときのテクニック
複数の情報を渡したい場合は、以下のようにaddAttributeを何度も使えばOKです。
@GetMapping("/profile")
public String profile(Model model) {
model.addAttribute("name", "佐藤花子");
model.addAttribute("age", 28);
model.addAttribute("location", "東京");
return "profile";
}
ビュー側ではそれぞれ${name}、${age}、${location}のように参照できます。
8. フォーム送信後のリダイレクトでも活用できる
ModelやModelMapは、リダイレクト時にはRedirectAttributesを使うことがベストプラクティスです。リダイレクトではModelの内容は引き継がれないため、RedirectAttributes#addFlashAttributeを使います。
@PostMapping("/submit")
public String handleForm(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("successMessage", "送信が完了しました!");
return "redirect:/result";
}
このようにして、画面遷移後のメッセージ表示などにも活用できます。
まとめ
Spring MVCでビューに値を渡す3つの方法の違いと使い分け
今回は、Spring MVCでコントローラーからビューへ値を渡す方法として、Model、ModelMap、ModelAndViewの3つについて学びました。それぞれの使い方や特徴を整理することで、開発現場でどの方法を使えば良いか判断できるようになります。
Modelはシンプルでコードも読みやすく、Spring公式でも推奨されている方法です。初心者が最初に選ぶには最適です。ModelMapはMapのような使い方ができ、複数のデータを一括で管理するケースに便利です。一方、ModelAndViewは、ビュー名とデータをまとめて扱えるので、条件によって動的にビューを切り替えるような処理に向いています。
実際に複数の値を渡すケースを再確認
複数のデータをビューに渡したいときは、以下のようにModelを使って何度もaddAttributeを呼び出すのが基本です。
@GetMapping("/details")
public String details(Model model) {
model.addAttribute("username", "田中一郎");
model.addAttribute("email", "tanaka@example.com");
model.addAttribute("registered", true);
return "user-details";
}
ビュー側では${username}や${email}といった変数を使って動的に情報を表示できます。これにより、ユーザーごとに異なる情報をテンプレートに反映できるようになります。
リダイレクト時の注意点とRedirectAttributesの活用
リダイレクトを伴うフォーム処理などでは、通常のModelやModelMapで渡した値は次の画面に引き継がれません。そこで、RedirectAttributesのaddFlashAttributeを使うことで、セッションを通じて一時的に値を渡すことができます。
@PostMapping("/contact")
public String submitContact(RedirectAttributes attrs) {
attrs.addFlashAttribute("msg", "お問い合わせを受け付けました。");
return "redirect:/contact/confirm";
}
この方法は、成功メッセージや通知メッセージを表示する際に非常に役立ちます。Spring MVCで実用的な開発を行うには、こういった細かな使い分けが重要になってきます。
Thymeleafとの組み合わせでさらに便利に
Spring BootとThymeleafを組み合わせると、渡された値をth:textでそのままHTMLテンプレートに表示できます。変数の展開も簡単で、デザイナーと協業しやすい構造になります。
Spring MVCのModel、ModelMap、ModelAndViewの違いを理解し、使い分けのベストプラクティスを身につけておくことで、実践的なWebアプリケーション開発がよりスムーズになります。
生徒
「今回でModel、ModelMap、ModelAndViewの違いがだいぶはっきりしてきました!」
先生
「それはよかったです。実際のプロジェクトでは、ほとんどがModelで事足りますが、場面によって使い分けると効率的になりますよ。」
生徒
「リダイレクト後に値が消えるのは知らなかったので、RedirectAttributesの使い方はとても参考になりました。」
先生
「ビューに一時的なメッセージを渡したいときには定番の方法ですから、ぜひ覚えておきましょう。今回の知識は今後の開発でもきっと役立ちますよ。」