Вопрос

Вопрос о 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";
        }
    }
}

Смотреть здесь подробную информацию с примерами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top