前提・実現したいこと
閲覧いただきありがとうございます。
SpringMVCフレームワークを使用しています
JavaEEを使用してウェブショッピングサイトのようなものを作成しています。
画面は初期画面(init.jsp)と明細追加画面(add.jsp)と確認画面(質問には直接関係ありません)があり、今回初期画面と明細追加画面の動作が思った通りにならないため質問させていただきました。長文になりますがどうかよろしくお願いいたします。
希望する動作としては以下の通りです。
1.初期画面に「商品」プルダウン、「点数」テキストボックス、[明細追加]ボタンを設置。
2..「商品」プルダウンで商品を選び、「点数」テキストボックスに購入したい数を記入し[明細追加]ボタンを押下する。
3.明細追加画面に遷移する。
4.明細追加画面には初期画面同様「商品」リスト、「点数」テキストボックス、[明細追加]ボタンがあり、下部に売上明細スペースが表記される。
5.売上明細スペースには「商品 ID」「商品名」「単価」「点数」「小計」を表示する。
6..明細追加画面の「商品」リスト、「点数」テキストボックスに初期画面と同様の操作をし「明細追加」ボタンを押下すると、売上明細スペースにその情報が追加される。
以上の5~6が今回の質問箇所の動作概要になります。
時間をかけても日時が経っていくばかりなので、皆様の協力を得たいと考えこの度質問いたしました。
不明箇所・失礼な箇所がありましたらどうぞご指摘ください。
発生している問題・エラーメッセージ
問題1.売上明細スペースの「商品 ID」「商品名」「単価」が表示されるが「点数」及び「小計」が0と表記されます。
1.Manager.javaで「商品名」を引数として「商品 ID」「商品名」「単価」データを受け取っているのは確認できました。
2.「点数」データはformで取得できていました。
3.「点数」及び「小計」はデフォルトデータでは0であり、そのデータをそのまま拾ってきています。
希望する動作:「点数」と「小計」のデータを加えて表記したいです。どのように処理を行えばデータを加えることができるでしょうか。
問題2.明細追加画面の「商品」リスト、「点数」テキストボックスに初期画面と同様の操作をし「明細追加」ボタンを押下すると例外がなげられるます。
1.getNameで名前が前回の分までセットされている。(例:初期画面で「ボールペン」を選択し、明細追加画面で「消しゴム」を選択し明細追加画面で「明細追加」ボタンを押下した場合、「消しゴム、ボールペン」で名前が取得されてしまうため例外となります。
希望する動作:.上記の例で行くと消しゴムだけを取得したいです。
該当のソースコード
Manager.javaの一部
public final class Manager {
/** 商品データ */
private static List<Item> list = new ArrayList<>();
private static List<Item> selectList = new ArrayList<>();
private static Item item;
static {
list.add(new Item("X10100", "ボールペン", 90, 0, 0));
list.add(new Item("X20100", "タッチペン", 120, 0, 0));
list.add(new Item("X30100", "消しゴム",80, 0, 0));
}
public static List<Item> selectProduct(String name) {
Item item = new Item("",name,0,0,0);
selectList.add(list.get(list.indexOf(item)));
return selectList;
}
public static String[] makeNameList() {
String[] nameList = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
nameList[i] = (list.get(i)).getName();
}
return nameList;
}
public static List<Item> getItemList() {
return list;
}
public static void setItemList() {
list.set(list.indexOf(item), item);
}
}
Item.javaの一部
/** 商品id */
private String id;
/** 商品名 */
private String name;
/** 単価 */
private int price;
/** 個数 */
private int quantity;
/** 小計 */
private int subtotal;
以下、上記のコンストラクタとgetterとsetterがあります
ShopForm.javaの一部
/** 商品id */
private String id;
/** 商品名 */
private String name;
/** 単価 */
private int price;
/** 個数 */
private int quantity;
/** 小計 */
private int subtotal;
以下、上記のコンストラクタとgetterとsetterがあります。
ShopSystemController.java
@Controller
@RequestMapping(value = "/system")
public class ShopSystemController {
private static final String INIT = "init";
private static final String ADD = "add";
private String message;
@RequestMapping(value = "/start")
public String init(ShopForm form, Model model) {
model.addAttribute("allList", Manager.getItemList());
model.addAttribute("message", message);
model.addAttribute("nameList", Manager.makeNameList());
return INIT;
}
/**
* 初期画面から呼ばれる。
* @param form フォームオブジェクト
* @param model モデルオブジェクト
* @return Viewとしてadd.jspを指定
*/
@RequestMapping(params = ADD)
public String add(ShopForm form, BindingResult result, Model model){
model.addAttribute("allList", Manager.selectProduct(form.getName()));
model.addAttribute("nameList", Manager.makeNameList());
model.addAttribute("message", "明細追加完了");
return ADD;
}
}
init.jspのbody部
<body>
<form:form modelAttribute="salesForm" action="/sales/system">
商品:<form:select path="name" items="${nameList}" /><br/>
点数:<form:input path="quantity" value = "1"/><br/>
<input type="submit" name="add" value="明細追加" />
</form:form><br/>
<div class="message">
<c:out value="${message}" />
<form:errors path="id" />
</div>
</body>
add.jspのbody部
<body>
<form:form modelAttribute="salesForm" action="/sales/system">
商品:<form:select path="name" items="${nameList}" /><br/>
<div>
<span>点数:</span><form:input path="quantity" value = "1"/>
</div><br/>
<input type="submit" name="add" value="明細追加" /><br/>
<div class="message"><c:out value="${message}" /><br/>
<form:hidden path="name" />
<table>
<tr><th>削除</th><th>商品ID</th><th>商品名</th><th>単価</th><th>点数</th><th>小計</th></tr>
<c:forEach items="${allList}" var="list">
<tr>
<td>${list.id}</span></td>
<td>${list.name}</td>
<td>${list.price}</td>
<td>${list.quantity}</td>
<td>${list.subtotal}</td>
</tr>
</c:forEach>
</table>
<div class = "btnFild">
<input type="submit" name="remove" value="削除" /> //この件は大丈夫です
<input type="submit" name="firm" value="確定" /> //この件も大丈夫です
</div>
</form:form>
</body>
試したこと
問題1 既述通りですが.「点数」データはformに渡せているのは確認できました。
selectProductに.「点数」データを渡して、試行錯誤したのですがうまくいきませんでした。
問題2 何故、2つ取れてしまっているかわからないため対処できませんでした。
補足情報(FW/ツールのバージョンなど)
構築環境:Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)
ローカルホストTomcat8
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
rarara
2018/03/11 23:02 編集
全部読めてないのですが気になったところ→【1】これSpringMVCフレームワークを使ってますよね?最初に書いたほうが良いです。【2】Managerクラス内のメンバ変数にstatic付いてますが、webアプリケーションの特にユーザによって頻繁に変更される変数でやっちゃうと「Aさんが変更した内容がBさんに反映される」なんてことが起きるのでstaticつけるところは見極めないとだめですよ。【3】コードを質問文に書く時は、入力欄の上のアイコンから</>っての選択して、読む人に読みやすい形にしましょう。インデントもちゃんとしましょう。
kakudeath
2018/03/11 23:50
コードの書式など必要なことは調べておくべきでした。staticの方については少し考えます。ご丁寧にありがとうございます。
A-pZ
2018/03/27 14:22
商品を選択した個数に応じた小計を計算している箇所がないようです。