[Seasar-user:6982] [Teeda]ServletResponseのContentTypeの設定タイミングについて
関 真理子
[E-MAIL ADDRESS DELETED]
2007年 3月 30日 (金) 16:15:36 JST
いつもお世話になっております。関です。
Teeda-1.0.6 を利用しております。
ServletResponseのContentTypeの設定タイミングについてのご相談です。
現在開発中のアプリで、8Kを超えるHTMLを表示しようとすると、
ResponseのContentTypeがnullとなる問題が発生しております。
そのため、サーバ構成をApache + Tomcat とした場合に、
FireFoxにてHTMLがテキストとして表示されてします。
※IEでは問題無し。
※Tomcatのみでは、IE・FireFoxともに問題無し。
ResponseRenderPhaseの処理を確認したところ、以下の点に気づきました。
TViewTag.doStartTag()にてsetContentType()が呼び出されているのですが、
その処理の前のsuper.doStartTag()にて実行される各ConponentのencodeBegin()の処理によって
ResponseのBufferSizeを超えるwrite()が実行され、
Servlet内部でsendBuffer()をされてしまっているように思えました。
# HTMLのサイズがおよそ8Kを超えたあたりでisCommitted()がtrueの状態になりました。
# また、事前にResponse.setBufferSize()を極端に大きく設定すると現象は発生しませんでした。
どうやら、ResponseにsetContentType()する前に、
ResponseのBufferSizeを超えるwrite()が実行されると、
Responseがコミット(isCommitted()がtrueの状態)となり、
その後のsetContentType()が反映されず、
ServletResponse.getContentType()がnullとなってしまうようです。
回避策として、独自のServletFilterで、
Request開始時に明示的にsetContentType()を指定しています。
TViewTag.doStartTag()内のsetContentType()の呼び出しタイミングを
もっと早くすればよいのかなと思うのですが、いかがでしょうか?
(それとも、ContentTypeはアプリ側で明示的に設定するべきでしょうか?)
以上です。
--
関真理子 <[E-MAIL ADDRESS DELETED]>
Seasar-user メーリングリストの案内