🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java EE

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

JSP

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

MVC

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

Java

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

1回答

2501閲覧

予期せぬ削除処理が行われてしまう

naotaro0704

総合スコア19

Java EE

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

JSP

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

MVC

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

Java

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2019/09/20 04:15

前提・実現したいこと

javaでの削除処理についてです。
今現在ラジオボタンを選択したときの削除処理辞退は行われています。しかしラジオボタンを選択していないときに削除処理を行っても削除処理が行われています。選択してないときに削除処理させないようにしたいです。

該当のソースコード

SalesController.java

java

1 2@Controller 3@RequestMapping(value = "/system") 4public class SalesSystemController { 5 6 ~中略~ 7 8 /** 明細追加画面での削除押下時の処理 */ 9 @RequestMapping(params = "remove") 10 public String remove(SalesForm form, BindingResult result, Model model) { 11 12 /** 13 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。 14 */ 15 model.addAttribute("ItemList", RecordManager.getItemList()); 16 /** 17 * formのquantityを取得し、addDataという名前でmodelに登録する。 18 */ 19 model.addAttribute("addData", form.getQuantity()); 20 21 /** 削除処理 */ 22 23 System.out.println(form.getPos()); 24 /** 25 * RecordManaagerのremoveメソッドを実行させる。 26 */ 27 RecordManager.remove(form.getPos()); 28 29 /** 商品の残りの数による条件分岐 */ 30 31 /** 売上明細の残りが1件以上の処理 */ 32 if (RecordManager.getSelectList().size() > 0) { 33 /** 34 * DELETEをmessage4という名前でmodelに登録する 35 */ 36 model.addAttribute("message4", DELMSG); 37 /** 38 * RecordManagerのselectListを取得し、allListという名前でmodelに登録する。(売上明細) 39 */ 40 model.addAttribute("allList", RecordManager.getSelectList()); 41 /** 42 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。 43 */ 44 model.addAttribute("ItemList", RecordManager.getItemList()); 45 /** 46 * RecordManagerのtotalを取得しtotalという名前でmodelに登録する。(合計) 47 */ 48 model.addAttribute("total", RecordManager.getTotal()); 49 /** 50 * 明細追加画面へ 51 */ 52 return ADD; 53 } 54 /** 売上明細の残りが0件のときの処理 */ 55 else { 56 /** 57 * DELETEをmessage4という名前でmodelに登録する 58 */ 59 model.addAttribute("message4", DELMSG); 60 /** 61 * 初期画面へ 62 */ 63 return INIT; 64 } 65 } 66 67 68 69} 70

Recordmanager.java

java

1 2/** 3 * 商品データ全体を保持するクラス 4 * 5 * @param <selectList> 6 */ 7public final class RecordManager<selectList> { 8 9 /** 商品データ */ 10 private static List<Item> list = new ArrayList<>(); 11 private static List<Item> selectList = new ArrayList<>(); 12 private static Item item; 13 /** totalを定義 */ 14 private static int total = 0; 15 private static long salesId; 16 private static int pos; 17 18 static { 19 list.add(new Item("A00101", "油性ボールペン", 60, 0, 0)); 20 list.add(new Item("A00201", "極細ボールペン", 120, 0, 0)); 21 list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0)); 22 list.add(new Item("A00401", "シャープペンシル", 100, 0, 0)); 23 list.add(new Item("A00501", "鉛筆H(1ダース)", 400, 0, 0)); 24 } 25 26 /** 商品名 */ 27 public static List<Item> selectItem(String id, int quantity) { 28 29 for (int i = 0; i < list.size(); i++) { 30 31 if (id.equals(list.get(i).getId())) { 32 33 /** Itemを再定義 */ 34 Item item = new Item(id,list.get(i).getName(), list.get(i).getPrice(), quantity, 35 quantity * list.get(i).getPrice()); 36 37 selectList.add(item); 38 /** subtotalを定義 */ 39 int subtotal = quantity * list.get(i).getPrice(); 40 total = total + subtotal; 41 42 break; 43 } 44 45 } 46 47 return selectList; 48 49 } 50 51 /** nameListの作成 */ 52 public static String[] makeNameList() { 53 /** nameListをlistの要素の中から定義する*/ 54 String[] nameList = new String[list.size()]; 55 /** iがlistの要素数以内での繰り返し処理*/ 56 for (int i = 0; i < list.size(); i++) { 57 /**listのi番目のnameをnameListに代入*/ 58 nameList[i] = (list.get(i)).getName(); 59 60 } 61 /** nameListを返す*/ 62 return nameList; 63 } 64 65 /** 選択した売上明細を削除 */ 66 public static void remove(int pos) { 67 68 /** 合計からpos番目の小計を引く */ 69 total = total - selectList.get(pos).getSubtotal(); 70System.out.println(pos); 71 /** selectListのpos番目を削除 */ 72 selectList.remove(pos); 73 } 74 } 75 76/**getterとsetterは省略しています。*/ 77 78 79 80} 81

SalesForm.java

java

1 2public class SalesForm implements Serializable { 3 private static final long serialVersionUID = 1L; 4 5 6 7 /** 商品id */ 8 private String id; 9 /** 商品名 */ 10 private String name; 11 /** 単価 */ 12 private int price; 13 /** 個数 */ 14 @NotNull 15 @Min(1) 16 private int quantity=1; 17 /** 小計 */ 18 private int subtotal; 19 private int pos; 20 21 public SalesForm() { 22 23 } 24 25/** getterとsetterは省略してます。*/ 26 27}

