我最近正在尝试学习 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 是会话属性。
问题出在 deleteFromCart 方法中。我从会话中获取计数,重新分配它并在会话中覆盖它。但是我在 jsp上看不到 count 的更新值。但是,可以看到更新后的 shoppingCart 对象已更新,尽管我没有覆盖会话对象(因为该对象与已经在会话中的对象相同)。
但是为什么计数没有更新,虽然我用 session.setAttribute 覆盖它?当我将新的计数对象添加到模型(model.addObject(“count”,count))时,我可以看到更新的计数值。但是为什么 session.setAttribute 没有给出相同的结果呢?