[Seasar-user:6998] Re: [Teeda]ServletResponseのContentTypeの設定タイミングについて
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
2007年 4月 2日 (月) 11:37:25 JST
関さん、
大谷です。
フィードバックありがとうございます。
下記内容を調査・検討してみます。
宜しくお願いします。
07/03/30 に 関 真理子<[E-MAIL ADDRESS DELETED]> さんは書きました:
> いつもお世話になっております。関です。
>
> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
--
=============================
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
=============================
Seasar-user メーリングリストの案内