Вам не нужно @ModelAttribute
( параметр ) только для того, чтобы использовать Бин в качестве параметра
Например, эти методы-обработчики прекрасно работают с этими запросами:
@RequestMapping("/a")
void pathA(SomeBean someBean) {
assertEquals("neil", someBean.getName());
}
GET /a?name=neil
@RequestMapping(value="/a", method=RequestMethod.POST)
void pathAPost(SomeBean someBean) {
assertEquals("neil", someBean.getName());
}
POST /a
name=neil
Используйте @ModelAttribute
( метод ) для загрузки данных по умолчанию в вашу модель при каждом запросе - например, из базы данных, особенно при использовании @SessionAttributes
.Это можно сделать в Controller
или ControllerAdvice
:
@Controller
@RequestMapping("/foos")
public class FooController {
@ModelAttribute("foo")
String getFoo() {
return "bar"; // set modelMap["foo"] = "bar" on every request
}
}
Любой JSP, перенаправленный на FooController
:
${foo} //=bar
или
@ControllerAdvice
public class MyGlobalData {
@ModelAttribute("foo")
String getFoo() {
return "bar"; // set modelMap["foo"] = "bar" on every request
}
}
Любой JSP:
${foo} //=bar
Используйте @ModelAttribute
( параметр ), если вы хотите использовать результат @ModelAttribute
( method ) в качестве по умолчанию :
@ModelAttribute("attrib1")
SomeBean getSomeBean() {
return new SomeBean("neil"); // set modelMap["attrib1"] = SomeBean("neil") on every request
}
@RequestMapping("/a")
void pathA(@ModelAttribute("attrib1") SomeBean someBean) {
assertEquals("neil", someBean.getName());
}
GET /a
Используйте @ModelAttribute
( параметр ), чтобы получить объект, сохраненный в атрибуте flash :
@RequestMapping("/a")
String pathA(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("attrib1", new SomeBean("from flash"));
return "redirect:/b";
}
@RequestMapping("/b")
void pathB(@ModelAttribute("attrib1") SomeBean someBean) {
assertEquals("from flash", someBean.getName());
}
GET /a
Используйте @ModelAttribute
( параметр ), чтобы получить объект, хранящийся в @SessionAttributes
@Controller
@SessionAttributes("attrib1")
public class Controller1 {
@RequestMapping("/a")
void pathA(Model model) {
model.addAttribute("attrib1", new SomeBean("neil")); //this ends up in session due to @SessionAttributes on controller
}
@RequestMapping("/b")
void pathB(@ModelAttribute("attrib1") SomeBean someBean) {
assertEquals("neil", someBean.getName());
}
}
GET /a
GET /b