質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Q&A

解決済

1回答

2398閲覧

セッション管理について

naotaro0704

総合スコア19

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

1グッド

0クリップ

投稿2019/10/28 06:30

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>
A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/10/28 06:57

その「混ざってる」のはどのキーでしょうか。 キーが同じであればクリアしない限り保持し続けるのがセッションなので、要件が少しでも違うならキーを分ける必要があるかと思いますが
naotaro0704

2019/10/28 07:25

どこを見ればキーが同じかわかりますか?
m.ts10806

2019/10/28 07:27

ご自身が書かれたコード以外にはないですよ。 自身が書かれたので自身が最も理解しているはずですが、追いきらないのでしたらブレイクポイント張ってデバッグしてください。
guest

回答1

0

ベストアンサー

昨今のブラウザでは、別ウィンドウや別タブで開いたとしてもセッション情報(セッションクッキー)が共有されます。
どうしても別にしたい場合は、Chromeであればシークレットウィンドウを開きます。

投稿2019/10/28 07:46

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/10/28 07:52

よく別のブラウザやバージョンでマルチ確認するとかはありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問