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;
Спасибо за чтение! Если вам понравилось, пожалуйста, похлопайте 👏 в ладоши.