旧掲示板でもお世話になっていましたが、
これからもよろしくお願いします。
先週取り組んでいた、列ごとのチェックをしている入力画面で
全テキストボックスに何も入ってなかった時のチェックについて
if文で行ごとのチェックに引っ掛かった回数カウントして
逃げる方法で解決することが出来ました。
今週は、先週までのものの改良として、
修正の際に全列をUPDATEしていたものを
まず修正する行を選び、選んだ行のみを別画面に表示し
データに手を加えてUPDATEするようにしたいと思います。
そこで、修正したい行のみを選択するためにチェックボックスを
配置したのですが、テーブルの中身をリザルトセットのWHILE文で
呼び出しているために、チェックボックスに皆同じ名前になってしまいます。
これを解消し、チェックをした列だけを別画面に呼び出すには
どうしたらよいでしょうか?
よろしくお願いいたします。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD>
<BODY>
<H1>データベースのテスト</H1>
<DIV CLASS="section">
<FORM ACTION="Update1.jsp" METHOD="post">
<TABLE CLASS="up">
<TR><TH CLASS="C1">更新</TH><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<%while(rs.next()){%>
<TR>
<TD CLASS="C2"><INPUT TYPE="checkbox" NAME="c1"></TD>
<TD CLASS="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("co_item")%>"></TD>
<TD CLASS="C3"><%=rs.getString("Item_Name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS="C4"><%=rs.getString("Price")%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
</DIV>
<DIV CLASS="section">
<INPUT TYPE="submit" VALUE="選 択">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Menu.jsp'">
</FORM>
</BODY>
</HTML>
※変数が先週までのものとは若干変更されております。
これからもよろしくお願いします。
先週取り組んでいた、列ごとのチェックをしている入力画面で
全テキストボックスに何も入ってなかった時のチェックについて
if文で行ごとのチェックに引っ掛かった回数カウントして
逃げる方法で解決することが出来ました。
今週は、先週までのものの改良として、
修正の際に全列をUPDATEしていたものを
まず修正する行を選び、選んだ行のみを別画面に表示し
データに手を加えてUPDATEするようにしたいと思います。
そこで、修正したい行のみを選択するためにチェックボックスを
配置したのですが、テーブルの中身をリザルトセットのWHILE文で
呼び出しているために、チェックボックスに皆同じ名前になってしまいます。
これを解消し、チェックをした列だけを別画面に呼び出すには
どうしたらよいでしょうか?
よろしくお願いいたします。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD>
<BODY>
<H1>データベースのテスト</H1>
<DIV CLASS="section">
<FORM ACTION="Update1.jsp" METHOD="post">
<TABLE CLASS="up">
<TR><TH CLASS="C1">更新</TH><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<%while(rs.next()){%>
<TR>
<TD CLASS="C2"><INPUT TYPE="checkbox" NAME="c1"></TD>
<TD CLASS="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("co_item")%>"></TD>
<TD CLASS="C3"><%=rs.getString("Item_Name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS="C4"><%=rs.getString("Price")%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
</DIV>
<DIV CLASS="section">
<INPUT TYPE="submit" VALUE="選 択">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Menu.jsp'">
</FORM>
</BODY>
</HTML>
※変数が先週までのものとは若干変更されております。
投稿:ばく[owada]/2006年 10月 04日 11時 24分
/更新:2006年 10月 04日 11時 24分
RE:質問よろしくお願いします。
by 竹形 誠司[takegata]
これは結構難しいですね。チェックボックスは、チェックされていないとパラメータ自体が送信されないので、受信側でも工夫が必要です。
下のコードは送信側の一部ですが、チェックボックスのNAME属性に0から始まる連番を振るようにしてみました。whileのループで表示されるチェックボックスは1行目がNAME="c1_0"、2行目がNAME="c1_1"、3行目がNAME="c1_2"・・・となります。
これを次のようなページで受けてみます。
もう少しいい方法があるかも知れませんが、とりあえず思いついた方法を書いてみました。
下のコードは送信側の一部ですが、チェックボックスのNAME属性に0から始まる連番を振るようにしてみました。whileのループで表示されるチェックボックスは1行目がNAME="c1_0"、2行目がNAME="c1_1"、3行目がNAME="c1_2"・・・となります。
<TABLE CLASS="up">
<TR><TH CLASS="C1">更新</TH><TH>アイテムコード</TH><TH>アイテム名 </TH><TH>単価</TH></TR>
<%
int i=0;
while(rs.next()){%>
<TR>
<TD CLASS="C2"><INPUT TYPE="checkbox" NAME="c1_<%=i%>"></TD>
<TD CLASS="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("co_item")%>"></TD>
<TD CLASS="C3"><%=rs.getString("Item_Name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS="C4"><%=rs.getString("Price")%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
</TR>
<%
i++;
}
stmt.close();
conn.close();
%>
</TABLE>
<TR><TH CLASS="C1">更新</TH><TH>アイテムコード</TH><TH>アイテム名 </TH><TH>単価</TH></TR>
<%
int i=0;
while(rs.next()){%>
<TR>
<TD CLASS="C2"><INPUT TYPE="checkbox" NAME="c1_<%=i%>"></TD>
<TD CLASS="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("co_item")%>"></TD>
<TD CLASS="C3"><%=rs.getString("Item_Name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS="C4"><%=rs.getString("Price")%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
</TR>
<%
i++;
}
stmt.close();
conn.close();
%>
</TABLE>
これを次のようなページで受けてみます。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCoItems = request.getParameterValues("Co_Item");
String[] aryItemNames = request.getParameterValues("Item_Name");
String[] aryPrices = request.getParameterValues("Price");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>動作管理</H1>
<DIV CLASS="section">
<%for(int i=0;i<aryCoItems.length;i++){
if(request.getParameter("c1_"+i)!=null){
/* c1_0, c1_1, c1_2, ...がnullでない場合に以下を実行 */
%>
<%=aryCoItems[i]%>:<%=aryItemNames[i]%>:<%=aryPrices[i]%><BR>
<%}
}%>
</DIV>
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="一覧に戻る" ONCLICK="location.href='Update.jsp'">
</DIV>
</BODY></HTML>
全体の行数はaryCoItems.lengthで調べることができるので、c1_0、c1_1、c1_2・・・の順にパラメータが送られてきているかどうかを調べ、パラメータが送られてきている場合(nullでない場合)はその行の処理を行うという感じです。<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCoItems = request.getParameterValues("Co_Item");
String[] aryItemNames = request.getParameterValues("Item_Name");
String[] aryPrices = request.getParameterValues("Price");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>動作管理</H1>
<DIV CLASS="section">
<%for(int i=0;i<aryCoItems.length;i++){
if(request.getParameter("c1_"+i)!=null){
/* c1_0, c1_1, c1_2, ...がnullでない場合に以下を実行 */
%>
<%=aryCoItems[i]%>:<%=aryItemNames[i]%>:<%=aryPrices[i]%><BR>
<%}
}%>
</DIV>
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="一覧に戻る" ONCLICK="location.href='Update.jsp'">
</DIV>
</BODY></HTML>
もう少しいい方法があるかも知れませんが、とりあえず思いついた方法を書いてみました。
投稿:竹形 誠司[takegata]/2006年 10月 05日 00時 21分
/更新:2006年 10月 05日 00時 26分
おはようございます。
お忙しいところご協力頂きまして、ありがとうございます。
これからソースがどうなっているか確認させて頂きます。
お忙しいところご協力頂きまして、ありがとうございます。
これからソースがどうなっているか確認させて頂きます。
投稿:ばく[owada]/2006年 10月 05日 08時 17分
/更新:2006年 10月 05日 08時 17分
ご提供していただいソースに若干手を加えてUPDATEするところまでたどり着けました。
しかし、修正ボタン押下時に以下のようなエラーになります。
前ページからのデータの取得の仕方が悪いのでしょうか?
また、以前から同じエラーがよく出るのですが、
このエラーの際の問題点の見つけ方がありましたら教えてください。
よろしくお願い致します。
org.apache.jasper.JasperException: Exception in JSP: /Itemlist_Update.jsp:43
40: throw e;
41: }
42: }finally{
43: pstmt.close();
44: conn.close();
45: }
46:
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.NullPointerException
org.apache.jsp.Itemlist_005fUpdate_jsp._jspService(org.apache.jsp.Itemlist_005fUpdate_jsp:85)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
*****Itemlist_Update_Comfirm.jsp*****
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<FORM ACTION="Itemlist_Update.jsp" METHOD="post">
<DIV CLASS="section">
<TABLE CLASS="itemlist">
<TR><TH>アイテムコード</TH><TH>数量</TH></TR>
<%for(int i=0;i<aryCo_Items.length;i++){
if(request.getParameter("c1_"+i)!=null){
/* c1_0, c1_1, c1_2, ...がnullでない場合に以下を実行 */
%>
<TR>
<TD CLASS="C3"><%=aryCo_Items[i]%></TD>
<TD CLASS="C4"><INPUT TYPE="text" NAME="Price" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
</TR>
<%}
}%>
</TABLE></DIV>
<DIV CLASS="section">
<INPUT TYPE="submit" VALUE="修 正">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='Menu.jsp'">
</FOME>
</DIV>
</BODY></HTML>
*****Itemlist_Update.jsp*****
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Item = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
String strMessage="";
Class.forName("com.mysql.jdbc.Driver");
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
Connection conn = DriverManager.getConnection(strConn);
Statement stmt = conn.createStatement();
PreparedStatement pstmt = null;
//SQLコマンドを作成
String strSql1 = "SELECT COUNT(co_item) FROM itemlist";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql1);
rs.next();
int intCount=rs.getInt(1);
try{
for(int i=0;i<intCount;i++){
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(3,aryCo_Item[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
}catch(SQLException e){
if(e.getErrorCode()==1062){
strMessage="アイテム名が重複しています。";
}else{
throw e;
}
}finally{
pstmt.close();
conn.close();
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<!-- <DIV CLASS="section"> -->
<H1><%=intCount%><%="行更新しました。"%></H1>
<!-- </DIV> -->
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='List.jsp'">
</DIV>
</BODY></HTML>
しかし、修正ボタン押下時に以下のようなエラーになります。
前ページからのデータの取得の仕方が悪いのでしょうか?
また、以前から同じエラーがよく出るのですが、
このエラーの際の問題点の見つけ方がありましたら教えてください。
よろしくお願い致します。
org.apache.jasper.JasperException: Exception in JSP: /Itemlist_Update.jsp:43
40: throw e;
41: }
42: }finally{
43: pstmt.close();
44: conn.close();
45: }
46:
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.NullPointerException
org.apache.jsp.Itemlist_005fUpdate_jsp._jspService(org.apache.jsp.Itemlist_005fUpdate_jsp:85)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
*****Itemlist_Update_Comfirm.jsp*****
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<FORM ACTION="Itemlist_Update.jsp" METHOD="post">
<DIV CLASS="section">
<TABLE CLASS="itemlist">
<TR><TH>アイテムコード</TH><TH>数量</TH></TR>
<%for(int i=0;i<aryCo_Items.length;i++){
if(request.getParameter("c1_"+i)!=null){
/* c1_0, c1_1, c1_2, ...がnullでない場合に以下を実行 */
%>
<TR>
<TD CLASS="C3"><%=aryCo_Items[i]%></TD>
<TD CLASS="C4"><INPUT TYPE="text" NAME="Price" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
</TR>
<%}
}%>
</TABLE></DIV>
<DIV CLASS="section">
<INPUT TYPE="submit" VALUE="修 正">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='Menu.jsp'">
</FOME>
</DIV>
</BODY></HTML>
*****Itemlist_Update.jsp*****
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Item = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
String strMessage="";
Class.forName("com.mysql.jdbc.Driver");
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
Connection conn = DriverManager.getConnection(strConn);
Statement stmt = conn.createStatement();
PreparedStatement pstmt = null;
//SQLコマンドを作成
String strSql1 = "SELECT COUNT(co_item) FROM itemlist";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql1);
rs.next();
int intCount=rs.getInt(1);
try{
for(int i=0;i<intCount;i++){
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(3,aryCo_Item[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
}catch(SQLException e){
if(e.getErrorCode()==1062){
strMessage="アイテム名が重複しています。";
}else{
throw e;
}
}finally{
pstmt.close();
conn.close();
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<!-- <DIV CLASS="section"> -->
<H1><%=intCount%><%="行更新しました。"%></H1>
<!-- </DIV> -->
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='List.jsp'">
</DIV>
</BODY></HTML>
投稿:ばく[owada]/2006年 10月 05日 12時 08分
/更新:2006年 10月 05日 12時 09分
このエラーはpstmtやconnが既に閉じられているか、または元々作られていない場合に起こりますね。ちょっと面倒ですけど、finally節を次のように修正してみてください。
connをfinallyの中でcloseしているのは、例外が発生した場合でもconnを確実にcloseするためです。
}finally{
try{
if(pstmt!=null){
pstmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
try{
if(pstmt!=null){
pstmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
connをfinallyの中でcloseしているのは、例外が発生した場合でもconnを確実にcloseするためです。
投稿:竹形 誠司[takegata]/2006年 10月 05日 13時 08分
/更新:2006年 10月 05日 13時 08分
finally部分を書き換えを試してみましたが、
今度はUPDATEするものがあるかのif文のところでエラーになってしまいました。
やはり、Itemlist_Insert_Confirm.jspからのデータの受け渡しがうまくいっていないのが原因なのでしょうか?
org.apache.jasper.JasperException: Exception in JSP: /Itemlist_Update.jsp:23
20: int intCount=rs.getInt(1);
21: try{
22: for(int i=0;i<intCount;i++){
23: if(!aryAmounts[i].equals("")){
24: String strSql = "Update itemlist SET amount =? WHERE co_item =?";
25: pstmt = conn.prepareStatement(strSql);
26: pstmt.setString(1,aryAmounts[i]);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.NullPointerException
org.apache.jsp.Itemlist_005fUpdate_jsp._jspService(org.apache.jsp.Itemlist_005fUpdate_jsp:65)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Item = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
String strMessage="";
Class.forName("com.mysql.jdbc.Driver");
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
Connection conn = DriverManager.getConnection(strConn);
Statement stmt = conn.createStatement();
PreparedStatement pstmt = null;
//SQLコマンドを作成
String strSql1 = "SELECT COUNT(co_item) FROM itemlist";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql1);
rs.next();
int intCount=rs.getInt(1);
try{
for(int i=0;i<intCount;i++){
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(3,aryCo_Item[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
}catch(SQLException e){
if(e.getErrorCode()==1062){
strMessage="アイテム名が重複しています。";
}else{
throw e;
}
}finally{
try{
if(pstmt!=null){
pstmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<!-- <DIV CLASS="section"> -->
<H1><%=intCount%><%="行更新しました。"%></H1>
<!-- </DIV> -->
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='List.jsp'">
</DIV>
</BODY></HTML>
今度はUPDATEするものがあるかのif文のところでエラーになってしまいました。
やはり、Itemlist_Insert_Confirm.jspからのデータの受け渡しがうまくいっていないのが原因なのでしょうか?
org.apache.jasper.JasperException: Exception in JSP: /Itemlist_Update.jsp:23
20: int intCount=rs.getInt(1);
21: try{
22: for(int i=0;i<intCount;i++){
23: if(!aryAmounts[i].equals("")){
24: String strSql = "Update itemlist SET amount =? WHERE co_item =?";
25: pstmt = conn.prepareStatement(strSql);
26: pstmt.setString(1,aryAmounts[i]);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.NullPointerException
org.apache.jsp.Itemlist_005fUpdate_jsp._jspService(org.apache.jsp.Itemlist_005fUpdate_jsp:65)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Item = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
String strMessage="";
Class.forName("com.mysql.jdbc.Driver");
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
Connection conn = DriverManager.getConnection(strConn);
Statement stmt = conn.createStatement();
PreparedStatement pstmt = null;
//SQLコマンドを作成
String strSql1 = "SELECT COUNT(co_item) FROM itemlist";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql1);
rs.next();
int intCount=rs.getInt(1);
try{
for(int i=0;i<intCount;i++){
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(3,aryCo_Item[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
}catch(SQLException e){
if(e.getErrorCode()==1062){
strMessage="アイテム名が重複しています。";
}else{
throw e;
}
}finally{
try{
if(pstmt!=null){
pstmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<!-- <DIV CLASS="section"> -->
<H1><%=intCount%><%="行更新しました。"%></H1>
<!-- </DIV> -->
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='List.jsp'">
</DIV>
</BODY></HTML>
投稿:ばく[owada]/2006年 10月 05日 13時 47分
/更新:2006年 10月 05日 13時 47分
aryAmounts[i] が null ですね。
フォームの送信側と受信側でパラメータ名の名前が合っているか
どうか確認してみてください。送信側のフォームに NAME="Amount"
という項目はありますか?。
String[] aryAmounts = request.getParameterValues("Amount");
に値が入っていないのかも知れません。フォームの送信側と受信側でパラメータ名の名前が合っているか
どうか確認してみてください。送信側のフォームに NAME="Amount"
という項目はありますか?。
投稿:竹形 誠司[takegata]/2006年 10月 05日 14時 46分
/更新:2006年 10月 05日 14時 57分
Amountを使用している部分は以下で全部です。
どれもちゃんと記述されているように思えます。
また、別のテーブルを使って同じ処理をさせているものについても
if文がエラーになっています。
Itemlist_Update_Form.jspからItemlist_Update_Confirm.jspへのデータの受け渡しは出来ています。
UPDATEするItemlist_Update.jspとItemlist_Update_Confirm.jspのデータの受け渡しが出来ているか確認する方法はありますか?
よろしくお願い致します。
*****Itemlist_Update_Form.jsp*****
<TD CLASS="C4"><%=rs.getString("Amount")%><INPUT TYPE="hidden" NAME="Amount" VALUE="<%=rs.getString("Amount")%>"></TD>
itemlist表を呼び出して、テーブルにしている部分。
*****Itemlist_Update_Confirm.jsp*****
String[] aryAmounts = request.getParameterValues("Amount");
頭の宣言部分。
<TD CLASS="C4"><INPUT TYPE="text" NAME="Price" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
修正する一覧をテーブルにしている部分。
*****Itemlist_Update.jsp*****
String[] aryAmounts = request.getParameterValues("Amount");
頭の宣言部分。
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(3,aryCo_Item[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
プリペアードステートメントの部分。
----------別の表を使ってのUPDATE処理でのエラー----------
org.apache.jasper.JasperException: Exception in JSP: /Name_Update.jsp:25
22:
23: try{
24: for(int i=0;i<intCount;i++){
25: if(!aryItem_Names[i].equals("") && !aryPrices[i].equals("")){
26: String strSql = "UPDATE items SET item_name =?, price =? WHERE co_item =?";
27: pstmt = conn.prepareStatement(strSql);
28: pstmt.setString(1,aryItem_Names[i]);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.NullPointerException
org.apache.jsp.Name_005fUpdate_jsp._jspService(org.apache.jsp.Name_005fUpdate_jsp:67)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
どれもちゃんと記述されているように思えます。
また、別のテーブルを使って同じ処理をさせているものについても
if文がエラーになっています。
Itemlist_Update_Form.jspからItemlist_Update_Confirm.jspへのデータの受け渡しは出来ています。
UPDATEするItemlist_Update.jspとItemlist_Update_Confirm.jspのデータの受け渡しが出来ているか確認する方法はありますか?
よろしくお願い致します。
*****Itemlist_Update_Form.jsp*****
<TD CLASS="C4"><%=rs.getString("Amount")%><INPUT TYPE="hidden" NAME="Amount" VALUE="<%=rs.getString("Amount")%>"></TD>
itemlist表を呼び出して、テーブルにしている部分。
*****Itemlist_Update_Confirm.jsp*****
String[] aryAmounts = request.getParameterValues("Amount");
頭の宣言部分。
<TD CLASS="C4"><INPUT TYPE="text" NAME="Price" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
修正する一覧をテーブルにしている部分。
*****Itemlist_Update.jsp*****
String[] aryAmounts = request.getParameterValues("Amount");
頭の宣言部分。
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(3,aryCo_Item[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
プリペアードステートメントの部分。
----------別の表を使ってのUPDATE処理でのエラー----------
org.apache.jasper.JasperException: Exception in JSP: /Name_Update.jsp:25
22:
23: try{
24: for(int i=0;i<intCount;i++){
25: if(!aryItem_Names[i].equals("") && !aryPrices[i].equals("")){
26: String strSql = "UPDATE items SET item_name =?, price =? WHERE co_item =?";
27: pstmt = conn.prepareStatement(strSql);
28: pstmt.setString(1,aryItem_Names[i]);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.NullPointerException
org.apache.jsp.Name_005fUpdate_jsp._jspService(org.apache.jsp.Name_005fUpdate_jsp:67)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
投稿:ばく[owada]/2006年 10月 05日 16時 21分
/更新:2006年 10月 05日 16時 21分
全体のコードが分からないので推測ですが、
この辺に問題があるのでは?
*****Itemlist_Update_Confirm.jsp*****
String[] aryAmounts = request.getParameterValues("Amount");
頭の宣言部分。
<TD CLASS="C4"><INPUT TYPE="text" NAME="Price" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
で NAME="Price" のパラメータに aryAmounts[i] を入れていますが、String[] aryAmounts = request.getParameterValues("Amount");
頭の宣言部分。
<TD CLASS="C4"><INPUT TYPE="text" NAME="Price" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
この辺に問題があるのでは?
投稿:竹形 誠司[takegata]/2006年 10月 05日 20時 18分
/更新:2006年 10月 05日 20時 18分
おはようございます。
昨日指摘して頂いた件は、NAME要素の記述ミスでした。
この部分を修正して再度修正処理を実行したところ以下のようなエラーが出ました。
Itemlist_Update_Confirm.jspとItemlist_Update.jspの間のデータの送受信がうまく行えてないようなのですが、どうしたらよいですか?
よろしくお願い致します。
例外
org.apache.jasper.JasperException: Exception in JSP: /Itemlist_Update.jsp:23
20: int intCount=rs.getInt(1);
21: try{
22: for(int i=0;i<intCount;i++){
23: if(!aryAmounts[i].equals("")){
24: String strSql = "Update itemlist SET amount =? WHERE co_item =?";
25: pstmt = conn.prepareStatement(strSql);
26: pstmt.setString(1,aryAmounts[i]);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.ArrayIndexOutOfBoundsException: 1
org.apache.jsp.Itemlist_005fUpdate_jsp._jspService(org.apache.jsp.Itemlist_005fUpdate_jsp:65)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
----------Itemlist_Update_Confirm.jsp----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<FORM NAME="form1" ACTION="Itemlist_Update.jsp" METHOD="post">
<DIV CLASS="section">
<TABLE CLASS="itemlist">
<TR><TH>アイテムコード</TH><TH>数量</TH></TR>
<%for(int i=0;i<aryCo_Items.length;i++){
if(request.getParameter("c1_"+i)!=null){
/* c1_0, c1_1, c1_2, ...がnullでない場合に以下を実行 */
%>
<TR>
<TD CLASS="C3"><%=aryCo_Items[i]%><INPUT TYPE="hidden" NAME="Co_Item" MAXLENGTH="4" VALUE="<%=aryCo_Items[i]%>"></TD>
<TD CLASS="C4"><INPUT TYPE="text" NAME="Amount" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
</TR>
<%}
}%>
</TABLE></DIV>
<DIV CLASS="section">
<INPUT TYPE="submit" VALUE="修 正">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Itemlist_Update_Form.jsp'">
</FOME>
</DIV>
</BODY></HTML>
----------Itemlist_Update.jsp----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
String strMessage="";
Class.forName("com.mysql.jdbc.Driver");
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
Connection conn = DriverManager.getConnection(strConn);
Statement stmt = conn.createStatement();
PreparedStatement pstmt = null;
//SQLコマンドを作成
String strSql1 = "SELECT COUNT(co_item) FROM itemlist";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql1);
rs.next();
int intCount=rs.getInt(1);
try{
for(int i=0;i<intCount;i++){
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(2,aryCo_Items[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
}catch(SQLException e){
if(e.getErrorCode()==1062){
strMessage="アイテム名が重複しています。";
}else{
throw e;
}
}finally{
try{
if(pstmt!=null){
pstmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<!-- <DIV CLASS="section"> -->
<H1><%=intCount%><%="行更新しました。"%></H1>
<!-- </DIV> -->
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='Menu.jsp'">
</DIV>
</BODY></HTML>
昨日指摘して頂いた件は、NAME要素の記述ミスでした。
この部分を修正して再度修正処理を実行したところ以下のようなエラーが出ました。
Itemlist_Update_Confirm.jspとItemlist_Update.jspの間のデータの送受信がうまく行えてないようなのですが、どうしたらよいですか?
よろしくお願い致します。
例外
org.apache.jasper.JasperException: Exception in JSP: /Itemlist_Update.jsp:23
20: int intCount=rs.getInt(1);
21: try{
22: for(int i=0;i<intCount;i++){
23: if(!aryAmounts[i].equals("")){
24: String strSql = "Update itemlist SET amount =? WHERE co_item =?";
25: pstmt = conn.prepareStatement(strSql);
26: pstmt.setString(1,aryAmounts[i]);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.ArrayIndexOutOfBoundsException: 1
org.apache.jsp.Itemlist_005fUpdate_jsp._jspService(org.apache.jsp.Itemlist_005fUpdate_jsp:65)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
----------Itemlist_Update_Confirm.jsp----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<FORM NAME="form1" ACTION="Itemlist_Update.jsp" METHOD="post">
<DIV CLASS="section">
<TABLE CLASS="itemlist">
<TR><TH>アイテムコード</TH><TH>数量</TH></TR>
<%for(int i=0;i<aryCo_Items.length;i++){
if(request.getParameter("c1_"+i)!=null){
/* c1_0, c1_1, c1_2, ...がnullでない場合に以下を実行 */
%>
<TR>
<TD CLASS="C3"><%=aryCo_Items[i]%><INPUT TYPE="hidden" NAME="Co_Item" MAXLENGTH="4" VALUE="<%=aryCo_Items[i]%>"></TD>
<TD CLASS="C4"><INPUT TYPE="text" NAME="Amount" MAXLENGTH="4" VALUE="<%=aryAmounts[i]%>"></TD>
</TR>
<%}
}%>
</TABLE></DIV>
<DIV CLASS="section">
<INPUT TYPE="submit" VALUE="修 正">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Itemlist_Update_Form.jsp'">
</FOME>
</DIV>
</BODY></HTML>
----------Itemlist_Update.jsp----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("WIndows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryAmounts = request.getParameterValues("Amount");
String strMessage="";
Class.forName("com.mysql.jdbc.Driver");
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
Connection conn = DriverManager.getConnection(strConn);
Statement stmt = conn.createStatement();
PreparedStatement pstmt = null;
//SQLコマンドを作成
String strSql1 = "SELECT COUNT(co_item) FROM itemlist";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql1);
rs.next();
int intCount=rs.getInt(1);
try{
for(int i=0;i<intCount;i++){
if(!aryAmounts[i].equals("")){
String strSql = "Update itemlist SET amount =? WHERE co_item =?";
pstmt = conn.prepareStatement(strSql);
pstmt.setString(1,aryAmounts[i]);
pstmt.setString(2,aryCo_Items[i]);
int intResult = pstmt.executeUpdate();
if(intResult==1){
strMessage="修正完了";
}else{
strMessage="修正に失敗しました";
}
}
}
}catch(SQLException e){
if(e.getErrorCode()==1062){
strMessage="アイテム名が重複しています。";
}else{
throw e;
}
}finally{
try{
if(pstmt!=null){
pstmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<H1>アイテムリストテーブル修正</H1>
<!-- <DIV CLASS="section"> -->
<H1><%=intCount%><%="行更新しました。"%></H1>
<!-- </DIV> -->
<DIV CLASS="section">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="location.href='Menu.jsp'">
</DIV>
</BODY></HTML>
投稿:ばく[owada]/2006年 10月 06日 08時 47分
/更新:2006年 10月 06日 14時 58分
原因
java.lang.ArrayIndexOutOfBoundsException: 1
とありますが、これは配列の要素数を超えてアクセスしようとしたために発生する例外です。23行目の i が aryAmounts の要素数より大きな値になってしまっているわけです。java.lang.ArrayIndexOutOfBoundsException: 1
20: int intCount=rs.getInt(1);
21: try{
22: for(int i=0;i<intCount;i++){
23: if(!aryAmounts[i].equals("")){
24: String strSql = "Update itemlist SET amount =? WHERE co_item =?";
25: pstmt = conn.prepareStatement(strSql);
26: pstmt.setString(1,aryAmounts[i]);
の部分を21: try{
22: for(int i=0;i<intCount;i++){
23: if(!aryAmounts[i].equals("")){
24: String strSql = "Update itemlist SET amount =? WHERE co_item =?";
25: pstmt = conn.prepareStatement(strSql);
26: pstmt.setString(1,aryAmounts[i]);
22: for(int i=0;i<aryAmounts.length;i++){
のように直せばこのエラーは無くなると思います。
投稿:竹形 誠司[takegata]/2006年 10月 06日 15時 26分
/更新:2006年 10月 06日 15時 29分
ご指導ありがとうございます。
確認してみます。
確認してみます。
投稿:ばく[owada]/2006年 10月 06日 17時 51分
/更新:2006年 10月 06日 17時 51分
おはようございます。
for文の条件でintCountからaryAmounts.lengthに変更することで
UPDATEが出来るようになりました。
ありがとうございます。
for文の条件でintCountからaryAmounts.lengthに変更することで
UPDATEが出来るようになりました。
ありがとうございます。
投稿:ばく[owada]/2006年 10月 10日 11時 21分
/更新:2006年 10月 10日 11時 21分
こんにちは。
今回は表示に関する質問をさせて下さい。
桁数の多い数字を表示される際に、カンマ区切りになっていないと見づらいので
カンマ区切りの整形をしたいと思っているのですが、どのような方法がありますか?
よろしく願いします。
今回は表示に関する質問をさせて下さい。
桁数の多い数字を表示される際に、カンマ区切りになっていないと見づらいので
カンマ区切りの整形をしたいと思っているのですが、どのような方法がありますか?
よろしく願いします。
投稿:ばく[owada]/2006年 10月 10日 17時 06分
/更新:2006年 10月 10日 17時 06分
数値文字列の整形にはNumberFormatクラスを使うといいと思います。『Java+MySQL+Tomcatで始めるWebアプリケーション構築入門』のP.66にこのクラスの概要を書きました。詳細は下のURLを参照してください。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/text/NumberFormat.html
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/text/NumberFormat.html
投稿:竹形 誠司[takegata]/2006年 10月 10日 17時 29分
/更新:2006年 10月 10日 17時 29分
おはようございます。
参考にさせていただきます。
参考にさせていただきます。
投稿:ばく[owada]/2006年 10月 11日 08時 14分
/更新:2006年 10月 11日 08時 14分
教えて頂いたサイト等を参照して形式はなんとなく分かりました。
オブジェクトの生成
NumberFormat exObject = NumberFormat.getNumberInstance();
フォーマット処理
exObject.format(exFormat)
これをテーブルの内容を表示するソースに埋め込んでみました。
場所が悪いのかやり方自体がトンチンカンなのかエラーが出てしまいます。
ご指導のほど、よろしくお願い致します。
以下のソースは、2つのテーブルを元にビューを作り、
これを表示させています。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD>
<BODY>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
例外
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved to a type
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved to a type
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:409)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
オブジェクトの生成
NumberFormat exObject = NumberFormat.getNumberInstance();
フォーマット処理
exObject.format(exFormat)
これをテーブルの内容を表示するソースに埋め込んでみました。
場所が悪いのかやり方自体がトンチンカンなのかエラーが出てしまいます。
ご指導のほど、よろしくお願い致します。
以下のソースは、2つのテーブルを元にビューを作り、
これを表示させています。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD>
<BODY>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
例外
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved to a type
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved to a type
JSPファイル: /items_list_select.jsp の中の30行目でエラーが発生しました
生成されたサーブレットのエラーです:
NumberFormat cannot be resolved
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:409)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
投稿:ばく[owada]/2006年 10月 11日 09時 54分
/更新:2006年 10月 11日 09時 54分
NumberFormatはjava.textパッケージのクラスなので、このパッケージをimportする必要があります。
<%@ page import="java.sql.*"%>
の下に<%@ page import="java.text.*"%>
を入れてください。
投稿:竹形 誠司[takegata]/2006年 10月 11日 12時 30分
/更新:2006年 10月 11日 12時 30分
こんにちは。
<%@ page import="java.text.*"%>を追加して動作確認してみました。
そうしましたら以下のようなエラーになりました。
テーブルを表示していたものに埋め込んだのですが
書き方に問題があるのでしょうか?
また、<%NumberFormat exObject = NumberFormat.getNumberInstance();%>の一文を
BODYに置いたのですがこれもこの場所・書き方でよいのでしょうか?
よろしくお願いします。
例外
org.apache.jasper.JasperException: Exception in JSP: /items_list_select.jsp:39
36: <TR>
37: <TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
38: <TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
39: <TD CLASS ="C4"><%=exObject.format(rs.getString("price"))%></TD>
40: <TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
41: <TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
42: </TR>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.IllegalArgumentException: Cannot format given Object as a Number
java.text.DecimalFormat.format(Unknown Source)
java.text.Format.format(Unknown Source)
org.apache.jsp.items_005flist_005fselect_jsp._jspService(org.apache.jsp.items_005flist_005fselect_jsp:93)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD>
<BODY>
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
<%@ page import="java.text.*"%>を追加して動作確認してみました。
そうしましたら以下のようなエラーになりました。
テーブルを表示していたものに埋め込んだのですが
書き方に問題があるのでしょうか?
また、<%NumberFormat exObject = NumberFormat.getNumberInstance();%>の一文を
BODYに置いたのですがこれもこの場所・書き方でよいのでしょうか?
よろしくお願いします。
例外
org.apache.jasper.JasperException: Exception in JSP: /items_list_select.jsp:39
36: <TR>
37: <TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
38: <TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
39: <TD CLASS ="C4"><%=exObject.format(rs.getString("price"))%></TD>
40: <TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
41: <TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
42: </TR>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.lang.IllegalArgumentException: Cannot format given Object as a Number
java.text.DecimalFormat.format(Unknown Source)
java.text.Format.format(Unknown Source)
org.apache.jsp.items_005flist_005fselect_jsp._jspService(org.apache.jsp.items_005flist_005fselect_jsp:93)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD>
<BODY>
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
投稿:ばく[owada]/2006年 10月 11日 13時 23分
/更新:2006年 10月 11日 13時 23分
NumberFormatクラスのformatメソッドには文字列を指定できません。
long型またはdouble型の数値として指定する必要があります。
long型またはdouble型の数値として指定する必要があります。
<TD CLASS ="C4"><%=exObject.format(rs.getString("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
を<TD CLASS ="C4"><%=exObject.format(rs.getString("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getString("sal"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%></TD>
にしてみてください。<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%></TD>
投稿:竹形 誠司[takegata]/2006年 10月 11日 13時 31分
/更新:2006年 10月 11日 13時 31分
早速のご指摘ありがとうございます。
StringをLongに変更することで表示できるようになりました。
ありがとうございます。
次は、チェックボックスの入力チェックに取り掛かります。
StringをLongに変更することで表示できるようになりました。
ありがとうございます。
次は、チェックボックスの入力チェックに取り掛かります。
投稿:ばく[owada]/2006年 10月 11日 13時 38分
/更新:2006年 10月 11日 13時 38分
NumberFormatつながりで、
テキストボックスに入力したデータを確認する画面で、
入力した値を配列に入れるためにStringで宣言している場合は
どうやってLong型に変更すればいいのでしょうか?
よろしくお願いします。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
request.setCharacterEncoding("Windows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryItem_Names = request.getParameterValues("Item_Name");
String[] aryPrices = request.getParameterValues("Price");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1>名称テーブル登録</H1>
<FORM ACTION="Name_Insert.jsp" METHOD="post">
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<TR><TD CLASS="C3"><%=aryCo_Items[0]%></TD><TD CLASS="C3"><%=aryItem_Names[0]%></TD><TD CLASS="C4"><%=aryPrices[0]%></TD></TR>
<TR><TD CLASS="C3"><%=aryCo_Items[1]%></TD><TD CLASS="C3"><%=aryItem_Names[1]%></TD><TD CLASS="C4"><%=aryPrices[1]%></TD></TR>
<TR><TD CLASS="C3"><%=aryCo_Items[2]%></TD><TD CLASS="C3"><%=aryItem_Names[2]%></TD><TD CLASS="C4"><%=aryPrices[2]%></TD></TR>
</TABLE>
<INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=aryCo_Items[0]%>">
<INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=aryItem_Names[0]%>">
<INPUT TYPE="hidden" NAME="Price" VALUE="<%=aryPrices[0]%>">
<INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=aryCo_Items[1]%>">
<INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=aryItem_Names[1]%>">
<INPUT TYPE="hidden" NAME="Price" VALUE="<%=aryPrices[1]%>">
<INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=aryCo_Items[2]%>">
<INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=aryItem_Names[2]%>">
<INPUT TYPE="hidden" NAME="Price" VALUE="<%=aryPrices[2]%>">
<INPUT TYPE="submit" VALUE="登 録">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Name_Insert_Form.jsp'">
</FORM>
</DIV>
</BODY></HTML>
テキストボックスに入力したデータを確認する画面で、
入力した値を配列に入れるためにStringで宣言している場合は
どうやってLong型に変更すればいいのでしょうか?
よろしくお願いします。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
request.setCharacterEncoding("Windows-31J");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryItem_Names = request.getParameterValues("Item_Name");
String[] aryPrices = request.getParameterValues("Price");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1>名称テーブル登録</H1>
<FORM ACTION="Name_Insert.jsp" METHOD="post">
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<TR><TD CLASS="C3"><%=aryCo_Items[0]%></TD><TD CLASS="C3"><%=aryItem_Names[0]%></TD><TD CLASS="C4"><%=aryPrices[0]%></TD></TR>
<TR><TD CLASS="C3"><%=aryCo_Items[1]%></TD><TD CLASS="C3"><%=aryItem_Names[1]%></TD><TD CLASS="C4"><%=aryPrices[1]%></TD></TR>
<TR><TD CLASS="C3"><%=aryCo_Items[2]%></TD><TD CLASS="C3"><%=aryItem_Names[2]%></TD><TD CLASS="C4"><%=aryPrices[2]%></TD></TR>
</TABLE>
<INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=aryCo_Items[0]%>">
<INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=aryItem_Names[0]%>">
<INPUT TYPE="hidden" NAME="Price" VALUE="<%=aryPrices[0]%>">
<INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=aryCo_Items[1]%>">
<INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=aryItem_Names[1]%>">
<INPUT TYPE="hidden" NAME="Price" VALUE="<%=aryPrices[1]%>">
<INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=aryCo_Items[2]%>">
<INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=aryItem_Names[2]%>">
<INPUT TYPE="hidden" NAME="Price" VALUE="<%=aryPrices[2]%>">
<INPUT TYPE="submit" VALUE="登 録">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Name_Insert_Form.jsp'">
</FORM>
</DIV>
</BODY></HTML>
投稿:ばく[owada]/2006年 10月 11日 15時 50分
/更新:2006年 10月 11日 15時 51分
String 型を int 型に変換するためにIntegerクラスのparseIntメソッドを使うことが多いと思いますが、long型に変換するには、同じように LongクラスのparseLongメソッドを使います。
投稿:竹形 誠司[takegata]/2006年 10月 11日 16時 18分
/更新:2006年 10月 11日 16時 18分
こんにちは。
今回は不要なテーブルを削除した時に起こったエラーについて質問させて下さい。
事象は、今回作成したシステム?を作成を始めたばかりの頃に作成したテーブルがありました、そのテーブルはその後使用しなくなってしまったので中にデータは何も入っていません。
そのため、このテーブルをデータベースから削除しようとしたのですが、
削除するとシステムのメニューを表示するページで、そのテーブルがありませんというメッセージが出てしまいます。
登録、修正、削除処理は問題なく動作します。
そのまま使用してない問題のテーブルを削除しなくても特に支障はないのですが、エラーになる原因が知りたいので、もし心当たりがあるようでしたら教えてください。
例外
org.apache.jasper.JasperException: Table 'sample.item' doesn't exist
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
javax.servlet.ServletException: Table 'sample.item' doesn't exist
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
org.apache.jsp.Menu_jsp._jspService(org.apache.jsp.Menu_jsp:108)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.sql.SQLException: Table 'sample.item' doesn't exist
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
com.mysql.jdbc.Connection.execSQL(Connection.java:2988)
com.mysql.jdbc.Connection.execSQL(Connection.java:2917)
com.mysql.jdbc.Statement.executeQuery(Statement.java:824)
org.apache.jsp.Menu_jsp._jspService(org.apache.jsp.Menu_jsp:61)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
今回は不要なテーブルを削除した時に起こったエラーについて質問させて下さい。
事象は、今回作成したシステム?を作成を始めたばかりの頃に作成したテーブルがありました、そのテーブルはその後使用しなくなってしまったので中にデータは何も入っていません。
そのため、このテーブルをデータベースから削除しようとしたのですが、
削除するとシステムのメニューを表示するページで、そのテーブルがありませんというメッセージが出てしまいます。
登録、修正、削除処理は問題なく動作します。
そのまま使用してない問題のテーブルを削除しなくても特に支障はないのですが、エラーになる原因が知りたいので、もし心当たりがあるようでしたら教えてください。
例外
org.apache.jasper.JasperException: Table 'sample.item' doesn't exist
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
javax.servlet.ServletException: Table 'sample.item' doesn't exist
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
org.apache.jsp.Menu_jsp._jspService(org.apache.jsp.Menu_jsp:108)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
java.sql.SQLException: Table 'sample.item' doesn't exist
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
com.mysql.jdbc.Connection.execSQL(Connection.java:2988)
com.mysql.jdbc.Connection.execSQL(Connection.java:2917)
com.mysql.jdbc.Statement.executeQuery(Statement.java:824)
org.apache.jsp.Menu_jsp._jspService(org.apache.jsp.Menu_jsp:61)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
投稿:ばく[owada]/2006年 11月 07日 14時 33分
/更新:2006年 11月 07日 14時 33分
エラーを起こすコードの中に、削除したテーブルにアクセスしている部分があるはずです。これを探して削除すればエラーは無くなると思います。
投稿:竹形 誠司[takegata]/2006年 11月 07日 19時 15分
/更新:2006年 11月 07日 19時 16分
こんにちは。
ファイルを使い回しが原因だと思うのですが、しっかりitem表をselectしてリザルトセットに入れるソースがありました。
何で昨日の時点でそれに気が付かなかったのかよく分からないんですが、そのソースを削除することで、item表を削除してもエラーにならなくなりました。
ファイルを使い回しが原因だと思うのですが、しっかりitem表をselectしてリザルトセットに入れるソースがありました。
何で昨日の時点でそれに気が付かなかったのかよく分からないんですが、そのソースを削除することで、item表を削除してもエラーにならなくなりました。
投稿:ばく[owada]/2006年 11月 08日 16時 07分
/更新:2006年 11月 08日 16時 07分