@ModelAttribute и @SessionAttribute в Spring

Как Spring Specification сказал, @ModelAttribute будет выполняться перед обработчиком сопоставления, а @SessionAttribute сохранит атрибут модели в сеансе.

Рассмотрим сценарий ниже: bean-компонент формы создается после вызова контроллера и также устанавливается как атрибут сеанса. В следующий раз, когда вызывается MenuController, createForm () будет выполнен снова и создаст еще один новый компонент формы. Мой вопрос: будет ли этот последний созданный bean-компонент формы быть установлен как атрибут сеанса? и какой компонент формы будет привязан к параметру в методе bookList ()?

Надеюсь, вы, ребята, сможете помочь. Спасибо.

@Controller
@RequestMapping("/store")
@SessionAttribute("form")
public class MenuController {
     @ModelAttribute("form")
     public Form createForm() {
     return new Form();
     }

     @RqeustMapping("/book")
     public String bookList(@ModelAttribute("form") Form form){
     //processing the form
     }
}

person user1105456    schedule 31.03.2012    source источник
comment
boraji.com/spring-mvc-4-sessionattributes-example   -  person Jafar Mirzaei    schedule 13.02.2020


Ответы (3)


Помните, что ваше отображение является обобщенным. Он будет отображаться как в метод GET, так и в метод POST.

Если отображение вашего запроса является методом GET,

Атрибут сеанса будет содержать значение @ModelAttribute («форма») из метода createForm.

Если форма атрибута возвращается из запроса POST,

Атрибут сеанса переопределит атрибут @Model из метода createForm.

Полезно помнить, что @ModelAttribute будет выполняться перед обработчиком сопоставления.

person nwolisa    schedule 16.04.2012

Когда метод bookList вызывается в первый раз в данном сеансе, тогда вызывается метод с @ModelAttribute('form), возвращаемое значение (объект формы) заполняется в HttpSession и вызывается метод bookList с тем же объектом формы.

Для последующих запросов в том же HttpSession Spring извлекает тот же объект Form из сеанса и не вызывает метод с @ModelAttribute('form') снова до конца сеанса.

После каждого завершения вызова метода bookList Spring сохраняет обновленную версию объекта Form в HttpSession.

Если вы используете Spring Boot 2.x, вы можете отлаживать DefaultSessionAttributeStore # retrieveAttribute, чтобы понять это поведение.

person Eugene Maysyuk    schedule 13.04.2019

атрибут sessionAttribute указывает, что «форма» будет сохранена в сеансе. не означает, что "форма" извлекается из сеанса.

person shawn    schedule 23.12.2015
comment
Атрибут @SessionAttribute указывает, что экземпляр объекта Form будет сохранен в сеансе после завершения вызова createForm И ПОЛУЧАЕТСЯ из сеанса каждый раз, когда контроллер получает запрос GET или POST. - person Eugene Maysyuk; 13.04.2019