Spring MVC, работа с данными формы и их проверка.

Краткая информация

Spring предоставляет архитектуру модель-представление-контроллер (MVC) и компоненты, которые можно использовать для разработки гибких и слабосвязанных веб-приложений. Он использует функции основных функций Spring, таких как IoC и DI.

  • Модель инкапсулирует данные приложения и обычно состоит из объектов POJO.
  • Представление отвечает за отображение данных модели и, как правило, генерирует вывод HTML, который может интерпретировать браузер клиента.
  • Контроллер отвечает за обработку запросов пользователей, построение соответствующей модели и передает ее представлению для визуализации.

Рабочий процесс

Инфраструктура Spring Web MVC разработана на основе DispatcherServlet.

💡 Java Servlet - это программы, которые действуют как промежуточный уровень между запросом, поступающим из веб-браузера или клиента HTTP, и приложениями на сервере HTTP.

🔍 Что происходит за кулисами, когда HTTP-запрос отправляется на сервер

  • DispatcherServlet обрабатывает все HTTP-запросы и ответы.
  • После получения HTTP-запроса DispatcherServlet обращается к HandlerMapping, чтобы вызвать соответствующий Controller.
  • Контроллер принимает запрос, вызывает соответствующий метод, строит модель и возвращает имя страницы просмотра в DispatcherServlet.
  • Затем DispatcherServlet получит помощь от ViewResolver, чтобы выбрать определенную страницу просмотра для запроса.
  • После завершения представления DispatcherServlet передает данные модели в представление, которое, наконец, отображается в браузере.

💡 Все вышеупомянутые компоненты (например, HandlerMapping, Controller и ViewResolver) являются частями WebApplicationContext, который является расширением ApplicationContext с некоторыми дополнительными функциями, необходимыми для веб-приложений.

Компоненты приложения Spring MVC

  • Коллекция веб-страниц для размещения компонентов пользовательского интерфейса.
  • Коллекции Spring beans (контроллеры, службы и т. Д.).
  • конфигурации Spring (XML, аннотации или Java).

Настройка среды 💪

Во-первых, вам нужно создать новый Динамический веб-проект и добавить все файлы jar в папку WEB-INF / lib, которую мы добавили ранее, или использовать Maven (как обсуждалось ранее).

Кроме того, нам нужно будет добавить сервлет Java, JSP и JSTL. Если вы используете Maven, добавьте эти зависимости в свой файл «pom.xml».

  <!-- Servlet+JSP+JSTL -->
  <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
  </dependency>
  <dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>javax.servlet.jsp-api</artifactId>
     <version>2.3.1</version>
  </dependency>
 
  <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
      <version>1.2</version>
  </dependency>

Конфигурации

[1] Настройка диспетчерских сервлетов Spring MVC

Создайте XML-файл «WEB-INF / web.xml» для определения и настройки диспетчерских сервлетов Spring MVC.

Затем мы настраиваем сопоставление URL-адресов диспетчерских сервлетов, которые мы только что определили. Это означает, что все входящие запросы (поскольку шаблон URL-адреса ниже «/») должны обрабатываться диспетчером с именем «MyDispatcher».

[2] Настройка диспетчерского сервлета «MyDispatcher»

Теперь, когда вы делаете запрос, он будет привязан к определенному диспетчеру. Итак, Spring загрузит конфигурацию этого диспетчера из папки «WEB-INF». В данном случае наш файл - «WEB-INF / spring-mvc-demo-servlet.xml».

Мы можем добавить поддержку таких функций, как сканирование компонентов Spring, преобразование, форматирование, проверка, настроить Spring MVC View Resolver.

💡 «префикс» и «суффикс» будут использоваться для отображения страницы просмотра.

📣 Нам нужно создать папку «просмотр» внутри папки «WEB-INF».

📣 Я предполагаю, что вы создали пакет под названием com.springmvcdemo, в котором находятся все ваши классы Java. Имя пакета должно быть выровнено с «Шагом 3» выше.

- Как добавить CSS, JavaScript и изображения?

Любой статический ресурс обрабатывается как сопоставление URL-адресов в Spring MVC.

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

<!-- A handler for serving static resources -->
<mvc:resources mapping="/assets/**" location="/assets/" />

Двойная звездочка «**» означает также поиск подкаталога.

На ваших страницах просмотра мы можем получить доступ к статическим файлам, используя одно из следующих действий:

<link rel="stylesheet" type="text/css"  href="${pageContext.request.contextPath}/assets/css/main.css">

Or, …

<!-- Include the core JSTL tags (will be discussed later) -->
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<!-- ... -->
<link rel="stylesheet" type="text/css"  href="<c:url value="/assets/css/main.css" />">

