4

最近、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 があります。ユーザーが特定のアイテムの「addToCart」をクリックすると、このアイテムが shoppingCart リストに追加されます。最初に、このコントローラーについての私の理解をよりよく説明します。何が得られないか教えてください。

ItemController が最初に呼び出されると、createShoppingCart メソッドと createCount メソッドが実行され、戻りパラメータが「shoppingCart」および「count」という名前でセッションに保存されます。ユーザーが「.../addToCart/1」という URL を呼び出すと、addToCart メソッドが呼び出されます。セッションからのメソッドシグネチャ2の値が必要なので、コントローラーはセッションで値が既に存在するかどうかを調べます。はい、そうです.. このとき、shoppingCart は空リストで、count は 0 です。メソッド本体では、選択された項目がリストに追加され、count は 2 になります。jsp が再び表示されます。

問題は、リスト shoppingCart が空ではないことを jsp が確認できることです。しかし、カウントはまだ 0 です。アイテムをバスケットに追加すると、shoppingCart がアイテムで満たされていることを jsp で確認できますが、カウントの値は常に 0 です。

実際、shoppingCart オブジェクトと count オブジェクトの間に違いはありません。なぜこのように動作するのかわかりません。最初はカウント型がプリミティブ int ではないかと疑い、それから Integer typ に変更しましたが、それでも問題は解決しません。

4

1 に答える 1