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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

MVC

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

Java

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

Spring

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

Q&A

解決済

1回答

1799閲覧

tableにおける削除について。

naotaro0704

総合スコア19

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

MVC

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

Java

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

Spring

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

0グッド

1クリップ

投稿2019/09/12 05:42

編集2019/09/13 06:27

前提・実現したいこと

tableの行削除についてです。ラジオボタンで選択した行を削除させるようにしたいのですが、現在選択した行ではない行が削除されてしまっています。削除自体は実行されています。

該当のソースコード

SalesSystemController.java

java

1~中略~ 2 3if (RecordManager.getSelectList().size() > 0) { 4 /** 5 * RecordManagerのselectListを取得し、allListという名前でmodelに登録する。 6 */ 7 model.addAttribute("allList", RecordManager.getSelectList()); 8 /** 9 * RecordManagerにnameListを作成 nameListという名前でmodelに登録する。 10 */ 11 model.addAttribute("nameList", RecordManager.makeNameList()); 12 /** 13 * RecordManagerのtotalを取得しtotalという名前でmodelに登録する。 14 */ 15 model.addAttribute("total", RecordManager.getTotal()); 16 /** 17 * 明細追加画面へ 18 */ 19 return ADD; 20 } 21 /** 売上明細の残りが0件のときの処理 */ 22 else { 23 /** 24 * 初期画面へ 25 */ 26 return INIT; 27 }

RecordManager.java

java

