我最近在学习Spring MVC。似乎我没有很好地理解@SessionAttributes和@ModelAttribute注释的功能。
这是我的控制器的一部分:
@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 + 2;
}
return new ModelAndView(new RedirectView("showAllItems"));
}
基本上有一个JSP列出所有的项目。当用户点击“addToCart”时,特定项目将被添加到购物车列表中。首先我会解释一下这个控制器的理解,你可以告诉我我不明白的地方。
当第一次调用ItemController时,将执行createShoppingCart和createCount方法,并将返回参数保存在名称为“shoppingCart”和“count”的会话中。当用户调用url“... / addToCart / 1”时,将调用addToCart方法。由于在方法签名中需要从会话中获取2个值,控制器将查看会话是否已经存在这些值。是的,它们是......此时shoppingCart是一个空列表,计数为0。在方法体中,选定的项目将被添加到列表中,计数将变为2。JSP将再次显示。
问题是,JSP可以看到购物车列表现在不为空。但是计数仍然为0。当我将商品添加到购物篮中时,我可以在JSP上看到购物车已填充了商品,但计数的值始终为0。
实际上,购物车(shoppingCart)和计数(count)对象没有任何区别......我不明白为什么它会表现得像这样。我最初怀疑计数类型是原始int,然后我将其更改为Integer类型,但问题仍未解决。