ModelMap.AdDaTribute ("Compte", --Count); Code>
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")); }
3 Réponses :
modèle.addObject code> met l'objet à la portée de la requête tandis que
httpsession.setatattribute code> 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. P>
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
ModelMap.AdDaTribute ("Compte", --Count); Code>
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.
Tout d'abord, La raison pour laquelle votre code ne fonctionne pas comme prévu réside dans la manière dont avant une méthode de contrôleur est invoqué fort>, tout répertorié dans 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> @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.
@sessaTtribute code> fonctionne. P>
@sessessattributes code>, dans votre cas
{"warenkorb", "comptez"} code> est lu à partir de la session et ajouté au modèle . P>
session.setAttribute("count", count)
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.
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 p>