フィルタ
アプリケーションサーバは、サーブレットやJSPを実行する前後にフィルタの自動実行を行っている。フィルタに共通処理を記述すれば、各サーブレットのソースコード量を減らせれる。
// フィルタの適用する範囲をWebFilterアノテーションで指定 @WebFilter(urlPatterns={"/*"}) public class EncodingFilter implements Filter { // フィルタの開始時に1回だけ呼び出される @Override public void init(FilterConfig arg0) throws ServletException {} // フィルタの適用時に毎回呼び出される @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // リクエスト用の文字エンコーディングの指定 arg0.setCharacterEncoding("UTF-8"); // レスポンス用の文字エンコーディングの指定 arg1.setContentType("text/html; charset=UTF-8"); System.out.println("フィルタの前処理"); // 次のフィルタを呼び出す。現在のフィルタが最後の場合、サーブレットやJSPを呼び出す。 arg2.doFilter(arg0, arg1); System.out.println("フィルタの後処理"); } // フィルタの終了時に1回だけ呼び出される @Override public void destroy() {} }
複数のフィルタを使う
複数のフィルタ実行には、web.xmlの利用が必須になる。
フィルタが適用される順番は、filter-mapping要素の記述順。
<filter> <!-- フィルタ名 --> <!-- filter要素とfilter-mapping要素に同じ名前を記述する --> <filter-name>hellofilter</filter-name> <!-- クラス --> <!-- パッケージ名.クラス名 --> <filter-class>chapter10.HelloFilter</filter-class> </filter> <filter-mapping> <!-- フィルタ名 --> <filter-name>hellofilter</filter-name> <!-- URLパターン --> <url-pattern>/chapter3/hello</url-pattern> </filter-mapping> <filter> <filter-name>hellofilter2</filter-name> <filter-class>chapter10.HelloFilter2</filter-class> </filter> <filter-mapping> <filter-name>hellofilter2</filter-name> <url-pattern>/chapter3/hello</url-pattern> </filter-mapping>
public class HelloFilter implements Filter { @Override public void destroy() { // TODO 自動生成されたメソッド・スタブ } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO 自動生成されたメソッド・スタブ PrintWriter pw = arg1.getWriter(); pw.println("[HelloFilter(pre)]"); arg2.doFilter(arg0, arg1); pw.println("[HelloFilter(post)]"); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO 自動生成されたメソッド・スタブ } }
public class HelloFilter2 implements Filter { @Override public void destroy() { // TODO 自動生成されたメソッド・スタブ } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO 自動生成されたメソッド・スタブ PrintWriter pw = arg1.getWriter(); pw.println("[HelloFilter2(pre)]"); arg2.doFilter(arg0, arg1); pw.println("[HelloFilter2(post)]"); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO 自動生成されたメソッド・スタブ } }
なお、フィルターの前処理と後処理では、実行順が逆になる。