スッキリわかるサーブレット&JSP入門 第2版

Sevlet 4.0でのフィルタの生成

フィルタを作成する方法が増えた

こんにちは、スッキリサーブレット&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がつけられているのでオーバーライドは必須ではありません

-スッキリわかるサーブレット&JSP入門 第2版
-