Рубрики
Без рубрики

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

Быстрая, практическая статья об аннотации @ModelAttribute в Spring MVC.

Автор оригинала: baeldung.

1. Обзор

Одним из наиболее важных Spring-MVC аннотаций является @ModelAttribute аннотация.

Атрибут @ModelAttribute – это аннотация, которая связывает параметр метода или возвращаемое значение метода с именованным атрибутом модели, а затем предоставляет его веб-представлению.

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

Дальнейшее чтение:

Модель, карта моделей и ModelAndView в Spring MVC

Аннотация Spring @RequestParam

2. Атрибут @ModelAttribute подробно

Как показано во вступительном абзаце, @ModelAttribute может использоваться либо в качестве параметра метода, либо на уровне метода.

2.1 На уровне метода

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

Давайте взглянем на краткий пример здесь, чтобы начать понимать, как это работает:

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

В этом примере мы показываем метод, который добавляет атрибут с именем msg ко всем model s, определенным в классе контроллера.

Конечно, мы увидим это в действии позже в статье.

В общем случае Spring-MVC всегда будет сначала вызывать этот метод, прежде чем вызывать какие-либо методы обработчика запросов. То есть, @ModelAttribute методы вызываются до того, как будут вызваны методы контроллера, аннотированные @RequestMapping . Логика последовательности заключается в том, что объект модели должен быть создан до того, как начнется какая-либо обработка внутри методов контроллера.

Также важно, чтобы вы аннотировали соответствующий класс как @ControllerAdvice . Таким образом, вы можете добавить значения в Model , которые будут определены как глобальные. Это фактически означает, что для каждого запроса существует значение по умолчанию для каждого метода в части ответа.

2.2 В качестве аргумента метода

При использовании в качестве аргумента метода он указывает, что аргумент должен быть извлечен из модели. Если его нет, он должен быть сначала создан, а затем добавлен в модель, и после того, как он присутствует в модели, поля аргументов должны быть заполнены из всех параметров запроса, имеющих совпадающие имена.

В следующем фрагменте кода атрибут employee model заполняется данными из формы, отправленной в конечную точку addEmployee . Spring MVC делает это за кулисами перед вызовом метода отправки:

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

    return "employeeView";
}

Позже в этой статье мы увидим полный пример того, как использовать объект employee для заполнения шаблона представления employee.

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

Это то, что обычно известно как привязка данных в Spring-MVC, общий механизм, который избавляет вас от необходимости анализировать каждое поле формы по отдельности.

3. Пример формы

В этом разделе мы приведем пример, упомянутый в разделе обзор: очень простая форма, которая предлагает пользователю (сотруднику компании, в нашем конкретном примере) ввести некоторую личную информацию (в частности, имя и идентификатор). После завершения отправки и без каких-либо ошибок пользователь ожидает увидеть ранее отправленные данные, отображенные на другом экране.

3.1 Представление

Давайте сначала создадим простую форму с полями id и name:


    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() у нас есть объект Employee , привязанный к нашему Представлению . Видите ли вы силу этой аннотации? Вы можете просто сопоставить поля формы с объектной моделью. В методе мы извлекаем значения из формы и устанавливаем их в Model Map .

В конце концов мы возвращаемся Сотрудник , что означает, что соответствующий файл JSP будет вызван как Смотреть представитель.

Кроме того, существует также метод addAttributes () . Его цель состоит в том, чтобы добавить значения в Модель , которые будут определены глобально. То есть значение по умолчанию будет возвращено в качестве ответа на каждый запрос к каждому методу контроллера. Мы также должны аннотировать конкретный класс как @ControllerAdvice .

3.3 Модель

Как упоминалось ранее, объект Model очень упрощен и содержит все, что требуется для атрибутов “front-end”. Теперь давайте рассмотрим пример:

@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 Подведение Итогов

@ControllerAdvice помогает контроллеру и, в частности, @ModelAttribute методам, которые применяются ко всем @RequestMapping методам. Конечно, наш метод addAttributes() будет запущен самым первым, до остальных методов @RequestMapping .

Имея это в виду и после запуска обоих submit() и add Attributes () , мы могли бы просто сослаться на них в Представлении , возвращенном из класса Controller , упомянув их имя внутри долларизованного дуэта фигурных скобок, например ${name} .

3.5 Просмотр результатов

Теперь давайте напечатаем то, что мы получили из формы:

${msg}

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

4. Заключение

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

Реализацию этого простого учебника можно найти в проекте github .