Spring MVC - difference between HttpSession.setAtt

2019-09-01 23:56发布

我想学习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"));
}

我的购物和计数是会话属性。

问题是在deleteFromCart方法。 我从会话重新分配和会话覆盖它。 但我不能看到计数的JSP的更新值 。 然而,更新ShoppingCart对象可以看到更新的,虽然我不覆盖会话对象(因为对象是已经在会议上同一个对象)。

但是,为什么计数不更新,虽然我用session.setAttribute覆盖它吗? 当我新的计数对象添加到模型(model.addObject(“计数”,计数)),那么我可以看到计数的更新值。 但是,为什么不session.setAttribute给予同样的结果?

Answer 1:

首先, @SessionAttribute不必使用HTTP会话。 它采用了SessionAttributeStore能有什么作为其后备存储。 只有默认实现使用HTTP会话。

之所以你的代码不作为如何预期谎言工作@SessionAttribute工作。

调用控制器方法之前 ,一切都在上市@SessionAttributes ,你的情况{"warenkorb", "count"}从会话读取并添加到模型中。

该方法返回后 ,会与已被添加到方法中的模型中的任何更新。

.addObject("count", count)

- >计数添加到模型中,事后的会话。

session.setAttribute("count", count)

- >计数添加到会话而不是模型。 它将任何控制器方法的下一次调用前加入到模型中。 但对于现在的模式仍然有老人count 。 该模型是什么被添加到该请求。 如果一个属性可以在请求范围中找到那么JSP并不关心什么了会议。

当您使用@SessionAttributes@ModelAttribute (或Spring MVC一般)尽量避免使用HttpSessionHttpRequest 。 即使HttpResponse存在一定的局限性。 怀抱美人Spring MVC ,而不是:)



Answer 2:

model.addObject把物体于该请求而范围HTTPsession.setAttribute它把到会话范围。 而且,由于JSP的变量都解决了下一个顺序:页面范围 - >请求范围 - > session范围 - >应用范围,你得到你所得到的。



Answer 3:

Java方法PARAMS由值传递。 您可以分配到这个paramateter任何yoou想要的方法中,但不会有它外面纽约的效果。 Insisde的方法,你要处理的帕拉姆副本



文章来源: Spring MVC - difference between HttpSession.setAttribute and model.addObject