Spring Метод MVC @ModelAttribute
Вопрос о 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";
}
Ответы
Ответ 1
Один не лучше, чем другой. Они оба служат другой цели.
- Метод: Если вам нужна модель для того, чтобы конкретный контроллер всегда был заполнен определенными атрибутами, уровень метода
@ModelAttribute
имеет больше смысла.
- Параметр: Используйте его для параметра, если вы хотите связать данные с запросом и неявно добавить его в модель.
Чтобы ответить на ваш вопрос о лучшем подходе
Я бы сказал, что подход 2 лучше, поскольку данные специфичны для этого обработчика.
Ответ 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";
}
}
}
Посмотрите здесь для получения подробной информации с примерами.