6

最近、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 で同じ結果が得られないのでしょうか?

4

3 に答える 3

13

まず@SessionAttribute、http セッションを使用する必要はありません。SessionAttributeStoreバッキングストレージとして何でも持つことができる を使用します。デフォルトの実装のみが http セッションを使用します。

コードが期待どおりに機能しない理由は、その@SessionAttribute仕組みにあります。

コントローラー メソッドが呼び出される前に@SessionAttributes、あなたのケースでは にリストされているすべて{"warenkorb", "count"}がセッションから読み取られ、モデルに追加されます。

メソッドが返された後、メソッド内のモデルに追加されたすべてのものでセッションが更新されます。

.addObject("count", count)

-> カウントがモデルに追加され、その後セッションに追加されます。

session.setAttribute("count", count)

-> カウントはセッションに追加されますが、モデルには追加されません。これは、コントローラ メソッドの次の呼び出しの前にモデルに追加されます。しかし今のところ、モデルにはまだ古いcount. モデルはリクエストに追加されるものです。また、属性がリクエスト スコープで見つかる場合、jsp はセッションの内容を気にしません。

@SessionAttributesand @ModelAttribute(または Spring MVC 一般)を使用する場合は、 HttpSessionorの使用を避けてくださいHttpRequest。用途もHttpResponse限られています。Spring MVC代わりの美しさを受け入れてください:)

于 2013-05-05T20:35:56.530 に答える
0

Java メソッドのパラメーターは値で渡されます。このパラメーターには、メソッド内で必要なものを何でも割り当てることができますが、メソッド外では何の効果もありません。パラメータのコピーを扱っているメソッドの内側

于 2014-09-14T04:18:06.033 に答える