akc*_*soy 6 spring session-variables spring-mvc httpsession modelattribute
我最近正在努力学习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"));
}
Run Code Online (Sandbox Code Playgroud)
ShoppingCart和count是会话属性.
问题出在deleteFromCart方法中.我从会话中获取计数,重新分配它并在会话中覆盖它.但是我无法看到 jsp上count 的更新值.但是,可以看到更新的shoppingCart对象已更新,但我不会覆盖会话对象(因为该对象是已在会话中的同一对象).
但是为什么计数没有更新,尽管我用session.setAttribute覆盖它?当我将新的计数对象添加到模型(model.addObject("count",count))时,我可以看到更新的count值.但是为什么session.setAttribute没有给出相同的结果呢?
a b*_*ver 11
首先,@SessionAttribute不必使用http会话.它使用一个SessionAttributeStore可以作为其后备存储的东西.只有默认实现使用http会话.
您的代码无法按预期工作的原因在于如何@SessionAttribute工作.
在调用控制器方法之前@SessionAttributes,在您的情况下{"warenkorb", "count"},列出的所有内容都从会话中读取并添加到模型中.
方法返回后,将使用已添加到方法中的模型的所有内容更新会话.
.addObject("count", count)
Run Code Online (Sandbox Code Playgroud)
- > count添加到模型中,然后添加到会话中.
session.setAttribute("count", count)
Run Code Online (Sandbox Code Playgroud)
- > count添加到会话中但不添加到模型中.它将在下一次调用任何控制器方法之前添加到模型中.但至于现在这个模型还有旧的count.并且模型是添加到请求中的内容.如果可以在请求范围中找到属性,那么jsp不关心会话中的内容.
当您使用@SessionAttributes和@ModelAttribute(或一般的Spring MVC)时,请避免使用HttpSession或HttpRequest.即使HttpResponse用途有限.拥抱美丽Spring MVC而不是:)
| 归档时间: |
|
| 查看次数: |
11492 次 |
| 最近记录: |