Je ne sais pas comment utiliser @SessionAttributes
j'essaie de comprendre l'architecture du printemps MVC. Cependant, je suis complètement confus par le comportement de @SessionAttributes.
voir SampleController ci-dessous , c'est de la manipulation de la méthode post par SuperForm classe. En fait, juste le champ de la classe SuperForm est seulement liant comme je m'y attendais.
cependant, après avoir mis @SessionAttributes dans Controller, la méthode de manipulation se lie en tant que sous-forme. Quelqu'un peut-il m'expliquer ce qui s'est passé dans cette liaison.
-------------------------------------------------------
@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>
3 réponses
Lors du traitement POST
demande, le Printemps est le suivant:
Sans
@SessionAttributes
: Spring instanciates une nouvelle instance deSuperForm
(le type est déduit de la signature deregister()
), popule ses propriétés par les valeurs des champs de forme et les passe à laregister()
méthode.@SessionAttributes
: Spring obtient une instance de l'attribut model de la session (où elle a été placée lors du traitementGET
en raison de la présence de@SessionAttributes
), met à jour ses propriétés par les valeurs des champs from et les passe àregister()
méthode.
Qui est @SessionAttributes
,register()
obtient la même instance de l'attribut objet model qui a été placé dans le Model par getCreateForm()
.
ajoutant à ce que @axtavt a dit: Supposons, en getCreateForm
vous mettez des valeurs pour un drop-down( list ou map), ou vous mettez des valeurs dans la forme que vous voulez dans la méthode register mais vous ne voulez pas qu'elles apparaissent dans la forme (même pas dans les champs cachés). Supposons maintenant qu'une erreur se soit produite dans register
méthode et vous devez montrer le formulaire à nouveau. Pour peupler drop down valeurs et d'autres valeurs dont vous auriez besoin dans le prochain post, vous auriez à les repopuler dans la forme. @SessionAttribute
aide ici comme @axtavt très bien décrit ci-dessus.
@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");
}
}