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

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

新規登録して質問してみよう
ただいま回答率
85.38%
Spring MVC

Spring MVCとは、Javaを用いてWebアプリケーションを開発できるフレームワーク。アーキテクチャにMVCを採用しており、画面遷移と入出力パラメータの受け渡しの基本的な機能の他、ユーザーの送信したパラメータに対する入力チェックなどさまざまな機能を持ちます。

JSP

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

Java

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

620閲覧

更新ボタンを押したらループで表示したリストのうち、一行のデータを変更する方法

THUTAYA

総合スコア3

Spring MVC

Spring MVCとは、Javaを用いてWebアプリケーションを開発できるフレームワーク。アーキテクチャにMVCを採用しており、画面遷移と入出力パラメータの受け渡しの基本的な機能の他、ユーザーの送信したパラメータに対する入力チェックなどさまざまな機能を持ちます。

JSP

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

Java

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2023/08/01 03:26

[実現]リストの一行ごとに実装している更新ボタンを押して、その行に対して入力した数値に更新するようにしたい。
いろいろ試しましたが、知識不足でうまくいきませんでした、知恵を貸していただけたら幸いです。

該当のソースコード

add.jsp

1<form:form action="/sales/system" modelAttribute="salesForm"> 2 <table> 3 <thead> 4 <tr> 5 <th>削除</th> 6 <th>商品ID</th> 7 <th>商品名</th> 8 <th>単価</th> 9 <th>点数</th> 10 <th>小計</th> 11 <th>更新</th> 12 </tr> 13 </thead> 14 15 <tbody> 16 <c:forEach items= "${allList}" var = "product" varStatus ="status"> 17 <tr> 18 <td><form:checkbox path="delNumList" value="${status.count}"/></td> 19 <td>${product.productId}</td> 20 <td>${product.name}</td> 21 <td>${product.unitPrice}</td> 22 <td><input type="number" name="numPoint" min="1" max="100" value="${product.quantity}"></td> 23 <td>${product.subtotal}</td> 24 <td> 25 <input type="hidden" name="reloadNum" value="${status.count}" /> 26 <input type="submit" name="reload" value="更新" /> 27 </td> 28 </tr> 29 </c:forEach> 30 </tbody> 31 </table> 32 33 <div> 34 合計<c:out value="${total}"/>円 35 </div> 36 37 <div class="footer"> 38 <input type="submit" name="removeProduct" value="削除" /> 39 <input type="submit" name="fix" value="確定" /> 40 </div> 41 </form:form>

SalesController.java

1/** 2 * 更新 3 * @param form フォームオブジェクト 4 * @param model モデルオブジェクト 5 * @return Add add.jsp 6 * */ 7 @RequestMapping(params = "reload") 8 public String reload(SalesForm form, Model model) { 9 10 int quantity = form.getNumPoint(); 11 12 int reloadNum = form.getReloadNum(); 13 14 15 if (reloadNum >= 0) { 16 Product existingProduct = form.getAllList().get(reloadNum -1); 17 18 existingProduct.setQuantity(quantity); 19 existingProduct.setSubtotal(quantity * existingProduct.getUnitPrice()); 20 form.getAllList().set(reloadNum-1, existingProduct); 21 } 22 mysql.putTogether(model, form, mysql); 23 24 form.clear(); 25 26 return ADD; 27 }

試したこと

ループしたときの行数をフォームクラスのreloadNum変数に渡して、その行数ごとのオブジェクトに対して処理を行いたかったのですが、最初にリストに格納したものしか更新できず、二番目以降はダメでした。(というより、すべての更新ボタンが最初のオブジェクト用の更新ボタンになっています。)

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

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

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

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

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

jimbe

2023/08/01 04:10

全部を 1 つの form で囲っているからでは。 行毎に form で囲む必要があると思います。
THUTAYA

2023/08/01 05:33 編集

ありがとうございます、短時間で問題点が分かるなんて感動しました。 もっと勉強します。
jimbe

2023/08/01 05:38

ボタンを押した時は、そのボタンが含まれる form 内のデータが送られます。 <form> ←★ <table> <thead> <tr> ~ </tr> </thead> <tbody> <c:forEach> <tr> ~ </tr> </c:forEach> </tbody> </table> </form> ←★ となっていると、forEach 内の行のどのボタンを押しても大外の form の扱いとなり、その中で例えば input の name が同じモノは最初にあるものが送られると思います。 ですから、各行のボタン(と input 等)が別々の form に含まれるように、 <table> <thead> <tr> ~ </tr> </thead> <tbody> <c:forEach> <form> ←★ <tr> ~ </tr> </form> ←★ </c:forEach> </tbody> </table> の形にする必要があるのでは? ということです。
THUTAYA

2023/08/01 05:44

formタグはいつも外側にあるものと思い込んでました。おかげで実現できる幅が広がりました。基本的な部分のご指摘だとは思いますが、ありがとうございました。
guest

回答1

0

自己解決

コメント欄のjimbeさんのアドバイス通りでした、ありがとうございます。form:formタグをループ内に新たに追加しただけです。

JSP

1<form:form action="/sales/system" modelAttribute="salesForm"> 2 <table> 3 <thead> 4 <tr> 5 <th>削除</th> 6 <th>商品ID</th> 7 <th>商品名</th> 8 <th>単価</th> 9 <th>点数</th> 10 <th>小計</th> 11 <th>更新</th> 12 </tr> 13 </thead> 14 15 <tbody> 16 <c:forEach items= "${allList}" var = "product" varStatus ="status"> 17 <form:form action="/sales/system" modelAttribute="salesForm"> 18 <tr> 19 <td><form:checkbox path="delNumList" value="${status.count}"/></td> 20 <td>${product.productId}</td> 21 <td>${product.name}</td> 22 <td>${product.unitPrice}</td> 23 <td><input type="number" name="numPoint" min="1" max="100" value="${product.quantity}"></td> 24 <td>${product.subtotal}</td> 25 <td> 26 <input type="hidden" name="reloadNum" value="${status.count}" /> 27 <input type="submit" name="reload" value="更新" /> 28 </td> 29 </tr> 30 </form:form> 31 </c:forEach> 32 </tbody> 33 </table> 34 35 <div> 36 合計<c:out value="${total}"/>円 37 </div> 38 39 <div class="footer"> 40 <input type="submit" name="removeProduct" value="削除" /> 41 <input type="submit" name="fix" value="確定" /> 42 </div> 43 </form:form>

投稿2023/08/01 05:36

編集2023/08/01 05:53
THUTAYA

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問