Приложение Spring MVC

Теперь мы понимаем концепции и настроили наше приложение Spring MVC. Давайте посмотрим, как мы можем применить эти концепции в действии… 🏃

  • DispatcherServlet делегирует запрос соответствующему контроллеру для обработки запроса.
  • Аннотация @Controller указывает, что конкретный класс выполняет роль контроллера.
  • Аннотация @RequestMapping используется для сопоставления URL-адреса либо целому классу, либо конкретному методу контроллера.

[1] Создайте класс контроллера, используя аннотацию @Controller.

Аннотация @Controller наследуется от аннотации @Component. Итак, это специальный @Component, используемый в веб-приложении MVC, и поэтому он будет сканироваться Spring IoC как компонент.

Итак, теперь этот контроллер будет обрабатывать все запросы URL-адреса корневого пути нашего MyDispatcher, который мы создали.

[2] Определить и сопоставить методы контроллера

Мы можем передавать различные параметры, такие как запрос, сеанс, объекты модели, и возвращать различные типы объектов (как вы увидите позже) из метода контроллера.

Все сопоставления запросов по методам относятся к сопоставлению контроллеров.

Итак, теперь welcome()method будет обрабатывать корневой путь этого контроллера.

По умолчанию он обрабатывает все типы HTTP-запросов (GET, POST и т. Д.), Если они не определены явно (т.е. с использованием method в @RequestMapping).

[3] Добавление атрибута (данных) в модель

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

Эти данные называются атрибутом (ами) модели, они могут быть Java-компонентами, которые несут данные формы для привязки данных.

📣 Мы обсудим данные HTML-формы и привязку данных позже.

Итак, мы можем передать атрибут модели из метода контроллера на страницу просмотра, а затем со страницы просмотра обратно в метод контроллера (то есть при отправке формы).

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

[4] Возвращаемое значение метода контроллера

Мы можем вернуть имя страницы просмотра, объект или вообще ничего не возвращать.

В случае возврата имени страницы просмотра Spring загрузит страницу просмотра в следующем формате: prefix + view page name + suffix (определенном ранее в файле «spring-mvc-demo-servlet.xml») в визуализироваться и отображаться.

[5] Создайте страницы просмотра

В основном это страницы JSP (но у вас могут быть HTML, PDF, листы Excel, XML и т. Д.). На страницах JSP вы пишете свой HTML и используете повторно используемые компоненты пользовательского интерфейса (например, теги) в Spring.

В нашем случае нам нужно создать файл «welcome-page.jsp».

Страницы просмотра должны располагаться в том месте, которое мы определили ранее в файле «spring-mvc-demo-servlet.xml».

${message} - это атрибут, который мы присвоили в welcome() методе.

Тестирование нашего проекта

Чтобы протестировать проект, нажмите URL → http: // localhost: 8080 / [NameOfTheProject] /

Работа с данными HTML-формы

В этом примере раздела мы объясним, как работать с данными HTML-формы; прочитать представленные данные и отобразить результаты.

Прежде чем мы начнем, предположим, что у нас есть класс Java User, который действует как модель в нашем приложении MVC Spring. Итак, мы можем добавить нового пользователя и отобразить данные пользователя.

[1] Отобразить HTML-форму

Впервые мы отобразим пустую форму, верно ?. Итак, мы можем создать атрибут модели (скажем, с именем user) и назначить его пустому объекту пользователя.

Итак, изначально будет отображаться пустая форма для добавления нового пользователя.

[2] Настройте форму

В Spring у нас есть многоразовые компоненты пользовательского интерфейса, которые мы можем использовать для создания нашего HTML, такие как теги формы. Теги формы позволяют связывать данные; автоматически устанавливать и извлекать данные из java beans (атрибуты модели).

Все, что нам нужно сделать, это сослаться на стандартную библиотеку тегов (JSTL) на наших страницах JSP. Они разделены на 5 групп: Core, Formatting, SQL, XML и JSTL Functions.

🔍 За кадром…

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

[4] Чтение данных формы

- HttpServletRequest

Мы можем передать и использовать объект HttpServletRequest в методе контроллера, чтобы получить доступ ко всем параметрам запроса (например, запрос GET).

@RequestMapping("/user")
public String showUser(HttpServletRequest request){ 
  int id = Integer.parseInt(request.getParameter("id"));
  /*...*/
}

- Аннотация RequestParam

Мы также можем читать данные формы с помощью аннотации @RequestParam. Это другой способ чтения данных формы в параметрах запроса.

Здесь мы связываем переменную со значением, полученным из аннотации@RequestParam.

@RequestMapping("/user")
public String showUser(@RequestParam("id") int id) {/*...*/}

