• 締切済み

例外が発生した時にブラウザにメッセージを表示

Servletで、db検索しその結果をブラウザに表示しています。 SQLExceptionや、NULLPointerExceptionが発生した時に、 今は、 catch(Exception e){ e.printStackTrace(); } としているのでログにエラーを書き出しているだけで、画面にはなにも表示されません。 エラーの時も、PrintWriter pw = response.getWriter();で pw.println("<HTML><HEAD></HEAD>"); pw.println("<body><h1>"); pw.println("エラー発生!"); pw.println("</h1></body></html>"); というふうにブラウザに出力したいのです。 catchブロックの中にはどのように、記述したらいいのでしょうか? ひとつのクラス内で以上の事がしたいのですが、そもそもそれも 無理なのでしょうか?

  • feb2
  • お礼率40% (2/5)
  • Java
  • 回答数3
  • ありがとう数2

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.3

 表示したいエラーページのHTMLを出力する文をcatch節に設定すればそれが出力されます。 すでに出力してしまっている内容がある場合は、HTTPServletResponse#reset()でそれをクリアできます。 以下の例では、パラメータにresetを付ければエラーページのみが出力され、 resetを付けなければ途中まで書き出された正常なページの下にエラーページがつながって出力されます。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class exceptionpage extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) { boolean ResetFlag = false; PrintWriter PW; int i[] = new int[10]; try { if (req.getParameter("reset") != null) ResetFlag = true; res.setContentType("text/html"); try { PW = res.getWriter(); } catch (Exception ex) { return; }; PW.println("<html><head><title>Valid Page</title></head>"); PW.println("<body>"); PW.println("<h1>ValidData</h1>"); i[10] = 10; PW.println("</body></html>"); } catch (Exception ex) { if (ResetFlag) res.reset(); try { PW = res.getWriter(); } catch (Exception exx) { return; }; PW.println("<html><head><title>Error Page</title></head>"); PW.println("<body>"); PW.println("<h1>Error Occurred</h1><br>"); PW.println(ex.toString() + "<br>"); PW.println("</body></html>"); }; }; }

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> catchブロック内で、いままでのPrintWriterを無効にする事は > 不可能なんでしょうか? 既に出力されちゃった内容ですからね。 そこまできれいにやりたければ、出力内容は文字列に貯め(StringWriterを使っても良い)て、 最後(例えば、finallyブロック)にまとめて出力する、なんて方法もあります。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

スタックトレースをブラウザに表示したいということでしょうか? Exception クラスがもつ printStackTrace() は三種類の引数指定ができます。 そのうちのひとつは PrintWriter クラスを受け付けるので、   catch(Exception e){     PrintWriter pw = response.getWriter();      ...     e.printStackTrace(pw);      ...   } というような使い方が可能です。タグを省略してますが、必要なものは前後で出力してください。

feb2
質問者

お礼

どうもありがとうございました。 うまくいきました。 だた、tryブロック内でpw.printlnでHTMLを編集中に エラーが発生した場合、その途中までのHTMLと catchブロック内で作成したHTMLが繋がってしまうので、 ブラウザには、正しい画面もエラー画面も表示されませんでした。 PrintWriterをflushしても、効果がありません。 catchブロック内で、いままでのPrintWriterを無効にする事は 不可能なんでしょうか?

