Spring 3 MVC: объект поддержки должен быть в сессии?Как я могу избежать этого? - PullRequest
1 голос
/ 14 ноября 2011

Я прочитал несколько руководств о формах и подаче в Spring 3 MVC. Все эти примеры показывают, что хранение объекта поддержки в сеансе выполняется следующим образом:

@ SessionAttributes ({ "команда"})

Я использовал старые версии Spring, в которых есть метод formBacking, если контроллер наследует SimpleFormController.

Защищенный объект formBackingObject (запрос HttpServletRequest)

Если я правильно понимаю, старый подход к версии загружает объект поддержки формы на лету, когда форма отправляется, и нет необходимости хранить этот объект в сеансе.

Если мое представление о Spring 3 MVC правильное, то мне не нравится сессионный подход, поскольку он требует много памяти в случае больших пользователей, а объект, сохраненный в сеансе, может быть устаревшим на момент отправки формы.

Можно ли избежать сохранения объекта поддержки формы в сеансе в MVC Spring 3? Есть указатель?

Спасибо за любой вклад и, пожалуйста, поправьте меня, если я ошибаюсь.

Привет.


Кто-нибудь еще знает, верно ли мое понимание?

GET-контроллер, добавляющий объект в модель, равносилен добавлению его в сеанс. Как Spring может помнить объект как вспомогательный объект при отправке формы? Приветствия.

Как объект поддержки формы, добавленный к модели в контроллере GET, может выдержать двустороннюю передачу между сервером и клиентом при отправке формы? Spring сериализует его на диске? Я предполагаю ...

Спасибо за любой вклад!

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Если вы просто не перечислите свою команду среди @SessionAttributes, она будет создаваться каждый раз.

В старом API контроллеров реализации могли решать, хотят ли они сохранить свои объекты команд в сеансе: см. AbstractFormController.isSessionForm(). SimpleFormController вернул false, в то время как AbstractWizardFormController вернул true, поскольку фактически требовалось, чтобы команда была сохранена в сеансе.

Вы можете проверить, как атрибут модели связан в приватном методе HandlerMethodInvoker.resolveModelAttribute(...):

if (implicitModel.containsKey(name)) {
    // ...
} else if (this.methodResolver.isSessionAttribute(name, paramType)) {
    // ...
else {
    bindObject = BeanUtils.instantiateClass(paramType);
}

Очевидно, что механизм связывания будет использовать свежий экземпляр, если вы явно не объявите его как атрибут сеанса; точно так же, как возвращение false из AbstractFormController.isSessionForm().


Как объект поддержки формы, добавленный к модели в контроллере GET, может выдержать двустороннюю передачу между сервером и клиентом при отправке формы? Spring сериализует его на диске? Я предполагаю ...

Spring (не всегда) не нужно хранить объект поддержки между представлением формы и отправкой формы. Если все, что вам нужно для заполнения вашего командного объекта, поставляется с запросом, Spring может просто создать новый командный объект (либо сам, либо позволить вам сделать это, если вы предоставите правильный метод), а затем связать запрос с этим свежим экземпляром.

См. Выше сравнение со старым API относительно различий между реализациями SimpleFormController и AbstractWizardFormController. Первому не нужно ничего хранить в сеансе, и он будет связывать запрос на отправку с вновь созданным объектом. С новыми аннотированными обработчиками поток такой же; если вы не хотите хранить его, он будет воссоздан при отправке: BeanUtils.instantiateClass(...) или по вашему собственному заводскому методу.

1 голос
/ 14 ноября 2011

Вам необходимо добавить объект поддержки в модель, а не в сеанс. Вот один урок ... http://www.roseindia.net/tutorial/spring/spring3/web/spring-3-mvc-form-example.html

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