В Spring MVC есть очень полезная аннотация - @ModelAttribute. Благодаря использованию этой аннотации можно существенно уменьшить код контроллера и облегчить его понимания, а заодно и улучшить его. :)
Аннотацию @ModelAttribute можно использовать как с методами, так и с параметрами методов. Если аннотация @ModelAttribute используется с методом, то возвращаемое методом значение автоматически помещается в модель. Рассмотрим простейший пример:
@ModelAttribute
public Person addPerson(@PathVariable String name) {
return new Person(name);
}
В даном случае создается объект типа Person, который помещается в модель. Имя этого объекта в модели совпадает с названием класса объекта, который добавляется если явно не указано имя атрибута модели. То есть, теперь в jsp-файлах можно обращаться к новосозданному объекту как:
${person.name}
Для облегчения понимания кода представим исходник класса Person:
package com.seostella.spring.domain;
public class Person {
private String name;
public Person(String name) {
super();
this.name = name;
}
public String getGreeting(){
return "Hi " + name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
В примере использовался простейший метод получения объекта путём его создания. Так же возможно получения объекта и другими способами. Например, из базы или из файловой системы.
Плюс в данном подходе в том, что нет необходимости в контроллере извлекать объект по параметрам запроса (или другим свойствам). Каждый объект инициализируется в отдельном методе, что облегчает чтение кода и поиск возможных ошибок.
Чтобы явно указать название атрибута, необходимо воспользоваться свойством value аннотации @ModelAttribute:
@ModelAttribute(value = "personGagarin")
public Person addGagarinPerson() {
return new Person("Gagarin");
}
В модель добавится атрибут personGagarin, к которому можно будет обратиться следующим способом:
${personGagarin.name}
Чтобы добавить несколько атрибутов в модель, используя один метод, воспользуйтесь аннотацией @ModelAttribute с методом, который не возвращает значения. Например:
@ModelAttribute
public void populateModel(Model model) {
model.addAttribute( new Sheldon() );
model.addAttribute( "personLeonard", new Person("Leonard") );
}
Как и в предыдущем случае с добавлением одного атрибута в модель, если не указывать имя атрибута, то он добавляется по имени класса. То есть, объект Sheldon добавится в модель под именем sheldon. Также можно явно указывать имя атрибута, как сделано в случае personLeonard.
Листинг класса Sheldon:
package com.seostella.spring.domain;
public class Sheldon extends Person{
public Sheldon() {
super("Sheldon");
}
}
Если Вам необходимо воспользоваться атрибутом модели (например, изменить его), то используйте аннотацию @ModelAttribute в качестве аргумента метода. Например:
@RequestMapping(value = "/mod", method = RequestMethod.GET)
public ModelAndView showModifiedPerson(@ModelAttribute Person person) {
person.setName( person.getName() + " (modified using @ModelAttribute method attribute)" );
ModelAndView modelAndView = new ModelAndView("person");
return modelAndView;
}
Вышеприведенным кодом мы изменим значение атрибута person, добавив в конец его имени фразу " (modified using @ModelAttribute method attribute)".
Если необходимо явно указать название атрибута, измените объявление метода следующим образом, добавив к аннотации @ModelAttribute параметр "person":
public ModelAndView showModifiedPerson(@ModelAttribute("person") Person person) {
// ...
}
Скачать проект с примерами из статьи можно по следующей ссылке - Скачать spring-modelattribute.zip
28 ноября 2019 г. 15:53
|
Найкраща стаття по @ModelAttribute, яку я бачив! Максимально коротко та зрозуміло.
|