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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Java

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

5001閲覧

DBから取得したレコードをforEachで表示させ、ID単位で値を取得したい

sql_ga_kakenai

総合スコア5

Spring MVC

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Java

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

1グッド

1クリップ

投稿2021/08/05 08:14

前提・実現したいこと

DBから取得したレコードをforEachで表示させ、ID単位で値を取得したい

発生している問題・エラーメッセージ

java(Spring MVC)を利用してECサイトを構築中です。
DBから注文関連の各種レコードを取得し、表にしてjspに表示させます。
必要な値の取得は全てできています。
この表には1レコードに1つのチェックボックスがついてきます。
表の下にはフォームが4つ設けられています。
c:forEachで取得できたレコードの数だけループして表示させます。

本題です。
チェックボックスをクリックしたとき、そのレコードと同じIDの情報を
4つのフォームにも表示させるようにしたいのですが、
思った動作をするのはループ1回目に表示されたレコードにチェックをした時のみで、
ループ2回目以降のレコードはチェックを入れても正しく動作をしません。
どのチェックボックスをクリックしてもループ1回目のレコードが表示されてしまいます。
※この部分はjQueryで実装しようとしています。

なんとか解決しようと思ったのですが、限界を迎えてしまいました。
どなたかご教授お願いできませんでしょうか。

該当のソースコード

jsp

1<div class="scroll"> 2 <table class="margin" border="1" > 3 <tr> 4 <th class="emp-th">選択</th> 5 <th class="emp-th">注文日</th> 6 <th class="emp-th">注文番号</th> 7 <th class="emp-th">顧客番号</th> 8 <th class="emp-th">顧客氏名</th> 9 <th class="emp-th">合計金額</th> 10 </tr> 11 <c:forEach var="pay" items="${payment}" varStatus="loop"> 12 <form:form modelAttribute="paymentRegistModel"> 13 <tr> 14 15 <td><input type="checkbox" id="aaa"></td> 16 <th>${pay.new_order_date}</th> 17 <th>${pay.new_order_id}</th> 18 <th>${pay.customer_id}</th> 19 <th>${pay.customer_name}</th> 20 <th>${pay.total_price}</th> 21 22 </tr> 23 </form:form> 24 </c:forEach> 25 </table> 26</div> 27 28<c:forEach var="pay" end="0" items="${payment}"> 29 <form:form modelAttribute="paymentRegistModel"> 30 入金日:<form:input path="payment_date" name="pd" id="pd" class="letter" type="text" value="${pay.payment_date}"/><br> 31 合計額:<form:input path="total_price" name="tp" id="tp" class="letter" type="text" value="${pay.total_price}"/><br> 32 入金額:<form:input path="total_price" name="tp1" id="tp1" class="letter" type="text" value="${pay.total_price}"/><br> 33 振込人名:<form:input path="customer_name" name="cn" id="cn" class="letter" type="text" value="${pay.customer_name}"/><br> 34 35 </form:form> 36 37</c:forEach>

jquery

1<script> 2 3//フォーム初期値を空にする(しないと初期状態で0とか入る) 4 $(document).one("ready", function(){ 5 $("#pd").val(""); 6 $("#tp").val(""); 7 $("#tp1").val(""); 8 $("#cn").val(""); 9 }); 10 11 $(function(){ 12//DBから拾った値を一度変数化 13 var pd = $('#pd').attr("value"); 14 var tp = $('#tp').attr("value"); 15 var tpp = $('#tp1').attr("value"); 16 var cn = $('#cn').attr("value"); 17 18//チェックボックスを押したらフォームに表示させる 19 20 $('[type=checkbox]').click(function(){ 21 22 $('#pd').val(pd); 23 $('#tp').val(tp); 24 $('#tp1').val(tpp); 25 $('#cn').val(cn); 26 }) 27 }); 28 29//チェックボックスを外したら表示を消す 30 $(function(){ 31 $('#aaa').on('change',function(){ 32 var test = $(this).prop('checked'); 33 if(test != true){ 34 $('#pd').val(""); 35 $('#tp').val(""); 36 $('#tp1').val(""); 37 $('#cn').val(""); 38 } 39 }) 40 }); 41 42</script>

試したこと

・DBから取得した値が格納されている${payment}の位置を見直し
・jQueryの書き方をいくつか試す

shinoharat👍を押しています

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

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

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

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

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

shinoharat

2021/08/12 09:14

こんにちは。 「まだ回答を求めています」に釣られて来ました。 内容を拝見したのですが、m.ts10806 さんのご回答がパーフェクトな気がします。 どこで躓いているのか、教えてもらえるとアドバイスしやすいです。 「m.ts10806 さんの言っていることが分からない」とか、 「言っていることは分かるが具体的なコードが1ミリも浮かばない」とか、 「自分なりにここまで作ってみたけど動かない」などなど。
sql_ga_kakenai

2021/08/13 05:40

ありがとうございます。コードと格闘していたので遅くなってしまいました。申し訳ありません。 一応解決したのですが、あんまりよくわかってない部分もあるのでアドバイス等頂けると幸いです。 今回はm.ts10806 さんの仰る通り、classを作ってそこを起点にインデックスを取得し、そこからchildNodesの値を引っ張り出すという書き方にしたのですが、感覚的にかなり無理やり感があるように思いました。 1)childNodesで値を取る場合、どこを指定すればいいのかよく分かりません。 なんとなく値が取れるのでいいかなと思ったのですが、今回は「childNodes[1].children[0]」とか「a.childNodes[15].value」とか「a.childNodes[11].innerText」といった書き方が混在してしまっています。。 2)childNodesから値を取得するという事は、javascriptではよくある事なのでしょうか…? 3)もうちょっとスマートな書き方といいますか、「こういう方向性で書けば同じ事ができる」などがあればご教授お願いできますでしょうか?
guest

