Spring MVC SessionAttributes与ModelAttribute一起使用

时间:2013-05-04 10:10:49

标签: spring session spring-mvc controller modelattribute

我最近正在尝试学习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列出所有项目。 Wenn用户点击“addToCart”获取特定项目,此项目将被添加到shoppingCart列表中。我最好先解释一下我对这个控制器的理解,你可以告诉我我没有得到的东西。

第一次调用ItemController时,将执行createShoppingCart和createCount方法,返回参数将以名称“shoppingCart”和“count”保存在会话中。当用户调用url“... / addToCart / 1”时,将调用addToCart方法。由于我需要来自会话的方法签名2值,控制器将在会话中查看值是否已存在。是的,它们是..此时shoppingCart是一个空列表,count为0.在方法体中,所选项目将被添加到列表中,count将为2.将再次显示jsp。

问题是,jsp可以看到shoppingCart列表现在不是空的。但是计数仍为0.当我将项目添加到购物篮时,我可以在jsp上看到shoppingCart已经填充了项目,但count的值始终为0.

实际上shoppingCart和count对象之间没有任何区别..我不明白它为什么会这样。我首先怀疑计数类型是原始int,然后我将其改为Integer typ,但问题仍未解决。

1 个答案:

答案 0 :(得分:1)

您没有更改 count(实际上您不能),您已分配给它。所以模型仍然指向旧的价值。您必须手动添加新值。

myModelAndView.add("count", count);

但是如果你能使用count,为什么还要为warenkorb.size而烦恼?