[Servlet]フィルター(Time Filter:処理時間の測定)機能の実装

2022/06/17に公開


◆はじめに

実装後に以下のURLにアクセスします。

http://localhost:8080/InputFunction/echo.jsp

すると、以下の仕様の画面が表示されます。
・文字列を入力し、送信ボタンを押す。
・Echo機能を提供するServletが呼び出される。
・送信した文字列が、再度、画面に表示される。

次が本記事で実装方法を紹介する、
Timerの機能を提供するFilterの動作です。
Eclipseのコンソールに、計測されたServletの処理時間が表示されます。


◆Fileterとは

Filterとは、
クライアントからのリクエストがくるとServletの前に実行されるクラスです
複数のServletで同じような処理を行いたい場合などに役に立ちます。


例えば、
Filterをひとつ実装すれば、どの画面からでも
用意したフィルターをかけられるようになるため、
ひとつひとつの画面に個別に実装する手間が省けます。


また、本記事では、Timer 機能を提供するFilterを実装しました。
Servletが呼ばれる前に、Time Filterが呼ばれ、タイマーがスタート。
処理後に、タイマーを停止し、理時間を計測することができます。


今回ご紹介するTime Filterのように、処理時間を計測するFilterだけではありません。
・文字コードを変換
・ログの出力
・ログイン機能  ...etc
様々に実装が可能ですし、複数のFilterを同時にかけることもできます。


◆前提/環境など

本記事は、以下の記事の「InputFunction」プロジェクトをベースに作成しています。
Echo機能のServletの処理時間を計測するため、ご用意ください。
基本的なプロジェクトの構成や、ライブラリについては以下をご覧ください。

https://zenn.dev/nakohama/articles/9f08b12905196e

また、バリデーション機能については、
以下の記事で実装方法を紹介しています。
こちらは、実装していなくても問題ありません。

https://zenn.dev/nakohama/articles/609b0aa0d076c6


※本記事では、 eclipseは以下のバージョンでの画像を使用しています。
日本語化はしていません。
他のversionでの動作は確認しておりません。


◆手順

Time Fliterの実装手順のみご紹介します。

①Filterクラスの用意

・mainフォルダに「filter」のパッケージを作成
・「filter」のパッケージ内に、「TimeFilter.java」を作成


②Time Filterのソースコード

・以下のコードを、「TimeFilter.java」に記述
TimeFilter.java
package filter;

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;

//("/echo")のURLにアクセスした際に呼ばれる
@WebFilter("/echo")
public class TimeFilter implements Filter{

	//init
	 public void init(FilterConfig conf) throws ServletException {
	
	 }
	
	//doFilter
	@Override
	public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) {
		
		//処理時間の計測開始
		System.out.println("TimeFilter# 時間の計測を開始します。");
		long start = System.currentTimeMillis();
		
		try {	
			// Servletを呼び出す。または、別のfliterを呼び出す。
			chain.doFilter(request,response);
		}
		
		catch(Exception e) {
			System.out.println("Error");	
		}
		
		//処理時間の計測終了
		finally {
			long end = System.currentTimeMillis();
			System.out.println("TimeFilter# 処理時間は,"+ (end - start) + "ms でした。");
		}  
	}
	
	//destroy
	public void destroy() {	
	}
}
「InputFunction」プロジェクトでは、以上でソースを貼った以外の
ファイルのコードや追加しているライブラリーに関しては、特に変更はありません。
そちらのソースに関しては、以下の記事をご参照ください。

https://zenn.dev/nakohama/articles/609b0aa0d076c6


③動作チェック

・Tomcatなどアプリケーションサーバーを起動
・実装後に以下のURLにアクセス

http://localhost:8080/InputFunction/echo.jsp

以下の画面が表示されるので、
・テキストボックス文字列を入力
・送信ボタンを押す

Echo機能の仕様は以下です。
・文字列を入力し、送信ボタンを押す。
・Echo機能を提供するServletが呼び出される。
・送信した文字列が、再度、画面に表示される。


因みに、Validation機能の使用は以下です。
・送信された文字列が空欄の場合は、
「この項目は必須入力です。」と文字列が表示される。

そして、正常にTimeFilerが動作していれば、
Eclipseのコンソールに、
計測されたServletの処理時間が表示されているはずです。

以上のようになっていれば、実装完了です。
ちなみに、
「ValidationMessage:null」はバリデーション機能でひっかからなかったのでnullです。
「message:処理時間の計測」は、Echo機能で返す文字列です。


◆さいごに

以上です。いかがだったでしょうか。
Filterの実装はできたでしょうか。
今回のポイントです。


①Filterクラスを作成し、doFilterメソッドにフィルタ処理を記載

②@WebFilter("Filterを呼び出すURL情報")をFilterクラスに記載

③chain.doFilterで、次の処理に移る


コードに関しての詳しい説明に関しては、
あまり書いていません。一応、コード内にコメントをつけてます。
あとは、他の参考に載せている書籍やサイトなど調べてみてください。


最後まで、ご覧いただきありがとうございました。


◆参考

本記事は、以下の書籍を大いに参考にしています。
より詳しく知りたい方は、どうぞ。

https://www.amazon.co.jp/dp/4797362596

・関連記事、その他

http://www.pasokuma.net/dev/java/servlet/servletfilter.html

https://www.javaroad.jp/servletjsp/sj_servlet10.htm

https://qiita.com/hogeo1234/items/0e43c5a501b7e621d091

Discussion