回答2

0

m.ts10806さんの助言からなんとか自己解決できました…
「インデックスってなに???」からの手直しでしたが、どうにかなりました。
キツい。でも勉強になりました。ありがとうございました。

今回はこのようにしました。
(childNodesの解説のほとんどが素のjavascriptだったので、jQueryでなくjsで書きました。)

×チェックボックス単体のidを起点にしていた
〇チェックボックスを含めた必要な情報全体のclassを起点にした

×jstlで書いたforEach文から得られた値をjavascriptで取得しようとしていた
〇javascriptにもforEach文を書き、そこで得られた値の中から必要なものを取り出して取得した

jsp

1<div class="scroll"> 2 <table class="margin" border="1" > 3 <tr> 4 <th class="emp-th">選択</th> 5 <th class="emp-th">注文日</th> 6 <th class="emp-th">注文番号</th> 7 <th class="emp-th">顧客番号</th> 8 <th class="emp-th">顧客氏名</th> 9 <th class="emp-th">合計金額</th> 10 </tr> 11 <c:forEach var="pay" varStatus="loop" items="${payment}"> 12 <form:form modelAttribute="paymentRegistModel"> 13 <tr class = "index"> 14 <td><input type="checkbox" id="aaa"></td> 15 <th>${pay.new_order_date}</th> 16 <th>${pay.new_order_id}</th> 17 <th>${pay.customer_id}</th> 18 <th>${pay.customer_name}</th> 19 <th>${pay.total_price}</th> 20 <input type="hidden" id="loop_hidden" value="${loop.index}"><% //loop.indexを無くすとjsが反応しなくなる.. %> 21 <input type="hidden" id="payment_date" value="${pay.payment_date}"> 22 </tr> 23 </form:form> 24 </c:forEach> 25 </table> 26</div> 27 28<c:forEach end="0" var="pay" varStatus="loop" items="${payment}"> 29 <form:form modelAttribute="paymentRegistModel"> 30 31 入金日:<form:input path="payment_date" id="pd" class="letter" type="text" value="${pay.payment_date}"/><br> 32 合計額:<form:input path="total_price" id="tp" class="letter" type="text" value="${pay.total_price}"/><br> 33 入金額:<form:input path="total_price" id="tp1" class="letter" type="text" value="${pay.total_price}"/><br> 34 振込人名:<form:input path="customer_name" id="cn" class="letter" type="text" value="${pay.customer_name}"/><br> 35 36 </form:form> 37</c:forEach> 38

javascript

1//フォーム初期値を空にする 2 $(document).one("ready", function(){ 3 $("#pd").val(""); 4 $("#tp").val(""); 5 $("#tp1").val(""); 6 $("#cn").val(""); 7 }); 8 9//チェックボックスをクリックするとフォームに値を出力する 10//indexクラスを取得→内容を配列化→forEach文で繰り返し→childNodesから各値を取得 11 12window.onload = function() { 13 14 var rows = document.querySelectorAll(".index"); 15 var rowsArray = Array.from(rows); 16 17 rowsArray.forEach(function(a) { 18 var check =a.childNodes[1].children[0]; 19 var payment_date = a.childNodes[15].value; 20 var total_price = a.childNodes[11].innerText; 21 var customer_name = a.childNodes[9].innerText; 22 23 //チェックが入ったら表示、チェックが外れたら非表示 24 check.addEventListener('click',function() { 25 26 if (this.checked == true){ 27 28 document.getElementById('pd').value = payment_date; 29 document.getElementById('tp').value = total_price; 30 document.getElementById('tp1').value = total_price; 31 document.getElementById('cn').value = customer_name; 32 33 }else{ 34 35 document.getElementById('pd').value = ""; 36 document.getElementById('tp').value = ""; 37 document.getElementById('tp1').value = ""; 38 document.getElementById('cn').value = ""; 39 40 } 41 }); 42 43 }); 44};

投稿2021/08/13 05:22

編集2021/08/13 05:44
sql_ga_kakenai

総合スコア5

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

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

m.ts10806

2021/08/13 05:30 編集

回答もコードはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 特に質問者自身の回答となると後から参考にする人(特に質問者さんと同じくらいの経験の人)が参考にしやすいものとなります。コードが見づらいのはあまり良くありません。 質問も回答も編集できます。
m.ts10806

2021/08/13 05:32

あと <td><input type="checkbox" id="aaa"></td> ↑ID重複してるのでここはJavaScriptからはちゃんと操作できないと思います。 「INDEXを振る」というのは「行番号のような連番を振る」と理解してもらえると良いです。 データベースのデータを引っ張ってきてるなら、そのIDとか、要は特定できる名前を付けてもらうためのつの手段です。
sql_ga_kakenai

2021/08/13 05:51

code機能でソース直しました。ご指摘ありがとうございます。 以前はid="aaa"の部分からどうにかしようとしていました。仰る通りなのですが、 これは実際に操作できなかったので一つ上の<tr>タグにclass="index"を作りました。 まさにこの番号を振って処理をしたいというのが今回の肝だったので、大変インデックスの勉強になりました。ありがとうございました。
m.ts10806

2021/08/13 06:45

>これは実際に操作できなかったので どういうことでしょうか。あくまで文字列なので「操作できない」という意味が分かりません。
guest

0

ベストアンサー

idはその名の通り要素を特定するための属性です。1画面内での重複は許されておらず、振ってしまった場合には特にJavascriptは正しく動作しません。
indexを振るなど工夫が必要ですし、行ごとに動作を制御したい場合、classを振ってそこからindexを得て処理させるなどもうひと工夫必要です。

投稿2021/08/05 20:35

m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問