関連するQ&A

  • サーブレットPrintWriterについて

    Javaの初心者でこまってまして・・・ public void doPost(HttpServletRequest request, HttpServletResponse response){ try{ // コンテンツタイプの設定 response.setContentType("text/html; charset=Shift_JIS"); // 外部出力 PrintWriter out = response.getWriter(); out.println("<html>");・・・(1) out.println("<head><title>goo!</title></head>");・・・(2) エラーがおこるような処理・・・(3) out.println("</html>")・・・(4) }catch(エラー ex){ out.println("エラーが発生しました。")・・・(5) } } このようなプログラムがあり、(3)でエラーが出たときに catchした場合(5)のメッセージだけを出力したいのです。 いまは(1)(2)(5)という感じで出力されてしまいます。 flushしてみたりしたのですが うまくいきませんでした。 わかる方おしえていただけますでしょうか

    • ベストアンサー
    • Java
  • servlet通信断時の処理について

    お世話になります。 Servletの処理中にクライアントとの通信がケーブル不良等が原因で切断された場合、エラー処理をしたいのですが、 エクセプションが発生しません。 発生させる方法は無いでしょうか。 本当に困っております。 通信断になるタイミングは 以下のコードでレスポンスデータをクライアントへ送信中に通信断になる場合です。 public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException,IOException { try { PrintWriter pw = new PrintWriter( new OutputStreamWriter(response.getOutputStream(), "UTF-8")); pw.write("OK"); pw.flush(); pw.close(); }catch(IOException e){ // エラー処理 }catch(Exception e){ // エラー処理 }finally{ // 後処理 } } どなたかご存知の方がいらっしゃいましたらお教え下さい。

    • ベストアンサー
    • Java
  • Java・ファイルへの書き込み

    はじめまして。 下記のプログラムで、以下の3つがどのような関係なのかがわかりません。 ("test1.txt")とnew FileWriterの関係 (new FileWriter("test1.txt")とnew BufferedWriterの関係 (new BufferedWriter(new FileWriter("test1.txt")と new PrintWriterの関係 どうかご教示いただきたく、よろしくお願い致します。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Sample7 { public static void main(String[] args){ PrintWriter pw = null; try{ pw = new PrintWriter (new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!"); pw.println("GoodBye"); System.out.println("ファイルに書き込みました。"); }catch(IOException e){ System.out.println("入出力エラーです。"); }finally{ if(pw != null){ pw.close(); } } } }

    • ベストアンサー
    • Java
  • forwardの前に

    http://www.techscore.com/tech/J2EE/Servlet/5-3.html のサイトに 「forwardの前に出力すると例外が発生する」 とあるんですが、試しにやってみたんですが、 例外は発生しませんでした。 なぜでしょうか? resp.setContentType("text/html; charset=EUC-JP"); PrintWriter pw = resp.getWriter(); pw.println("<form method=\"'get'\">"); pw.println("<input type=\"submit\" value=\"ボタン\">"); pw.println("</form>"); RequestDispatcher rd = req.getRequestDispatcher("/other/"); rd.forward(req,resp); こんなソースなんですけど。。

    • ベストアンサー
    • Java
  • Servletでテキストボックスに入力された内容を追記したい。

    Servletでテキストボックスとボタンを置きsubmitすると下にいくつも追記できるようにしたいです。そのときに ブラウザを複数起動しても独立して稼動できるようにしたいです。 自分の考えとしては、submitしたデータをArrayListに取り込んでhtmlに返そうと思って下記のブログラムを 書いてみましたがうまく作動しませんでした。 何か良い方法がありましたら教えてください。 import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletTest extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException { ArrayList al = new ArrayList(); // ヘッダに出力形式をセット res.setContentType("text/html; charset = Shift_JIS"); // 出力ストリームを作成 PrintWriter pw = res.getWriter(); // テキストボックスからデータを受け取る String input = req.getParameter("param"); al.add(input); // テキストボックスが空の場合 if(input == null) { input = ""; } // HTML文を出力 pw.println("<html><head>"); pw.println("<title>SrvletTest</title>"); pw.println("</head>"); pw.println("<body>"); pw.println("<form>"); pw.println("<input type = 'text' name = 'param' maxlength = 20>"); pw.println("<input type = 'submit'><br>"); for(int i = 0; i < al.size(); i++) { pw.println(al.get(i)); } pw.println("</form>"); pw.println("</body></html>"); pw.close(); } }

    • ベストアンサー
    • Java
  • 標準入力をするメソッドを作り例外処理をそのメソッド内で行います

    以下のソースでエラーが発生します return文は書いているのですが エラー内容は 「return 文が指定されていません」 と出ます。 return文はどこに置けばいいのでしょうか。 よろしくお願いします。 public static int getStdin(){  try{   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   return (Integer.parseInt(br.readLine()));  }catch(IOException e){   System.out.println("標準入出力でのエラー");  }catch(NumberFormatException e){   System.out.println("不正な入力が行われました");  }finally{   System.out.println("例外処理が無事終了");  } }

    • ベストアンサー
    • Java
  • javaからmysqlに接続ができません。

    よろしくお願いします。 JavaからMySqlに接続ができなくて困っています。 <環境> OS:Windows XP JDK : jdk1.6.0_02 JDBC Driver for MySQL : mysql-connector-java-5.1.5-bin.jar Java、MySql単体では正常に動作しているようですが、ドライバを認識できず、JavaからMySqlに接続することができません。 ---コード------------------------------------------ import java.net.*; import java.sql.*; public class SqlSample1{ String url = "jdbc:mysql://localhost/test_db"; String user = "root";//ユーザ名 String pass = "admin";//パスワード Connection con = null; //コンストラクタ public SqlSample1(){ init();//初期化 fin();//終了 } //初期化 public void init(){ try{ //ドライバのロード Class.forName("org.gjt.mm.mysql.Driver"); //MySQLサーバへの接続 con = DriverManager.getConnection(url,user,pass); System.out.println("Connected!!"); }catch(SQLException e){ System.err.println("SqlException:\n"+e.toString()); }catch(Exception e){ e.printStackTrace(); } } //終了:開放 public void fin(){ try{ con.close(); System.out.println("Closed."); }catch(SQLException e){ System.err.println("SqlException:\n"+e.toString()); }catch(Exception e){ e.printStackTrace(); } } public static void main(String args[]){ SqlSample1 ss1=new SqlSample1(); } } ----------------------------------------------------------- ----エラーメッセージ--------------------------------------- SqlException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure Last packet sent to the server was 0 ms ago. java.lang.NullPointerException at SqlSample1.fin(SqlSample1.java:41) at SqlSample1.<init>(SqlSample1.java:18) at SqlSample1.main(SqlSample1.java:53) ------------------------------------------------------------ ※C:\mysql-connector-java-5.1.5の下のmysql-connector-java-5.1.5-bin.jarファイルにCLASSPATHを設定しています。 初心者のためへたくそな質問になっているかもしれません。 申し訳ありません。 上記の情報が不十分な場合はご指摘をお願い致します。

  • 条件判定後に編集したエラー画面を表示させたい。

     jsp画面で設定した情報をJavaで取得し、テーブルへの登録/削除処理を行っています。 条件に従い、情報の登録/削除処理が出来ない場合は、エラーメッセージを簡易作成/表示して、元の画面に戻る=>再入力(入力情報消去済)と云う手順を踏みたいのですが、条件分岐後エラーメッセージ画面が表示されず、入力情報消去済の前画面に戻ってしまいます。 分岐後のエラー画面記述部分は次の通りです。 {PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title> エラー発生 </title>"); out.println("</head>"); out.println("<body bgcolor='white>"); out.println(" 登録情報に不具合があります。<br>"); out.println(" 登録内容を確認のうえ再登録下さい。<br>"); out.println("<input type='button'"); out.println("value ='前の画面に戻る'"); out.println(" onclick =\"location.href='nnnn(前画面).jsp'\">"); out.println("</body>"); out.println("</html>"); Syste.out/println("エラー表示");} こんな感じです。"エラー表示"はエクリプスのコンソール上に表示されており、この処理は通過している様です。また、終了メッセージを同様の記述で、判断は伴わない場合には正しく出力されているだけに、頭を抱えております。 問題になりそうな箇所の指摘を御願いします。

    • ベストアンサー
    • Java
  • 【Servletのエラーについて教えて下さい!】

    こんにちわ。いつもありがとうございます。 サーブレットをコンパイル後、実行するとHTTPのPOSTメソッドは、このURLではサポートされていません。 と表示されます。 前のJSPからはmethod="POST"にて送信しているのですが・・・ すみませんが、ご教授下さい! ソースは以下となります。 よろしくお願い致します! import javax.servlet.http.*; import java.sql.*; import java.io.*; public class EditingServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException { /*フィールドの宣言*/ Connection conn = null; res.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = res.getWriter(); out.println("<html><head></head><body>"); String Str = req.getParameter( "Str" ); try { String user = "ID", pwd="PW"; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String url="jdbc:sqlserver://10.121.67.247:1433;DatabaseName=Name"; /*JDBC URL*/ conn = DriverManager.getConnection(url,user,pwd); Statement stmt = conn.createStatement(); stmt.executeUpdate("UPDATE T_Strfer SET フラグ ='1' WHERE id='"+ Str +"'"); out.println("データを更新しました!<br>"); } catch (ClassNotFoundException e) { out.println("クラスが見つかりません。"); } catch (SQLException e) { out.println("データの更新に失敗しました。 "); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) {} } out.println("</body></html>"); out.close(); } }

    • ベストアンサー
    • Java
  • HTMLからデータを受け取るサーブレットについて

    教本の教え通りにコードを記述してるつもりなんですが,うまくいきません。コンパイルもうまくいきtomcatでHTML画面からデータを送信してもサーブレットはうまく応えてくれません。どなたか教えてください。 (fromhtml_365.java) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class fromhtml_365 extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException{ res.setContentType("text/html; charset=shift_JIS"); PrintWriter out = res.getWriter(); out.println("<html><head>"); out.println("<title>サーブレットからパラメータを受信</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>受信したパラメータ</h1>"); out.println("<h2>"); out.println(req.getParameter("param")); out.println("</h2>"); out.println("</hody></html>"); } } (html_366.html) <HTML> <HEAD><TITLE>サーブレットにパラメータを送信</TITLE></HEAD> <BODY> <H1>サーブレットにパラメータを送信</H1> <FORM ACTION="/examples/servlet/fromhtml_365"> 送信パラメータ<INPUT TYPE="TEXT" NAME="param"><BR> <INPUT TYPE="SUBMIT" value="送信"> </FORM> </BODY> </HTML>

    • ベストアンサー
    • Java

専門家に質問してみよう