Что такое @ModelAttribute в Spring MVC? - PullRequest
342 голосов
/ 06 августа 2010

Какова цель и использование @ModelAttribute в Spring MVC?

Ответы [ 12 ]

379 голосов
/ 06 августа 2010

@ModelAttribute относится к свойству объекта Model (M в MVC;) так скажем, у нас есть форма с объектом поддержки формы, который называется «Персона» Затем Spring MVC может предоставить этот объект методу Controller с помощью аннотации @ModelAttribute:

public String processForm(@ModelAttribute("person") Person person){
    person.getStuff();
}

См. "Использование @ModelAttribute для аргумента метода" (Spring 3.1).

С другой стороны, аннотация используется для определения объектов, которые должны быть частью модели. Поэтому, если вы хотите, чтобы объект Person упоминался в модели, вы можете использовать следующий метод:

@ModelAttribute("person")
public Person getPerson(){
    return new Person();
}

Этот аннотированный метод разрешит доступ к объекту Person в вашем представлении, поскольку он автоматически добавляется в модели Spring.

См. «Использование @ModelAttribute для метода» (Spring 3.1).

Надеюсь, это помогло.

126 голосов
/ 31 января 2013

Я знаю, что это старая нить, но я подумал, что брошу свою шляпу в кольцо и посмотрю, смогу ли я немного запачкать воду:)

Я нашел свою первоначальную борьбу, чтобы понять @ModelAttribute было результатом решения Spring объединить несколько аннотаций в одну.Это стало яснее, когда я разделил его на несколько меньших аннотаций:

Для аннотаций параметров представьте @ModelAttribute как эквивалент @Autowired + @Qualifier, то есть он пытается извлечь бин с данным именем из управляемой модели Spring,Если именованный компонент не найден, вместо выдачи ошибки или возврата null он неявно принимает на себя роль @Bean, т. Е. Создает новый экземпляр с помощью конструктора по умолчанию и добавляет компонент в модель.

Для аннотаций методов представьте @ModelAttribute как эквивалент @Bean + @Before, т. Е. Он помещает компонент, созданный в коде пользователя, в модель и всегда вызывается перед методом обработки запроса.

Образно говоря, ясмотрите @ModelAttribute как следующее (пожалуйста, не воспринимайте это буквально !!):

@Bean("person")
@Before
public Person createPerson(){
  return new Person();
}

@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
  ...
}

Как видите, Spring принял правильное решение сделать @ModelAttribute всеобъемлющей аннотацией;никто не хочет видеть аннотацию "шведский стол".

22 голосов
/ 31 декабря 2015

Для моего стиля я всегда использую @ModelAttribute, чтобы поймать объект из пружинной формы 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)

и каждое имя поля книги должно совпадать с путем в подэлементе формы

17 голосов
/ 11 декабря 2016

Поэтому я попытаюсь объяснить это более простым способом.Давайте получим:

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”}) в качестве значения в модели (модель можно представить как карту (ключ: значение)).Методы @ ModelAttribute в контроллере вызываются до методов @ RequestMapping в том же контроллере.

Здесь мы хотим добавить к Модели общую информацию, которая будет использоваться в форме для отображения пользователю.Например, его можно использовать для заполнения HTML-выделения:

enter image description here

2. Аргумент метода

public String findPerson(@ModelAttriute(value="person") Person person) {
    //..Some logic with person
    return "person.jsp";
}

@ModelAttribute в аргументе метода указывает, что аргумент должен быть получен из модели.Таким образом, в этом случае мы ожидаем, что у нас есть объект Model person в качестве ключа, и мы хотим получить его значение и поместить его в аргумент метода Person person .Если такого не существует или (иногда вы неправильно пишете (value = "persson")), то Spring не найдет его в модели и создаст пустой объект Person с использованием значений по умолчанию.Затем возьмет параметры запроса и попытается связать их в объекте Person, используя их имена.

name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&

Итак, у нас есть имя, и оно будет привязано к Person.name с помощью setName (String name).Таким образом, в

//..Some logic with person

у нас есть доступ к этому заполненному имени со значением "Dimitrij".

Конечно, Spring может связывать более сложные объекты, такие как списки, карты, список наборов карт и т. Д.но за сценой это делает магию привязки данных.

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

Конечно, у нас есть множество различных ситуаций - методы @ModelAttribute также могут быть определены в @ControllerAdvice и т. Д. ...

9 голосов
/ 09 ноября 2017

Я знаю, что опоздал на вечеринку, но я процитирую, как говорят, «Лучше опоздать, чем никогда». Итак, начнем, У каждого есть свои способы объяснить вещи, позвольте мне попытаться подвести итог и упростить это для вас в нескольких шагах с примером; Предположим, у вас есть простая форма, 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>

Путь = "Имя" Путь = "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 

теперь, наконец, у нас есть form-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 и назначаем весь компонент / объект ученику.

Шаг 4: И затем мы используем его, как мы делаем ставку, так же, как показывать его на странице и т. Д., Как я сделал

Надеюсь, это поможет вам понять концепцию. Спасибо

4 голосов
/ 25 апреля 2016

Аннотация, которая связывает параметр метода или возвращаемое значение метода с именованным атрибутом модели, доступным для веб-представления.

public String add(@ModelAttribute("specified") Model model) {
    ...
}
3 голосов
/ 24 августа 2016

Используется для привязки данных весной MVC.Пусть у вас есть jsp с элементом формы, например

на JSP

<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>

(метод Spring Form, простая формаэлемент также может быть использован)

На стороне контроллера

@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {

}

Теперь, когда вы отправите форму, вам будут доступны значения полей формы.

2 голосов
/ 01 марта 2019

Возьмите любое веб-приложение, будь то 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";
}

Надеюсь, это схематическое объяснение помогло!

2 голосов
/ 14 декабря 2015

@ ModelAttribute может использоваться в качестве аргументов / параметра метода или перед объявлением метода.Основная цель этой аннотации - привязать параметры запроса или поля формы к объекту модели

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

1 голос
/ 01 мая 2018

@ ModelAttribute просто привязывает значение из полей jsp к Calfo Pojo для выполнения нашей логики в классе контроллера. Если вы знакомы с распорками, то это похоже на заполнение формбэя при подаче.

...