こんにちは!今回は、Spring Frameworkでよく使われるアノテーションの一つである @ModelAttribute
について、初心者向けにわかりやすく解説します。
@ModelAttributeとは?
@ModelAttribute
とは、
「リクエストパラメータをオブジェクトにマッピングし、ビューに渡すためのアノテーション」
です。
よくわからないので具体例を見ていきましょう。
通常のPostMappingの受け渡し
例えば、Webでユーザー情報をフォーム入力して、/submitのURLに送信するとします。
それを受け取る@PostMappingはこうなりますね。
result.htmlというビューを返しています。
@PostMapping("/submit")
public String submitForm(@RequestParam User user, Model model) {
model.addAttribute("user", user);
return "result";
}
ここで送られてきたUser型のデータをビュー(result.html)で使うときには、Modelという箱を用意して、その箱に送られてきたデータを載せなくてはいけません。
それでは、@ModelAttributeをつかうとどうなるか見ていきましょう。
@ModelAttributeを使った場合
同じくWebでユーザー情報をフォーム入力して、/submitのURLに送信すると、たったこれだけで同じ動作になります。
@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {
return "result";
}
自動的に送られてきたUser型のデータを箱に格納し、ビューに渡す機能まで兼ね備えているということです。
まとめてみましょう。
まとめると、、
- リクエストデータをオブジェクトにバインドする
フォームから送られてくるデータ(リクエストパラメータ)をオブジェクトに変換し、コントローラーで処理できるようにします。 - モデルにデータを追加する
コントローラーメソッドの引数に@ModelAttribute
を付けることで、オブジェクトをビューに渡すことができ、テンプレートエンジン(例:Thymeleaf, JSPなど)で利用可能になります。
@ModelAttributeの引数
@ModelAttribute
にも引数があります。
value属性
@ModelAttribute
の value
属性で、モデルに追加するオブジェクトの名前を指定できます。
@PostMapping("/register")
public String registerUser(@ModelAttribute("newUser") User user, Model model) {
model.addAttribute("user", user); // テンプレートでは "newUser" ではなく "user" として参照
return "userProfile";
}
この場合、テンプレートで参照するときは "newUser"
ではなく、model.addAttribute("user", user);
で追加された "user"
としてアクセスします。
@ModelAttributeの応用編
次に、@ModelAttribute
の少し高度な使い方を紹介します。
1. モデルにデフォルトデータを追加する
@ModelAttribute
は、メソッドの引数だけでなく、メソッドそのものにも使うことができます。これにより、テンプレートに渡すデータを事前に設定することが可能です。
@Controller
public class ProductController {
// 全てのリクエストに対して、カテゴリリストをモデルに追加
@ModelAttribute("categories")
public List<String> addCategories() {
return Arrays.asList("Electronics", "Books", "Clothing");
}
// 商品を表示するメソッド
@GetMapping("/products")
public String getProduct() {
return "productDetail";
}
}
この例では、@ModelAttribute("categories")
というメソッドを使って、productDetail.htmlというビューでカテゴリのリストを使うことができます。
2. バリデーションとの併用
@ModelAttribute
と併せてバリデーションを行うことも可能です。Springの @Valid
アノテーションを使用すれば、入力されたデータが正しいかどうかを自動的にチェックしてくれます。
@Controller
public class UserController {
// ユーザー登録フォームから送信されたデータをバリデート
@PostMapping("/register")
public String registerUser(@Valid @ModelAttribute User user, BindingResult result, Model model) {
if (result.hasErrors()) {
return "registrationForm"; // バリデーションエラーがあればフォームに戻す
}
userService.save(user); // エラーがなければ保存
model.addAttribute("user", user);
return "userProfile";
}
}
この場合、@Valid
アノテーションを付けることで、User
オブジェクトに対してバリデーションが行われます。もしバリデーションエラーが発生した場合、BindingResult
オブジェクトにそのエラーが格納され、処理を分岐させることができます。
おわりに
@ModelAttribute
を使うことで、リクエストデータを簡単にオブジェクトにマッピングでき、またテンプレートに渡すデータをコントローラーレベルで管理できます。今回は、基本的な使い方から応用例まで紹介しましたので、実際にコードを書いて試してみてください!
もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