- Доступ к значениям параметров запроса на страницах просмотра

На страницах JSP доступен набор объектов, таких как request, response, param, paramValues ​​, cookie и т. д.

Объект param сопоставляет имя параметра запроса с одним значением, а paramValues ​​ сопоставляет имя параметра запроса с массивом значений.

<html>
 <head>
   <title>Spring MVC Demo</title>
 </head>
 <body>
   <h2>${param.id}</h2>
 </body>
</html>

- Аннотация RequestBody

Если данные передаются в теле запроса (например, запрос POST), тогда мы можем получить доступ к данным, используя вместо этого@RequestBody.

@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser(@RequestBody User user){/*...*/}

💡 Аналогично, метод контроллера with@ResponseBody annotation указывает, что возвращаемое значение должно быть привязано к телу веб-ответа.

- Аннотация атрибута модели

Когда форма отправлена ​​(скажем, для добавления нового пользователя), мы можем привязать объект пользователя к отправленным данным формы. Как? Атрибут модели, поставляемый с аннотацией @ModelAttribute, привязан к отправленным данным.

Итак, мы можем связать объект пользователя с атрибутом модели (назовем его, например, user) и получить доступ ко всем данным, отправленным с помощью объекта пользователя.

💡 @ModelAttribute annotation делает атрибут модели user доступным для просмотра страниц для доступа и отображения.

📣 Это метод, который мы будем использовать в нашем примере.

[5] Отображение данных отправлено

Теперь мы можем использовать атрибут модели user для отображения данных на странице просмотра.

На странице просмотра result.jsp мы можем получить доступ и отобразить атрибуты модели.

Проверка данных формы

Spring 4 поддерживает API проверки компонентов. Hibernate Validator - это реализация API проверки Java Beans.

Он предоставляет набор проверочных аннотаций, которые мы можем использовать для проверки данных, например @NotNull, @Max, @Min, @Size, @Pattern, @Future & @Past.

Чтобы добавить и использовать валидатор гибернации. Либо загрузите файлы JAR из и добавьте их в нашу папку lib в проекте, либо объявите зависимость в вашем Maven файле« pom.xml ».

Проверка данных формы - процесс

Мы собираемся использовать приведенный выше пример добавления нового пользователя и применения правил проверки к отправленным данным.

[1] Добавить правила проверки в класс пользователей

Для каждого поля пользовательского объекта мы укажем правила проверки.

- имя является обязательным, имеет минимальную длину 2 и максимальную 20. Оно должно содержать только буквенно-цифровые символы с пробелами.

- пароль является обязательным, не может быть пустым, минимальная длина 8, и должен содержать как минимум одну цифру, один нижний и один верхний символы, один специальный символ и не содержит пробелов. .

- адрес электронной почты является обязательным и имеет допустимый формат электронной почты.

- дата рождения не может быть нулевой или быть в прошлом.

- Укажите возраст, минимум 15 и максимум 100.

- высота имеет значение от 50 до 300.

- Массив объектов хобби не может быть пустым; должен быть хотя бы один.

📣 Один из распространенных вопросов: «В чем разница между @NotNull, @NotEmpty и @NotBlank

  • @NotNull: проверяет, не является ли значение нулевым, не обращая внимания на содержимое (оно может быть пустым). Используется с датами, коллекциями, картой, массивом и т. д.
  • @NotEmpty: проверяет, не является ли значение пустым или пустым, разрешая пустые пробелы, но размер должен быть больше нуля. Используется со строками, коллекциями, картой, массивом и т. д.
  • @NotBlank: проверяет, не является ли значение пустым или пустым, а обрезанная длина больше нуля. Используется со строками.

[2] Отображать сообщение об ошибке в форме HTML

Мы будем использовать тег form:errors для отображения сообщений об ошибках проверки (если они есть). Кроме того, мы можем применить класс CSS для отображения ошибок.

[3] Выполните правила проверки в контроллере

Аннотация @Valid выполняет правила проверки для пользовательского объекта (мы определили ранее в пользовательском классе). Результаты проверки будут помещены в объект BindingResult.

💡 Если ошибка существует, она будет отображаться как span вместо тега form:errors.

<span id="name.errors" class="error">name must have min length of 2, and max of 20</span>

Пользовательские правила проверки

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

[1] Создайте настраиваемую аннотацию для правила проверки

[2] Создайте собственный код правила проверки (вспомогательный класс)

[3] Используйте настраиваемое правило проверки

@VisaCode(value="IND", message="visa code must start with IND and of length >= 5")
private String visaCode;

Спасибо за чтение! Если вам понравилось, пожалуйста, похлопайте 👏 в ладоши.