Топ-100Специальный тег Form в Spring - CodOrbits
LogoCodOrbits

Раздел: Spring MVC

Раздел расскажет о Spring MVC — компоненте Spring для разработки веб-приложений с использованием архитектуры MVC.

Все разделы
Иконка Spring MVC

Специальный тег 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
мин.

Similar Articles Icon
Divider

Валидация форм в Spring MVC

21
мин.

Similar Articles Icon
Divider

Введение в ORM с использованием Hibernate

20
мин.

Similar Articles Icon