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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

1回答

1995閲覧

jspからサーブレットへのパラメータの引き渡しをループで行う方法

yasu_1217

総合スコア14

JSP

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2018/12/05 03:41

編集2018/12/05 05:18

jspからサーブレットへのパラメータの引き渡しをループで行う方法

jspで、シフト表のようなものを表示し、そのテキストボックスに入っている値をループでサーブレットに引き渡そうとしています。その際に、パラメータの設定をうまく行うことができません。
現在、ループで表現しようとしているのですが、引き渡すパラメータのnameもループしているため、ループの最後の値のみ引き渡しているような状態です。
どのようにnameを設定すれば引き渡しをすることができるのか、教えていただけたらとてもありがたいです。よろしくお願いします。

パラメータを渡すjsp(table部分のみ表記)

jsp

1<form action = "/Shifttable/RecordMember" method="post"> 2<table border=1> 3 <tr> 4 <th>ID</th> 5 <th>名前</th> 6 <th><%=month %>月<%=date %>日</th> 7 <th><%=month %>月<%=date+1%>日</th> 8 <th><%=month %>月<%=date+2%>日</th> 9 <th><%=month %>月<%=date+3%>日</th> 10 <th><%=month %>月<%=date+4%>日</th> 11 <th><%=month %>月<%=date+5%>日</th> 12 <th><%=month %>月<%=date+6%>日</th> 13 </tr> 14 15 <%for(Shift shift : shiftList) { //ループでシフトを代入、デフォルトの値で表示 %> 16 <tr align = "center"> 17 <td><%=shift.getId()%></td> 18 <td><%=shift.getName()%></td> 19 <td><input type="text" size="3" value= "<%=shift.getMon()%>" name="monday"></td> 20 <td><input type="text" size="3" value= "<%=shift.getTue()%>" name="tuesday"></td> 21 <td><input type="text" size="3" value= "<%=shift.getWen()%>" name="wednesday"></td> 22 <td><input type="text" size="3" value= "<%=shift.getThu()%>" name="thursday"></td> 23 <td><input type="text" size="3" value= "<%=shift.getFri()%>" name="friday"></td> 24 <td><input type="text" size="3" value= "<%=shift.getSat()%>" name="saturday"></td> 25 <td><input type="text" size="3" value= "<%=shift.getSun()%>" name="sunday"></td> 26 </tr> 27 <% } %> 28</table> 29<input type="submit" value="登録"> 30</form>

###パラメータを受け取るサーブレット(パラメータの取得からSQLの実行まで)

public class RecordMember extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //リクエストパラメータを取得 request.setCharacterEncoding("UTF-8"); String monday = request.getParameter("monday"); String tuesday = request.getParameter("tuesday"); String wednesday = request.getParameter("wednesday"); String thursday = request.getParameter("thursday"); String friday = request.getParameter("friday"); String saturday = request.getParameter("saturday"); String sunday = request.getParameter("sunday"); Connection conn = null; try { //JDBCドライバを読み込み Class.forName("org.h2.Driver"); //データベース接続 conn = DriverManager.getConnection("jdbc:h2:file:C:/data/example", "sa", ""); //UPDATE文を準備 Statement stmt = conn.createStatement(); stmt.executeUpdate("UPDATE SHIFT SET MON = '"+monday+"',TUE = '"+tuesday+"' ,WEN ='"+wednesday+"' ,THU ='"+thursday+"', FRI = '"+friday+"', SAT = '"+saturday+"', SUN = '"+sunday+"'");

追記部分

jsp

1 //この部分以外は変更していません 2 <%int loopcount = 0; %>//ループカウントの定義 3 <%for(Shift shift : shiftList) { //ループでシフトを代入、デフォルトの値で表示 %> 4 <tr align = "center"> 5 <td><%=shift.getId()%></td> 6 <td><%=shift.getName()%></td> 7 <td><input type="text" size="3" value= "<%=shift.getMon()%>" name="monday<%=loopcount%>"></td> 8 <td><input type="text" size="3" value= "<%=shift.getTue()%>" name="tuesday<%=loopcount%>"></td> 9 <td><input type="text" size="3" value= "<%=shift.getWen()%>" name="wednesday<%=loopcount%>"></td> 10 <td><input type="text" size="3" value= "<%=shift.getThu()%>" name="thursday<%=loopcount%>"></td> 11 <td><input type="text" size="3" value= "<%=shift.getFri()%>" name="friday<%=loopcount%>"></td> 12 <td><input type="text" size="3" value= "<%=shift.getSat()%>" name="saturday<%=loopcount%>"></td> 13 <td><input type="text" size="3" value= "<%=shift.getSun()%>" name="sunday<%=loopcount%>"></td> 14 </tr> 15 <%loopcount++; %>//ループカウントの加算 16 <% } %> 17 <input type="hidden" value="<%=loopcount%>" name="shiftListCount">

java

1 2//UPDATE文を準備(IDの指定方法を教えていただきたいです) 3 Statement stmt = conn.createStatement(); 4 for(int i = 0;i < (int)Integer.parseInt(request.getParameter("shiftListCount"));i++){ 5 monday = request.getParameter("monday"+i); 6 tuesday = request.getParameter("tuesday"+i); 7 wednesday = request.getParameter("wednesday"+i); 8 thursday = request.getParameter("thursday"+i); 9 friday = request.getParameter("friday"+i); 10 saturday = request.getParameter("saturday"+i); 11 sunday = request.getParameter("sunday"+i); 12 stmt.executeUpdate("UPDATE SHIFT SET MON = '"+monday+"',TUE = '"+tuesday+"' ,WEN ='"+wednesday+"' ,THU ='"+thursday+"', FRI = '"+friday+"', SAT = '"+saturday+"', SUN = '"+sunday+"' WHERE ID = "+i+1 ); 13 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ざっくりコードにコメント入れますのでイメージだけ伝わればと。

jsp

1←ここでループカウンタ変数定義 2<%for(Shift shift : shiftList) { %> 3<input type="text" size="3" value= "<%=shift.getMon()%>" name="monday<%=ループカウンタ%>"> 4 5 6←ここでループカウンタ++ 7<% } %> 8<input type="hidden" value= "<%=ループカウンタ%>" name="shiftListCount">

Java

1for(i = 0;i < (int)request.getParameter("shiftListCount");i++){ 2 monday = request.getParameter("monday"+i); 3} 4 5

投稿2018/12/05 03:49

編集2018/12/05 03:49
m.ts10806

総合スコア80765

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

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

yasu_1217

2018/12/05 04:24

回答いただきありがとうございます。 入力してみたところ、サーブレットの方で、stringからintへのキャストができないと表示されてしまいました。 この場合は、サーブレットの方で、あらかじめstringからintへの変換などをした方がよいのでしょうか?
m.ts10806

2018/12/05 04:26

ええ、あくまで即席のイメージコードなので別途intにキャストして受けとるように書いてください。
yasu_1217

2018/12/05 05:03

ありがとうございます。 試しに、作ってみたのですが、whereでIDを指定すると空欄になってしまいました。データベースの更新の部分での問題は何かあるでしょうか? //UPDATE文を準備 Statement stmt = conn.createStatement(); for(int i = 0;i < (int)Integer.parseInt(request.getParameter("shiftListCount"));i++){ monday = request.getParameter("monday"+i); tuesday = request.getParameter("tuesday"+i); wednesday = request.getParameter("wednesday"+i); thursday = request.getParameter("thursday"+i); friday = request.getParameter("friday"+i); saturday = request.getParameter("saturday"+i); sunday = request.getParameter("sunday"+i); stmt.executeUpdate("UPDATE SHIFT SET MON = '"+monday+"',TUE = '"+tuesday+"' ,WEN ='"+wednesday+"' ,THU ='"+thursday+"', FRI = '"+friday+"', SAT = '"+saturday+"', SUN = '"+sunday+"' WHERE ID = "+i+1 ); }
m.ts10806

2018/12/05 05:05

コメント欄ではコードブロック使えませんので今のところのコードを質問本文に提示いただけますか? なんとなく、足し算と文字列連結が混合されてるのが問題のようにも見えますが
yasu_1217

2018/12/05 05:12

質問にソースコードを追加して更新しました。 IDの指定の方法に問題があるという事でしょうか?
m.ts10806

2018/12/05 05:13

jspのほうも、できれば。むしろそっちがあること前提なので。
m.ts10806

2018/12/05 05:15

ひとまず、最後のi+1 は (i+1 ) とすること。 たぶん ID= 01 となります。文字列への連結が優先されるので、()をつけて先に計算して、その結果を連結されるようにしてください。 (あと直に入れるのではなくプリペアドステートメント利用された方がいいですね。  このコードはユーザー入力を受け入れるのと同等なのでSQLインジェクションを埋めこもうと思えば埋め込めます。)
m.ts10806

2018/12/05 05:16

stmt.executeUpdate("UPDATE SHIFT SET MON = '"+monday+"',TUE = '"+tuesday+"' ,WEN ='"+wednesday+"' ,THU ='"+thursday+"', FRI = '"+friday+"', SAT = '"+saturday+"', SUN = '"+sunday+"' WHERE ID = "+(i+1) );
yasu_1217

2018/12/05 05:20

追加の回答ありがとうございます。質問の部分にjspのコードも追加しました。
m.ts10806

2018/12/05 05:25

jsp の方は問題なさそうですね。 IDのところかと思います。 2018/12/05 14:15、2018/12/05 14:16 のコメントを参照してください。
yasu_1217

2018/12/05 05:54

該当の部分を(i+1)に変更したのですが、空欄のままになってしまいます。 テーブルの方のIDが1になっているのと、サーブレットの方では01になってしまっている違いなのでしょうか?
m.ts10806

2018/12/05 05:59

すみません。あまり気にしなかったのですが「空欄のまま」というのは何のことでしょうか? (i+1)とすることで01となるのは避けられるはずなのですが、、 念のため先にi+1を計算した結果をS変数にしてSQLに連結させてみてください
yasu_1217

2018/12/05 06:12

空欄のままというのは、テーブルに値がなにも入らないままになってるということです。jspのテキストボックスに文字を入力しても、出力に反映されない状態です。 SQLへの連結、試してみます。
yasu_1217

2018/12/05 14:52

ループカウントの定義を1にして、where での+1を失くしたら動作しました! 丁寧な回答ありがとうございました。
m.ts10806

2018/12/05 15:59

解決されたようで何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問