■やりたいこと
ModelAndView, Model, ModelMapの違いについて知りたい。
■各オブジェクトについて
ModelMap
・LinkedHashMapである。
ModelAndView
・ViewとModelを両方追加できる。
・addObjectをすると内部で保持するModelMapに追加される。
・addAttribute
ExtendedModelMap (Model)
・Modelインターフェースを実現している。
・ModelMapを継承している。
・ハンドラの引数はこれをさらに継承した「BindingAwareModelMap」である。
■構造
BindingAwareModelMap
┗ ExtendedModelMap
┗ModelMap, Mode
ModelAndView
┗ModelMap
①インプット情報(Form)が「model」にセットされるのか。
②チェック結果情報(BindingResult)が「model」にセットされるのか。
@PostMapping("entry1")
public String entry1(Model model, @Validated TestForm form, BindingResult result) {
return "output";
}
@PostMapping("entry2")
public String entry2(ModelMap model, @Validated TestForm form, BindingResult result) {
return "output";
}
@PostMapping("entry3")
public String entry3(ModelAndView model, @Validated TestForm form, BindingResult result) {
return "output";
}
①,②の結果
Model : される。
ModelMap : される。
ModelAndView : されない(ModelMapがNull)。
③@ModelAttributeのオブジェクトは「model」にセットされるのか。
@ModelAttribute
public EchoForm getForm() {
return new EchoForm();
}
@GetMapping("show1")
public String show1(Model model) {
return "input";
}
@GetMapping("show2")
public String show2(ModelMap model) {
return "input";
}
@GetMapping("show3")
public String show3(ModelAndView model) {
return "input";
}
③の結果
Model : される。
ModelMap : される。
ModelAndView : されない。(ModelMapがNULL)
④セッション情報はModelにセットされるのか。
(SessionBeanをDIした場合)
これについては勘違いしていた。
@ModelAttributeを使用する場合はModelにセッション情報をセットする必要があったが、
@SessionScopeの場合、それは必要なく、直接
コントローラクラスのフィールドにDIされたオブジェクトを操作すればよいのだ。
よってセッションBeanはModelには設定されない。
■まとめ
・ModelAndView - Modelのデータを保持する。
・Model - Modelのふるまいを定義する。
・ModelMap - Modelのデータ自身である。
⇒ 細かいことを抜きにすれば、いずれもデータは「ModelMap」型で保持している。