• ベストアンサー

サーブレットでデータベース操作。

サーブレットを使ってMySQL内のテーブルにレコードを追加、変更、削除できるようなプログラムを作っています。流れとしましては『HTML画面→サーブレット起動→レコード追加、変更、削除』といった具合です。追加、変更ができてなぜか削除だけできません。SQL文を書き換えるだけのはずなのですが・・。どなたか教えて下さい。windows2000Professional, j2sdk1.4.0_01, Tomcat3.3.1,MySQL3.23.47 略 . . Connection con = null; Statement stmt = null; try { con = DriverManager.getConnection( "jdbc:mysql://localhost/db_ichat", "root", "pen3"); stmt = con.createStatement(); String seqno = request.getParameter("seqno"); String name = request.getParameter("name"); String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); String psw = request.getParameter("psw"); String pswjp = new String(psw.getBytes("8859_1"), "JISAutoDetect"); String email = request.getParameter("email"); StringBuffer buf = new StringBuffer(); buf.append("delete from t_id "); buf.append("where seqno = "); buf.append(seqno); stmt.executeUpdate(buf.toString()); try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} . . 略。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • nori1976
  • ベストアンサー率60% (3/5)
回答No.2

Exceptionを見る限りでは、 s_delete.java:55 s_delete.javaのソースの、55行目に原因があるといっています。 55行目の情報設定の値がNULLになっているとかはありませんか? 55行目の前後をご確認ください。

wareha_uminoko
質問者

お礼

できました!!なんてことはない理由でした。 取得しなくても良いものを書いていたからだったと思います。 //String name = request.getParameter("name"); //String namejp = new String(name.getBytes("8859_1"), //                  "JISAutoDetect"); //String psw = request.getParameter("psw"); //String pswjp = new String(psw.getBytes("8859_1"), //                  "JISAutoDetect"); //String email = request.getParameter("email"); これらの部分を上記のようにコメントにして String seqno = request.getParameter("seqno");だけを取得した結果、 うまくいきました。55行目付近を徹底して考えていたらわかりました。 ちょっと原因に拍子抜けしましたが、できてよかったです。ありがとうございました。

その他の回答 (2)

noname#16216
noname#16216
回答No.3

> String name = request.getParameter("name");         : > String psw = request.getParameter("psw"); これのどちらかが、HttpServletRequestからnullで 取得されたりしてませんか?

wareha_uminoko
質問者

お礼

おいそがしいのに時間を割いて答えてくださいましてありがとうございました。

  • nori1976
  • ベストアンサー率60% (3/5)
回答No.1

できたSQL文(stmt.executeUpdate(buf.toString());直前のもの)を、ログに出力し、確認してみてください。 それと、ExceptionとSQLExceptionを拾って、getMessage()でメッセージを取得してみてください。 原因がわかると思います。 Connection con = null; Statement stmt = null; try { con = DriverManager.getConnection( "jdbc:mysql://localhost/db_ichat", "root", "pen3"); stmt = con.createStatement(); String seqno = request.getParameter("seqno"); String name = request.getParameter("name"); String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); String psw = request.getParameter("psw"); String pswjp = new String(psw.getBytes("8859_1"), "JISAutoDetect"); String email = request.getParameter("email"); StringBuffer buf = new StringBuffer(); buf.append("delete from t_id "); buf.append("where seqno = "); buf.append(seqno); try{ stmt.executeUpdate(buf.toString()); }catch(SQLException e){ // ログがあるならログを入れてください、ないなら,stdout e.printStackTrace(); }catch(Exception e){ // ログがあるならログを入れてください、ないなら,stdout e.printStackTrace(); } try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} #上記方法で出力したならば、tomcatのlogs配下のログにはかれているはずです。

wareha_uminoko
質問者

補足

tomcat画面では下記のログが出まして、logファイルの中には『2003-01-25 18:28:04 - /netjv: s_delete: init』と書かれたテキストがありました。 もう少し簡単に説明お願いします。 java.lang.NullPointerException at s_delete.processRequest(s_delete.java:55) at s_delete.doGet(s_delete.java:98) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java :574) at org.apache.tomcat.core.Handler.invoke(Handler.java:322) at org.apache.tomcat.core.Handler.service(Handler.java:235) at org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:4 85) at org.apache.tomcat.core.ContextManager.internalService(ContextManager. java:917) at org.apache.tomcat.core.ContextManager.service(ContextManager.java:833 ) at org.apache.tomcat.modules.server.Http10Interceptor.processConnection( Http10Interceptor.java:176) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java :494) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP ool.java:516) at java.lang.Thread.run(Thread.java:536)

