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>
18
demandé sur zono 2011-02-06 18:05:52

3 réponses

Lors du traitement POST demande, le Printemps est le suivant:

  • Sans @SessionAttributes: Spring instanciates une nouvelle instance de SuperForm (le type est déduit de la signature de register()), popule ses propriétés par les valeurs des champs de forme et les passe à la register() méthode.

  • @SessionAttributes: Spring obtient une instance de l'attribut model de la session (où elle a été placée lors du traitement GET 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().

22
répondu axtavt 2017-01-24 06:26:51

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.

3
répondu Ritesh 2011-02-06 15:58:45
@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");
    }

}
0
répondu user1275645 2013-11-13 14:44:50