Search on the blog

2012年12月9日日曜日

Server-side Java(2) Servletのフィルタを使う

フィルタとは?
あるServletが実行される直前に別の処理を埋め込む機能。どのServletに対して処理を埋め込むかは、servlet-mappingのurl-patternと同様に正規表現を使って指定することができる。
もともとフィルタの設定はweb.xmlに記述していたが、Servlet 3.0からはアノテーションで設定することができるようになった。
これは便利!AOPとほぼ同じに見えるんだけど、違いは何だろう。。

サンプル
Tomcat Version 7.0.33で動作確認。
/MainServletにアクセスすると、FilterServletの処理が実行されます。その後、MainServletの処理が実行されます。

[MainServlet.java]
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MainServlet
 */
@WebServlet("/MainServlet")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("<title>Filter Test</title>");
        out.println("</head>");
        out.println("<body>");

        out.println("<p>MainServletの処理です。</p>");

        out.println("</body>");
        out.println("</html>");
    }
}

[FilterServlet.java]
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class FilterServlet
 */
@WebFilter(filterName="FilterServlet", urlPatterns="/*")
public class FilterServlet implements Filter {
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        response.setContentType("text/html; charset=UTF-8");
        response.getWriter().println("Filterの処理です。");
        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
    }

}

0 件のコメント:

コメントを投稿