Какова цель и использование @ModelAttribute
в Spring MVC?
Что такое @ModelAttribute в Spring MVC?
Ответ 1
@ModelAttribute
ссылается на свойство объекта Model (M в MVC;)
так скажем, у нас есть форма с объектом поддержки формы, который называется "Персона"
Затем Spring MVC может предоставить этот объект методу Controller с помощью аннотации @ModelAttribute
:
public String processForm(@ModelAttribute("person") Person person){
person.getStuff();
}
С другой стороны, аннотация используется для определения объектов, которые должны быть частью модели. Поэтому, если вы хотите, чтобы объект Person упоминался в модели, вы можете использовать следующий метод:
@ModelAttribute("person")
public Person getPerson(){
return new Person();
}
Этот аннотированный метод позволит получить доступ к объекту Person в вашем представлении, поскольку он автоматически добавляется в модели Spring.
Смотрите "Использование @ModelAttribute".
Ответ 2
Я знаю, что это старая нить, но я подумал, что брошу свою шляпу в кольцо и посмотрю, смогу ли я немного загрязнить воду:)
Я обнаружил, что моя первоначальная борьба за понимание @ModelAttribute
была результатом решения Spring объединить несколько аннотаций в один. Это стало яснее, когда я разделил его на несколько небольших аннотаций:
Для аннотаций параметров подумайте о @ModelAttribute
как эквиваленте @Autowired + @Qualifier
, то есть он пытается получить bean с заданным именем из управляемой модели Spring. Если названный bean не найден, вместо того, чтобы бросать ошибку или возвращать null
, он неявно берет на себя роль @Bean
, т.е. Создайте новый экземпляр, используя конструктор по умолчанию, и добавьте bean к модели.
Для аннотаций метода подумайте о @ModelAttribute
как эквиваленте @Bean + @Before
, т.е. помещает bean, созданный пользовательским кодом в модели, и он всегда вызывается перед методом обработки запроса.
Образно, я вижу @ModelAttribute
следующим образом (пожалуйста, не принимайте это буквально!!):
@Bean("person")
@Before
public Person createPerson(){
return new Person();
}
@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
...
}
Как вы можете видеть, Spring принял правильное решение сделать @ModelAttribute
всеобъемлющую аннотацию; никто не хочет видеть аннотацию smorgasbord.
Ответ 3
В моем стиле я всегда использую @ModelAttribute для захвата объекта из формы spring jsp. например, я создаю форму на странице jsp, эта форма существует с commandName
<form:form commandName="Book" action="" methon="post">
<form:input type="text" path="title"></form:input>
</form:form>
и я поймаю объект на контроллере с последующим кодом
public String controllerPost(@ModelAttribute("Book") Book book)
и каждое имя поля книги должно соответствовать пути в подэлементе формы
Ответ 4
Поэтому я попытаюсь объяснить это более простым способом. Пусть есть:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
Как описано в документации Spring MVC, аннотация @ModelAttribute может использоваться для методов или аргументов метода. И, конечно, мы можем одновременно использовать их в одном контроллере.
1. Метод аннотации
@ModelAttribute("cities")
public List<String> checkOptions(){
return new Arrays.asList(new[]{"Sofia","Pleven","Ruse"});//and so on
}
Цель такого метода - добавить атрибут в модель. Таким образом, в нашем случае ключ городов будет иметь список new Arras.asList(new[]{"Sofia","Pleven","Ruse"})
качестве значения в модели (вы можете думать о модели как о карте (key: value)). Методы @ModelAttribute в контроллере вызываются до методов @RequestMapping внутри того же контроллера.
Здесь мы хотим добавить к Модели общую информацию, которая будет использоваться в форме для отображения пользователю. Например, его можно использовать для заполнения HTML-выбора:
2. Метод аргументации
public String findPerson(@ModelAttriute(value="person") Person person) {
//..Some logic with person
return "person.jsp";
}
@ModelAttribute в аргументе метода указывает, что аргумент должен быть получен из модели. Так что в данном случае мы ожидаем, что мы имеем в модели человека объект как ключ, и мы хотим, чтобы получить его значение и поместить его в метод аргумента Person человека. Если такого не существует или (иногда вы неправильно пишете (value = "persson")), то Spring не найдет его в модели и создаст пустой объект Person с использованием значений по умолчанию. Затем возьмем параметры запроса и попытаемся связать их данные в объекте Person, используя их имена.
name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&
Таким образом, у нас есть имя, и оно будет привязано к Person.name с помощью setName (String name). Так в
//..Some logic with person
у нас есть доступ к этому заполненному имени со значением "Димитрий".
Конечно, Spring может связывать более сложные объекты, такие как списки, карты, списки наборов карт и т.д., Но за сценой это делает магию привязки данных.
-
Мы можем одновременно иметь аннотированный метод и обработчик метода запроса с @ModelAttribute в аргументах. Тогда мы должны объединить правила.
-
Конечно, у нас есть множество различных ситуаций - методы @ModelAttribute также могут быть определены в @ControllerAdvice и так далее...
Ответ 5
Я знаю, что опоздал на вечеринку, но я процитирую, как говорят, "Лучше опоздать, чем никогда". Так что давайте начнем, У каждого есть свои способы объяснить вещи, позвольте мне попытаться подвести итог и упростить это для вас в нескольких шагах с примером; Предположим, у вас есть простая форма, form.jsp
<form:form action="processForm" modelAttribute="student">
First Name : <form:input path="firstName" />
<br><br>
Last Name : <form:input path="lastName" />
<br><br>
<input type="submit" value="submit"/>
</form:form>
путь = "FirstName" Путь = "LastName" Это поля/свойства в StudentClass когда вызывается форма, вызываются их геттеры, но после отправки вызываются их сеттеры, и их значения устанавливаются в bean-компоненте, который был указан в modelAttribute = "student" в теге формы.
У нас есть StudentController, который включает в себя следующие методы:
@RequestMapping("/showForm")
public String showForm(Model theModel){ //Model is used to pass data between
//controllers and views
theModel.addAttribute("student", new Student()); //attribute name, value
return "form";
}
@RequestMapping("/processForm")
public String processForm(@ModelAttribute("student") Student theStudent){
System.out.println("theStudent :"+ theStudent.getLastName());
return "form-details";
}
//@ModelAttribute("student") Student theStudent
//Spring automatically populates the object data with form data all behind the
//scenes
теперь, наконец, у нас есть форма-details.jsp
<b>Student Information</b>
${student.firstName}
${student.lastName}
Итак, вернемся к вопросу Что такое @ModelAttribute в Spring MVC? Пример определения из источника для вас, http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation @ModelAttribute - это аннотация, которая связывает параметр метода или возвращаемое значение метода с именованным атрибутом модели, а затем предоставляет его веб-представлению.
Что на самом деле происходит, так это то, что он получает все значения вашей формы, которые были переданы им, а затем хранит их, чтобы вы могли связать или присвоить их объекту. Он работает так же, как @RequestParameter, где мы получаем только параметр и присваиваем значение некоторому полю. Разница лишь в том, что @ModelAttribute содержит все данные формы, а не один параметр. Он создает для вас bean-компонент, который содержит отправленные данные формы для последующего использования разработчиком.
Подведем итоги. Шаг 1 : Запрос отправлен, и наш метод showForm запускается, и модель, временный бин устанавливается с именем студента, перенаправляется в форму. theModel.addAttribute("студент", новый студент());
Шаг 2 : modelAttribute = "студент" при заполнении формы модель меняет студента, и теперь она содержит все параметры формы
Шаг 3 : @ModelAttribute ("студент") студент theStudent Мы извлекаем значения, удерживаемые @ModelAttribute, и присваиваем весь объект EJB-компонента студенту.
Шаг 4: И затем мы используем его, как мы делаем ставку, точно так же, как показываем его на странице и т.д., Как я сделал
Я надеюсь, что это поможет вам понять концепцию. Спасибо
Ответ 6
Возьмите любое веб-приложение, будь то Gmail, Facebook, Instagram или любое другое веб-приложение, все это касается обмена данными или информацией между конечным пользователем и приложением или пользовательским интерфейсом и внутренним приложением. Даже в мире Spring MVC есть два способа обмена данными:
- от контроллера к пользовательскому интерфейсу и
- от пользовательского интерфейса до контроллера.
Здесь нас интересует, как данные передаются из интерфейса в контроллер. Это также можно сделать двумя способами:
- Использование формы HTML
- Использование параметров запроса.
Использование формы HTML: Рассмотрим приведенный ниже сценарий,
Когда мы отправляем данные формы из веб-браузера, мы можем получить доступ к этим данным в нашем классе Controller как объект. Когда мы отправляем HTML-форму, Spring Container выполняет четыре вещи. Это будет,
- сначала прочитайте все данные, которые представлены в запросе, используя метод request.getParameter.
- как только он их прочитает, он преобразует их в соответствующий тип Java, используя integer.parseInt, double.parseDouble и все другие методы синтаксического анализа, доступные на основе типа данных данные.
- после анализа он создаст объект класса модели, который мы создали. Например, в этом сценарии отправляется информация о пользователе, и мы создаем класс с именем User, для которого контейнер будет создавать объект, и он будет устанавливать все значения, которые автоматически поступают в этот объект.
- Затем он передаст этот объект, установив значения для контроллера.
Чтобы все это заработало, нам нужно выполнить определенные шаги.
Сначала нам нужно определить класс модели, такой как User, в котором количество полей должно точно соответствовать количеству полей в HTML-форме. Кроме того, имена, которые мы используем в форме HTML, должны соответствовать именам, которые мы имеем в классе Java. Эти два очень важны. Имена должны совпадать, количество полей в форме должно совпадать с количеством полей в классе, который мы создаем. Как только мы это сделаем, Контейнер автоматически прочитает поступающие данные, создаст объект этой модели, установит значения и передаст его Контроллеру. Чтобы прочитать эти значения внутри контроллера, мы используем аннотацию @ModelAttribute для параметров метода. Когда мы создаем методы в контроллере, мы собираемся использовать @ModelAttribute и добавить к нему параметр, который автоматически получит этот объект от контейнера.
Вот пример кода для регистрации пользователя:
@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
model.addAttribute("user", user);
return "regResult";
}
Надеюсь, это схематическое объяснение помогло!
Ответ 7
Аннотация, которая связывает параметр метода или возвращаемое значение метода с именованным атрибутом модели, доступным для веб-представления.
public String add(@ModelAttribute("specified") Model model) {
...
}
Ответ 8
Это используется для целей привязки данных в Spring MVC
. Пусть у вас есть jsp с элементом формы в нем, например.
on
JSP
<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>
(Spring Метод формы, элемент простой формы также можно использовать)
На стороне контроллера
@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {
}
Теперь, когда вы отправите форму, значения полей формы будут доступны вам.
Ответ 9
@ModelAttribute может использоваться как аргумент метода/параметр или перед объявлением метода. Основная цель этой аннотации - привязать параметры запроса или поля формы к объекту модели
Ответ 10
@ModelAttribute
создаст атрибут с именем, указанным вами (@ModelAttribute("Testing") Test test) as Testing
в данном примере. Test является тестом bean, являющимся ссылкой на bean, и тестирование будет доступно в модели, чтобы вы могли используйте его на страницах jsp для поиска значений, которые вы сохранили в ModelAttribute
.
Ответ 11
@ModelAttribute просто привязывает значение из полей jsp к Calo Pojo для выполнения нашей логики в классе контроллера. Если вы знакомы с распорками, то это похоже на заполнение формбайта при отправке.
Ответ 12
Аннотация ModelAttribute используется как часть веб-приложения Spring MVC и может использоваться в двух сценариях.
Прежде всего, его можно использовать для ввода данных в модель нагрузки до JSP. Это особенно полезно для обеспечения того, что JSP требуется для отображения всех данных. Инъекция получается путем подключения одного метода к модели.
Во-вторых, его можно использовать для чтения данных из существующей модели и присвоения их параметрам метода тренера.
ссылка https://dzone.com/articles/using-spring-mvc%E2%80%99s