@ModelAttribute и @SessionAttribute в Spring - PullRequest
2 голосов
/ 01 апреля 2012

Как указано В спецификации Spring указано , @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
     }
}

Ответы [ 3 ]

1 голос
/ 16 апреля 2012

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

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

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

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

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

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

0 голосов
/ 13 апреля 2019

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

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

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

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

0 голосов
/ 23 декабря 2015

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

...