Spring MVC и анотацията @ModelAttribute

1. Общ преглед

Една от най-важните анотации на Spring-MVC е анотацията @ModelAttribute.

В @ModelAttribute е пояснение, което се свързва параметър на метод или метод за връщане на стойност до назован модел атрибут и след това го излага на уеб изглед.

В следващия пример ще демонстрираме използваемостта и функционалността на анотацията чрез обща концепция: формуляр, изпратен от служител на компанията.

2. @ModelAttribute в дълбочина

Както разкри уводният параграф, @ModelAttribute може да се използва или като параметър на метод, или на ниво метод.

2.1 На ниво метод

Когато анотацията се използва на ниво метод, тя показва, че целта на този метод е да добави един или повече атрибути на модел. Такива методи поддържат същите типове аргументи като методите @RequestMapping, но те не могат да бъдат директно съпоставени с заявки.

Нека да разгледаме един бърз пример тук, за да започнем да разбираме как работи това:

@ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "Welcome to the Netherlands!"); } 

В примера показваме метод, който добавя атрибут с име msg към всички модели , дефинирани в класа на контролера.

Разбира се, ще видим това в действие по-късно в статията.

По принцип Spring-MVC винаги ще извика първо този метод, преди да извика каквито и да било методи за обработка на заявки. Това означава, че методите @ModelAttribute се извикват преди да се извикат методите на контролера, анотирани с @RequestMapping . Логиката зад последователността е, че обектът на модела трябва да бъде създаден преди каквато и да е обработка да започне в методите на контролера.

Също така е важно да коментирате съответния клас като @ControllerAdvice. По този начин можете да добавите стойности в Model, които ще бъдат идентифицирани като глобални. Това всъщност означава, че за всяка заявка съществува стойност по подразбиране за всеки метод в частта за отговор.

2.2 Като аргумент на метода

Когато се използва като аргумент на метод, това означава, че аргументът трябва да бъде извлечен от модела. Когато не присъства, трябва първо да бъде създаден екземпляр и след това добавен към модела и след като присъства в модела, полетата с аргументи трябва да се попълват от всички параметри на заявката, които имат съвпадащи имена.

В кодовия фрагмент, който следва атрибута на модел на служител , се попълва с данни от формуляр, изпратен до крайната точка addEfficiee . Spring MVC прави това зад кулисите, преди да извика метода за изпращане:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@ModelAttribute("employee") Employee employee) { // Code that uses the employee object return "employeeView"; }

По-късно в тази статия ще видите пълен пример за това как да се използва служител обекта, за да се пренесат на employeeView шаблона.

И така, той свързва данните на формуляра с боб. Контролерът, анотиран с @RequestMapping, може да има аргументи за потребителски клас, анотирани с @ModelAttribute .

Това е това, което е известно като свързване на данни в Spring-MVC, общ механизъм, който ви спестява да се налага да анализирате всяко поле на формуляра поотделно.

3. Пример за формуляр

В този раздел ще предоставим примера, посочен в раздела за общ преглед: много основна форма, която подканва потребителя (служител на компания, в нашия конкретен пример), да въведе някаква лична информация (конкретно име и идентификационен номер). След като подаването приключи и без никакви грешки, потребителят очаква да види предварително изпратените данни, показани на друг екран.

3.1 Изгледът

Нека първо създадем проста форма с полета за идентификатор и име:

 Name  Id    

3.2 Контролерът

Ето класа на контролера, където се прилага логиката за гореспоменатия изглед:

@Controller @ControllerAdvice public class EmployeeController { private Map employeeMap = new HashMap(); @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit( @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("id", employee.getId()); employeeMap.put(employee.getId(), employee); return "employeeView"; } @ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "Welcome to the Netherlands!"); } }

В метода submit () имаме обект на служител, обвързан с нашия изглед . Можете ли да видите силата на тази анотация? Можете да прикачите полетата на формуляра си към обектния модел толкова просто. В метода извличаме стойности от формуляра и ги задаваме на ModelMap .

В крайна сметка връщаме workerView , което означава, че съответният JSP файл ще бъде извикан като представител на View .

Furthermore, there is also an addAttributes() method. Its purpose is to add values in the Model which will be identified globally. That is, a default value will be returned as a response for every request to every controller method. We also have to annotate the specific class as @ControllerAdvice.

3.3 The Model

As mentioned before, the Model object is very simplistic and contains all that is required by the “front-end” attributes. Now, let's have a look at an example:

@XmlRootElement public class Employee { private long id; private String name; public Employee(long id, String name) { this.id = id; this.name = name; } // standard getters and setters removed }

3.4 Wrap Up

The @ControllerAdvice assists a controller and in particular, @ModelAttribute methods that apply to all @RequestMapping methods. Of course, our addAttributes() method will be the very first to run, prior to the rest of the @RequestMapping methods.

Keeping that in mind and after both of submit() and addAttributes() are run, we could just refer to them in the View returned from the Controller class, by mentioning their given name inside a dollarized curly-braces duo, like for example ${name}.

3.5 Results View

Let's now print what we received from the form:

${msg}

Name : ${name} ID : ${id}

4. Conclusion

В този урок проучихме използването на анотацията @ModelAttribute както за аргументи на методите , така и за случаи на използване на ниво метод .

Изпълнението на този прост урок може да бъде намерено в проекта github.