Я смущен тем, как использовать @SessionAttributes
Я пытаюсь понять архитектуру Spring MVC. Однако я совершенно смущен поведением @SessionAttributes.
Пожалуйста, посмотрите на SampleController ниже, это метод обработки почты классом SuperForm. На самом деле, только класс класса SuperForm является обязательным, как я ожидал.
Однако после того, как я поставил @SessionAttributes в Controller, метод обработки является обязательным как SubAForm. Может кто-нибудь объяснить мне, что произошло в этой привязке.
-------------------------------------------------------
@Controller
@SessionAttributes("form")
@RequestMapping(value = "/sample")
public class SampleController {
@RequestMapping(method = RequestMethod.GET)
public String getCreateForm(Model model) {
model.addAttribute("form", new SubAForm());
return "sample/input";
}
@RequestMapping(method = RequestMethod.POST)
public String register(@ModelAttribute("form") SuperForm form, Model model) {
return "sample/input";
}
}
-------------------------------------------------------
public class SuperForm {
private Long superId;
public Long getSuperId() {
return superId;
}
public void setSuperId(Long superId) {
this.superId = superId;
}
}
-------------------------------------------------------
public class SubAForm extends SuperForm {
private Long subAId;
public Long getSubAId() {
return subAId;
}
public void setSubAId(Long subAId) {
this.subAId = subAId;
}
}
-------------------------------------------------------
<form:form modelAttribute="form" method="post">
<fieldset>
<legend>SUPER FIELD</legend>
<p>
SUPER ID:<form:input path="superId" />
</p>
</fieldset>
<fieldset>
<legend>SUB A FIELD</legend>
<p>
SUB A ID:<form:input path="subAId" />
</p>
</fieldset>
<p>
<input type="submit" value="register" />
</p>
</form:form>
Ответы
Ответ 1
При обработке запроса POST
Spring выполняет следующие действия:
-
Без @SessionAttributes
: Spring создает новый экземпляр SuperForm
(тип выводится из подписи register()
), заполняет его свойства значениями из полей формы и передает его в register()
.
-
С @SessionAttributes
: Spring получает экземпляр атрибута модели из сеанса (где он был помещен при обработке GET
из-за наличия @SessionAttributes
), обновляет его свойства по значениям из полей и передает его методу register()
.
То есть, с @SessionAttributes
, register()
получает тот же экземпляр объекта атрибута model, который был помещен в Model на getCreateForm()
.
Ответ 2
Добавляем к тому, что сказал @axtavt: предположим, что в getCreateForm
вы добавляете некоторые значения для раскрывающегося списка (списка или карты) или добавляете некоторые значения в форме, которые вы хотите использовать в методе регистрации, но вы не Не хочу, чтобы они показывались по форме (даже в скрытых областях). Теперь предположим, что ошибка произошла в методе register
, и вам нужно снова отобразить форму. Чтобы заполнить значения выпадающего списка и другие значения, которые вам понадобятся в следующем посте, вам придется их повторно заполнить в форме. @SessionAttribute
здесь используется как @axtavt, очень хорошо описанный выше.
Ответ 3
@Controller
@SessionAttributes("test")
public class Controller{
Customer customer;
public Controller() {
super();
customer = new Customer();
}
@ModelAttribute("test")
public Customer getCustomer() {
customer.setName("Savac");
return customer;
}
@RequestMapping({"/index"})
public ModelAndView showMainPage (@ModelAttribute("test") Customer customer, ModelMap model, method = RequestMethod.GET) {
//in the view you set the name
return new ModelAndView("index");
}
@RequestMapping(value = "customer/{customerID}", method = RequestMethod.GET)
public ModelAndView viewAdvice(@PathVariable("customerID") int customerID, @ModelAttribute("test") Customer customer, ModelMap model) {
customer.setName("AnotherName");
model.addAttribute("test", customer);
return new ModelAndView("customer");
}
}