アプリ版:「スタンプのみでお礼する」機能のリリースについて

翔泳社「10日でおぼえるJSP/サーブレット」をもとにJSP/サーブレットを学習中です。この書籍の6-3データベースのデータの更新、削除の項で、サンプルが上手く動作しないので、みなさんにご教授願いたく投稿させていただきました。長文になりますがよろしくお願いいたします。
内容はまず、以下のフォームにデータベースからデータを取得し、更新、削除行うというものです。
「ファイル名p_update1.jsp」
<form method="POST" action="p_update2.jsp">
<input type="submit" value="更新/削除" />
<input type="reset" value="取消" />
<table border="0">
<tr style="background:#00ccff">
<th>削除</th><th>ISBNコード</th><th>書名</th>
<th>価格</th><th>出版社</th><th>刊行日</th>
</tr>
<% while(rs.next()){ %>
<tr style="background:#ffffcc">
<td><input type="checkbox" name="delete<%=count %>" value="1" /></td>
<td><%=rs.getString("isbn") %>
<input type="hidden" name="isbn<%=count %>"
value="<%=rs.getString("isbn")%>" /></td>
<td>
<input type="text" name="title<%=count %>" size="25"
value="<%=rs.getString("title")%>" /></td>
<td>
<input type="text" name="price<%=count %>" size="5"
value="<%=rs.getString("price")%>" />円</td>
<td>
<select name="publish<%=count %>">
<% for(String pub : pubs){
<option value="<%=pub %>"
<%
if(pub.equals(rs.getString("publish"))){
out.print("selected='seleced'");
} %>><%=pub %></option>
<% } %>
</select></td>
<td>
<input type="text" name="published<%=count %>" size="12"
value="<%=dformat.format(rs.getDate("published")) %>" /></td>
</tr>
<%
count++;
}
rs.close();
ps.close();
db.close();
%>
</table>
<input type="hidden" name="count" value="<%=count %>" />
</form>
%>

このファイルは正しく動作し、データベースからデータが取得できます。削除したいレコードにチェックを入れてボタンを押すとデータが削除され正しく動作しますが、タイトルや価格を変更してもレコードの更新がおこなわれません。

受け取り側のファイルの内容です。
「ファイル名p_update2.jsp」
<%
request.setCharacterEncoding("Windows-31J");
InitialContext context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/Jsp10");
Connection db = ds.getConnection();
db.setAutoCommit(false);
PreparedStatement up = db.prepareStatement("UPDATE book SET title=?, price=?, publish=?, published=? WHERE isbn=?");
PreparedStatement del = db.prepareStatement("DELETE FROM book WHERE isbn=?");
int count = Integer.parseInt(request.getParameter("count"));
for(int i=1;i<count;i++){
if(request.getParameter("delete" + i)==null){
up.setString(1, request.getParameter("title" + i));
up.setString(2, request.getParameter("price" + i));
up.setString(3, request.getParameter("publish" + i));
up.setString(4, request.getParameter("published" + i));
up.setString(5, request.getParameter("isbn" + i));
up.executeUpdate();
}else{
del.setString(1, request.getParameter("isbn" + i));
del.executeUpdate();
}
}
up.close();
del.close();
db.commit();
db.close();
response.sendRedirect("p_update1.jsp");
%>

試しにifブロック内でout.println(request.getParameter("title")+i)をh1タグ内に記述して実行すると、タイトル名がきちんと表示されるので、とりあえずifブロック内に処理が移っていて、フォームから送信された情報は取得できているようです。
次にフォームから送信された情報ではなく、以下を実行してみると、きちんとデータベースが更新されます。
up.setString(1, "PHPライブラリコレクション");
up.setString(2, "2500");
up.setString(3, "翔泳社");
up.setString(4, "2000-04-04");
up.setString(5, "978-4-7980-1616-0");
up.executeUpdate();

各ソフトウェアのバージョン等
apache tomcat 6.0
jdbcドライバ mysql-connector-java-5.1.10-bin.jar
MYSQL 5.0.87
java JDK 1.6.0_13
eclipse 3.5
です。

何が問題か未だ解決できず、1週間がたってしまいました。ご教授お願いいたします。

A 回答 (2件)

パラメータtitleだけではなく、


パラメータisbnがちゃんと取れていますか?

where句で絞込みをしているので、isbnが間違っていると、
更新対象が0件になります。

この回答への補足

ご指摘の通りifブロック内でh1タグ内にout.println(request.getPrameter("isbn")+iを書いて実行してみたところ、null値が返ってきていました。しかし、Display ie HTTP Headersというツールでクエリ情報を確認してみたところ、クエリは正常に送信されているようです。もしよろしければ考えられる原因などご回答くだされば幸いです。もちろん自分でもこれから原因を探って見たいと思います。ありがとうございました。何かヒントを得た気がします。

補足日時:2010/03/09 16:31
    • good
    • 0
この回答へのお礼

回答ありがとうございます。早速これから確認してみます。

お礼日時:2010/03/09 16:06

参考URLにあるコードを使って、全パラメーターを表示してみてください。


名前が間違っていたりしませんか?
2バイト文字になっていたなんて事は、なかなか気づきにくい間違いだったりします。

参考URL:http://www.atmarkit.co.jp/fjava/rensai2/jspservl …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。様々やっていたら知らぬ間に正常に動作するようになっていました。あまり気持ちのいい終わり方ではないですが、自分が何をやったかをノートにまとめてこの項は終わりたいと思います。ご紹介いただいたページもとても参考になる内容でしたので大切に保存させていただきました。
ほんとにありがとうございました。

お礼日時:2010/03/09 23:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!