2013-05-04 71 views
3

我想学习Spring MVC最近。看起来我并没有很好地理解@SessionAttributes和@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

你不要更改count(你实际上不能),你分配给它。所以这个模型仍然指向旧的价值。您将不得不手动添加新值。

myModelAndView.add("count", count); 

但为什么与count困扰,如果你可以使用warenkorb.size呢?

+0

我不再在model中添加warenkorb对象。但它有效?有什么不同? (顺便说一句,它不是关于功能..我只是尝试了一些不同的东西学习..当然warenkorb.size作品也 – akcasoy 2013-05-04 10:44:02

+0

你的意思是这样的:warenkorb.add(item)不改变会话中的对象,它只是操纵对象的属性。但是在会话中仍然存在相同的对象,因此我们不需要再次将warenkorb添加到模型中。但count = count + 2正在改变对象的整数计数。所以新的对象必须添加到会话中? – akcasoy 2013-05-04 10:47:50

+0

@Cimbom听起来像你得到它:) – zeroflagL 2013-05-04 11:53:40

相关问题