Servlet/JSP 基礎編11 フィルタ
フィルタとは
サーブレット・JSPを実行する前後に指定した処理を実行するための機能のことである。これをうまく使うと、共通処理を記述することで、全体のコード量を減らすことができる。
具体的に共通の処理というのは、レスポンスに対する文字エンコーディングやMIMEタイプ設定、逆にリクエストの文字エンコーディングなどがある。
フィルタを作成するために
フィルタを作成するためには、Filterインタフェースを実装したクラスを宣言しなければならない。まず、Filterインターフェースには、3つのメソッドが提供されており、必ず、オーバーライドしなければならない。
その3つのメソッドというのは、「doFilter」「init」「destroy」である。doFilterメソッドは、フィルタ適用時に呼び出される。initメソッドは開始時に一度、destroyメソッドは終了時に一度呼び出される。文字で書いても、理解が追い付かないと思うので、プログラムの中で詳しく書いていこうとおもう。
プログラムを作成する前に、最後、このフィルタの適用範囲を設定する。これは、Webアノテーションのように記述すればよい。正しくは、WebFilterアノテーションである。
プログラムの作成
実際のフィルタ部分のプログラムは以下である。
まず、1行目がWebFilterアノテーションである。URLパターンに「/*」と指定しているので、これから先の作成するサーブレット・JSP、すべてにこのフィルタが適用されることになる。
次に、doFilterメソッドを見てほしい。引数の中に、request,responseと、chainというものがある。これは、FilterChainインタフェースのインスタンスである。このchainを用いて、フィルタの終了時に行う後処理を記述することができる。
このメソッドの中では、リクエストとレスポンスのエンコーディングなどを設定している。そして、「chain.doFilter(request,response)」と書かれている。一見、引数の数が少ないと思うだろうが、これは、FilterChainインタフェースのdoFilterメソッドであり、先ほどのものとは別物である。これを書くことで、フィルタの後ろ側にある、サーブレット・JSPにリクエスト、レスポンス内容を送ることができる。逆に言うと、この処理がなければ、フィルタでリクエストが遮断されてしまう。
分かりにくいと思うので、図で表す。
最もシンプルに表すと上図のようになる。これで、「フィルタの後ろ側にあるサーブレット・JSP」や「フィルタでリクエストが遮断されてしまう」という意味が理解できると思う。
続きを解説する。initメソッド、destroyメソッドは、特に何も目的がないので、宣言だけをする。
あとは、適当なサーブレットを用意する。サーブレットのプログラムは以下である。
シンプルに「サーブレットの処理」と画面にでるようにした。
結果は以下である。
フィルタの前処理
サーブレットの処理
フィルタの後処理
まず、フィルタのプログラムで前処理が行われており、サーブレットの処理、戻ってきて、後処理が行われていることが分かる。今までのプログラムなら、文字化けが起きるはずだが、フィルタを通すことで、文字化けを防げている。
今後は、エンコーディングのことを気にせず、プログラムを書くことができる。
おわりに
今回は「フィルタ」について簡単に紹介してきた。以上で、「サーブレット・JSP 基礎編」は終わりである。次回からは「応用編」として、サーブレット・JSPだけでなく、データベースなど、本格的にWEBアプリケーションに使われている機能に触れていきたいと思う。