Специальный тег Form в Spring
Last updated: 11 мая 2025 г.В спринг есть специальные теги, которые упрощают нам разработку.
В этом уроке рассмотрим специальный тег form:form
.
Тег form:form обеспечивает прямую привязку полей объекта модели вашего приложения к полям ввода HTML-формы.
Давайте создадим простой класс SomeUser
с одним полем, геттерами и сеттерами.
1package classes;
2import org.springframework.stereotype.Component;
3
4@Component
5public class SomeUser {
6 // определим поле, которое в объекте SomeUser
7 // будет напрямую привязано к текстовому
8 // полю в форме. и сеттеры геттеры для него
9 private String userName;
10
11 public SomeUser() { }
12}
Как видим, пока сеттеров в классе нет. Это было сделано специально, чтобы продемонстрировать один важный прием работы в Eclipse, который нужно знать, поскольку благодаря нему программисту не придется писать большое количество рутинного кода.
Так вот, Eclipse может сам генерировать геттеры и сеттеры для полей в классе. Для этого нужно нажать правой кнопкой мыши в любом месте класса без кода и выбрать Generate Getters and Setters
.

Отмечаем поле для которого нужно сгенерировать геттер сеттер и нажимаем generate.

Как видим, магическим образом в классе появились геттер и сеттер для поля userName
и писать вручную ничего не пришлось.
1package classes;
2import org.springframework.stereotype.Component;
3
4@Component
5public class SomeUser {
6 // определим поле которое в объекте SomeUser
7 // будет напрямую привязано к текстовому
8 // полю в форме, и сеттеры геттеры для него
9 private String userName;
10
11 public SomeUser() { }
12
13 public String getUserName() {
14 return userName;
15 }
16
17 public void setUserName(String userName) {
18 this.userName = userName;
19 }
20}
Генерировать можно не только геттеры и сеттеры.
Можно, например, сгенерировать переопределения методов Оbject для данного класса, таких как ToString
, equals и hashCode
, что очень удобно.
Итак класс, объект которого мы будем создавать и связывать этот объект с формой мы написали. Теперь давайте же создадим этот объект. Создаваться он будет в обработчике и помещаться в аттрибут в Model
.
То есть правильно будет сказать, что спринг форма будет напрямую связана с объектом, который находиться в аттрибуте.
Этот обработчик помимо того, что создает аттрибут c объектом SomeUser будет перенаправлять на страницу с формой, где этот объект в аттрибуте будет связываться с формой.
Новый обработчик:
1package classes;
2
3import javax.servlet.http.HttpServletRequest;
4
5@Controller
6@RequestMapping("/FirstController")
7public class MVCcontroller{
8 @RequestMapping("/FirstJSP")
9 public String FirstJSP() {
10 return "JSPpage";
11 }
12
13 @RequestMapping("/SecondJSP")
14 public String SecondJSP() {
15 return "JSPpage1";
16 }
17
18 @RequestMapping("/FormPage")
19 public String FormPage() {
20 return "FormPage";
21 }
22
23 @RequestMapping("/FormProcessingController")
24 public String FormProcessingController(
25 HttpServletRequest req, Model model) {
26 model.addAttribute("responseMsg",
27 (req.getParameter("username")+" entered!"));
28 return "FormProcessingPage";
29 }
30
31 // Новый обработчик
32 @RequestMapping("/FormTagPage")
33 public String FormTagPage(Model model) {
34 // здесь создаем аттрибут, передавая в него
35 // экземпляр, с которым будет связана форма
36 // на странице FormTagPage
37 model.addAttribute("someuser",new SomeUser());
38 return "FormTagPage";
39 }
40}
Давайте же свяжем форму на странице на которую переводит только что определенный обработчик /FormTagPage
и объект в аттрибуте в модели.
Страница с формой:
1<%@ page language="java" contentType="text/html;
2 charset=ISO-8859-1"
3 pageEncoding="ISO-8859-1"%>
4<!-- Чтобы использовать этот особый тег формы
5 его нужно для начала импортировать в текущий файл -->
6<%@ taglib prefix="form"
7 uri="http://www.springframework.org/tags/form"%>
8<%@ page isELIgnored="false" %>
9<!DOCTYPE html>
10<html>
11<head>
12
13 <title>Insert title here</title>
14</head>
15<body>
16<!-- Тег form:form связывает напрямую поля
17 объекта какого-либо класса нашего приложения и формы -->
18<!-- "someuser" в атрибуте modelAttribute - это имя
19 атрибута который мы создали в контроллере и в который
20 там же поместили экземпляр класса SomeUser с которым
21 мы связываем данную форму. -->
22<form:form action="FormTagProcessor" modelAttribute="someuser">
23 <!-- Ниже в атрибуте path указываем userName.
24 Это часть имени методов в SomeUser которая
25 стоит в названиях методов после set или get.
26 То есть к userName в начало подставляется get и set для вызова
27 в объекте в аттрибуте someuser геттера и сеттера поля
28 userName. То есть когда страница с формой в первый раз
29 загружается вызывается геттер getUserName() и данный
30 инпут этим геттером получает поле таким образом связывая
31 поле экземпляра в атрибуте и данный input -->
32 <form:input path="userName"/> <br/>
33 <!-- Когда пользователь нажимает Submit вызывается
34 сеттер setUserName() и этим сеттером устанавливается
35 значение поля в экземпляр в атрибуте. далее этот атрибут
36 в модели передается в FormTagProcessor то есть в обработчик
37 который написан в теге action. И в этом обработчике
38 этот измененный формой объект можно будет извлечь. -->
39 <input type="submit" value="submit"/> <br/>
40</form:form>
41</body>
42</html>
Теперь давайте создадим этот обработчик, который был прописан в теге action у формы.
м1package classes;
2
3import javax.servlet.http.HttpServletRequest;
4
5@Controller
6@RequestMapping("/FirstController")
7public class MVCcontroller{
8 @RequestMapping("/FirstJSP")
9 public String FirstJSP() {
10 return "JSPpage";
11 }
12
13 @RequestMapping("/SecondJSP")
14 public String SecondJSP() {
15 return "JSPpage1";
16 }
17
18 @RequestMapping("/FormPage")
19 public String FormPage() {
20 return "FormPage";
21 }
22
23 @RequestMapping("/FormProcessingController")
24 public String FormProcessingController(
25 HttpServletRequest req, Model model) {
26 model.addAttribute("responseMsg",
27 req.getParameter("username")+" entered!");
28 return "FormProcessingPage";
29 }
30
31 @RequestMapping("/FormTagPage")
32 public String FormTagPage(Model model) {
33 model.addAttribute("someuser",new SomeUser());
34 return "FormTagPage";
35 }
36
37 //Новый обработчик
38 @RequestMapping("/FormTagProcessor")
39 //с помощью аннотации @ModelAttribute принимаем атрибут
40 //посланный формой в этот обработчик и помещаем
41 //экземпляр из него в новый экземпляр someUser
42 public String FormTagProcessor(
43 @ModelAttribute("username") SomeUser someUser) {
44 //Воспользуемся этим объектом. Проверим
45 //содержится ли в поле userName этого объекта то
46 //что вводилось в текстовое поле в форме.
47 //Выведем на консоль томcat содержимое поля
48 //userName в новом объекте someUser
49 System.out.println(someUser.getUserName());
50 //Далее переданынй в тот обработчик объект(аттребут)
51 //доступен на jsp странице, на которую
52 //происходит переход из этого обработчика.
53 //Тоесть на FormTagProcessingPage.
54 return "FormTagProcessingPage";
55 }
56}
Теперь извлечем на странице на которую переводит только что определенный обработчик поле объекта в аттрибуте. В этом поле, ясное дело, содержится то, что вбивал в текстовое поле формы пользователь.
м1<%@ page isELIgnored="false" %>
2<html>
3<head>
4 <title>Auth Form</title>
5</head>
6<body>
7 <h2>${username.userName}</h2>
8</body>
9</html>
Проверка работы приложения.
Перейдем на страницу с формой через обработчик по пути /FormTagPage
.

Введем в поле текст и нажмем submit.

Видим в консоли Tomcat, что новый объект в обработчике /FormTagProcessor содержит то, что вводил в текстовое поле формы пользователь.

Видим, что обработчик успешно перенаправил на вторую страницу и объект, который содержит то, что писал пользователь в текстовые поля формы был успешно передан этим обработчиком на эту страницу.
Следующие уроки
Теги Spring Form: Select, Radio, Checkbox
19
мин.
Валидация форм в Spring MVC
21
мин.
Введение в ORM с использованием Hibernate
20
мин.