[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 メーリングリストの案内