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 заполняет поля класса, который затем заполняет атрибут модели для передачи обратно в представление

Это правильно?

Ответы на вопрос(5)

Ваш ответ на вопрос