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

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

1. обзор

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

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

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

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

Model, ModelMap и Model View в Spring MVC

Узнайте об интерфейсахModel,ModelMap иModelView, предоставляемых Spring MVC.

Read more

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

Подробное руководство по аннотации Spring @RequestParam

Read more

2. @ModelAttribute в глубине

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

2.1 At the Method Level

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

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

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

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

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

В общем, Spring-MVC всегда будет сначала вызывать этот метод, прежде чем он вызовет какие-либо методы обработчика запросов. That is, @ModelAttribute methods are invoked before the controller methods annotated with @RequestMapping are invoked. Логика, лежащая в основе последовательности, заключается в том, что объект модели должен быть создан до начала любой обработки внутри методов контроллера.

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

2.2 As a Method Argument

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

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

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

    return "employeeView";
}

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

Таким образом, он связывает данные формы с бином. The controller annotated with @RequestMapping can have custom class argument(s) annotated with @ModelAttribute.с

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

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

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

3.1 The View

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


    Name
    

    Id
    

    

3.2 The Controller

Вот класс контроллера, где реализуется логика для вышеупомянутого представления:

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

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

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

3.3 The Model

Как упоминалось ранее, объектModel очень упрощен и содержит все, что требуется для «внешних» атрибутов. Теперь давайте посмотрим на пример:

@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

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

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

3.5 Results View

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

${msg}

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

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

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

Реализацию этого простого руководства можно найти в проектеgithub - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.