1public final class RecordManager<selectList> { 2 3 /** 商品データ */ 4 private static List<Item> list = new ArrayList<>(); 5 private static List<Item> selectList = new ArrayList<>(); 6 private static Item item; 7 /** totalを定義 */ 8 private static int total = 0; 9 private static long salesId; 10 private static int pos; 11 12 static { 13 list.add(new Item("A00101", "油性ボールペン", 60, 0, 0)); 14 list.add(new Item("A00201", "極細ボールペン", 120, 0, 0)); 15 list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0)); 16 list.add(new Item("A00401", "シャープペンシル", 100, 0, 0)); 17 list.add(new Item("A00501", "鉛筆H(1ダース)", 400, 0, 0)); 18 list.add(new Item("B00101", "無線綴ノートA4", 100, 0, 0)); 19 list.add(new Item("B00201", "リングノートA4", 120, 0, 0)); 20 list.add(new Item("B00301", "領収書", 350, 0, 0)); 21 list.add(new Item("C00101", "はさみ(青)", 128, 0, 0)); 22 list.add(new Item("C00201", "ステープラー", 338, 0, 0)); 23 list.add(new Item("C00301", "2穴パンチ", 128, 0, 0)); 24 list.add(new Item("C00401", "ゼムクリップ", 98, 0, 0)); 25 list.add(new Item("C00501", "消しゴム", 58, 0, 0)); 26 } 27 28 /** 商品名 */ 29 public static List<Item> selectItem(String id, int quantity) { 30 31 for (int i = 0; i < list.size(); i++) { 32 33 if (id.equals(list.get(i).getId())) { 34 // System.out.println(i); 35 /** Itemを再定義 */ 36 Item item = new Item(id, list.get(i).getName(), list.get(i).getPrice(), quantity, 37 quantity * list.get(i).getPrice()); 38 39 selectList.add(item); 40 41 /** xを定義 */ 42 int subtotal = quantity * list.get(i).getPrice(); 43 total = total + subtotal; 44 45 break; 46 } 47 48 } 49 50 return selectList; 51 52 } 53 54 /** nameListの作成 */ 55 public static String[] makeNameList() { 56 String[] nameList = new String[list.size()]; 57 for (int i = 0; i < list.size(); i++) { 58 nameList[i] = (list.get(i)).getName(); 59 } 60 return nameList; 61 } 62 /** idListの作成 */ 63 public static String[] makeIdList() { 64 String[] idList = new String[list.size()]; 65 for (int i = 0; i < list.size(); i++) { 66 idList[i] = (list.get(i)).getId(); 67 } 68 return idList; 69 } 70 71 72 /** 選択した売上明細を削除 */ 73 public static void remove(int pos) { 74 /** 合計の更新 */ 75 total = total - selectList.get(pos).getSubtotal(); 76 System.out.println(pos); 77 selectList.remove(pos); 78 79 } 80 81 82 83 /** ↓getterとsetter */ 84 85 /** itemList取得 */ 86 public static List<Item> getItemList() { 87 return list; 88 } 89 90 /** itemLista設定 */ 91 public static void setItemList() { 92 /** 設定した[item」をlist内で検索する。 */ 93 list.set(list.indexOf(item), item); 94 } 95 96 /** 97 * @return selectList 98 */ 99 public static List<Item> getSelectList() { 100 return selectList; 101 } 102 103 /** 104 * @param selectList 105 * セットする selectList 106 */ 107 public static void setSelectList(List<Item> selectList) { 108 RecordManager.selectList = selectList; 109 } 110 111 112 /** 113 * @return pos 114 */ 115 public static int getPos() { 116 return pos; 117 } 118 119 /** 120 * @param pos 121 * セットする pos 122 */ 123 public static void setPos(int pos) { 124 RecordManager.pos = pos; 125 } 126 127} 128

add.jsp

jsp

1<body> 2 <form:form modelAttribute="salesForm" action="/sales/system"> 3 <div class="header"> 4 <span class="titleName">直太郎オンラインショップ</span> 5 <div class="date"><%=LocalDate.now()%></div> 6 </div> 7 <div class="main"> 8 <div> 9 商品: 10 <form:select path="id"> 11 12 <form:option path="id" value="${idList}" begin="1"/> 13 <form:options items="${nameList}"/> 14 15 </form:select> 16 17 <br /> 18 </div> 19 <div> 20 <span class="itemQuantity">点数:</span> 21 <form:input path="quantity" size="20" /> 22 </div> 23 24 <div class="add"> 25 <div> 26 <input type="submit" name="addition" value="明細追加" /> 27 </div> 28 </div> 29 </div> 30 31 <br> 32 <div class="message"> 33 <font color="#ff0000"> <c:out value="${message1}" /> 34 </font> 35 <font color="#1e90ff"> <c:out value="${message2}" /> 36 <font color="#1e90ff"> <c:out value="${message4}" /> 37 </font> 38 </font> 39 <font color="#ff0000"> <c:out value="${message5}" /> 40 </font> 41 </div> 42 <br> 43 44 45 46 <div class=""> 47 <span class="details">売上明細</span> 48 49 <table class="product"> 50 51 <tr> 52 <th>削除</th> 53 <th>商品ID</th> 54 <th>商品名</th> 55 <th>単価</th> 56 <th>点数</th> 57 <th>小計</th> 58 </tr> 59 <c:forEach items="${allList}" var="allList" varStatus="status" > 60 <tr> 61 <th class="itemradiobtn"> 62 <form:radiobutton path="name" name="pos" label="" value="${status.index}" /></th> 63 <th class="id">${allList.id}</th> 64 <th class="name">${allList.name}</th> 65 <th class="price">${allList.price}</th> 66 <th class="quantity">${allList.quantity}</th> 67 <th class="subtotal">${allList.subtotal}</th> 68 </tr> 69 </c:forEach> 70 </table> 71 </div> 72 73 <div class="total"> 74 合計: 75 <fmt:formatNumber groupingUsed="true"> 76 <c:out value="${total}" /> 77 </fmt:formatNumber> 7879 </div> 80 81 82 <div class="footer"> 83 84 <input type="submit" name="remove" value="削除" 85 onclick="remove_row(this)" /> <input type="submit" name="firm" 86 value="確定" /> 87 </div> 88 89 </form:form> 90 91</body>

試したこと

選択したラジオボタンの1つ上の行が削除されていたので、

public static void remove(int pos) { /** 合計の更新 */ total = total - selectList.get(pos+1).getSubtotal(); System.out.println(pos+1); selectList.remove(pos+1);

というふうにpos+1に変更してみました。

System.out.println(pos+1); ### 補足情報(FW/ツールのバージョンなど) clipse Java EE IDE for Web Developers. Version: Mars.2 Release (4.5.2) ローカルホストTomcat8

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

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

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

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

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

guest

回答1

0

ベストアンサー

htmlテーブル上の行番号とリストの行(添字)の扱いに差異があるのであれば、どちらかでプラマイするのは特に問題ないと思います。
が、そもそも論としてそのように小細工しなくて済むように見かけの行番号を渡すのではなく、idなどといった削除するデータを特定するキーを渡すべきです。
(そしてidをキーとした削除メソッドを呼ぶ)
例えば今後データとしてはあるが条件により非表示にする場合などで見かけの行と合わないことはいくらでも出てくることが予想されます。

投稿2019/09/17 01:02

S_kawa

総合スコア156

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

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

naotaro0704

2019/09/17 04:16

回答ありがとうございます。同じ商品でも別々に追加した場合は別で表示されるようにしています。 指摘していただいたやり方だと、同名の商品を一気に削除してしまうということが起こってしまいそうなのですが。。。
S_kawa

2019/09/17 07:46

その場合はlist化する時点でシーケンシャルな番号を振って、それを削除キーとすればいいのではないでしょうか? リストのビューとして特別な実装ではないので探せば色々とサンプルが見つかると思いますよ。
naotaro0704

2019/09/17 08:20

シーケンシャルな番号はvalue="${status.index}"で振ってあるということにはならないですかね。
tetutetu

2019/09/17 08:50

横からすみません >指摘していただいたやり方だと、同名の商品を一気に削除してしまうということが起こってしまいそうなのですが 被りが発生する可能性がある時点でIDの存在意義がないのではないでしょうか…?
S_kawa

2019/09/18 16:59

本業忙しく回答修正まではできませんが、解決へのヒントはコメント含め出尽くしていると思います。 >value="${status.index}"で振ってある これは不変ではないことに注意してください。どこかの要素を削除するとIndexが詰めなおされますね。 1つ削除してリストやビューを作り直して…という場合に問題なく思えますが例えばリストにチェックボックスを付けて2つ削除するとなったらどうなるでしょうか? シーケンシャルな番号という記載が紛らわしかったかもしれません、要するに画面上の行であるとかListのIndexであるとか、データを操作したら変わってしまうもの、扱うものでインデックスオリジンが違うものにすべきではないということです。 元の回答に記載したIDも別にアイテムのIDという意味ではなく、リストを作成した際にリスト用のIDを作ってくださいという意味でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問