Разница между @ModelAttribute и org.springframework.ui.ModelMap.get ()? - PullRequest
2 голосов
/ 10 июня 2011

Я пытаюсь использовать объект в качестве командного объекта элемента <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>.

В методе GET контроллера я добавляю объект следующим образом:

@RequestMapping(method = RequestMethod.GET)
public String renderForm(ModelMap model, HttpServletRequest request) {
    [...]
    model.addAttribute("voting", voting);
    [...]
}

В визуализированной форме объект команды отображается правильно, если он определен следующим образом:

<form:form action="vote" method="PUT" commandName="voting" name="oform">

Теперь, когда я пытаюсь получить доступ к объекту команды формы обратно в контроллере, в методе POST у меня есть два подхода. Сначала я объявляю @ModelAttribute в подписи:

@RequestMapping(method = RequestMethod.PUT)
public String newVoting(@ModelAttribute("voting") Voting voting, HttpServletRequest request) { [...]}

Или я получаю доступ к ModelMap и получаю значение из базовой карты:

@RequestMapping(method = RequestMethod.PUT)
public String newVoting(ModelMap model, HttpServletRequest request) {
    Voting voting = (Voting) model.get("voting");
    [...]
}

При выполнении первого я получаю объект так, как он был представлен формой. Делая последнее, я получаю объект таким, каким он был ДО обработки формы.

Почему отправка формы не меняет объект в ModelMap и почему @ModelAttribute отличается от того, что в реальной модели? Мне кажется, что имя «ModelAttribute» должно приводить к тому же объекту, что и получение объекта непосредственно из модели.

Может быть, @ModelAttribute вводит в заблуждение?

EDIT Забыл упомянуть, что это объект @ SessionAttributes

 @SessionAttributes({"voting", "state"})

1 Ответ

2 голосов
/ 10 июня 2011

Ваш первый подход, используя аннотацию @ModelAttribute, делает две вещи:

  1. Создание объекта голосования с использованием отправленных данных формы;
  2. Предоставление объекта Voting для представления путем добавления его в модель (запрос или, в вашем случае, сеанс из-за @SessionAttributes ({"голосования"})).

Ваш второй подход использует только ModelMap, поэтому он получает только атрибуты модели (из запроса или, в вашем случае, сеанса, в зависимости от аннотации @SessionAttributes).Этот подход не использует данные из отправленной формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...