Spring BootのModelAndViewを徹底解説!使い方から応用まで詳しく解説
こんにちは。ゆうせいです。
Spring BootでWebアプリケーションを開発するとき、画面にデータを渡して表示させる方法はいくつかあります。その中でも、ModelAndView は 「データ(Model)」と「画面(View)」を一緒に管理する」 方法の一つです。
この記事では、
- ModelAndViewとは何か?
- どんな場面で使うのか?
- 実際のコード例
- Modelや- RedirectAttributesとの違い
などを詳しく解説します。
1. ModelAndViewとは?
ModelAndView は、Spring MVCで利用されるクラスで、データ(Model)とビュー(View)をまとめて扱える のが特徴です。
通常、Spring Bootでは以下の3つの方法でビューにデータを渡せます。
| 方法 | 説明 | 主な用途 | 
|---|---|---|
| ModelAndView | Model(データ)とView(画面)をセットで管理する | 画面遷移とデータセットをまとめて扱う | 
| Model | データだけを扱う | 画面名は Stringで返す場合 | 
| RedirectAttributes | リダイレクト時にデータを渡す | リダイレクト時に一時的にデータを保持する | 
2. ModelAndViewの基本的な使い方
2.1 コントローラでの基本的な書き方
Spring Bootでは、Controller クラスで ModelAndView を使うことで、データと画面の指定を同時に行えます。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class SampleController {
    @GetMapping("/hello")
    public ModelAndView hello() {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("hello");  // 表示するビュー(hello.html)
        mav.addObject("message", "こんにちは、Spring Boot!");  // ビューに渡すデータ
        return mav;
    }
}
2.2 ModelAndView の主なメソッド
| メソッド | 説明 | 
|---|---|
| setViewName(String viewName) | 表示するテンプレート(HTMLやJSP)を指定 | 
| addObject(String key, Object value) | データをビューに渡す | 
| getViewName() | 設定されたビュー名を取得 | 
| getModel() | 設定されたデータを取得 | 
3. 実際にビューと連携してみる
次に、Spring Bootで ModelAndView を使って Thymeleafのテンプレート と連携する例を紹介します。
3.1 Thymeleafのテンプレートを用意
src/main/resources/templates/hello.html に以下のようなHTMLを作成します。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello Page</title>
</head>
<body>
    <h1 th:text="${message}">デフォルトメッセージ</h1>
</body>
</html>
3.2 動作確認
- http://localhost:8080/helloにアクセス
- こんにちは、Spring Boot!というメッセージが表示される
これで、ModelAndView を使ってデータとビューを連携できました。
4. ModelAndViewの応用編
4.1 複数のデータを渡す
1つのビューに対して複数のデータを渡すことも可能です。
@GetMapping("/multi")
public ModelAndView multiData() {
    ModelAndView mav = new ModelAndView("multi");
    mav.addObject("title", "複数データ");
    mav.addObject("message", "これは複数のデータを渡すサンプルです");
    return mav;
}
ビュー (multi.html) では、以下のようにデータを表示できます。
<h1 th:text="${title}"></h1>
<p th:text="${message}"></p>
4.2 フォームと組み合わせる
Spring Bootのフォーム送信でも ModelAndView を利用できます。
フォーム画面 (form.html)
<form action="/submit" method="post">
    <input type="text" name="name">
    <button type="submit">送信</button>
</form>
コントローラ
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@PostMapping("/submit")
public ModelAndView submit(@RequestParam("name") String name) {
    ModelAndView mav = new ModelAndView("result");
    mav.addObject("name", name);
    return mav;
}
結果表示 (result.html)
<p th:text="'あなたの名前は ' + ${name} + ' です。'"></p>
5. ModelAndView を使うべき場面
Spring Bootでは Model を使うことが一般的ですが、ModelAndView が適しているケースもあります。
5.1 ModelAndView を使うべき場合
- ビューとデータをセットで管理したいとき
- プログラムの可読性を高めたいとき
- 複数のデータをまとめて管理したいとき
5.2 Model を使うべき場合
- シンプルにデータだけ渡したいとき
- ビュー名をメソッドの戻り値で指定する場合
例えば、以下のように Model を使う場合は、ModelAndView は不要です。
@GetMapping("/simple")
public String simple(Model model) {
    model.addAttribute("message", "シンプルなデータ渡し");
    return "simpleView";
}
6. まとめ
今回はSpring Bootの ModelAndView について詳しく解説しました。
- ModelAndViewは データとビューをまとめて管理 できる
- setViewName()で 表示するビューを指定 する
- addObject()で データをビューに渡す
- Modelとの使い分けが大事
ModelAndView を使いこなすと、Spring BootのWeb開発がよりスムーズになります。実際の開発で活用してみてください。ください!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
- 
セイ・コンサルティング・グループ株式会社代表取締役。
 岐阜県出身。
 2000年創業、2004年会社設立。
 IT企業向け人材育成研修歴業界歴20年以上。
 すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
 この記事に間違い等ありましたらぜひお知らせください。