Я новичок в Spring MVC. Пожалуйста, помогите мне распаковать документацию.
Documentation
Spring Документация MVC заявляет (основное внимание):
-
@ModelAttribute
в аргументе метода указывает, что аргумент должен быть извлечен из модели. Если в модели нет, аргумент должен быть сначала создан, а затем добавлен в модель. После присутствия в модели поля аргументов должны быть заполнены из всех параметров запроса, имеющих соответствующие имена. Класс WebDataBinder сопоставляет имена параметров запроса - включая параметры строки запроса и поля формы - для моделирования полей атрибутов по имени. -
@RequestParam
связывает параметры запроса с параметром метода в вашем контроллере.
Отказ от ответственности /Clarifier
Я знаю, что @ModelAttribute
и @RequestParam
не одно и то же, не являются взаимоисключающими, не выполняют одну и ту же роль и могут использоваться одновременно, как в this вопрос - действительно, @RequestParam
можно использовать для заполнения полей @ModelAttribute
. Мой вопрос больше ориентирован на разницу между их внутренними разработками.
Вопрос:
В чем разница между @ModelAttribute
(используется для аргумента метода, а не метода) и @RequestParam
? В частности:
- Источник: У
@RequestParam
и@ModelAttribute
есть тот же источник информация/население, т.е. параметры запроса в URL-адресе, которые могут быть представлены как элементы формы/модели, которые былиPOST
ed? - Использование: Правильно ли выбраны переменные, полученные с помощью
@RequestParam
(если они не переданы в модель), а переменные, полученные с помощью@ModelAttribute
, автоматически отправляются в возвращаемую модель?
Или в очень простых примерах кодирования, какова реальная рабочая разница между этими двумя примерами?
Пример 1: @RequestParam
:
// foo and bar are thrown away, and are just used (e.g.) to control flow?
@RequestMapping(method = RequestMethod.POST)
public String testFooBar(@RequestParam("foo") String foo,
@RequestParam("bar") String bar, ModelMap model) {
try {
doStuff(foo, bar);
}
// other code
}
Пример 2: @ModelAttribute
:
// FOOBAR CLASS
// Fields could of course be explicitly populated from parameters by @RequestParam
public class FooBar{
private String foo;
private String bar;
// plus set() and get() methods
}
// CONTROLLER
// Foo and Bar become part of the model to be returned for the next view?
@RequestMapping(method = RequestMethod.POST)
public String setupForm(@ModelAttribute("fooBar") FooBar foobar) {
String foo = fooBar.getFoo();
String bar = fooBar.getBar();
try {
doStuff(foo, bar);
}
// other code
}
Мое настоящее понимание:
@ModelAttribute
и @RequestParam
оба опросят параметры запроса для информации, но они используют эту информацию по-разному:
-
@RequestParam
просто заполняет автономные переменные (которые, конечно же, могут быть полями в классе@ModelAttribute
). Эти переменные будут выброшены, когда контроллер будет выполнен, если они не были отправлены в модель. -
@ModelAttribute
заполняет поля класса, который затем заполняет атрибут модели, который будет передан обратно в представление
Правильно ли это?