• ベストアンサー

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

  • ayato
  • お礼率25% (16/64)
  • Java
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • サーブレットについて

    こんにちは。 サーブレットに質問したいことがあります。 以下のサンプルソースで、 response.setContentType("text/html;charset=Shift_JIS"); の部分があるのですが、このようにすると日本語が文字化けしてしまいます。 ちなみにresponse.setContentType("text/html); とすると、日本語も文字化けせずに正しく表示されます。 ここで質問なのですが、 サーブレットの場合はJSPと違い、charsetを指定しなくてもよろしいのでしょうか? 何か分かることがありましたらご教授御願い致します。 ---------☆サンプルソース(HelloWorldExample.java)☆---------------- import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>ハローワールド</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>HelloWorld ハローワールド</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } } ---------------------------------------------------

    • ベストアンサー
    • Java
  • javaソースの中でのスタイルシート

    サーブレットの中で、スタイルシートのリンクを記述したのですが、反映されません。そもそも、無理なのでしょうか?他にやり方があるのでしょうか?初心者です。よろしくお願い致します。 public class MyJava extends HttpServlet{ public void doGet (HttpServletRequest    requ,HttpServletResponse res) { PrintWriter out=response.getWriter(); response.setContentType("text/html;charset=Shift_JIS"); try{ out.println("<HTML><HEAD><LINK HREF=style.css TYPE=text/css REL=stylesheet></head><title>"); 後述略

  • サーブレットからBeanに

    こんにちは areaフォルダに AreaServlet 、GetterServlet beanフォルダに FirstBean ============================== package area; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class AreaServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS"; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { String info="滋賀県"; bean.FirstBean fiBe = new bean.FirstBean(); fiBe.setZip(info); response.setContentType(CONTENT_TYPE); PrintWriter out=response.getWriter(); out.println("<html>"); out.println("<head><title>BeanServlet</title></head>"); out.println("<body>"); out.println("FirstBeanにセットされたデータ:" + fiBe.getZip() ); out.println("<p><a href=\"/jspbean2/servlet/area.GetterServlet\">Bean確認用</a>"); out.println("</body></html>"); } } ============================== package area; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class GetterServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS"; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType(CONTENT_TYPE); PrintWriter out=response.getWriter(); bean.FirstBean fiBe = new bean.FirstBean(); out.println("FirstBeanにセットされたデータ:" + fiBe.getZip() ); } } ============================== package bean; public class FirstBean { private String zip; //Setterの定義 public void setZip(String newZip) { zip = newZip; } //Getterの定義 public String getZip() { return zip; } } ============================== AreaServlet ではきちんと bean へ文字列を setし、また文字列を getしているようです。 その後 AreaServlet から GetterServlet へと移ったとき GetterServlet にも bean から文字列をgetしたいのに、どうしてか null が返ってgetできません??? どのようにしたら良いでしょうか? よろしくお願いします。

  • 始めてのサーブレットでつまづいています。アドバイス下さい。

    【参考ファイル】 http://www.hellohiro.com/servlet.htm ----------------------------------------------------------- 【ソース HelloWorldServlet.java】 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ContentTypeを設定 response.setContentType("text/html; charset=Shift_JIS"); // 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); // 出力 out.println("<html>"); out.println("<head>"); out.println("<title>Hello World Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World"); out.println("</body>"); out.println("</html>"); } } ----------------------------------------------------------- 【バージョン】 [java] C:\j2sdk1.4.2_06 [Tomcat] C:\Program Files\Apache Software Foundation\Tomcat 5.5 ----------------------------------------------------------- 【環境変数】 [CLASSPATH] .;C:\Program Files\Java\j2re1.4.1_02\lib\ext\QTJava.zip [Path] C:\j2sdk1.4.2_06\bin;C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\servlet-api.jar ----------------------------------------------------------- 【エラー内容】 C:\Program Files\Apache Group\Apache2\htdocs\java\hello>javac HelloWorldServlet. java HelloWorldServlet.java:2: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloWorldServlet.java:3: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloWorldServlet.java:5: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : HelloWorldServlet の クラス public class HelloWorldServlet extends HttpServlet { ^ HelloWorldServlet.java:6: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : HelloWorldServlet の クラス public void service(HttpServletRequest request, ^ HelloWorldServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : HelloWorldServlet の クラス HttpServletResponse response) ^ HelloWorldServlet.java:8: シンボルを解決できません。 シンボル: クラス ServletException 場所 : HelloWorldServlet の クラス throws ServletException, IOException { ^ エラー 6 個 C:\Program Files\Apache Group\Apache2\htdocs\java\hello>

    • ベストアンサー
    • Java
  • doPost+doGet

    public class Class{ public void doPost (HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException try{ //処理 }catch(Exception e){ e.printStackTrace(); } } public void doGet (HttpServletRequest request,HttpServletResponse response){ try{ doPost(request, response); }catch(Exception e){ e.printStackTrace(); } } } この処理は、doGetで送信されたものをdoPostに送って処理するということでよろしいのでしょうか? 分かる方がいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • index.htmlの代わりにサーブレットを実行

    localhost:8080でindex.htmlを表示する代わりにServlet.classを実行したいのですがtomcat5の設定を教えてください。ちなみにlocalhost:8080/servletで実行するところまでは、本に載ってたので分かってます。 public class Servlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println(new java.util.Date()); out.println("</BODY>"); out.println("</HTML>"); } }

    • ベストアンサー
    • Java
  • JavaサーブレットでのGmail送信プログラム

    Javaサーブレットでメールを送信したいと思い、こちら(http://www.utilz.jp/wiki/JavaMail1)のサイトで公開されているソースコードを利用してプログラムを作成したのですがエラーが発生してしまいました。 公開されているプログラムだけで実行した際には動いたので動作環境に問題は無いと思います。 public class send_Gmail extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, MessagingException { send( "*********", // gmail アカウント "*********", // gmail パスワード "*********", // 送信先 "subject", // サブジェクト "body"); // 本文 // コンテンツタイプの設定 response.setContentType("text/html;charset=Windows-31J"); // 出力のためのPrintWriterオブジェクトを取得 PrintWriter out = response.getWriter(); // 一連のコンテンツを出力 out.println("<html><head>"); out.println("<title>スクリプトレット</title>"); out.println("</head><body>"); out.println("メールを送信しました<br />"); out.println("</body></html>"); } private static final Properties PROP; static { PROP = new Properties(); PROP.put("mail.smtp.host", "smtp.gmail.com"); PROP.put("mail.smtp.port", "587"); PROP.put("mail.smtp.auth", "true"); PROP.put("mail.smtp.starttls.enable", "true"); } public void send( String user, String password, String to, String subject, String body) throws MessagingException { Transport transport = null; try { Session sess = Session.getInstance(PROP); MimeMessage mm = new MimeMessage(sess); mm.setFrom(new InternetAddress(user)); mm.setSubject(subject); mm.setRecipient( Message.RecipientType.TO, new InternetAddress(to)); mm.setContent(body, "text/plain; charset=iso-2022-jp"); mm.setHeader("Content-Transfer-Encoding", "7bit"); transport = sess.getTransport("smtp"); transport.connect(user, password); transport.sendMessage(mm, mm.getAllRecipients()); } finally { if (transport != null) { transport.close(); } } } コンパイルすると send_Gmail.java:28: Gmail_test.send_Gmail のdoPost(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) は javax.servlet.http.HttpServlet の doPost(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) をオーバーライドできません。オーバーライドされたメソッドは javax.mail.MessagingException をスローしません。 protected void doPost(HttpServletRequest request, HttpServletResponse response) というエラーが出てしまいます。throwsにMessagingExceptionを記述しないと、今度は記述しろというエラーが出てしまい困っています…解決策を教えて下さい。よろしくお願いします。

    • ベストアンサー
    • Java
  • JavaServletで出力したページへの、vodafoneからの閲覧でエラー

    モバイル端末用のサイトを、JavaServletにて構築しています。 とりあえず簡単なページを表示させるところから始めたのですが、IE、DoCoMo端末、au端末からは正常に見れるのに、vodafone端末から見ようとすると「このページは表示できません。このページへのアクセスは規制されています。(P40123E)」と出ます。 vodafoneで閲覧できるようにする方法をご存知の方いらっしゃいましたら、ご教授いただけないでしょうか。よろしくお願い致します。 ■テスト環境: Windows2000 pro SP4 Tomcat 5.0.27 J2SE 1.4.2 vodafone V602SH ■出力されるHTMLソース: <html> <head> <title>Hello World Servlet</title> </head> <body> Hello JAVA World </body> </html> ■JavaServletプログラムソース: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { public void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ContentTypeを設定 response.setContentType("text/html; charset=Shift_JIS"); // 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); // 出力 out.println("<html>"); out.println("<head>"); out.println("<title>Hello World Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello JAVA World"); out.println("</body>"); out.println("</html>"); } }

  • 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
  • PrintWriterについて

    javaでHTMLの処理をしているのですが、条件を指定して二つの文を分岐しているのですが一番最初はtureを通っていてそのあとfalseが通るはずのなのですが一応ブレークポイントでは二回目はfalseを通っているのになぜかfalseの方は表示してくれません。何が原因なのでしょうか?よろしくお願いします。 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = null; try { out = response.getWriter(); out.print("<html>"); out.print("<head>"); out.print("<title>アップロードテスト</title>"); out.print("</head>"); out.print("<body>"); out.print("<h1>"); if(flag){ out.print("trueです"); flag=0; } else{ out.print("falseです。"); flag=0; } out.print("</h1>"); out.print("</body>"); out.print("</html>"); out.flush();