• 締切済み

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();

みんなの回答

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.4

こんにちは。 ブレークポイントで止まっているのが実際は違うスレッドであったりしませんか?(サーブレットだとあります) あとはout.printをStringBuilderとかにしてSystem.out.printlnしてみてコンソールに表示されるものが意図しているものか調べてみては如何でしょうか。 またこの場合にflagがfalseになるのは new ZipFileUtil().unZip(zipFile, buffSize); でIOExceptionが発生した場合のみですが、そこで logger.error("Unzip Error=" + e.getMessage()); が実行されていますのでログはどのようになっていますか? IOExceptionが発生しない限りflagはtrueのままです。

全文を見る
すると、全ての回答が全文表示されます。
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.3

こんにちは。 補足ありがとうございました。 やはりソース内に2回呼んでいる動きが見られないのですが。 またflagはグローバル変数とありますが、厳密に言うとJavaにはグローバル変数がありませんしこの場合doPost内のローカル変数です。 2回呼び出すってdoPostを2回呼ぶということでしょうか? そうなるとflag変数は呼び出されるごとにfalseで初期化され、以降の動きに合わせて内容が変わります。

takoyaki2019
質問者

お礼

回答ありがとうございます。 すみませんグローバルではないですね。 複数回通るのは、厳密にいうとサーバーからアップされるたびに呼ばれます。実際通って入るのでなぜブレークポイントに通っているのに(一応Stringで文字の中身も調べました。)HTML表示されないのかか不思議でなりません。ブレークポイントで通っているのにプログラムでは表示されないということはありえるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 どの部分で2回通るようにしてるかによっても変わるかもしれませんし、転記ミスがあるみたいなので、いっそのこと全文掲載してください。 (公開してはまずいところはマスクして構わないので)

takoyaki2019
質問者

お礼

ちょっと変えました。 @SuppressWarnings("unchecked") protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean flag = false; String title = null; File zipFile = null; //TODO DBへの登録などの処理 debugLog("titleValue=" + title); debugLog("zipFile=" + zipFile); // Zipファイルなら解凍 if (zipFile != null && ZipFileUtil.isZipFile(zipFile.getAbsolutePath())) { try { //取得したZipファイルをバッファーサイズを指定 new ZipFileUtil().unZip(zipFile, buffSize); // flag = true; } catch (IOException e) { logger.error("Unzip Error=" + e.getMessage()); } } // Android端末に直接ダウンロード結果を返却text/plain response.setContentType("text/html;charset=UTF-8"); PrintWriter out = null; try { response.getWriter().close(); out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>true or false</title>"); out.println("</head>"); out.println("<body>"); String str=(flag ? "trueです。" : "falseです。"); out.println("<h1>" + str+"</h1>"); out.println("</body>"); out.println("</html>"); out.flush(); debugLog("Return Responsed"); } catch (IOException e) { logger.error("RESPONSE_ERROR", e); } finally { if (out != null) { out.close(); } 以上ですよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 2回目ってどこで動いてますか? このソースを見る限りでは1度しか実行していませんが。 2回目のサーブレットの呼び出しでという意味だったらflagの値を何らかの形で保持して、あげないとダメです。 >二回目はfalseを通っているのになぜかfalseの方は表示してくれません。 本当にfalseでしょうか。 out.printやSystem.out.println でflagの内容を表示してみてください。

takoyaki2019
質問者

お礼

回答ありがとうございます。一応複数回通るようにプログラムを組んでおります。ブレークポイントでflagの値を見ましても二回目はfalseです。flagはグローバル変数です。なぜか二回目以降のhtml文が表示されません。

takoyaki2019
質問者

補足

trueのflag=0ではなくflag=falseで、falseのところのflag=0はなしです。すみません。

全文を見る
すると、全ての回答が全文表示されます。

関連する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
  • サーブレットについて

    こんにちは。 サーブレットに質問したいことがあります。 以下のサンプルソースで、 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>"); 後述略

  • 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
  • java eclipseでのエラーについて

    環境 eclipse tomcat6 javaファイルとweb.xmlを用いており 職業を選択し送信ボタンを押すとあなたの職業はXXXですと表示するはずなのですが HTTPステータス 404がでて困っています どこが間違っているのでしょうか package servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class RadioInput extends HttpServlet{ String html; String html1="<!doctype html><html lang=ja><head><meta charset=utf-8><title>Radioinput</title></head></body>"; String html2="職業をお選びください<form action=Radioinput method=post><table><tr><td><input type=radio name=occupation value=会社員>会社員<br><input type=radio name=occupation value=学生>学生<br><input type=radio name=occupation value=主婦>主婦<br><input type=radio name=occupation value=その他>その他</td></tr></table><br><input type=submit value =送信><input type=reset value=リセット></form></body></html>"; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); html=html1+html2; out.println(html); out.close(); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ int numberOfErrors=0; String errorMessage="<div class=alerm>入力値にエラーがありました</div>"; String noRadioValueError="<div class=alerm>「エラー入力値がありません」</div>"; request.setCharacterEncoding("UTF-8"); String occupation=request.getParameter("occupation"); if(occupation==null){ numberOfErrors +=1; errorMessage +=noRadioValueError; } response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); if(numberOfErrors>0){ html = html1+errorMessage+html2; out.println(html); }else{ html=html1+"あなたの職業は"+occupation+"ですね</body></html>"; out.println(html); } out.close(); } }

    • ベストアンサー
    • Java
  • サーブレットから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できません??? どのようにしたら良いでしょうか? よろしくお願いします。

  • submitで日本語をおくりたい

    自分は現在JSPの勉強をしているのですが、JSPからサーブレットにsubmitをつかって、日本語を送信した場合文字化けして表示されてしまうので困っています。 ソースコードで説明させていただくと JSP側ソース <%@ page contentType="text/html;charset=Shift_JIS" pageEncoding="Shift_JIS" %> <html> <head><title>a</title></head> <body> <form action="Hello" method="post"> <textarea rows="10" cols="40" name="comment"> ここにコメントを書いて送信を押すとコメントがつきます </textarea><br> <input type="submit" value="送信"> </form> </body> </html> サーブレット側 import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class hello extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); response.setCharacterEncoding("Shift_JIS"); PrintWriter out = response.getWriter(); String msg = request.getParameter("comment"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println(msg);//ここで表示 out.println("</body>"); out.println("</html>"); } } この様なソースを書いたのですが、サーブレット側で日本語を表示させようとすると、文字化けしてしまいます(英語は普通に表示されます)。 どのようにすれば、サーブレット側で日本語を表示できるのでしょうか? お返事おまちしております。

    • ベストアンサー
    • Java
  • 困っています

    フォームに入力したデータをセッションに登録し、次の入力画面でそこまでたまったデータと入力されたデータを追加し、入力欄と一緒に表示するフォームを作っています。特にフォームの中のデータを取り出すあたりが分かりません。どなたか、アドバイス等お願いします。下のソースは作り掛けで、以前作った買い物かごをベースにしています。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class form extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { HttpSession hs = request.getSession(true); ArrayList a = (ArrayList)hs.getAttribute("writing"); if( a == null ) { a = new ArrayList(); } request.setCharacterEncoding("JISAutoDetect"); String s1[] = request.getParameterValues("f1"); String s2 = request.getParameter("f2"); response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>サーブレット</title></head>"); out.println("<body>"); out.println("<form action=http://....method=POST>"); out.println("<h2>入力フォーム</h2>"); out.println("<textarea name=f1 size=5 multiple>"); out.println("

    • ベストアンサー
    • Java
  • コンパイルエラー

    JBuiderでコンパイルしようとするとエラーがでてしまいます。ソースは以下の通りです。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); Integer count=(Integer)session.getAttribute("count"); if(count == null){  count = new Integer(0); }else{  count = new Integer(count.intValue()+1); } session.setAttribute("count",count); response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out= response.getWriter(); out.println("<html>"); out.println("<head><title>TestServlet</title></head>"); out.println("<body>"); out.println(session.getId()); out.println("<p>\"count\"という名前のattribute = " + count +"</p>"); out.println("</body></html>"); out.close(); } } これをコンパイルすると、 "TestServlet.java": エラー #: 300 : メソッド getAttribute(java.lang.String) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 9, 列 36 "TestServlet.java": エラー #: 300 : メソッド setAttribute(java.lang.String, java.lang.Integer) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 15, 列 13 というメッセージがでます。何が原因なのか教えてください。