最近、Spring MVC を学ぼうとしています。@ModelAttribute アノテーションと HttpSession の機能がよくわからなかったようです。
@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 + 1;
}
return new ModelAndView(new RedirectView("showAllItems")).addObject("count", count);
}
@RequestMapping(value="/deleteFromCart/{itemId}", method=RequestMethod.GET)
public ModelAndView deleteFromCart(@PathVariable("itemId") Item item,
HttpSession session) {
List<Item> list = (List<Item>) session.getAttribute("shoppingCart");
list.remove(item);
//session.setAttribute("shoppingCart", list);
Integer count = (Integer) session.getAttribute("count");
count = count - 1;
session.setAttribute("count", count);
return new ModelAndView(new RedirectView("showAllItems"));
}
ShoppingCart と count はセッション属性です。
問題は deleteFromCart メソッドにあります。セッションからカウントを取得し、再割り当てしてセッションで上書きします。しかし、jsp の countの更新された値が表示されません。ただし、更新された shoppingCart オブジェクトは更新されていることがわかりますが、セッション オブジェクトを上書きしません (オブジェクトは既にセッションにあるオブジェクトと同じであるため)。
しかし、session.setAttribute で上書きしてもカウントが更新されないのはなぜですか? 新しいカウント オブジェクトをモデル (model.addObject("count", count)) に追加すると、カウントの更新された値が表示されます。しかし、なぜ session.setAttribute で同じ結果が得られないのでしょうか?