| この記事の要点 |
|---|
|
Model(推奨)
メソッドの引数で Model を受け取り、属性を追加。戻り値は View 名(String):
@Controller
public class UserController {
@GetMapping("/users")
public String list(Model model) {
List<User> users = userService.findAll();
model.addAttribute("users", users);
model.addAttribute("title", "ユーザー一覧");
return "users/list"; // ← View 名 (例: users/list.jsp)
}
@GetMapping("/users/{id}")
public String show(@PathVariable Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "users/detail";
}
}
JSP / Thymeleaf 側
<!-- JSP -->
<h1>${title}</h1>
<ul>
<c:forEach var="user" items="${users}">
<li>${user.name}</li>
</c:forEach>
</ul>
<!-- Thymeleaf -->
<h1 th:text="${title}">タイトル</h1>
<ul>
<li th:each="user : ${users}" th:text="${user.name}">名前</li>
</ul>
ModelAndView
モデルと View を 1 つのオブジェクトに包んで返す:
@Controller
public class UserController {
@GetMapping("/users")
public ModelAndView list() {
ModelAndView mav = new ModelAndView("users/list");
mav.addObject("users", userService.findAll());
mav.addObject("title", "ユーザー一覧");
return mav;
}
@GetMapping("/users/{id}")
public ModelAndView show(@PathVariable Long id) {
ModelAndView mav = new ModelAndView();
mav.setViewName("users/detail");
mav.addObject("user", userService.findById(id));
return mav;
}
}
比較
| 項目 | Model | ModelAndView |
|---|---|---|
| View 名 | 戻り値の String | オブジェクトに含む |
| 属性追加 | model.addAttribute(...) | mav.addObject(...) |
| 記述量 | 少ない | 多い |
| 条件で View 変更 | String を分岐 | setViewName(...) |
| Spring 推奨度 | 推奨 | 後方互換用 |
条件分岐の場合の書き方比較
// Model 版
@GetMapping("/users/{id}")
public String show(@PathVariable Long id, Model model) {
Optional<User> user = userService.findByIdOptional(id);
if (user.isPresent()) {
model.addAttribute("user", user.get());
return "users/detail";
} else {
model.addAttribute("error", "User not found");
return "errors/404";
}
}
// ModelAndView 版
@GetMapping("/users/{id}")
public ModelAndView show(@PathVariable Long id) {
Optional<User> user = userService.findByIdOptional(id);
ModelAndView mav = new ModelAndView();
if (user.isPresent()) {
mav.setViewName("users/detail");
mav.addObject("user", user.get());
} else {
mav.setViewName("errors/404");
mav.addObject("error", "User not found");
}
return mav;
}
@ModelAttribute の併用
共通のモデル属性を定義したい場合:
@Controller
public class UserController {
// すべてのメソッドのモデルに追加される
@ModelAttribute("currentUser")
public User currentUser(HttpSession session) {
return (User) session.getAttribute("user");
}
@ModelAttribute("appName")
public String appName() {
return "My App";
}
@GetMapping("/profile")
public String profile(Model model) {
// currentUser, appName はすでにモデルに追加されている
return "profile";
}
}
RedirectAttributes(リダイレクト時)
@PostMapping("/users")
public String create(@ModelAttribute User user, RedirectAttributes redirectAttributes) {
userService.create(user);
redirectAttributes.addFlashAttribute("message", "登録しました");
return "redirect:/users";
// → /users にリダイレクト、Flash 属性は次のリクエストで利用可能
}
@GetMapping("/users")
public String list(Model model, @ModelAttribute("message") String message) {
// リダイレクト後の最初の表示で message が利用可能
return "users/list";
}
@RestController なら両方不要
// View を返さず JSON を返す場合
@RestController
@RequestMapping("/api/users")
public class UserApiController {
@GetMapping
public List<User> list() {
return userService.findAll();
// ← Jackson が自動で JSON 化
}
}
Map で簡略化
// 簡単なケースなら Map を直接返す
@GetMapping("/users/{id}")
public String show(@PathVariable Long id, Map<String, Object> model) {
model.put("user", userService.findById(id));
return "users/detail";
}
// または Model に対して直接 put しているのと同等
使い分けのまとめ
- 新規開発:
Model + Stringを使う - 条件で View 名が大きく変わる: ModelAndView も読みやすい場合あり
- JSON API:
@RestControllerでオブジェクト直接返却 - レガシーコード: ModelAndView をそのまま保守
関連記事
子ページ
子ページはありません
同階層のページ
- インストール(eclipseプラグイン)
- クイックスタート
- プロジェクトの作成
- Spring Bootプロジェクトの作成
- Spring Bootプロジェクトの実行
- Spring BootでHello World!
- アノテーション一覧
- DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
- DB接続設定や値の取得(JdbcTemplate編)
- ビューから値をモデルに格納しコントローラーで受け取る方法
- コントローラーにてモデルに値を格納してビューに渡す方法
- テンプレートエンジン
- ModelとModelAndViewの違い
- AOPの使用方法
- classpath: 内部ファイルの読み込み
- file: 外部ファイルの読み込み
- CSVファイルアップロード方法(Ajax)
- CSVファイルダウンロード方法(Ajax)
- Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
- Application.propertiesの環境依存設定の分割方法
- JPAにおけるEntityManagerの取得方法
- JPAにおけるjava.sql.Connectionの取得方法
- エラー一覧
- jarの引数を受け取る方法
- Spring BootでGmailからメール送信
- 複数のDBに接続する設定(Spring Boot & JPA編)
- ポート番号の変更
- Basic認証の実装と特定のURLに限定する方法
- Spring SecurityのBasic認証の無効化
- 独自のエラーページを定義する方法
- プロパティファイルの値やjar実行時の引数を取得する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09