HttpServletResponseWrapperで見るHTML/JSP処理の流れ
HttpServletResponseWrapper
HttpServletResponseWrapper は、Servlet を利用したアプリケーションで Servlet からの応答に対して内容を取得したり、内容に変更を加えてから応答を返したい場合など、 レスポンスに対してなんらかの処理を加えたい場合に使用するクラスです。 HttpServletResponseWrapper は HttpServletResponse インタフェースを実装していて、 開発者がサブクラス化して自由に拡張できます。標準ではインスタンス生成時に渡した HttpServletResponse をラップし、各メソッドは、ラップしたそれらメソッドをそのまま呼び出します。
HTML、 JSP 処理で流れが異なる
今回、この HttpServletResponseWrapper を継承してレスポンスの内容を編集しようとしたのですが、 HTML と JSP を処理するのでは処理の流れが異なることがわかりました。 きっかけは Tomcatにおけるフィルタリング機能の活用 ( http://www-06.ibm.com/jp/developerworks/java/011116/j_j-tomcat.html ) を参考にレスポンスの内容を変換するプログラムを作ろうとしていた時で、どうしてもレスポンスが変換できなくて困ったことからでした。 サンプルと全く同じにするとうまくいったため、なぜかと調べていたところ、リクエストするファイルが HTML か JSP かの違いが原因だということがわかりました。
ただし Servlet は 仕様こそ J2EE で定められていますが、 実装は各アプリケーションサーバで異なる可能性があるそうなので、ここで紹介する処理の流れが全てに当てはまるとは言えないので注意が必要です。 今回は Tomcat 5.5.20 環境で動作を確認しました。
レスポンス取得の流れ
HTMLを処理する流れ
HTML を処理する場合、 HttpServletResponseWrapper では以下の流れで処理が進みます。
- setHeader (String arg0, String arg1) メソッドが呼び出されます。
- getOutputStream() が呼び出され、 ServletOutputStream が生成されます。
- setContentType(String arg0) メソッドが呼び出されます。
- setContentLength(int arg0) メソッドが呼び出されます。
- setBufferSize(int arg0) メソッドが呼び出されます。
- 生成された ServletOutputStream の write(byte[] arg0, int arg1, int arg2) メソッドが呼び出されます。
- write に渡されたbyte 毎に write(int arg0) が呼び出されます。
つまり Tomcat 5.5 で HTML を処理する場合、 ServletOutputStream の write メソッドでレスポンスが書き出されます。
JSP を処理する流れ
JSP を処理する場合、 HttpServletResponseWrapper では以下の流れで処理が進みます。
- setContentType(String arg0) メソッドが呼び出されます。
- getWriter() が呼び出され、 PrintWriter が生成されます。
- 生成された PrintWriter の write(char[] arg0, int arg1, int arg2) が呼び出されます。
つまり Tomcat 5.5 で JSP を処理する場合、 PrintWriter の write メソッドでレスポンスが書き出されます。
レスポンスを拡張する際には
この結果から、Tomcat 5.5 では HTML を処理する場合には ServletOutputStream が、 JSP を処理する場合には PrintWriter が使用されます。 そのため HTML か JSP かに依存しないレスポンスを拡張を行いたい場合、 両方で書き出される内容を取得して適切な処理を加える実装を行う必要があります。
言語・環境 |
Java |
総称型(Generics) |
JFace |
Servlet/JSP |
ResponseWrapper処理の流れ |
PHP |
includeパス解決方法 |
Objective-C |
Cocoa |
Excel関数 |
目的別 |
PR |
検索 |