転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】基礎からのサーブレット⑩

フィルタ

アプリケーションサーバは、サーブレット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 自動生成されたメソッド・スタブ

	}

}

なお、フィルターの前処理と後処理では、実行順が逆になる。
f:id:uuc1h:20181212003032p:plain