Weblogic 9.2j

相変わらず苦戦中。
ServletResponseに対してGZipOutputStreamによる圧縮を施しているのだが、RequestDispatcher#includeを実行すると圧縮したストリームの内容が壊れるところまでは判明した。includeといえば昔のTomcatではページに対してのエンコーディングが効かず鬼門だったが、Tomcat5以降はJSRに忠実であり、問題らしい問題は出ていない。
こんな時やはりソースコードを覗くことができないのは辛い。
それよりServletAPIとJSPだ。諸所散々語りつくされており、他のフレームワークの躍進もあって最近ではすっかりダークサイドの技術のように酷い扱いだが、元々ServletJSPの考え方はシンプルなもので、それほど酷いとは思わない。上手に使えばそれなりにスマートに実装できるしあれほど毛嫌いされるいわれは無いと思う。(嫌われるのはSierが100万、200万するアプリケーションサーバを無理に薦めるからだ、という話もある)
しかし、どうしても気に入らないのが以前も書いたHttpServletResponseから取得するServletOutputStreamの振舞いがベンダによってまちまちな所だ。拙作のフレームワークではよくあるようにアプリケーションサーバによる実装や環境の違いを吸収する機構を幾つかもつが、この部分だけはベンダ固有のコーディングを行わなければならないことがしばしばある。

以下、Java Servlet Specification Version 2.3からの抜粋だが、

JSR-000053 JavaTM Servlet 2.3 and JavaServer PagesTM 1.2 Specifications
(FCS)

SRV.5.5 Closure of Response Object

When a response is closed, the container must immediately flush all remaining
content in the response buffer to the client. The following events indicate that the
servlet has satisfied the request and that the response object is to be closed:
• The termination of the service method of the servlet.
• The amount of content specified in the setContentLength method of the response
has been written to the response.
• The sendError method is called.
The sendRedirect method is called.

この通りに振舞わないケースが過去にいくつもあった。