gpt4 book ai didi

spring - Spring MVC-HttpSession.setAttribute和model.addObject之间的区别

转载 作者:行者123 更新时间:2023-12-04 13:33:02 26 4
gpt4 key购买 nike

我正在尝试最近学习Spring MVC。似乎我不太了解@ModelAttribute批注和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"));
}

ShoppingCart和count是 session 属性。

问题出在deleteFromCart方法中。我从 session 中获得 计数,在 session 中 重新分配,并在 session 中 覆盖。但是我 无法看到jsp计数的更新值。但是,可以看到更新的shoppingCart对象已更新,尽管我没有覆盖 session 对象(因为该对象是已经在 session 中的同一对象)。

但是为什么计数没有更新,尽管我用session.setAttribute覆盖了它?
当我将新的计数对象添加到模型中(model.addObject(“count”,count))时,我可以看到count的更新值。但是,为什么session.setAttribute没有给出相同的结果?

最佳答案

首先,@SessionAttribute不必使用http session 。它使用SessionAttributeStore可以将任何内容作为其后备存储。仅默认实现使用http session 。

您的代码无法按预期工作的原因在于@SessionAttribute的工作方式。

在调用 Controller 方法之前,从 session 中读取@SessionAttributes(在您的情况下为{"warenkorb", "count"})中列出的所有内容,并将其添加到模型中。

方法返回后,将使用该方法中已添加到模型中的所有内容更新 session 。

.addObject("count", count)

->计数被添加到模型中,然后添加到 session 中。
session.setAttribute("count", count)

-> count添加到 session 中,但不添加到模型中。在下一次调用任何 Controller 方法之前,它将被添加到模型中。但是到目前为止,该模型仍然具有旧的 count。而模型就是添加到请求中的内容。而且,如果可以在请求范围内找到属性,则jsp不会在乎 session 中的内容。

当您使用 @SessionAttributes@ModelAttribute(或通常的Spring MVC)时,请避免使用 HttpSessionHttpRequest。甚至 HttpResponse的使用也很有限。改用 Spring MVC的美丽:)

关于spring - Spring MVC-HttpSession.setAttribute和model.addObject之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com