Метод Spring MVC @ModelAttribute
-
20-12-2019 - |
Вопрос
Вопрос о Spring MVC
@ModelAttribute
методы, Установка атрибутов модели в контроллере @RequestMapping
Метод стихов устанавливает атрибут индивидуально с помощью @ModelAttribute
методы, какой из них считается лучшим и чаще используется?
С точки зрения дизайна, какой подход считается лучшим из следующих:
Подход 1
@ModelAttribute("message")
public String addMessage(@PathVariable("userName") String userName, ModelMap model) {
LOGGER.info("addMessage - " + userName);
return "Spring 3 MVC Hello World - " + userName;
}
@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {
LOGGER.info("printWelcome - " + userName);
return "hello";
}
Подход 2
@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {
LOGGER.info("printWelcome - " + userName);
model.addAttribute("message", "Spring 3 MVC Hello World - " + userName);
return "hello";
}
Решение
Один не лучше другого.Они оба служат другой цели.
- Метод: Если вам нужно, чтобы модель для конкретного контроллера всегда была заполнена определенными атрибутами, уровень метода
@ModelAttribute
имеет больше смысла. - Параметр: Используйте его для параметра, если вы хотите связать данные из запроса и неявно добавить их в модель.
Чтобы ответить на ваш вопрос о лучшем подходе
Я бы сказал, что подход 2 лучше, поскольку данные специфичны для этого обработчика.
Другие советы
А @ModelAttribute annotation
служит двум целям в зависимости от того, как он используется:
На уровне метода
Использовать @ModelAttribute
на уровне метода для предоставления справочных данных для модели.Аннотированные методы @ModelAttribute выполняются до выбранного @RequestMapping
аннотированный метод-обработчик.Они эффективно предварительно заполняют неявную модель определенными атрибутами, часто загружаемыми из базы данных.К такому атрибуту уже можно получить доступ через @ModelAttribute
аннотированные параметры метода-обработчика в выбранном методе-обработчике, возможно, с примененной к нему привязкой и проверкой.
Другими словами;метод, помеченный с помощью @ModelAttribute
заполнит указанный «ключ» в модели.Это происходит ДО @RequestMapping
На уровне параметра метода
На уровне параметра метода
Когда вы размещаете @ModelAttribute
по параметру метода, @ModelAttribute
сопоставляет атрибут модели с конкретным аннотированным параметром метода.Таким образом контроллер получает ссылку на объект, содержащий данные, введенные в форму.
Примеры
Уровень метода
@Controller
public class MyController {
@ModelAttribute("productsList")
public Collection<Product> populateProducts() {
return this.productsService.getProducts();
}
}
Итак, в приведенном выше примере: «productsList
» в модели заполняется до @RequestMapping
выполняется.
Уровень параметра метода
@Controller
public class MyController {
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("product") Product myProduct, BindingResult result, SessionStatus status) {
new ProductValidator().validate(myProduct, result);
if (result.hasErrors()) {
return "productForm";
}
else {
this.productsService.saveProduct(myProduct);
status.setComplete();
return "productSaved";
}
}
}
Смотреть здесь подробную информацию с примерами.