Spring MVCとは?
Spring MVCは、JavaでWebアプリケーションを開発するための軽量フレームワークです。MVCアーキテクチャに基づき、コントローラー、ビュー、モデルを分離して開発できます。アノテーションベースの設定により、直感的で保守性の高いコードを記述できます。
コントローラーの基本
@Controllerでクラスを定義し、@RequestMappingでURLパスをマッピング
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping
public String list(Model model) {
model.addAttribute("users", userService.findAll());
return "users/list"; // View名
}
@GetMapping("/{id}")
public String show(@PathVariable Long id, Model model) {
model.addAttribute("user", userService.findById(id));
return "users/show";
}
}
● @Controller: コントローラークラスであることを宣言
● @GetMapping: GETリクエストをマッピング
● Model: ビューにデータを渡すためのオブジェクト
RESTコントローラー
JSON/XMLレスポンスを返すAPI用コントローラー
@RestController
@RequestMapping("/api/users")
public class UserRestController {
@Autowired
private UserService userService;
@GetMapping
public List getAllUsers() {
return userService.findAll();
}
@GetMapping("/{id}")
public ResponseEntity getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
}
● @RestController = @Controller + @ResponseBody
● ResponseEntity: HTTPステータスやヘッダーを制御
リクエストパラメータ
// クエリパラメータ: /search?keyword=spring
@GetMapping("/search")
public String search(@RequestParam String keyword, Model model) {
model.addAttribute("results", userService.search(keyword));
return "users/search";
}
// オプショナルパラメータ
@GetMapping("/list")
public String list(
@RequestParam(required = false, defaultValue = "1") int page,
Model model) {
model.addAttribute("users", userService.findByPage(page));
return "users/list";
}
必須パラメータ
@RequestParam String name
オプション
required = false
パスパラメータ
// 単一パラメータ: /users/123
@GetMapping("/{id}")
public String show(@PathVariable Long id, Model model) {
model.addAttribute("user", userService.findById(id));
return "users/show";
}
// 複数パラメータ: /posts/2024/03/article-title
@GetMapping("/{year}/{month}/{slug}")
public String showPost(
@PathVariable int year,
@PathVariable int month,
@PathVariable String slug,
Model model) {
model.addAttribute("post", postService.find(year, month, slug));
return "posts/show";
}
● URLパスの一部を変数として取得
● 変数名とパラメータ名は一致させる必要あり
CRUD操作(REST API)
作成(POST)
@PostMapping
public ResponseEntity create(
@RequestBody User user) {
User saved = userService.save(user);
return ResponseEntity
.status(HttpStatus.CREATED)
.body(saved);
}
取得(GET)
@GetMapping("/{id}")
public ResponseEntity get(
@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
更新(PUT)
@PutMapping("/{id}")
public ResponseEntity update(
@PathVariable Long id,
@RequestBody User user) {
User updated = userService.update(id, user);
return ResponseEntity.ok(updated);
}
削除(DELETE)
@DeleteMapping("/{id}")
public ResponseEntity delete(
@PathVariable Long id) {
userService.deleteById(id);
return ResponseEntity
.noContent()
.build();
}
バリデーション
エンティティクラス
public class User {
@NotBlank(message = "名前は必須です")
@Size(min = 2, max = 50)
private String name;
@Email(message = "有効なメールアドレスを入力してください")
private String email;
@Min(value = 18, message = "18歳以上である必要があります")
private Integer age;
}
コントローラーでのバリデーション
@PostMapping
public String create(
@Valid @ModelAttribute User user,
BindingResult result) {
if (result.hasErrors()) {
return "users/form"; // エラー時はフォーム再表示
}
userService.save(user);
return "redirect:/users";
}
@NotNull
null不可
@NotBlank
空文字不可
@Size
文字数制限
メール形式
実務で役立つTips
例外ハンドリング
@ExceptionHandlerや@ControllerAdviceで集約的にエラー処理を実装
インターセプター
HandlerInterceptorでリクエスト前後の共通処理を実装(認証など)
プロパティ注入
@Valueでapplication.propertiesの値を注入可能
レイヤー分離
Controller → Service → Repositoryの3層構造を保つ
Spring MVC リクエスト処理フロー
リクエストはDispatcherServletで受信され、適切なコントローラーにルーティングされます
よく使うアノテーション
@RequestMapping系
@GetMapping - GET
@PostMapping - POST
@PutMapping - PUT
@DeleteMapping - DELETE
パラメータ系
@PathVariable - URLパス
@RequestParam - クエリ
@RequestBody - JSON/XML
@ModelAttribute - フォーム
その他
@Autowired - DI注入
@Valid - バリデーション
@SessionAttributes - セッション
@CrossOrigin - CORS設定