Spring BootのModelAndViewを徹底解説!使い方から応用まで詳しく解説

こんにちは。ゆうせいです。
Spring BootでWebアプリケーションを開発するとき、画面にデータを渡して表示させる方法はいくつかあります。その中でも、ModelAndView「データ(Model)」と「画面(View)」を一緒に管理する」 方法の一つです。

この記事では、

  • ModelAndViewとは何か?
  • どんな場面で使うのか?
  • 実際のコード例
  • ModelRedirectAttributes との違い

などを詳しく解説します。


1. ModelAndViewとは?

ModelAndView は、Spring MVCで利用されるクラスで、データ(Model)とビュー(View)をまとめて扱える のが特徴です。

通常、Spring Bootでは以下の3つの方法でビューにデータを渡せます。

方法説明主な用途
ModelAndViewModel(データ)と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 動作確認

  1. http://localhost:8080/hello にアクセス
  2. こんにちは、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開発がよりスムーズになります。実際の開発で活用してみてください。ください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

春のロゴ アイコン by Icons8

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。