#java #spring #forms #spring-mvc
#java #spring #формы #весна-mvc #spring-mvc
Вопрос:
Можно ли обрабатывать форму с помощью аннотации Spring @ModelAttribute
без использования тега Spring <form:form...>
. Я видел этот способ сделать, но он кажется сложным при использовании Thymeleaf (я ничего об этом не знаю).
Предполагается, что Spring является ненавязчивым фреймворком, так есть ли альтернативное решение моей проблемы?
Комментарии:
1. Что вы используете вместо Thymeleaf ?
2. Больше ничего, просто использование простой страницы JSP с JSTL и EL .
Ответ №1:
Если вы создаете свою форму с использованием тегов Spring, она будет преобразована в HTML. Запустите свой проект и проверьте исходный код вашего сайта JSP. Теги Spring просто немного упрощают работу программиста. Например
<form:form modelAttribute="newUser" action="/addUser" method="post">
<form:input path="firstName" />
<form:input path="lastName" />
<button type="submit">Add</button>
</form:form>
будет преобразован в HTML
<form id="newUser" action="/addUser" method="post">
<input id="firstName" name="firstName" type="text" value="" />
<input id="lastName" name="lastName" type="text" value="" />
<button type="submit">Add</button>
</form>
В контроллере вы добавляете объект передачи данных (DTO) в модель, например
@RequestMapping(value = "/index", method = RequestMethod.GET)
public ModelAndView homePage() {
ModelAndView model = new ModelAndView();
model.addObject("newUser", new User());
model.setViewName("index");
return model;
}
и получить данные формы
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public ModelAndView addUser(
@ModelAttribute("newUser") User user) { ... }
Использование тегов Spring совершенно необязательно, если имена полей формы точно такие же, как в вашем bean-объекте (здесь User class ) и модели.
Комментарии:
1. Таким образом, мы можем полностью игнорировать теги Spring и просто использовать значение атрибута «id» (здесь: «newUser») для привязки формы к ее POJO на стороне контроллера! Я прав?
2. Да, вы все правильно поняли. Вот как это работает. Многие входные атрибуты еще проще и короче записывать в базовом HTML, например required=»требуется» => требуется и т.д. В более сложных формах, таких как select — option, версия тега spring более компактна.
3. В HTML-версии должны присутствовать все основные входные атрибуты (идентификатор, имя, тип, значение). Вы можете ничего не пропустить. В противном случае это не всегда будет работать.
4. Что вы имеете в виду под «В противном случае это не всегда будет работать», разве это не всегда работает на стороне контроллера таким образом?
5. Теги Spring кажутся действительно компактными, но я уже реализовал свою форму исключительно в версии HTML, но я бы обработал ее с помощью контроллера Spring, поэтому мне интересно, возможно ли это без изменения моей формы.
Ответ №2:
Используйте JSp, как предложено в разделе комментариев выше. Сначала вы должны добавить в свой pom следующую зависимость (или ее эквивалент для gradle)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
Кроме того, ваши jsp должны быть помещены в вашу папку web-inf .
Ваш application.properties должен выглядеть следующим образом:
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
Комментарии:
1. Я думаю, вы не поняли мою проблему. Я хотел бы обрабатывать форму с помощью контроллера spring без использования тега spring в моих файлах JSP. Spring кажется действительно гибким при использовании аннотации @ModelAttribute, но я не хочу использовать что-то вроде <form:form ….> в моем файле JSP.
2. Вы пытаетесь использовать thymeleaf без тегов spring form ? не подавать в суд, это сработает. вот почему мы предложили jsp в сочетании с jstl и EL .
3. Кстати, @ModelAttribute и jsp хорошо работают без тегов spring form
4. У вас есть пример? Как я могу связать поля формы с классом поддержки формы без использования тега Spring ?
5. Я не использую Thymeleaf в своем проекте