Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 07.02.2017
Сообщений: 33

Spring MVC работа с формой

30.03.2017, 18:13. Показов 1520. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Для тех, кто работал со Spring MVC ни для кого не секрет, что Spring имеет свою собственную библиотеку тегов. Об одном из этих тегов и будет мой вопрос. А именно о теге "form:form", а вернее о его атрибуте modelAttribute (аналог устаревшего commandName).

Читая документацию, я сначала подумал что этот атрибут используется только для того, чтобы заполнить форму какими-то начальными данными (т.е. основа для формы, backing object). И только для этого, ни для чего более.

Но в процессе работы выяснилось, что этот атрибут, также определяет объект, который будет отправлен данной формой и будет получен в контроллере. Но как это происходит? За счет чего? Посредством чего? За счет какого механизма? Ведь, насколько мне известно, HTML-запросы не могут передавать объекты - они могут передавать параметры запроса, но никак не объекты.

Если вопрос не понятен, то опишу подробности. Если понятен, то дальше можно не читать.

На всякий случай код контроллера:
Java
1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView main() {
  User user = new User();
  return new ModelAndView("index", "userObj", user);
}
 
@RequestMapping(value = "/check-user", method = RequestMethod.POST)
public String checkUser(@Valid @ModelAttribute(name = "userObj") User user, BindingResult bindingResult, Model model) {
  if (bindingResult.hasErrors()) return "index";
  return "check-user";
}
А это код формы:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<form:form class="box login" modelAttribute="userObj" method="POST" action="check-user">
        <fieldset class="boxBody">
            <label>Username</label>
            <form:input path="name"/>
            <form:errors path="name" cssClass="error" />
            <label>Password</label>
            <form:password path="password"/>
            <form:errors path="password" cssClass="error"/>
        </fieldset>     
        <footer>
            <form:checkbox path="admin" />
            <label>Admin?</label>
            <input type="submit" class="btnLogin" value="Login" tabindex="4">
        </footer>
</form:form>
Ход мыслей:
При запросе на "/" в атрибут модели помещается объект userObj (что практически эквивалентно добавлению атрибута запроса в не Spring MVC приложении, т.е. атрибут модели userObj будет доступен только в рамках одного запроса) и отдается представление index - на нем располагается форма.

Сервер отдает страницу с формой. Поскольку useObj пустой, то форма отрендерится с пустыми значениями полей. Запрос завершается, атрибут модели userObj больше не доступен. Заполняем поля формы значениями и нажимаем submit. Начинается новый запрос. Данные уходят в обработчик checkUser().

В сигнатуре checkUser(): public String checkUser(@Valid @ModelAttribute(name = "userObj") User user, BindingResult bindingResult, Model model) видно, что мы извлекаем из модели атрибут userObj и помещаем его в переменную User user. Но как? Ведь это уже другой запрос и прошлый атрибут userObj (который был пустым) уже утерян!

Остается только предположить, что форма каким-то образом генерирует новый атрибут модели, в который помещает заполненный объект user. Но как это происходит технически? Ведь как я уже написал, запрос клиента не может передать атрибут модели (он может передавать только параметры запроса - введенные данные в поля формы). И происходит это генерирование, видимо, за счет атрибута modelAttribute (устар. commandName).

Получается что у сервера уже откуда-то есть информация о том, что атрибут должен быть именно "userObj". Если в контроллере попытаться получить атрибут с другим именем, например, "useObj2" то будет брошено исключение. Каким образом передается от клиента серверу информация об атрибуте модели и о его имени? Посредством чего modelAttribute (устар. commandName) из JSP формы передает атрибут в модель? Может за счет id формы (в которую в конечном счете отрендериться Spring-форма и modelAttribute станет видимо id'шником)? Или как?

Факт остается фактом, получить в контроллере введенные данные можно только указав значение modelAttribute (устар. commandName). В теле POST-запроса, передаваемого от клиента, есть информация о введенных данных, но нет и быть не может об атрибуте модели. Но откуда-то сервер знает имя нужного атрибута?

С уважением, надеюсь понятно написал.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.03.2017, 18:13
Ответы с готовыми решениями:

Spring MVC работа с видеопотоком
Здравствуйте, уважаемые форумчани. Подскажите как реализовать передачу видео в Spring MVC ? Я хочу реализовать передачу видео в...

Работа с url в spring mvc, redirect
У мене возникает проблема с отображением url в браузере в моем приложение, не то что я бы хотел. На главной странице есть меню ...

Работа с web.xml (Spring MVC + MySQL)
Можете проверить правильно ли я написал код в web.xml. Хочу вывести ошибку 404 страница не найдена. WEB XML &lt;?xml...

1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
30.03.2017, 19:18
слишком много букв.
Делается просто, в хроме смотришь, что уходит в запросе, в дебаггере смотришь, что приходит в запросе, сравниваешь, получаешь ответ на свой вопрос. Если непонятно, кидай сюда скрины из браузера и дебаггера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2017, 19:18
Помогаю со студенческими работами здесь

Работа с двумя контроллерами (Spring MVC + Security)
У меня есть два контроллера, я хочу чтобы сначала запустился &quot;AuthorizationController&quot; package adil.java.schoolmaven.controller; ...

Каркас Spring boot или mvc + security + работа с бд
Нужно web приложение с авторизацией(пытался прикрутить spring security), в которой пользователи создают тикеты(вопросы), а эксперты на них...

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями Spring MVC проект собирается нормально и...

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

задания по spring core и spring mvc для новичков
Какие задания можно предложить новичкам для выполнения после знакомства их с spring core и mvc ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru