- 締切済み
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();
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 ブレークポイントで止まっているのが実際は違うスレッドであったりしませんか?(サーブレットだとあります) あとは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)
こんにちは。 補足ありがとうございました。 やはりソース内に2回呼んでいる動きが見られないのですが。 またflagはグローバル変数とありますが、厳密に言うとJavaにはグローバル変数がありませんしこの場合doPost内のローカル変数です。 2回呼び出すってdoPostを2回呼ぶということでしょうか? そうなるとflag変数は呼び出されるごとにfalseで初期化され、以降の動きに合わせて内容が変わります。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 どの部分で2回通るようにしてるかによっても変わるかもしれませんし、転記ミスがあるみたいなので、いっそのこと全文掲載してください。 (公開してはまずいところはマスクして構わないので)
お礼
ちょっと変えました。 @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)
こんにちは。 2回目ってどこで動いてますか? このソースを見る限りでは1度しか実行していませんが。 2回目のサーブレットの呼び出しでという意味だったらflagの値を何らかの形で保持して、あげないとダメです。 >二回目はfalseを通っているのになぜかfalseの方は表示してくれません。 本当にfalseでしょうか。 out.printやSystem.out.println でflagの内容を表示してみてください。
お礼
回答ありがとうございます。一応複数回通るようにプログラムを組んでおります。ブレークポイントでflagの値を見ましても二回目はfalseです。flagはグローバル変数です。なぜか二回目以降のhtml文が表示されません。
補足
trueのflag=0ではなくflag=falseで、falseのところのflag=0はなしです。すみません。
お礼
回答ありがとうございます。 すみませんグローバルではないですね。 複数回通るのは、厳密にいうとサーバーからアップされるたびに呼ばれます。実際通って入るのでなぜブレークポイントに通っているのに(一応Stringで文字の中身も調べました。)HTML表示されないのかか不思議でなりません。ブレークポイントで通っているのにプログラムでは表示されないということはありえるのでしょうか?