ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|---|
|
@Controller の基本
@Controller
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public String list(Model model) {
List<User> users = userService.findAll();
model.addAttribute("users", users);
return "users/list"; // ← View 名 (users/list.html or .jsp)
}
@GetMapping("/{id}")
public String show(@PathVariable Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "users/show";
}
@GetMapping("/create")
public String createForm(Model model) {
model.addAttribute("user", new UserCreateForm());
return "users/create";
}
@PostMapping
public String create(@ModelAttribute @Valid UserCreateForm form, BindingResult result) {
if (result.hasErrors()) {
return "users/create"; // バリデーション失敗
}
User user = userService.createUser(form.getName(), form.getEmail());
return "redirect:/users/" + user.getId();
}
}
@Controller vs @RestController
| 項目 | @Controller | @RestController |
|---|---|---|
| 用途 | HTML / JSP View 返却 | JSON / XML API |
| 戻り値 | View 名 (String) | POJO → JSON 自動変換 |
| @ResponseBody | 個別メソッドに付ける | クラス全体に暗黙適用 |
| 典型例 | サーバサイドレンダリング | SPA バックエンド / 外部 API |
View 名の解決
@GetMapping("/users/{id}")
public String show(@PathVariable Long id, Model model) {
model.addAttribute("user", userService.findById(id));
return "users/show";
// ↓ ViewResolver が以下を探す
// - templates/users/show.html (Thymeleaf)
// - WEB-INF/jsp/users/show.jsp (JSP)
// - 等
}
// プレフィックス
return "redirect:/users"; // → 302 redirect
return "forward:/api/internal"; // → 内部 forward (同 request)
return "users/show"; // → 通常 view 解決
Model / ModelAndView
// Model 引数で受け取る (推奨)
@GetMapping("/users/{id}")
public String show(@PathVariable Long id, Model model) {
model.addAttribute("user", userService.findById(id));
model.addAttribute("title", "ユーザー詳細");
return "users/show";
}
// ModelAndView 返却
@GetMapping("/users/{id}")
public ModelAndView showMav(@PathVariable Long id) {
ModelAndView mav = new ModelAndView("users/show");
mav.addObject("user", userService.findById(id));
return mav;
}
// Map 引数 (簡略形)
@GetMapping("/users/{id}")
public String showMap(@PathVariable Long id, Map<String, Object> model) {
model.put("user", userService.findById(id));
return "users/show";
}
フォーム受け取り
// フォーム DTO
public class UserCreateForm {
@NotBlank(message = "名前は必須です")
@Size(max = 100)
private String name;
@NotBlank
@Email
private String email;
// getter/setter
}
// 表示
@GetMapping("/users/create")
public String createForm(Model model) {
model.addAttribute("form", new UserCreateForm());
return "users/create";
}
// 受信 + バリデーション
@PostMapping("/users")
public String create(@ModelAttribute("form") @Valid UserCreateForm form,
BindingResult result,
RedirectAttributes redirect) {
if (result.hasErrors()) {
return "users/create"; // フォームに戻る (エラー表示)
}
User user = userService.createUser(form.getName(), form.getEmail());
redirect.addFlashAttribute("message", "ユーザーを作成しました");
return "redirect:/users/" + user.getId();
}
HTML テンプレート (Thymeleaf)
<!-- resources/templates/users/show.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:text="${title}">タイトル</title>
</head>
<body>
<h1 th:text="${user.name}">名前</h1>
<p th:text="${user.email}">メール</p>
<a th:href="@{/users/{id}/edit(id=${user.id})}">編集</a>
</body>
</html>
<!-- フォーム -->
<form th:action="@{/users}" th:object="${form}" method="post">
<input th:field="*{name}" type="text">
<span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
<input th:field="*{email}" type="email">
<span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span>
<button type="submit">登録</button>
</form>
例外ハンドリング
@Controller
public class UserController {
@ExceptionHandler(EntityNotFoundException.class)
public String handleNotFound(EntityNotFoundException ex, Model model) {
model.addAttribute("error", ex.getMessage());
return "errors/404";
}
@ExceptionHandler(BusinessException.class)
public String handleBusiness(BusinessException ex, RedirectAttributes redirect) {
redirect.addFlashAttribute("error", ex.getMessage());
return "redirect:/users";
}
}
// グローバル
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleAll(Exception ex, Model model) {
model.addAttribute("error", "システムエラー");
return "errors/500";
}
}
関連記事
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?