SpringのModelクラスとaddAttributeメソッドの使い方を完全ガイド!初心者でも安心
Spring Bootを使ったWebアプリケーション開発を、 環境構築から実践まで一通り学びたい方には、 定評のある入門書が参考になります。
Spring Boot 3 プログラミング入門をAmazonで見る※ Amazon広告リンク
生徒
「Springでビューにデータを渡すにはどうすればいいですか?」
先生
「Springでは、org.springframework.uiパッケージに含まれるModelクラスを使います。addAttributeメソッドを使うと、簡単にデータを渡すことができますよ。」
生徒
「具体的にどのようにデータを追加するんですか?」
先生
「それでは、addAttributeメソッドの使い方を詳しく見ていきましょう!」
1. SpringのModelクラスとは?
SpringのModelクラスは、コントローラーからビュー(HTMLテンプレート)へ値を手渡しするための「入れ物」です。キーと値のペアで情報を管理でき、テンプレート側ではそのキー名で取り出して表示します。画面に見せたい最小限の情報だけをまとめるので、コードがすっきりし、役割分担(表示はビュー、処理はコントローラー)が明確になります。
例えば「ユーザー名」「今日のメッセージ」「商品の件数」といった、小さなテキストや数値から、リストやオブジェクトまで扱えます。ポイントはキー名をわかりやすく統一すること。後でテンプレートから参照するときに迷いません。初心者の方は「画面に持っていきたいデータを、箱(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) {
// 「name」という名札で「太郎」という値を箱(Model)に入れる
model.addAttribute("name", "太郎");
// 表示したいテンプレート(ビュー)の名前を返す
return "hello";
}
}
テンプレート側では ${name} のように参照できます。まずは「キー=名札」「値=中身」というイメージをつかみ、画面に必要な分だけ入れるのがコツです(Spring Model 使い方 / ビューにデータを渡す / addAttribute 基本)。
2. addAttributeメソッドとは?
addAttributeメソッドは、Modelクラスにデータを追加するためのメソッドです。このメソッドを使うと、キーと値の形式でデータをModelに格納できます。
主に以下のような場面で使用されます:
- ユーザー情報を渡す
- 商品リストを表示する
- フォームの入力結果をビューに反映させる
データを追加する際は、キー名を一貫性のある名前にすることが重要です。これにより、後からビューでデータを扱いやすくなります。
3. 基本的な使い方
以下は、addAttributeメソッドを使ってデータを追加し、それをビューに渡す例です。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AddAttributeExampleController {
@GetMapping("/add-attribute")
public String addAttributeExample(Model model) {
model.addAttribute("title", "SpringのaddAttributeメソッド");
model.addAttribute("message", "このデータはaddAttributeを使って渡されました。");
return "exampleView";
}
}
この例では、addAttributeメソッドを使って2つのデータ(titleとmessage)をModelに追加しています。このデータはビューで使用できます。
Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。
Spring Framework超入門をAmazonで見る※ Amazon広告リンク
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>
これにより、コントローラーで設定したデータがブラウザに表示されます。
5. 動的なデータの追加
addAttributeメソッドを使えば、条件によってデータを動的に追加することも可能です。以下はその例です:
@GetMapping("/dynamic-add")
public String dynamicAddExample(Model model, boolean isAdmin) {
if (isAdmin) {
model.addAttribute("userRole", "管理者");
} else {
model.addAttribute("userRole", "一般ユーザー");
}
return "dynamicView";
}
この例では、管理者と一般ユーザーで異なるデータをModelに追加しています。
6. よくある疑問を解決
Q: addAttributeメソッドで追加したデータが表示されないのはなぜですか?
A: キー名のミスや、ビューでの変数参照方法が間違っている可能性があります。キー名が一致しているか確認してください。
Q: Modelに追加するデータに制限はありますか?
A: 制限はありません。文字列、リスト、オブジェクトなど、さまざまなデータ型を追加できます。
Q: 動的にデータを追加する場合、何に注意すべきですか?
A: 条件分岐によってデータが期待通りに追加されるよう、ロジックを明確に記述することが重要です。
7. Model・ModelMap・ModelAndViewの違いと選び方
同じ「ビューに値を渡す」でも、Model(インターフェース)、ModelMap(Mapベースの実装)、ModelAndView(ビュー名とモデルを一緒に持つ)で使い分けができます。コントローラーメソッドの引数に渡すなら基本はModel、Map操作に慣れている場合はModelMap、処理の途中でビューを切り替えたいときはModelAndViewがわかりやすいです。
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 ModelKindsController {
@GetMapping("/with-model")
public String withModel(Model model) {
model.addAttribute("msg", "Modelで値を追加");
return "sampleView";
}
@GetMapping("/with-modelmap")
public String withModelMap(ModelMap modelMap) {
modelMap.addAttribute("msg", "ModelMapで値を追加");
modelMap.put("count", 3);
return "sampleView";
}
@GetMapping("/with-mav")
public ModelAndView withModelAndView() {
ModelAndView mav = new ModelAndView("sampleView");
mav.addObject("msg", "ModelAndViewで値とビューを同時に設定");
return mav;
}
}
- 迷ったらModel:最も一般的で、テスト・保守もしやすい
- Map操作重視ならModelMap:
putなどMap APIが使える - ビュー名を明示したいならModelAndView:転送先をコードで切り替えたいケースに便利
8. @ModelAttributeとフォーム入力の受け渡し(BindingResultと一緒に)
フォームの値をビュー⇄コントローラーで安全にやり取りするなら、コマンドオブジェクトと@ModelAttributeが便利です。検証結果はBindingResultで受け取り、エラー時は同じビューに戻してメッセージを表示します。必要に応じてaddAttributeで補助情報(セレクトボックス用のリスト等)も渡します。
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.BindingResult;
@Controller
@RequestMapping("/users")
public class UserFormController {
public static class UserForm {
@NotBlank(message = "ユーザー名は必須です")
private String username;
// getter / setter 省略
public String getUsername(){ return username; }
public void setUsername(String username){ this.username = username; }
}
@GetMapping("/new")
public String showForm(@ModelAttribute("userForm") UserForm form, Model model) {
model.addAttribute("title", "ユーザー登録フォーム");
return "user/form";
}
@PostMapping
public String submit(@Valid @ModelAttribute("userForm") UserForm form,
BindingResult binding, Model model) {
if (binding.hasErrors()) {
model.addAttribute("title", "入力エラーがあります");
return "user/form";
}
model.addAttribute("message", "登録が完了しました");
return "user/complete";
}
}
@ModelAttribute("userForm"):ビュー側では${userForm.*}で参照BindingResult:直前の引数の検証結果を受け取り、エラー表示に活用addAttribute:タイトルや選択肢など補助データを一緒に渡す
9. リダイレクト時のデータ受け渡し(RedirectAttributesとFlash属性)
POST後にredirect:/...する場合、通常のaddAttributeはクエリパラメータ化されます。一時的な通知メッセージなどは、セッションをまたいで1回だけ有効な「フラッシュ属性」を使うと安全です。
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 saveSomething(RedirectAttributes ra) {
// URLに出してよい値は addAttribute(= クエリ文字列になる)
ra.addAttribute("result", "ok");
// 一度だけ表示したい通知は addFlashAttribute(= セッション一時領域)
ra.addFlashAttribute("flashMessage", "保存に成功しました");
return "redirect:/list";
}
}
- addAttribute:URLに露出して良い値(ページング条件など)
- addFlashAttribute:成功・失敗メッセージなど一時的な通知に最適
- ビュー側:
${flashMessage}で1回だけ表示される
まとめ
SpringのModelクラスとaddAttributeメソッドは、コントローラーからビューにデータを渡すための基本的なツールです。addAttributeメソッドを活用することで、データの管理が簡単になり、ビューでの表示がスムーズに行えるようになります。
特に、動的にデータを追加する方法や、条件によってデータを変更する実装は、Webアプリケーション開発において非常に重要です。また、キー名を一貫して使用することで、保守性やデバッグのしやすさも向上します。
例えば、以下のように追加データをカスタマイズすることで、柔軟なビューの表示が可能です。
@GetMapping("/summary-example")
public String summaryExample(Model model) {
model.addAttribute("pageTitle", "Springまとめ");
model.addAttribute("description", "SpringのModelクラスとaddAttributeメソッドの活用方法を学びましょう。");
model.addAttribute("nextSteps", "次は、SpringのModelMapクラスを理解してみてください!");
return "summaryView";
}
このように、addAttributeメソッドを使えば、動的なデータ追加が簡単に行えます。次に学ぶべきステップとして、ModelMapやModelAndViewの使い方を習得することで、Springのデータ管理スキルをさらに向上させることができます。
生徒
「今日はSpringのaddAttributeメソッドについてたくさん学びました!」
先生
「そうですね。このメソッドは、データをビューに渡す基本的な方法として非常に役立ちます。」
生徒
「動的なデータ追加もできるので、いろいろな場面で使えそうです!」
先生
「その通りです。条件分岐によるデータ管理やビューでの表示方法を工夫することで、ユーザー体験を向上させられますよ。」
生徒
「次は、ModelMapについて学んでみたいです!」
先生
「いいですね。ModelMapは、さらに柔軟なデータ管理が可能になるクラスです。次回も一緒に頑張りましょう!」