webアプリケーションでのセッション管理について質問です。
localhostでオンラインショップを作成しています。@sessionAttributesアノテーションを使ってセッション管理しようとしているのですがうまくいきません。
希望する動作としては、
1、システムを起動させ、明細追加の動作を行う。
2、別ウィンドウでシステムを起動させ明細追加の動作を行う。このときに追加した商品を各ウィンドウで混ざらないようにする。
といった感じの動作です。
1つのウィンドウでは正常に動作するのですが別ウィンドウでの動作をしても追加した商品が混ざってしまっています。
ソースコードは以下のとおりです。
SalesSystemController.java
java
1@Controller 2@SessionAttributes(types = SalesForm.class) 3@RequestMapping(value = "/system") 4public class SalesSystemController { 5 6// private static final Logger logger = LoggerFactory.getLogger(SalesController.class); 7 8 /** Stringの定数としてINITを定義する。*/ 9 private static final String INIT = "init"; 10 /** Stringの定数としてADDを定義する。*/ 11 private static final String ADD = "add"; 12 /** Stringの定数としてFIXを定義する。*/ 13 private static final String FIX = "fix"; 14 /** 個数入力時のエラーメッセージを定義 */ 15 private static final String ERRMSG = "個数には1以上の数字を入力してください。"; 16 /** 商品追加の正常処理メッセージを定義 */ 17 private static final String ADDMSG = "明細に追加しました。"; 18 /** 商品登録の正常処理メッセージを定義 */ 19 private static final String FIXMSG = "以下のように売上登録しました。"; 20 /** 削除時の正常処理メッセージを定義 */ 21 private static final String DELMSG = "選択された明細行を削除しました。"; 22 /** 削除時のエラーメッセージを定義 */ 23 private static final String REMMSG = "明細行を選択してください。"; 24 25 /** 初期画面を呼び出す処理 */ 26 /** 27 * アノテーション情報として/startを受け入れる 28 * @param form 格納場所 29 * @param model 格納名 30 * @return 初期 31 */ 32 @RequestMapping(value = "/start") 33 /**SalesFormの引数をformに、Modelの引数をmodelに指定する。 */ 34 35 public String init(SalesForm form, Model model) { 36 37 /** 38 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。(プルダウンリスト) 39 */ 40 model.addAttribute("ItemList", RecordManager.getItemList()); 41 42// SalesForm.end(null); 43 return INIT; 44 } 45 46 /** 初期画面での明細追加押下時の処理 */ 47 48 /** 49 * 追加ボタンを押すとaddメソッドが実行される。 50 * @param form 格納場所 51 * @param result エラー情報 52 * @param model 格納名 53 * @return 追加 54 */ 55 @RequestMapping(params = "add") 56 public String add(@Valid @ModelAttribute("salesForm") SalesForm form, BindingResult result, Model model) { 57 58 /** POST:というメッセージを出力、formのquantityを取得 */ 59// logger.info("Post : " + form.getQuantity()); 60 61 /** 1の数字以外または未入力のときエラーとして処理 */ 62 if (result.hasErrors()) { 63 /** 64 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。(プルダウンリスト) 65 */ 66 model.addAttribute("ItemList", RecordManager.getItemList()); 67 /** 68 * ERRMSGをmessage1という名前でmodelに登録する。 69 */ 70 model.addAttribute("message1", ERRMSG); 71 /** 72 * 初期画面へ 73 */ 74 return INIT; 75 } 76 /** 1以上のとき正常処理 */ 77 else { 78 /** 79 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。(プルダウンリスト) 80 */ 81 model.addAttribute("ItemList", RecordManager.getItemList()); 82 /** 83 * RecordManagerのselectItemのidとquantityを取得し、selectListという名前でmodelに登録する。(売上明細) 84 */ 85 model.addAttribute("selectList", RecordManager.selectItem(form.getId(), form.getQuantity(), form.getPos())); 86 /** 87 * ADDMSGをmessage2という名前でmodelに登録する。 88 */ 89 model.addAttribute("message2", ADDMSG); 90 /** 91 * RecordManagerのtotalを取得しtotalという名前でmodelに登録する。(合計) 92 */ 93 model.addAttribute("total", RecordManager.getTotal()); 94 /** 95 * formに格納されているquantityとidを初期値に戻す。 96 */ 97 form.clear(); 98 /** 99 * 明細追加画面へ 100 */ 101 return ADD; 102 } 103 } 104 105 /** 明細追加画面での明細追加押下時の処理 */ 106 107 /** 108 * 追加ボタンを押すとaddメソッドが実行される。 109 * @param form 格納場所 110 * @param result エラー情報 111 * @param model 格納名 112 * @return 追加 113 */ 114 @RequestMapping(params = "addition") 115 public String additon(@Valid @ModelAttribute("salesForm") SalesForm form, BindingResult result, Model model) { 116 /** 117 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。(プルダウンリスト) 118 */ 119 model.addAttribute("ItemList", RecordManager.getItemList()); 120 121 /** 1の数字以外または未入力のときエラーとして処理 */ 122 if (result.hasErrors()) { 123 /** 124 * RecordManagerのselectListを取得し、selectListという名前でmodelに登録する。(売上明細) 125 */ 126 model.addAttribute("selectList", RecordManager.getSelectList()); 127 /** 128 * RecordManagerのtotalを取得しtotalという名前でmodelに登録する。(合計) 129 */ 130 model.addAttribute("total", RecordManager.getTotal()); 131 /** 132 * ERRMSGをmessage1という名前でmodelに登録する。 133 */ 134 model.addAttribute("message1", ERRMSG); 135 } 136 /** 1以上のとき正常処理 */ 137 else { 138//System.out.println(form.getPos() + " 追加 "); 139 140 /** 141 * RecordManagerのselectItemにidとquantityを格納する。(売上明細) 142 */ 143 model.addAttribute("selectList", RecordManager.selectItem(form.getId(), form.getQuantity(), form.getPos())); 144 /** 145 * RecordManagerのtotalを取得しtotalという名前でmodelに登録する。(合計) 146 */ 147 model.addAttribute("total", RecordManager.getTotal()); 148 /** 149 * ADDMSGをmessage2という名前でmodelに登録する。 150 */ 151 model.addAttribute("message2", ADDMSG); 152 /** 153 * formに格納されているquantityとidを初期値に戻す。 154 */ 155 form.clear(); 156 157 } 158 /** 159 * 明細追加画面へ 160 */ 161 return ADD; 162 } 163 164 165 166 167 168}
SalesForm.java
javapublic
1 private static final long serialVersionUID = 1L; 2 3 /** 商品id */ 4 private String id; 5 /** 商品名 */ 6 private String name; 7 /** 単価 */ 8 private int price; 9 /** 個数 */ 10 @NotNull 11 @Min(1) 12 private int quantity = 1; 13 /** 小計 */ 14 private int subtotal; 15 /** 順番 */ 16 private int pos; 17 18 19 /** quantity、id、posを振り直す処理 */ 20 public void clear() { 21 quantity = 1; 22 id = "A00101"; 23 pos = 0; 24 } 25 /** 26 * @param sessionStatus セッション 27 */ 28 public static void end(SessionStatus sessionStatus) { 29 sessionStatus.setComplete(); 30 } 31/* getterとsetterは省略しています*/ 32}
Recordmanager.java
java
1public final class RecordManager<selectList> { 2 3 /** 商品データ */ 4 /** listを定義 */ 5 private static List<Item> list = new ArrayList<>(); 6 /** slectListを定義 */ 7 private static List<Item> selectList = new ArrayList<>(); 8 /** totalを定義. */ 9 private static int total = 0; 10 /** posを定義. */ 11 private static int pos; 12 13 static { 14 list.add(new Item("A00101", "油性ボールペン", 60, 0, 0, 0)); 15 list.add(new Item("A00201", "極細ボールペン", 120, 0, 0, 0)); 16 list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0, 0)); 17 list.add(new Item("A00401", "シャープペンシル", 100, 0, 0, 0)); 18 list.add(new Item("A00501", "鉛筆H(1ダース)", 400, 0, 0, 0)); 19 20 } 21 22 /** 23 * 選択した商品を売上明細へ追加 24 * @param id 商品id 25 * @param quantity 個数 26 * @param pos 順番 27 * @return selectList 28 */ 29 public static List<Item> selectItem(String id, int quantity, int pos) { 30 /** int型iを定義しselectListの要素内で繰り返し処理 */ 31 for (int i = 0; i < list.size(); i++) { 32 /** 選択されたidとlistに格納されているidが一致したとき以下の処理を尾行う。 */ 33 if (id.equals(list.get(i).getId())) { 34 /** pos値を定義 */ 35 36 37 /** Itemを再定義 */ 38 Item item = new Item(id, list.get(i).getName(), list.get(i).getPrice(), quantity, 39 quantity * list.get(i).getPrice(), pos); 40 /** selectListにitemの値を追加する。 */ 41 selectList.add(item); 42 43 /** subtotalを定義 */ 44 int subtotal = quantity * list.get(i).getPrice(); 45 /** total算出 */ 46 total = total + subtotal; 47 for (int k = 0; k < selectList.size(); k++) { 48 /** selectListのpos値を振り直す。 */ 49 selectList.get(k).setPos(k); 50 } 51 break; 52 } 53 54 } 55 56 return selectList; 57 58 }
init.jsp
jsp
1<body> 2 <form:form modelAttribute="salesForm" action="/sales/system"> 3 4 <div class="header"> 5 <span class="titleName">直太郎オンラインショップ</span> 6 <div class="date" > 7 <% GregorianCalendar cal = new GregorianCalendar(); 8 SimpleDateFormat format = new SimpleDateFormat("yyyy年M月d日 E曜日"); 9 String datestr = format.format(cal.getTime()); 10 out.println(datestr); 11 %> 12 </div> 13 </div> 14 15 <div class="main"> 16 <div> 17 商品: 18 <form:select path="id"> 19 20 <form:options items="${ItemList}" itemValue="id" itemLabel="name" /> 21 </form:select> 22 <br /> 23 </div> 24 <div> 25 <span class="itemQuantity">個数:</span> 26 <form:input path="quantity" size="20" /> 27 </div> 28 </div> 29 30 <div class="footer"> 31 <input type="submit" name="add" value="明細追加" /> 32 </div> 33 <br> 34 <div class="message"> 35 <font color="#ff0000"> <c:out value="${message1}" /> 36 </font><font color="#1e90ff"> <c:out value="${message4}" /> 37 </font> 38 <br> 39 </div> 40 41 </form:form> 42</body>
回答1件
あなたの回答
tips
プレビュー