@ModelAttribute и Spring MVC

апреля
24
2012

В 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

Комментарии (1)

shoomi
28 ноября 2019 г. 15:53
Найкраща стаття по @ModelAttribute, яку я бачив! Максимально коротко та зрозуміло.


Вы должны войти под своим аккаунтом чтобы оставлять комментарии