Spring FrameworkのControllerの基本的なアノテーション


JavaのSpring FrameworkのMVCのControllerでよく使う基本的なアノテーション@RequestMappingや、@BindingResult、オブジェクトのModelなどを紹介します。


🐠 Controllerの処理対象のパスを指定:@RequestMapping

value属性

Java Spring MVCのControllerの処理対象となるURLを@RequestMappingアノテーションのvalueオプションで指定します。(valueは最初の/は省略できます)

// value で処理対象のパスを指定
@RequestMapping(value = "books")
// valueだけなら省略可能
@RequestMapping("books")
// 複数のパスを指定できる
@RequestMapping(value = { "books", "magazines" })

method属性

GETやPOSTなどのmethodオプションで指定します。

// methodでmethodを指定
@RequestMapping(value = "books", method = RequestMethod.GET)
// 複数のmethodを指定できる
@RequestMapping(value = "books", method = { RequestMethod.GET, RequestMethod.POST })

GET POST, PUT, PATCH, DELETE, HEAD, OPTIONS, TRACEを指定可能です。

🐯 GETリクエストのアノテーション:@GetMapping

@RequestMappingのGETリクエスト用のアノテーションが@GetMappingです。記述の省略と可読性の向上が目的です。

@GetMapping("books")
public index() { /* ...*/ }

🍣 POSTリクエストのアノテーション:@PostMapping

@RequestMappingのPOSTリクエスト用のアノテーションが@PostMappingです。記述の省略と可読性の向上が目的です。

@PostMapping("books/create")
public create() { /* ...*/ }

😀 RESTパラーメータの受取:@PathVaribable

@PathVaribable/books/1のようにREST形式のURLのパラメータ1を受け取るのに使います。value属性は省略でき、省略した場合は引数名をパラメータ名と解釈します。

@RequestMapping("/books/{id}")
public String show(@PathVaribable(default = 1) Integer id, ModelMap model) {
Book book = bookService.findById(id);
model.addAttribute("book", book);
return "index";
}

🐝 リクエストパラーメータの受取:@RequestParam

@RequestParam?order=priceのようにリクエストパラメータorderを受け取るのに使います。value属性は省略でき、省略した場合は引数名をパラメータ名と解釈します。

@RequestMapping("/books")
public String show(@PathVaribable(default = "updatedTime") String order, ModelMap model) {
List<Book> books = bookService.findAllOrderBy(order);
model.addAttribute("books", books);
return "index";
}

😼 コントローラからビューに値を渡す:ModelMap

コントローラからビューに値を渡すのに、メソッドの仮引数にModelMapを指定する方法があります。

@RequestMapping("/books")
public String sample2(ModelMap model) {
model.addAttribute("message", "こんにちは");
return "index";
}

ModelModelMapModelAndViewの簡単な説明です。

オプション 説明
Model ModelはインターフェースでaddAttributeメソッドなどをもつ
ModelMap ModelMapはMAPインターフェースの実装。Mapメソッドをもと
ModelAndView ModelMapとviewオブジェクトのコンテナ

😎 RequestMappingのアクション前に実行:@ModelAttribute

@ModelAttributeをメソッドにつけるとRequestMappingのアクションを実行する前にそのメソッドが呼び出されます。

@GetMapping(value = "create")
String create() {
// 2番目に実行
}
@ModelAttribute
SomeForm setupForm() {
// 1番目に実行
}

@ModelAttributeはアクションの引数に付与することもできます。その場合は自動的に同名のフィールドにマッピングされ、リクエストスコープにも設定されます。

😸 バリデーション結果を格納:@BindingResult

@BindingResultはメソッド引数として直前のフォームオブジェクトのバリデーション結果を格納します。@BindingResultはメソッドの引数の並び順をバリデーション対象の直後にすることが必須なので注意してください。

@PostMapping(value = "create", params = "confirm")
public String createConfirm(@Validated CommentForm form, BindingResult result, Model model) {
if (result.hasErrors()) {
return createRedo(form, model);
}
return VIEW_BASE + "createConfirm";
}

🚜 リダイレクト先にオブジェクトを送る:RedirectAttributes

RedirectAttributesはリダイレクト先にオブジェクトを送るのに使います。

@PostMapping(value = "create")
public String create(@Validated AbcForm form, BindingResult result, Model model, RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return createRedo(form, model);
}
// データの登録処理..
redirectAttributes.addFlashAttribute("message", "新規レコードを作成しました")
return "redirect:/articles";
}

RedirectAttributesaddFlashAttributeaddAttributeメソッドを紹介します。

メソッド 説明
addFlashAttribute sessionでオブジェクトを送付するため、リダイレクト時に一度だけ有効なデータの受け渡し方になります
addAttribute URLパラメータでオブジェクトを送付するため、その後何度でも有効な文字列となります

🐞 参考リンク

📚 おすすめの書籍