Что используется аннотация @ModelAttribute на контроллере

У меня есть контроллер, как показано ниже

@RequestMapping("/getList")
    public ModelAndView getNetAllList(@ModelAttribute MYObject myObj)  {

//my code here

}

Я вызываю этот контроллер через отправку формы как

<form name = "myForm"  th:action = "@{/getList}" th:object = "${myObjVO}" method = "post"

Теперь мой вопрос: даже если я удаляю аннотации @ModelAttribute, этот код работает нормально.

Значит ли это, что @ModelAttribute больше не нужен с новой пружиной? Если не то, какая особенность весны заботится о сопоставлении формы и модели. Я использую весеннюю загрузку 2.0.0 с тимелистом.

Может ли кто-нибудь помочь мне с моим вопросом

user8710021 29.03.2018 16:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
3 825
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

@ModelAttribute используется для сопоставления объекта с моделью, обычно используемой для инициализации формы со значениями по умолчанию.

В этом случае имя атрибута в представлении («myObjVO») не совпадает с атрибутом, созданным в модели («myObj»). Следовательно, при вызове метода атрибут myObjVO отправляется и заменяет myObj.

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

вы думаете, что ваш ответ правильный. Я хотел бы проголосовать против вашего ответа.

user8710021 06.04.2018 16:56

Думаю, это отвечает на ваш вопрос.

... Also adds a fall-back strategy to instantiate the model attribute from a URI template variable or from a request parameter if the name matches the model attribute name and there is an appropriate type conversion strategy.

Аннотация @ModelAttribute может использоваться как на уровне метода, так и на уровне аргумента. На уровне метода его можно использовать для настройки атрибутов модели перед использованием любого метода @RequestMapping. На уровне аргументов его можно использовать для фильтрации определенных свойств из формы (например, элемента Employee, который должен быть построен из набора атрибутов формы). См. этот учебник для получения дополнительной информации о том, как его использовать.

Да, и я думаю, что мой ответ подразумевает, что вам не нужно его использовать, но если вы захотите, то это то, что он делает. Извини, если не смог помочь.

thomi 10.04.2018 09:38

Я знаю, что он делает. У меня вопрос, теперь это необязательно ??

user8710021 11.04.2018 23:33
@ModelAttribute

относится к свойству объекта модели (M в MVC) Итак, скажем, у нас есть форма с объектом поддержки формы, который называется "Person". Затем вы можете настроить Spring MVC для передачи этого объекта в метод контроллера с помощью аннотации @ModelAttribute:

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

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

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

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

Я знаю, для чего это используется. У меня вопрос, теперь это необязательно?

user8710021 11.04.2018 23:34

Как аргумент метода

When used as a method argument, it indicates the argument should be retrieved from the model. When not present, it should be first instantiated and then added to the model and once present in the model, the arguments fields should be populated from all request parameters that have matching names.

In the code snippet that follows the employee model attribute is populated with data from a form submitted to the addEmployee endpoint. Spring MVC does this behind the scenes before invoking the submit method:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
    // Code that uses the employee object

    return "employeeView";
}

Later on in this article we will see a complete example of how to use the employee object to populate the employeeView template.

So, it binds the form data with a bean. The controller annotated with @RequestMapping

can have custom class argument(s) annotated with @ModelAttribute.

This is what is commonly known as data binding in Spring-MVC, a common mechanism that saves you from having to parse each form field individually.

In general, Spring-MVC will always make a call first to that method, before it calls any request handler methods. That is, @ModelAttribute methods are invoked before the controller methods annotated with @RequestMapping are invoked. The logic behind the sequence is that, the model object has to be created before any processing starts inside the controller methods.

У меня вопрос: «Неужели больше нет необходимости использовать эту аннотацию». Потому что мой код работает без этой аннотации.

user8710021 11.04.2018 23:35

Это то, что обычно известно как привязка данных в Spring-MVC, общий механизм, который избавляет вас от необходимости анализировать каждое поле формы по отдельности. В общем, Spring-MVC всегда будет использовать @ModelAttribute. это аннотация клиента. это мой ответ. вам нужно читать контент.

0gam 12.04.2018 02:49
Ответ принят как подходящий

Во-первых, я не думаю, что ваш код работает. Это сработает, только если вы выберете одно из следующих решений.

решение 1.

@RequestMapping("/getList")
    public ModelAndView getNetAllList(@ModelAttribute("myObjVO") MYObject myObj)  {

//my code here

}

<form name = "myForm"  th:action = "@{/getList}" th:object = "${myObjVO}" method = "post">

решение 2:

@RequestMapping("/getList")
    public ModelAndView getNetAllList( MYObject myObj)  {

//my code here

}

<form name = "myForm"  th:action = "@{/getList}" th:object = "${myObject}" method = "post">

Если вы внимательно посмотрите на эти решения, вы поймете, когда потребуется @ModelAttribute.

Итак, теперь вернемся к вашему вопросу

Вам не нужен @ModelAttribute только для того, чтобы использовать bean-компонент в качестве параметра. ModelAttribute используется для различных целей. Прочтите документ это, а также проверьте следующие два из ответа stackoverflow.

Что такое @ModelAttribute в Spring MVC?

Аннотации @ModelAttribute, когда ее использовать?

Другие вопросы по теме