Spring MVC中使用ModelAttribute的SessionAttributes

4

我最近在学习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类型,但问题仍未解决。
1个回答

1
您不能更改count(实际上是不可能的),只能对其进行赋值。因此,模型仍然指向旧值。您需要手动添加新值。
myModelAndView.add("count", count);

但如果您可以使用warenkorb.size,为什么还要麻烦使用count呢?


我没有再次将warenkorb对象添加到模型中。但它仍然有效?有什么区别吗?(顺便说一句,这不是关于功能的问题...我只是尝试了一些不同的东西来学习...当然warenkorb.size也可以工作) - akcasoy
你的意思是:warenkorb.add(item) 不会改变 session 中的对象,它只是操作对象的一个属性。但是在 session 中仍然存在相同的对象,因此我们不必再次将 warenkorb 添加到模型中。但是 count = count + 2 改变了 Integer count 对象。所以新对象必须添加到 session 中吗? - akcasoy
@Cimbom 听起来你已经搞定了 :) - a better oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接