SpringBoot 買い物かご追加機能 セッションへの保存取得の記述方法

実現したいこと

以下のコントローラーで実行しています。
追加ボタンを押した際にはその情報をセッションで一時保存し、セッションから情報を取得する必要があります。
HTMLファイルは「list.html」一つで、すべて表示させる方法です。
現状では、リスト毎の表示になってしまい、必要な情報(商品名や在庫数など)を一つずつ分けて表示することが出来ていません。
そこで、リスト毎での保存取得ではなく、一つずつ保存取得できる方法に変更させる必要があるのでは?と考えたのですが、その記述方法がうまくいきません。
合わせてHTMLでの情報の呼び出し記述方法の例も教えていただきたいです。

発生している問題・分からないこと

買い物かごへの追加、一覧表示機能が実装できていない

該当のソースコード

SpringBoot

1@Controller 2//@SessionAttributes(names = "basketMap") 3public class ClientBasketController { 4 5 // 商品情報 6 @Autowired 7 ItemRepository itemRepository; 8 9 // セッション 10 @Autowired 11 HttpSession session; 12 13 @Autowired 14 private EntityManagerFactory emf; 15  /** 16 * 買い物かご一覧画面表示 処理 17 * (ナビゲーションバー「買い物かご」押下) 18 * 19 * @return "client/basket/list" 買い物かご一覧へ 20 */ 21 @RequestMapping(value = "/client/basket/list", method = RequestMethod.GET) 22 public String list() { 23 // セッションから買い物かごリストを取得 24 List<BasketBean> basketList = (List<BasketBean>) session.getAttribute("basketList"); 25 // 買い物かごリストが空の場合は、空のリストを生成 26 if (basketList == null) { 27 basketList = new ArrayList<>(); 28 } 29 // 商品情報を取得 30 List<Item> items = new ArrayList<>(); 31 for (BasketBean basketBean : basketList) { 32 EntityManager em = emf.createEntityManager(); 33 Item item = em.find(Item.class, basketBean.getId()); 34 items.add(item); 35 em.close(); 36 } 37 // 買い物かご情報をセッションにセット 38 session.setAttribute("basketList", basketList); 39 session.setAttribute("items", items); 40 // 買い物かご一覧画面へ遷移 41 return "client/basket/list"; 42 } 43 44 /** 45 * 買い物かご追加処理 46 * 商品詳細画面「買い物かごへ追加」ボタン押下処理 47 * 48 * @return リダイレクト"client/basket/list"買い物かご一覧画面へ 49 */ 50 @RequestMapping(path = "/client/basket/add", method = RequestMethod.POST) 51 public String addItemToBasket(Integer id, String name, Integer stock, Integer orderNum) { 52 // 新しいBasketBeanオブジェクトを作成 53 BasketBean basketBean = new BasketBean(id, name, stock, orderNum); 54 55 // セッションに買い物かごが既にあるか確認 56 List<BasketBean> basketList = (List<BasketBean>) session.getAttribute("basketList"); 57 if (basketList == null) { 58 // 買い物かごがない場合、新しいリストを作成し、そこに追加 59 basketList = new ArrayList<>(); 60 } 61 62 // 作成したBasketBeanをセッションに追加 63 basketList.add(basketBean); 64 // セッションに更新された買い物かごリストを格納 65 session.setAttribute("basketList", basketList); 66 67 // 買い物かご一覧画面にリダイレクト 68 return "client/basket/list"; 69 }

試したこと・調べたこと

上記の詳細・結果

ソースコードを以下のようにリスト型からマップ型へ変更したところ、セッションへの取得判断(画面表示)ができていないような結果となりました。

~略~
/**
* 買い物かご一覧画面表示 処理
* (ナビゲーションバー「買い物かご」押下)
*
* @return "client/basket/list" 買い物かご一覧へ
*/
@RequestMapping(value = "/client/basket/list", method = RequestMethod.GET)
public String list(Model model) {
// セッションから買い物かごマップを取得
Map<Integer, BasketBean> basketMap = (Map<Integer, BasketBean>) session.getAttribute("basketMap");
// 買い物かごマップが空の場合は、空のマップを生成
if (basketMap == null) {
basketMap = new HashMap<>();
}
// 商品情報を取得
List<Item> items = new ArrayList<>();
for (Map.Entry<Integer, BasketBean> entry : basketMap.entrySet()) {
Integer itemId = entry.getKey();
BasketBean basketBean = entry.getValue();
if (itemId != null) { // itemIdがnullでないことを確認
EntityManager em = emf.createEntityManager();
Item item = em.find(Item.class, itemId);
if (item != null) { // itemがnullでないことを確認
items.add(item);
}
em.close();
}
}
model.addAttribute("items",items);

// 買い物かご一覧画面へ遷移 return "client/basket/list"; } @RequestMapping(path = "/client/basket/add", method = RequestMethod.POST) public String addItemToBasket(Integer id, String name, Integer stock, Integer orderNum, Model model) { // セッションから買い物かごを取得 Map<Integer, BasketBean> basketMap = (Map<Integer, BasketBean>) session.getAttribute("basketMap"); if (basketMap == null) { basketMap = new HashMap<>(); } // 買い物かごに商品を追加 BasketBean basketBean = new BasketBean(id, name, stock, orderNum); // 商品情報を作成 basketMap.put(id, basketBean); // 商品IDをキーとしてマップに追加 // セッションに買い物かごを保存 session.setAttribute("basketMap", basketMap); // 商品情報を取得 List<Item> items = new ArrayList<>(); for (Map.Entry<Integer, BasketBean> entry : basketMap.entrySet()) { Integer itemId = entry.getKey(); BasketBean bean = entry.getValue(); if (itemId != null) { EntityManager em = emf.createEntityManager(); Item item = em.find(Item.class, itemId); items.add(item); em.close(); } } // セッションに商品リストを保存 model.addAttribute("items", new HashMap<Integer, BasketBean>()); return "redirect:/client/basket/list"; }

補足

特になし

コメントを投稿

0 コメント