• ベストアンサー

サーブレット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してみたりしたのですが うまくいきませんでした。 わかる方おしえていただけますでしょうか

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

  • ベストアンサー
  • soakun
  • ベストアンサー率66% (6/9)
回答No.4

(1)や(2)にある<html>タグ自体を全く出力したくない、 というふうに私はこの質問を解釈しました。 だとすれば、プログラムの順序がまずいのではないでしょうか。 次のようにしてみてください。 # ただしエラーチェックはこちらでやっていないので、 # スペルミス等はご容赦 public void doPost(HttpServletRequest request, HttpServletResponse response){ response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); StringBuffer buffer = new StringBuffer(); try { // 例外が発生し得る処理 - (3) // 出力は out.printlnではなく、 // buffer.append(文字列); // とすること。 // 改行を挿入するには("\n")を文字列中に紛れ込ませる out.println("<html>"); // (1) out.println("なんたらかんたら"); // (2) out.println(buffer.toString()); // バッファに溜め込んだものを掃き出す out.println("</html>"); // (4) } catch(例外 ex) { out.println("エラーが発生しました。") // (5) }

その他の回答 (3)

noname#16216
noname#16216
回答No.3

これは、PrintWriterがどうこう言うより、Javaの例外のキャッチに関する問題だと思うのですが。。。 kuro_73さんが示されているように、上のコードでcatch節内に response.sendRedirect()やgetRequestDispatcher()を使って 既存のページに飛ばすのも1つの方法だと思いますが、 > out.println("<html>");・・・(1) > out.println("<head><title>goo!</title></head>");・・・(2)  try{   エラーがおこるような処理・・・(3)  } catch (エラー ex) {   out.println("エラーが発生しました。"); ・・・(5)  } > out.println("</html>")・・・(4) > }catch(エラー ex){   // I/Oエラー時の処理 > } といういうふうに、特定の範囲内でエラーが発生し、それに合わせて処理を 行う場合には、その特定の範囲内をtry節で括るのが正しい処理だと思いますが どうでしょうか? 上記の方法だと、出力されるのは(1)(2)(5)(4)の順番で出力されるはずです。

  • kuro_73
  • ベストアンサー率28% (33/117)
回答No.2

servletをエラーHTMLにフォワードしてしまえば大丈夫ですよ。 response.sendRedirect("/html/next.html"); とか・・・

noname#209929
noname#209929
回答No.1

一度String型変数などのバッファに溜めて、エラーの起こる処理の後一気にprintln()する、というのでは駄目でしょうか?

関連するQ&A