フィルタを作成する方法が増えた
こんにちは、スッキリサーブレット&JSP入門著者の国本です。
今春に改訂した「スッキリわかるサーブレット&JSP入門 第2版」では、Apache Tomcat 9を使用しています。
このApache Tomcat 9は、サーブレットの最新仕様であるServlet 4.0 に対応しています。
とはいえ、Servlet 4.0 は前バージョンからあまり大きなアップデートはありません。かろうじて目玉扱いになっているのが「サーバー・プッシュ」です。「スッキリわかるサーブレット&JSP入門」の改訂にあたり「サーバー・プッシュ」の解説を追加するか検討したのですが、初心者向けの機能ではないので見送ってしまいました(もし期待していた方がいたらすみません)
折角、Apache Tomcat 9を使用しているので、ここでは Servlet 4.0 ネタを1つ紹介したいと思います。といっても「サーバー・プッシュ」はいろいろなサイトで紹介されているので敢えて紹介せず、少しマニアックなネタを紹介したいとおもいます。
Servlet 4.0では、「javax.servlet.http.HttpFilter」という抽象クラスが追加されました。このクラスを使用すると、シンプルなフィルターを作成することができます。
どれくらいシンプルになるか、実際に見比べてみましょう。論よりソースです。
まずは、従来の方法(javax.servlet.Filterインタフェースを実装)です。
// import文は省略 @WebFilter("/SampleFilter") public class SampleFilter implements Filter { public void destroy() { // フィルタが破棄される時の処理 } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { // 前処理 chain.doFilter(request, response); // 後処理 } public void init(FilterConfig fConfig) throws ServletException { // フィルタが生成された時の処理 } }
うーん、destory()とinit()がなんとも邪魔で、スッキリしないですね。こららのメソッドに処理を書くことは殆どないのですが、実装しているFilterインタフェースに定義されているため、オーバーライドしなければいけません(※1)
一方、HttpFilterクラスを継承してフィルターを作成すると次のようになります。
// import文は省略 @WebFilter("/*") public class SampleFilter extends HttpFilter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 前処理 chain.doFilter(request, response); // 後処理 } }
おぉ、スッキリ!! 。余計なdestroy()とinit()のオーバーライドをする必要がありません。必要なdoFilterのみをオーバーライドすればOKです。ただし、HttpFilterはクラスなので「実装」ではなく「継承」しないといけない事に注意してください。
ただ、残念なのが、Eclipseで「フィルター」を新規作成すると、従来の方法でフィルターを作成してしまうことです。新しい方法でフィルターを作成するには、次のどちらかの方法でやる必要があります。
方法1: フィルターを新規作成。Filterを実装からHttpFilterを継承に変更して、destroy()とinit()を削除
方法2: HttpFilterを継承するクラスを新規作成。doFilter()をオーバーライドして、@WebFilterアノテーションを追加
うーん、どっちも面倒くさい。。
なので、本では従来の方法のままで新しい方法は紹介しませんでした。そのうち、Eclipseが対応してくれたら、本も変更するかと思います。
ということで、楽になりそうで、楽にならない微妙なネタでした。
フィルターについて勉強したいという方は、「スッキリわかるサーブレット&JSP入門 第2版」をよろしくお願いいたします(営業)
※1: 厳密にいうとdestory()メソッドには、defaultがつけられているのでオーバーライドは必須ではありません