У меня есть контроллер, как показано ниже
@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 с тимелистом.




@ModelAttribute используется для сопоставления объекта с моделью, обычно используемой для инициализации формы со значениями по умолчанию.
В этом случае имя атрибута в представлении («myObjVO») не совпадает с атрибутом, созданным в модели («myObj»). Следовательно, при вызове метода атрибут myObjVO отправляется и заменяет myObj.
Таким образом, нет необходимости использовать @ModelAttribute, потому что форма инициируется в представлении и не сопоставляется с формой, созданной в модели.
вы думаете, что ваш ответ правильный. Я хотел бы проголосовать против вашего ответа.
Думаю, это отвечает на ваш вопрос.
... 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, который должен быть построен из набора атрибутов формы). См. этот учебник для получения дополнительной информации о том, как его использовать.
Да, и я думаю, что мой ответ подразумевает, что вам не нужно его использовать, но если вы захотите, то это то, что он делает. Извини, если не смог помочь.
Я знаю, что он делает. У меня вопрос, теперь это необязательно ??
@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.
Я знаю, для чего это используется. У меня вопрос, теперь это необязательно?
Как аргумент метода
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.
У меня вопрос: «Неужели больше нет необходимости использовать эту аннотацию». Потому что мой код работает без этой аннотации.
Это то, что обычно известно как привязка данных в Spring-MVC, общий механизм, который избавляет вас от необходимости анализировать каждое поле формы по отдельности. В общем, Spring-MVC всегда будет использовать @ModelAttribute. это аннотация клиента. это мой ответ. вам нужно читать контент.
Во-первых, я не думаю, что ваш код работает. Это сработает, только если вы выберете одно из следующих решений.
решение 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.
Может ли кто-нибудь помочь мне с моим вопросом