Начало работы с формами в Spring MVC

Начало работы с формами в Spring MVC

1. обзор

В этой статье мы обсудим формы Spring и привязку данных к контроллеру. Также мы рассмотрим одну из основных аннотаций вSpring MVC, т.е. @ModelAttribute.

Конечно, Spring MVC - сложная тема, в которой вам нужно понять множество вещей, чтобы использовать ее в полной мере, поэтомуdefinitely dig deeper into the framework here.

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

Изучение библиотеки тегов форм SpringMVC

Краткое и конкретное руководство о различных тегах, которые предоставляет Spring MVC, чтобы помочь нам создавать и проверять формы.

Read more

Введение в использование FreeMarker в Spring MVC

FreeMarker - это шаблонизатор на основе Java от Apache Software Foundation. В этом руководстве показано, как настроить FreeMarker для использования в Spring MVC.

Read more

Введение в использование Thymeleaf весной

Thymeleaf - это язык шаблонов с отличной интеграцией с Spring. Эта статья представляет собой введение в использование Thymeleaf в приложении Spring MVC.

Read more

2. Модель

Во-первых, давайте определимa simple entity, которые мы собираемся отобразить и привязать к форме:

public class Employee {
    private String name;
    private long id;
    private String contactNumber;

    // standard getters and setters
}

Это будет наш объект поддержки формы.

3. Вид

Далее - давайте определимthe actual form и, конечно же, HTML-файл, который его содержит. Мы собираемся использовать страницу, на которой создается / регистрируется новый сотрудник:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

    
    
    
        

Welcome, Enter The Employee Details

Name
Id
Contact Number

Во-первых, обратите внимание, что мы включаем библиотеку тегов на нашу страницу JSP - taglibform - чтобы помочь с определением нашей формы.

Далее - здесь важную роль играет тег<form:form>; он очень похож на обычный тег HTLM<form>, но атрибутmodelAttribute - это ключ, определяющий имя объекта модели, поддерживающего эту форму:

Это будет соответствовать@ModelAttribute позже в контроллере.

Далее - каждое поле ввода использует еще один полезный тег из библиотеки тегов Spring Form -form: prefix. Каждое из этих полей указываетa path attribute - это должно соответствовать получателю / установщику атрибута модели (в данном случае - классу Employee). Когда страница загружена, поля ввода заполняются Spring, который вызывает метод получения каждого поля, связанного с полем ввода. Когда форма отправляется, вызыватели вызывают для сохранения значений формы в объекте.

Наконец, когдаthe form is submitted, вызывается обработчик POST в контроллере, и форма автоматически связывается с аргументомemployee, который мы передали.

Basic Forms with Spring MVC

4. Контроллер

Теперь давайте посмотрим наthe Controller, который будет обрабатывать серверную часть:

@Controller
public class EmployeeController {

    @RequestMapping(value = "/employee", method = RequestMethod.GET)
    public ModelAndView showForm() {
        return new ModelAndView("employeeHome", "employee", new Employee());
    }

    @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    public String submit(@Valid @ModelAttribute("employee")Employee employee,
      BindingResult result, ModelMap model) {
        if (result.hasErrors()) {
            return "error";
        }
        model.addAttribute("name", employee.getName());
        model.addAttribute("contactNumber", employee.getContactNumber());
        model.addAttribute("id", employee.getId());
        return "employeeView";
    }
}

Контроллер определяет две простые операции: GET для отображения данных в форме и POST для операции создания через отправку формы.

Также обратите внимание, что если объект с именем «employee» не добавлен в модель, Spring будет жаловаться, когда мы пытаемся получить доступ к JSP, потому что JSP будет настроен для привязки формы к атрибуту модели «employee»:

java.lang.IllegalStateException:
  Neither BindingResult nor plain target object
    for bean name 'employee' available as request attribute
  at o.s.w.s.s.BindStatus.(BindStatus.java:141)

Чтобы получить доступ к нашему объекту поддержки формы, нам нужно внедрить его через аннотацию@ModelAttribute.

`+ @ ModelAttribute +` в аргументе метода указывает, что аргумент будет получен из модели. Если аргумент отсутствует в модели, сначала будет создан аргумент, а затем добавлен в модель.

5. Обработка ошибок привязки

По умолчанию Spring MVC генерирует исключение при возникновении ошибок во время привязки запроса. Обычно это не то, что мы хотим, вместо этого мы должны представлять эти ошибки пользователю. Мы собираемся использоватьBindingResult, добавив его в качестве аргумента к нашему методу контроллера:

public String submit(
  @Valid @ModelAttribute("employee") Employee employee,
  BindingResult result,
  ModelMap model)

АргументBindingResult необходимо разместить сразу после объекта поддержки формы - это один из редких случаев, когда порядок аргументов метода имеет значение. В противном случае мы столкнемся со следующим исключением:

java.lang.IllegalStateException:
  Errors/BindingResult argument declared without preceding model attribute.
    Check your handler method signature!

Теперь - исключение больше не генерируется; вместо этого ошибки [.brush: .java; .gutter: .true] # будет зарегистрирован вBindingResult, переданном методуsubmit. На этом этапе мы можем обрабатывать эти ошибки разными способами - например, операцию можно отменить: #

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@Valid @ModelAttribute("employee")Employee employee,
  BindingResult result,  ModelMap model) {
    if (result.hasErrors()) {
        return "error";
    }

    //Do Something
    return "employeeView";
}

Обратите внимание, как, если результат содержит ошибки, мы возвращаем пользователю другое представление, чтобы эти ошибки отображались правильно. Давайте посмотрим на это мнение -error.jsp:


    
    

    
        

Please enter the correct details

Retry

6. Отображение сотрудника

Наконец, помимо создания нового сотрудника, мы также можем просто отобразить его - вот код быстрого просмотра для этого:


    

Submitted Employee Information

Name : ${name}
ID : ${id}
Contact Number : ${contactNumber}

Страница JSP просто использует выражения EL для отображения значений свойств объекта Employee в модели.

7. Тестирование приложения

Простое приложение может быть развернуто - например, на сервере Tomcat - и доступно локально:

Это представление, содержащее основную форму - до операции отправки:

Spring MVC Form example - Submit

Пример формы Spring MVC - Отправить

После отправки отображаются данные:

Spring MVC Form example - View

Пример формы Spring MVC - Просмотр

Вот и все -a working example of a simple form with Spring MVC, with validation.

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

Наконец, как я уже говорил в начале статьи, вам следуетdefinitely dig deeper into Spring MVC.