Что такое @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-выбора:

enter image description here

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 может связывать более сложные объекты, такие как списки, карты, списки наборов карт и т.д., Но за сценой это делает магию привязки данных.

  1. Мы можем одновременно иметь аннотированный метод и обработчик метода запроса с @ModelAttribute в аргументах. Тогда мы должны объединить правила.

  2. Конечно, у нас есть множество различных ситуаций - методы @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 есть два способа обмена данными:

  1. от контроллера к пользовательскому интерфейсу и
  2. от пользовательского интерфейса до контроллера.

Здесь нас интересует, как данные передаются из интерфейса в контроллер. Это также можно сделать двумя способами:

  1. Использование формы HTML
  2. Использование параметров запроса.

Использование формы HTML: Рассмотрим приведенный ниже сценарий,

Form Submission Representation

Когда мы отправляем данные формы из веб-браузера, мы можем получить доступ к этим данным в нашем классе Controller как объект. Когда мы отправляем HTML-форму, Spring Container выполняет четыре вещи. Это будет,

  1. сначала прочитайте все данные, которые представлены в запросе, используя метод request.getParameter.
  2. как только он их прочитает, он преобразует их в соответствующий тип Java, используя integer.parseInt, double.parseDouble и все другие методы синтаксического анализа, доступные на основе типа данных данные.
  3. после анализа он создаст объект класса модели, который мы создали. Например, в этом сценарии отправляется информация о пользователе, и мы создаем класс с именем User, для которого контейнер будет создавать объект, и он будет устанавливать все значения, которые автоматически поступают в этот объект.
  4. Затем он передаст этот объект, установив значения для контроллера.

Чтобы все это заработало, нам нужно выполнить определенные шаги.

Internal working

Сначала нам нужно определить класс модели, такой как 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 может использоваться как аргумент метода/параметр или перед объявлением метода.  Основная цель этой аннотации - привязать параметры запроса или поля формы к объекту модели

Ref. http://www.javabeat.net/modelattribute-spring-mvc/

Ответ 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