- PR -

【tomcatからのレスポンスがコミットしない。(進捗のゲージがでっぱなし)】

1
投稿者投稿内容
fight
ベテラン
会議室デビュー日: 2005/09/25
投稿数: 74
投稿日時: 2006-11-29 10:46
ServletOutputStream sos = response.getOutputStream();
sos.print("Hello World");
sos.flush();
sos.close();
にてバイナリ形式でレスポンスを送信しています。
しかし、IEのステータスバーのゲージがしばらく残ったままで砂時計もしばらく出ています。しばらくすると消えます。
なぜこのように時間がかかるのでしょうか?
早くする方法を知りたいです。
ご存知の方がいらっしゃいましたら教えていただけるとありがたいです。よろしくお願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-11-29 14:01
Content-Length が合っていないということはないでしょうか?

よくわからなければレスポンスを Tcpmon などでキャプチャして貼り付けてもらえれば確認できます。
fight
ベテラン
会議室デビュー日: 2005/09/25
投稿数: 74
投稿日時: 2006-12-01 11:06
Content-Lengthは以下で設定しているので問題ないと思います。
response.setContentLength("Hello World".getBytes().length)
※responseはHttpServletResponse型です。

う〜む。原因がわからない。。。(困
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-12-01 11:29
キャプチャした結果はいかがでしたか?

他の切り分け方法としてはよそからもってきた HelloWorldServlet を使う方法があります。
同じ現象が発生するようであればコーディングの問題ではないですね。
同じ現象が発生しないようであればコーディングにどういう違いがあるのか比べられます。
fight
ベテラン
会議室デビュー日: 2005/09/25
投稿数: 74
投稿日時: 2006-12-04 12:40
すいません。やっぱり原因はContent-Lengthでした。
無事すばやいレスポンスを得ることができました。
ありがとうございました。
.getBytes()していることが原因でした。.getBytes()をはずすといけました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-12-04 12:46
そのまま日本語を返してもうまく動きますか?

たぶん Content-Length でセットする際のエンコーディングと出力する際のエンコーディングが合っていなくて計算がかみ合わないのだと思います。
fight
ベテラン
会議室デビュー日: 2005/09/25
投稿数: 74
投稿日時: 2006-12-04 17:28
日本語を返しても動きます。
レスポンス返却時にPrintWriterで日本語返す場合はgetBytes()が必要でしたがServletOutputStreamで返す場合はgetBytes()をつけるのはNGのようです。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-12-04 17:55
引用:

mukoubutiさんの書き込み (2006-12-04 17:28) より:
日本語を返しても動きます。



servletapiのソースを呼んだ限りでは、ISO-8859-1に含まれない文字を
ServletOutputStream#print(String)で書き込むと例外が飛ぶようですが。

#少なくとも、Tomcat、JBoss、GlassFish辺りはそんな動きになるかと。

引用:

レスポンス返却時にPrintWriterで日本語返す場合はgetBytes()が必要でしたがServletOutputStreamで返す場合はgetBytes()をつけるのはNGのようです。



Content-Lengthヘッダを出力したいなどの理由で
ServletOutputStreamを使って出力を行いたいのならば、

コード:
byte data[] = "Hello World".getBytes("UTF-8");
response.setContentLength(data.length)
ServletOutputStream sos = response.getOutputStream(); 
sos.write(data);



のように、自分で変換したバイト列を出力するのが確実です。

あと、String#getBytes()はシステムのデフォルトのエンコーディングを使うので、
サーバーの環境によって出力されるデータが変わってしまうのでよろしくないです。
String#getBytes(String)のバージョンを使うようにしましょう。
1

スキルアップ/キャリアアップ(JOB@IT)