- ベストアンサー
サーブレット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してみたりしたのですが うまくいきませんでした。 わかる方おしえていただけますでしょうか
- みんなの回答 (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)
これは、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)
servletをエラーHTMLにフォワードしてしまえば大丈夫ですよ。 response.sendRedirect("/html/next.html"); とか・・・
一度String型変数などのバッファに溜めて、エラーの起こる処理の後一気にprintln()する、というのでは駄目でしょうか?