こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2012-10-05 11:24:09

QNo.7733122

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんにちは。

ブレークポイントで止まっているのが実際は違うスレッドであったりしませんか?(サーブレットだとあります)

あとはout.printをStringBuilderとかにしてSystem.out.printlnしてみてコンソールに表示されるものが意図しているものか調べてみては如何でしょうか。

またこの場合にflagがfalseになるのは
new ZipFileUtil().unZip(zipFile, buffSize);
でIOExceptionが発生した場合のみですが、そこで
logger.error("Unzip Error=" + e.getMessage());
が実行されていますのでログはどのようになっていますか?

IOExceptionが発生しない限りflagはtrueのままです。

投稿日時 - 2012-10-05 13:49:35

ANo.3

こんにちは。

補足ありがとうございました。

やはりソース内に2回呼んでいる動きが見られないのですが。
またflagはグローバル変数とありますが、厳密に言うとJavaにはグローバル変数がありませんしこの場合doPost内のローカル変数です。

2回呼び出すってdoPostを2回呼ぶということでしょうか?
そうなるとflag変数は呼び出されるごとにfalseで初期化され、以降の動きに合わせて内容が変わります。

投稿日時 - 2012-10-05 12:55:31

お礼

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

投稿日時 - 2012-10-05 13:31:55

ANo.2

こんにちは。

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

投稿日時 - 2012-10-05 12:29:49

お礼

ちょっと変えました。
@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();
}
以上ですよろしくお願いします。

投稿日時 - 2012-10-05 12:46:46

ANo.1

こんにちは。

2回目ってどこで動いてますか?
このソースを見る限りでは1度しか実行していませんが。

2回目のサーブレットの呼び出しでという意味だったらflagの値を何らかの形で保持して、あげないとダメです。

>二回目はfalseを通っているのになぜかfalseの方は表示してくれません。
本当にfalseでしょうか。
out.printやSystem.out.println でflagの内容を表示してみてください。

投稿日時 - 2012-10-05 11:40:22

補足

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

投稿日時 - 2012-10-05 11:50:36

お礼

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

投稿日時 - 2012-10-05 11:47:30

あなたにオススメの質問