Spring MVC: объясните разницу между @RequestParam и @ModelAttribute
Я новичок в Spring MVC. Пожалуйста, помогите мне распаковать документацию.
Документация
Spring MVC Документация состояния (акцент мой):
@ModelAttribute
в аргументе метода указывает, что аргумент должен быть получен из модели. Если аргумент отсутствует в модели, сначала необходимо создать аргумент, а затем добавить его в модель. Когда-то присутствует в модели,поля аргумента должны быть заполнены всеми параметрами запроса, имеющими совпадающие имена, Класс WebDataBinder сопоставляет имена параметров запроса, включая параметры строки запроса и поля формы, для моделирования полей атрибута по имени.
@RequestParam
привязывает параметры запроса к параметру метода в вашем контроллере.
Отказ от ответственности / разъяснения
я знаю это@ModelAttribute
а также@RequestParam
не являются одинаковыми, не являются взаимоисключающими, не выполняют одинаковую роль и могут использоваться одновременно, как вэтот вопрос - в самом деле,@RequestParam
может использоваться для заполнения полей@ModelAttribute
, Мой вопрос больше ориентирован на разницу между их внутренней работой.
Вопрос:
В чем разница между@ModelAttribute
(используется для аргумента метода, а не метода) и@RequestParam
? В частности:
@RequestParam
а также@ModelAttribute
иметь один и тот же источник информации / совокупность, то есть параметры запроса в URL, которые могли быть предоставлены как элементы формы / модели, которая былаPOST
ред?Использование: Верно ли, что переменные извлекаются с@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
заполняет поля класса, который затем заполняет атрибут модели для передачи обратно в представление
Это правильно?