関連するQ&A

  • テーブルにレコードを追加するサーブレット。

    HTML画面からservletに接続してMYSQLにてつくったデータベースのテーブルに レコードを追加するプログラム(servlet)を作っています。テーブルを表示させるservlet(ext_db5_2_1.java)と、テーブルにレコードを追加して前出のservlet(ext_db5_2_1.java)を呼び出しテーブル表示をさせるservlet(ext_db5_2_2.java)をつくってます。 windows2000Professional, j2sdk1.4.0_01, MySQL3.23.47, tomcat3.3.1 テーブルにレコードを追加するサーブレット(ext_db5_2_2.java)の問題箇所。 // データベースに追加する値を取得 String number = request.getParameter("number"); String name = new String( request.getParameter("name").getBytes("8859_1"), "JISAutoDetect"); String from_pref =new String( request.getParameter("from_pref").getBytes("8859_1"), "JISAutoDetect"); // SQLを実行して、データベースに追加する StringBuffer buf = new StringBuffer(); buf.append("INSERT INTO OOIWA_SEM ("); buf.append("NUMBER, NAME, FROM_PREF) "); buf.append("VALUES ("); buf.append(number); buf.append(",'"); buf.append(name); buf.append("','"); buf.append(from_pref); buf.append("')"); stmt.executeUpdate(buf.toString()); // データベース表示するために、RequestDispatcherを取得 ServletContext cx = getServletContext(); RequestDispatcher rd =                          cx.getRequestDispatcher("/netjv/servlet/shuwa.ext_db5_2_1");

  • ブラウザ上に表示されたデータベースに追加

    タイトルのことをしようとすると、「java.lang.NullPointerException」というエラーが出ますが、これを解消するにはどうすればよいのでしょうか? そのエラーがでるページのソースを上げておきます。 <%@ page contentType="text/html; charset=Shift_JIS" %> <%@ page import="java.sql.*" %> <%! //toUnicodeメソッドの定義 public String toUnicode(String s) throws java.io.UnsupportedEncodingException { return (new String(s.getBytes("8859_1"), "JISAutoDetect")); } %> <% //JDBCドライバのロード Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //データベースへ接続 String jdbcUrl = "jdbc:odbc:AnsSheet"; String user = "root"; String password = "progressive"; Connection con = DriverManager.getConnection(jdbcUrl,user,password); //SQL実行 Statement stmt = con.createStatement (); String sql = "INSERT INTO AnsSheet (問題, a, b, c, d, e, f) VALUES("; sql = sql + "'" + toUnicode(request.getParameter("問題")) + "',"; sql = sql + "'" + toUnicode(request.getParameter("a")) + "',"; sql = sql + "'" + toUnicode(request.getParameter("b")) + "',"; sql = sql + "'" + toUnicode(request.getParameter("c")) + "',"; sql = sql + "'" + toUnicode(request.getParameter("d")) + "',"; sql = sql + "'" + toUnicode(request.getParameter("e")) + "',"; sql = sql + toUnicode(request.getParameter("f")) + ")"; int cnt = stmt.executeUpdate(sql); //接続解除 stmt.close(); con.close(); %> <jsp:forward page="keepAnsSheet.jsp" />

  • JSPとサーブレットの連携

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("windows-31j"); response.setContentType("text/html;charset=windows-31j"); PrintWriter out=response.getWriter(); request.setCharacterEncoding("windows-31j"); String st = request.getParameter("ti"); String s2 = request.getParameter("ho"); String s3 = request.getParameter("ke"); Connection con = null; ResultSet rs = null; Statement stmt = null; try { String url = "jdbc:mysql:///o?user=&password=2&useUnicode=true&characterEncoding=windows-31J"; con = (Connection) DriverManager.getConnection(url); stmt = (Statement) con.createStatement(); String sql = "INSERT INTO o_tb(tiiki,houmon,keiyaku) VALUES('" + request.getParameter("ti")+ "','" + request.getParameter("ho")+ "','" + request.getParameter("ke")+ "') "; int rss=0; rss = stmt.executeUpdate(sql); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); } JSPから上記のサーブレットに値を渡し、DB格納までは上手くいきました。 ですが当然上記だと真っ白なサーブレットページが表示されるだけです。 JSPのボタンを押し→サーブレットでDB格納したら、またJSPページを表示させたいんですが、どうしたらいいですか??

    • ベストアンサー
    • Java
  • String <=> byte配列 の際のエンコード(続)

    前回の質問(4つほど前の)の続きですが、 8859-1が日本語を扱うことができるという勘違いは、 サーブレットで日本語のリクエストパラメータを使用する際の、 次のようなコードに起因してます。 String param = new String(request.getParameter("test")).getBytes("8859_1"), "JISAutoDetect"); ここで、request.getParameter("test") から返ってくる String は 8859-1エンコーディングされたものだと単純に考えていたのですが、 今回、あらためてこれについて考えてみました。 request.getParameter("test").getBytes("8859_1") で、 ブラウザのエンコーディングを用いた、パラメータを表現するバイト列が ちゃんと取得できています。 では、request.getParameter("test") の結果返ってくる String は ブラウザのエンコードでパラメータを表現するバイト列を用い、 値はそのままで、エンコード名だけを8859-1として構築されたもの、 になると思うのですが、 そういう認識で正しいのでしょうか。 また、それで正しいのなら、それと同じことを自分で行うには どうすればよいのでしょうか。 とても気になります。 もしわかる方がいらっしゃったら、是非回答お願いします。

    • ベストアンサー
    • Java
  • サーブレットとMysqlについて

    画面のtextboxからDB(Mysql)にinsertするときの質問です。 皆さんのおかげでinsertすることができました。 しかし、textboxが一個で値も一つなのに、 insertするとDBには2行同じ値がinsertされます。 下記のソースのどこがいけないのでしょうか? ご教示をお願いします。 「ソース」 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] name10 = request.getParameterValues("sonota"); for (int i = 0; i < name10.length; i++) { System.out.println(i + " " + name10[i]); name10[i] = new String(name10[i].getBytes("8859_1"), "UTF-8"); } Connection conn = null; CallableStatement cs = null; PreparedStatement stmt = null; ResultSet rs = null; String url = "jdbc:mysql://localhost/Sample_db"; String dbUser = "root"; String dbPass = "taratara"; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, dbUser, dbPass); String sql= "insert into Sample_table (name) values (?)"; stmt = conn.prepareStatement(sql); for (String n : name10) { stmt.setString(1, n); stmt.executeUpdate(); } int cnt = stmt.executeUpdate(); stmt.close(); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); }catch(Exception e){ } } }

  • JBuilderの文字化け

    JBuilderでサーブレットでパラメータを渡す際に日本語が文字化けしてしまいます。 Enumeration enum=request.getParameterNames(); while(enum.hasMoreElements()){ String key=(String)enum.nextElement(); String value=new String(request.getParameter(key).getBytes("8859_1"),"JISAutoDetect"); out.println(value); } ソースは上記のようになっていますが日本語を表示できません。直す方法がわかる方どうかよろしくお願いします。

  • サーブレットとMysqlについて

    JSP サーブレット Mysqlについて質問です。 私が今実現させたいことを簡単に説明します。 画面側にはtextboxがあり、このtextboxは追加ボタンによって、 どんどん追加されていきます。 サーブレット側はこのtextboxの全ての値をDBに書き込みたいです。 例えば、textboxが二つなら、一つ目のINSERTでDBのname列にtextbox一個目の値を書き込み、二つ目のINSERTでDBのname列にtextboxニ個目の値を書き込む。 ソースを書いてみたのですが、いろいろと違いがあると思いますので、ご教示をお願いします。 現在は下記ソースを実行してもDBは更新されません・・ もしかしたら、DBの設定がおかしいのでしょうか・・ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] name10 = request.getParameterValues("sonota"); for (int i = 0; i < name10.length; i++) { System.out.println(i + " " + name10[i]); name10[i] = new String(name10[i].getBytes("8859_1"), "UTF-8"); } Connection conn = null; CallableStatement cs = null; PreparedStatement stmt = null; ResultSet rs = null; String url = "jdbc:mysql://localhost/Sample_db"; String dbUser = "root"; String dbPass = "taratara"; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, dbUser, dbPass); String sql= "insert into Sample_db.Sample_table (name) values (name10[i]);"; stmt = conn.prepareStatement(sql); for (String n : name10) { stmt.setString(1, n); stmt.executeUpdate(); } int cnt = stmt.executeUpdate(); stmt.close(); }catch(Exception e){ //exception RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } } }

    • ベストアンサー
    • Java
  • 文字コード

    少し、聞かせてください。 今、WEBアプリケーションを作っています。 HTMLからのリクエスト文字を受け取りServletで処理を考えています。 そこで、 String para = request.getParameter(para); String param = new String(para.getBytes("8859_1","JISAutoDetect"); で、8859_1,Shift_JIS,EUC-JP,ISO-2022-JP の Unicode 変換することが できるのは、分かりました。 では、この HTML からのリクエスト文字が、どのタイプの文字コード でかかれているかを検出できるのでしょうか? 自分では、バイト列をつかさどる方法が浮かぶのですが・・・。 HPでもかまいませんので、教えてください。

    • ベストアンサー
    • Java
  • 文字化け

    JSPで取ったデータをServletがGetParameterしています。 文字化け防止のコーディングは以下のようにしています。 String adr = request.getParameter("adr"); //住所 if(adr !=null && adr.equals("")==false){ //文字化け防止(日本語変換) adr = new String(adr.getBytes("8859_1"), "JISAutoDetect"); }else{ adr = ""; } が、全角のハイフン(-)だけが 文字化けしてしまいます。 ?になってしまいます。 なにかいいページかヒントがありましたら 教えてください。

  • jspでデータベースにレコード追加

    表題のことをしたいのですが、 「HTTPステータス 500 - An exception occurred processing JSP page」という エラー表示がされてしまいます。 名前、会社、住所というテキストボックスに入力して 決定ボタンを押下するとデータベースにレコード追加されるのを 目的としていますが、下記のコードで間違いはありますでしょうか? ----------------------------------------------- <%@ page language="java" %> <%@ page import="java.sql.*"%> <%@ page contentType="text/html; charset=Shift_JIS"%> <% request.setCharacterEncoding("Shift_JIS"); String strName=request.getParameter("name"); String strCompany=request.getParameter("company"); String strAddress=request.getParameter("address"); Class.forName("com.mysql.jdbc.Driver"); String strConn= "jdbc:mysql://localhost/***" + "?user=****&password=****" + "&useUnicode=true&characterEncoding=Shift_JIS"; Connection conn = DriverManager.getConnection(strConn); Statement stmt = conn.createStatement(); String strSql="insert into person (name,company,address) values('"+ strName + "'," + strCompany + "'," + strAddress + ")"; int result= stmt.executeUpdate(strSql); stmt.close(); conn.close(); %> <%//一覧ページにforward%> <jsp:forward page="****.jsp"/> ----------------------------------------------- >int result= stmt.executeUpdate(strSql); の行でエラーが出ているっぽいのですが。。。 TomcatとMySQLを使用しています。 ※環境など情報が不足していましたら、そちらもご指摘ください。  開発勉強中で、まだ理解が足りていない所が多数あります。

    • ベストアンサー
    • Java

専門家に質問してみよう