- ベストアンサー
java servletでMySQLへの情報登録について
- java servletを使用して、ホームページのフォームから名前と番号をMySQLに登録したい
- フォームの列名はname[1],bango[1]などの形式であり、番号があるものだけを登録したい
- 試しに作ったservletでうまく登録できない。なお、MySQLの接続情報やクエリは正しい
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
DBの型(多分数値型?)にNULLを入れようとしてエラーになっているように見えます。 おそらくパラメータがちゃんと取れてないんじゃありませんか? 今のソースだとINSERTの前にnameとjikokuの値をが入っているかチェックされずにINSERT処理にいってしまうので、事前にチェックしたほうがいいかと。 doGetメソッドの中身ですが、do whileかwhileに書き直したほうがよいのでは?(do whileあんまり好きじゃないのでwhileで書いてみます) /*HTTP Get リクエストの処理*/ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //エンコード request.setCharacterEncoding("Shift_JIS"); //FORMからの第一次受け渡し int i = 1; String name = request.getParameter("name["+ i +"]"); String jikoku = request.getParameter("jikoku["+ i +"]"); //for文の始まり while ( name != null && !name.equals("") ){ if ( jikoku != null && !jikoku.equals("") ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); Statement stmt = null; ResultSet rs = null; try{ /* 検索するSQL文を作成 */ String sql = "INSERT INTO table1 (eki,jikoku) VALUES ('"+name+"','"+jikoku+"') "; /* Statementオブジェクトの生成とクエリの実行 */ stmt = con.createStatement(); stmt.executeUpdate(sql); /* 切断 */ stmt.close(); } catch (SQLException e){ out.println("<h3>登録に失敗しました</h3>"); e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } finally{ /* finallyを使って資源の解放 */ try{ if (stmt != null){ stmt.close(); stmt = null; } } catch (Exception e){ e.printStackTrace(); } } }//if文の終了 else{ // jikokuが空っぽだよー } //FORMからの第一次受け渡し i++; name = request.getParameter("name["+ i +"]"); jikoku = request.getParameter("jikoku["+ i +"]"); }//for文終了 } javaのコンパイル環境ないので間違っているかもしれませんが、適宜修正してください。
その他の回答 (5)
- ProKaseifu
- ベストアンサー率51% (98/192)
><form action=http://localhost:8080/MyApp/servlet/program2 method=get> >名前<input name="name[1]" value="田中"> 時刻<input name="jikou[1]"><br> >名前<input name="name[2]" value="品川"> 時刻<input name="jikou[2]"><br> >名前<input name="name[3]" value="村上"> 時刻<input name="jikou[3]"><br> <br> ><input type="submit" value="送信"> getParameterで取得するときのパラメータ名とhtmlのパラメータ名が不一致です。これでは取得できるはずがありません。(HTMLではjikou、サーブレット側はjikoku) 次に、時刻のvalueの設定がないのでパラメータを取得できたとしても""かnullのどちらかが取得されるはずです。 上記部分をもう一度見直してみてください。
お礼
文字化けはHTMLの設定をしていなかったせいでした。申し訳ありませんでした。 今日一日ほとんど朝から親身になってご教授していただき 非常に心強く粘り強く教えていただいたこととても感謝しております。 ProKaseifu様本当にありがとうございました。
補足
凡ミスをしていました。ご迷惑をおかけしてすみませんでした。 本線と脱線するような気もするのですがご相談させていただきます。 登録はうまくいくのですが、MySQLで確認すると文字化けしてしまいます。 ソースコードに書いていますが文字化け対策として request.setCharacterEncoding("Shift_JIS"); をしていますが登録されているときには文字化けしています。 他のjavaサーブレットの文字を表示するプログラムは正しく表示されます。 javaの質問をするところで恐悦至極に思いますがご意見お願いいたします。 参考にしましたサイト http://www.atmarkit.co.jp/fjava/rensai3/mojibake03/mojibake03.html
- fortranxp
- ベストアンサー率26% (181/684)
NO3.訂正 String[] name=new String[100]; String[] jikoku=new String[100]; で name[i] = request.getParameterValues("name["+ i +"]"); jikoku[i] = request.getParameterValues("jikoku["+ i +"]"); かも
- fortranxp
- ベストアンサー率26% (181/684)
ぱっと見ですが String nameとString jikokuは 配列ですのでString[] name=new name[100]; String[] jikoku=new jikoku[100]だと思います。
- ProKaseifu
- ベストアンサー率51% (98/192)
DBにインサートする部分でエラーが発生しているのでしょうか? エラーの内容を教えてください。
補足
エラー文があまりにも長くなってしまうので、はじめだけ書かせていただきます。 java.sql.SQLException: incorrect integer value: 'null' for column 'jikoku' at row1........ この後は非常に長くて書けませんでした。
- ProKaseifu
- ベストアンサー率51% (98/192)
どのへんが「うまくいきません」か? フォームのパラメータを受け取れない? DBにインサートできていない? 等。 質問はできるだけピンポイントで。
補足
上記のプログラムだとtomcatにエラーが排出されます。 以前今の状態と少し違いますがプログラムを作ったところ、 フォームからのパラメータ取得は出来ているようですが、 DBには登録できませんでした。 プログラムの概要ですが 「nameが無くなるまでループを行い、jikokuがある場合だけ登録する」という具合です。
補足
わざわざソースプログラムを書いていただき、ありがとうございます。 実行しMySQLからデータを確認したところ、 Emptyと表示されるので登録が失敗しているようです。 念のため、以下にHTMLを書きます。 <form action=http://localhost:8080/MyApp/servlet/program2 method=get> 名前<input name="name[1]" value="田中"> 時刻<input name="jikou[1]"><br> 名前<input name="name[2]" value="品川"> 時刻<input name="jikou[2]"><br> 名前<input name="name[3]" value="村上"> 時刻<input name="jikou[3]"><br> <br> <input type="submit" value="送信"> 記述していただいたプログラムのコンパイルですが、問題なくできました。