6
votes

Spring MVC - Différence entre httpsession.settattribute et modèle.addObject

J'essaie d'apprendre le printemps MVC récemment. Il semble que je ne comprenais pas bien les fonctionnalités de @modelattribute annotation et httpsession.

@SessionAttributes({"shoppingCart", "count"})
public class ItemController {

@ModelAttribute("shoppingCart")
public List<Item> createShoppingCart() {
    return new ArrayList<Item>();
}

@ModelAttribute("count")
public Integer createCount() {
    return 0;
}

@RequestMapping(value="/addToCart/{itemId}", method=RequestMethod.GET)
public ModelAndView addToCart(@PathVariable("itemId") Item item, 
        @ModelAttribute("shoppingCart") List<Item> shoppingCart, @ModelAttribute("count") Integer count) {

    if(item != null) {
        shoppingCart.add(item);
        count = count + 1;
    }

    return new ModelAndView(new RedirectView("showAllItems")).addObject("count", count);
}

@RequestMapping(value="/deleteFromCart/{itemId}", method=RequestMethod.GET)
public ModelAndView deleteFromCart(@PathVariable("itemId") Item item, 
        HttpSession session) {

    List<Item> list = (List<Item>) session.getAttribute("shoppingCart");
    list.remove(item);
    //session.setAttribute("shoppingCart", list);

    Integer count = (Integer) session.getAttribute("count");
    count = count - 1;
    session.setAttribute("count", count);

    return new ModelAndView(new RedirectView("showAllItems"));
}


0 commentaires

3 Réponses :


2
votes

modèle.addObject met l'objet à la portée de la requête tandis que httpsession.setatattribute le met à la portée de la session. Et puisque les variables sur JSP sont résolues sur la commande suivante: page Portée -> Demande de portée -> Portée de la session -> Champ d'application, vous obtenez ce que vous obtenez.


3 commentaires

Mais j'ai défini les deux attributs comme attributs de session ci-dessus avec @sessessattributes ({"warenkorb", "compter"}). Lorsque je écrase le nombre d'attributs avec session.setattribute ("Compte", compte), ne devrait-il pas modifier l'attribut avec la scène de la session? Peut-être que je n'aurais peut-être pas dû écrire la question comme "la différence entre Satattribute et AddObject", mais la différence entre 2 objets de session utilisées dans la méthode DELETEFROMBASKET, qui en résulte différentes manières (Warenkorb est mise à jour, le compte est toujours l'objet de numéros). .


Fuh, finalement résolu .. Changez votre méthode Signature sur Public ModelandView Deletefrombase (@pathvariable Entier Position, @modelattribute ("Warenkorb") Liste

Warenkorb, @modelattribute ("Compte") Compte entier, ModelMap ModelMap) et pour définir l'attribut dans la session DO: ModelMap.AdDaTribute ("Compte", --Count);


Lorsque je change la signature de méthode que vous écrivez, cela fonctionne, je sais :) Ma méthode AddtObasket fonctionne de la même manière. J'essayais simplement de comprendre le concept général, essayant d'utiliser différentes choses comme Httpsession, etc. Néanmoins, merci beaucoup.



13
votes

Tout d'abord, @sessaTtribute code> n'a pas à utiliser la session HTTP. Il utilise un sessionAttribuestore code> qui peut avoir quelque chose de stockage de support. Seule la mise en œuvre par défaut utilise la session HTTP.

La raison pour laquelle votre code ne fonctionne pas comme prévu réside dans la manière dont @sessaTtribute code> fonctionne. P>

avant une méthode de contrôleur est invoqué fort>, tout répertorié dans @sessessattributes code>, dans votre cas {"warenkorb", "comptez"} code> est lu à partir de la session et ajouté au modèle . P>

Une fois la méthode renvoyée forte> la session est mise à jour avec tout ce qui a été ajouté au modèle dans la méthode. P>

session.setAttribute("count", count)


1 commentaires

Donc en gros; Avant d'être invoqué une méthode de contrôleur, la session met à jour le modèle. Après la méthode, le modèle met à jour la session. Donc, le seul moment, lorsque le même attribut contenait à la fois en session et en modèle peut avoir différentes valeurs, dans la méthode du contrôleur. Merci beaucoup.



0
votes

Les paramètres de la méthode Java sont passés par des valeurs. Vous pouvez attribuer à ce paramatéter tout ce que vous voulez à l'intérieur de la méthode, mais il n'aura pas d'effet de NY en dehors de celui-ci. Insisde de la méthode que vous traitez avec la copie du param


0 commentaires