add.jsp

jsp

1 2<body> 3 <form:form modelAttribute="salesForm" action="/sales/system"> 4 <div class="header"> 5 <span class="titleName">直太郎オンラインショップ</span> 6 <div class="date"><%=LocalDate.now()%></div> 7 </div> 8 <div class="main"> 9 <div> 10 商品: 11 <form:select path="id"> 12 13 <form:options items="${ItemList}" itemValue="id" itemLabel="name" /> 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> <font color="#1e90ff"> <c:out value="${message2}" /> <font 35 color="#1e90ff"> <c:out value="${message4}" /> 36 </font> 37 </font> <font color="#ff0000"> <c:out value="${message5}" /> 38 </font> 39 </div> 40 <br> 41 42 43 44 <div class=""> 45 <span class="details">売上明細</span> 46 47 <table class="product"> 48 49 <tr> 50 <th>削除</th> 51 <th>商品ID</th> 52 <th>商品名</th> 53 <th>単価</th> 54 <th>点数</th> 55 <th>小計</th> 56 </tr> 57 <c:forEach items="${allList}" var="allList" varStatus="status"> 58 <tr> 59 <th class="itemradiobtn"><form:radiobutton path="pos" 60 label="" value="${status.index}"/></th> 61 <th class="id">${allList.id}</th> 62 <th class="name">${allList.name}</th> 63 <th class="price">${allList.price}</th> 64 <th class="quantity">${allList.quantity}</th> 65 <th class="subtotal">${allList.subtotal}</th> 66 </tr> 67 </c:forEach> 68 </table> 69 </div> 70 71 <div class="total"> 72 合計: 73 <fmt:formatNumber groupingUsed="true"> 74 <c:out value="${total}" /> 75 </fmt:formatNumber> 7677 </div> 78 79 80 <div class="footer"> 81 82 <input type="submit" name="remove" value="削除" 83 onclick="remove_row(this)" /> <input type="submit" name="firm" 84 value="確定" /> 85 </div> 86 87 </form:form> 88 89</body> 90</html> 91

試したこと

removeメソッドでfor文を使って繰り返し処理を行い、if文でSalesFormで格納されているposの値と同じ順番の要素をequalsで探すプログラムを考えてみました。

/** 選択した売上明細を削除 */ public static void remove(int pos) { for (int j = 0; j < selectList.size(); j++) { if (pos.equals(selectList.get(j).getPos()){ /** 合計からpos番目の小計を引く */ total = total - selectList.get(pos).getSubtotal(); break; } /** selectListのpos番目を削除 */ selectList.remove(pos); } }

このように定義しましたがgetPos()がエラーが出でしまいます。どのように変更したらよいでしょうか。

補足情報(FW/ツールのバージョンなど)

Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)
ローカルホストTomcat8

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

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

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

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

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

guest

回答1

0

このように定義しましたがgetPos()がエラーが出でしまいます。どのように変更したらよいでしょうか。

何のエラーが出るのかを具体的に記載してください。
ひとまず if (pos.equals(selectList.get(j).getPos()){
int型の比較に.equals()は使えません。 == でいいです。


しかしラジオボタンを選択していないときに削除処理を行っても削除処理が行われています

理由を断言できる知識がなかったため現象を再現できないか探ってみた結果ですが
このような処理の流れだと、ラジオボタン未選択の場合formには0が入っています。
formに0が渡ってしまった時点で実際に0番目が選択されているのか
未選択で0が渡っているのかを判断できないので
削除ボタン押下時にラジオボタンのいずれかが選択されているか判定する必要があるのでは。

投稿2019/09/20 04:36

編集2019/09/20 05:03
tetutetu

総合スコア419

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

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

naotaro0704

2019/09/20 04:59

メソッド getPos() は型 Item で未定義です。と出ます。確かに型Itemで定義はしてません。追加で定義することは避けたいです。
tetutetu

2019/09/20 05:06

ラジオボタン未選択時の場合に起こる問題の解決方法として追記しましたが そもそも仕様に無理があるのではないでしょうか。(長考すれば何かしら方法は見つかるかもしれませんが)
tetutetu

2019/09/20 05:13

一度に複数の問題が発生している上に、あまり流れが伝わってきません。 削除が動作するようになった →ラジオボタン未選択で削除押したらどうなる? →何も選択していないのに消えてる →removeメソッドを「試したこと」内の記述に変更した という認識なのですが、まずそこは合ってますか?
naotaro0704

2019/09/20 05:46

あってます。わかりづらくてすみません。
tetutetu

2019/09/20 05:57

根本的な解決になるかどうかはともかくとして removeメソッドを変更前のものに戻して ラジオボタンにrequired、もしくはchecked属性を付与することで 暫定的に未選択のまま削除処理が行われることはなくなるかと。 問題が発生する理由は上述の通りなので、仕様変更して解決するか、その他解決方法を探すかですかね。
naotaro0704

2019/09/20 06:31

ありがとうございます。指摘していただいたやり方でやって見ます。
tetutetu

2019/09/20 06:32

あまりお勧めできませんけどね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問