2013-05-04 72 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

相關問題