- - PR -
【tomcatからのレスポンスがコミットしない。(進捗のゲージがでっぱなし)】
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-11-29 10:46
ServletOutputStream sos = response.getOutputStream();
sos.print("Hello World"); sos.flush(); sos.close(); にてバイナリ形式でレスポンスを送信しています。 しかし、IEのステータスバーのゲージがしばらく残ったままで砂時計もしばらく出ています。しばらくすると消えます。 なぜこのように時間がかかるのでしょうか? 早くする方法を知りたいです。 ご存知の方がいらっしゃいましたら教えていただけるとありがたいです。よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2006-11-29 14:01
Content-Length が合っていないということはないでしょうか?
よくわからなければレスポンスを Tcpmon などでキャプチャして貼り付けてもらえれば確認できます。 | ||||||||||||
|
投稿日時: 2006-12-01 11:06
Content-Lengthは以下で設定しているので問題ないと思います。
response.setContentLength("Hello World".getBytes().length) ※responseはHttpServletResponse型です。 う〜む。原因がわからない。。。(困 | ||||||||||||
|
投稿日時: 2006-12-01 11:29
キャプチャした結果はいかがでしたか?
他の切り分け方法としてはよそからもってきた HelloWorldServlet を使う方法があります。 同じ現象が発生するようであればコーディングの問題ではないですね。 同じ現象が発生しないようであればコーディングにどういう違いがあるのか比べられます。 | ||||||||||||
|
投稿日時: 2006-12-04 12:40
すいません。やっぱり原因はContent-Lengthでした。
無事すばやいレスポンスを得ることができました。 ありがとうございました。 .getBytes()していることが原因でした。.getBytes()をはずすといけました。 | ||||||||||||
|
投稿日時: 2006-12-04 12:46
そのまま日本語を返してもうまく動きますか?
たぶん Content-Length でセットする際のエンコーディングと出力する際のエンコーディングが合っていなくて計算がかみ合わないのだと思います。 | ||||||||||||
|
投稿日時: 2006-12-04 17:28
日本語を返しても動きます。
レスポンス返却時にPrintWriterで日本語返す場合はgetBytes()が必要でしたがServletOutputStreamで返す場合はgetBytes()をつけるのはNGのようです。 | ||||||||||||
|
投稿日時: 2006-12-04 17:55
servletapiのソースを呼んだ限りでは、ISO-8859-1に含まれない文字を ServletOutputStream#print(String)で書き込むと例外が飛ぶようですが。 #少なくとも、Tomcat、JBoss、GlassFish辺りはそんな動きになるかと。
Content-Lengthヘッダを出力したいなどの理由で ServletOutputStreamを使って出力を行いたいのならば、
のように、自分で変換したバイト列を出力するのが確実です。 あと、String#getBytes()はシステムのデフォルトのエンコーディングを使うので、 サーバーの環境によって出力されるデータが変わってしまうのでよろしくないです。 String#getBytes(String)のバージョンを使うようにしましょう。 |
1