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";
        }
    }
}

Посмотрите здесь для получения подробной информации с примерами.