機能SAMPLE.11 「EzServlet/拡張pointを利用する方法」

今回は、EzServletの「拡張point」を利用する方法について説明します。


EzServletの拡張pointは、以下の1つです。(個人的な考えですが、拡張pointが沢山あるのは分りづらい思っているため…^^;)


Controllerの「doInitilize」「doCatch」「doFinallize」メソッドを共通Controllerクラスで実装する方法。
補足:上記以外に「EzServletクラス(基底Servlet)を拡張する方法」もありますが、かなりコアな拡張になります。
    大抵の拡張は、上記の拡張pointを利用することにより対応可能(のはず)です。


では、拡張pointの具体的な説明をしていきます。

Controllerの「doInitilize」「doCatch」「doFinallize」メソッドを、共通Controllerクラスで実装する方法。


HTMLの「ボタン(リンク)」がクリックされると、HTMLに対応するControllerの(name属性と同名の)メソッドが
呼び出されます。
その際、Controllerに「doInitilize」メソッドが存在する場合は、(name属性と同名の)メソッド呼出前に
「doInitilize」が呼び出されます。
そして、Controllerに「doFinallize」メソッドが存在する場合は、(name属性と同名の)メソッド呼出後に
「doFinallize」が呼び出されます。
また、Controllerに「doCatch」メソッドが存在する場合は、(name属性と同名の)メソッドで例外発生時に
「doCatch」が呼び出されます。

整理すると、下記の順番でメソッドが呼び出されます。

(1)doInitilizeメソッド
(2)ボタンのname属性と同名のメソッド
(3)doCatchメソッド(2で例外が発生した場合のみ呼ばれるメソッド)
(4)doFinallizeメソッド

この機能を拡張pointとして利用します。
まず、共通Controllerクラスを作成し、そのクラスで「doInitilize」「doCatch」「doFinallize」メソッドを実装し、各メソッドで拡張したい内容を記述します。
サブControllerクラスは、共通Controllerクラスを継承すればOKです。
後は、書くメソッドで、「ログ出力」を記述するなり、「セキュリティーチェック」を行うなり自由に利用してください。
注1:Controllerクラスは、シングルトンではありません。クラス内にプロパティーを宣言しても問題ありません。
注2:doInitilize, doCatch, doFinallizeメソッドは、必須ではありません。記述があれば利用されるだけです。


doInitilize, doCatch, doFinallizeメソッドで受け渡されるシグニチャは以下の通りです。


1.doInitialize(String className, String methodName, Object page)メソッド
 引数1:classNameは、呼び出されるControllerのクラス名です。
 引数2:methodNameは、呼び出されるControllerのメソッド名です。
 引数3:pageは、DTOインスタンスです。

2.doCatch(String className, String methodName, Object page, Throwable e)
 引数1:classNameは、呼び出されるControllerのクラス名です。
 引数2:methodNameは、呼び出されるControllerのメソッド名です。
 引数3:pageは、DTOインスタンスです。
 引数4:発生した例外のインスタンスです。

3.doFinalize(String className, String methodName, Object page)メソッド
 引数1:classNameは、呼び出されるControllerのクラス名です。
 引数2:methodNameは、呼び出されるControllerのメソッド名です。
 引数3:pageは、DTOインスタンスです。

実装イメージは下記のような感じです。

public class CommonController {
	/**
	 * <p>
	 * 画面のボタン・リンクに対応する全メソッドが呼び出される前に呼ばれるメソッドです。<br>
	 * 共通処理を記述する場合は親クラスを作成し、このメソッドを実装します。<br>
	 * </p>
	 * @param className 呼び出されるクラス名
	 * @param methodName 呼び出されるメソッド名
	 * @param page 画面情報を保持するDTO
	 */
	public void doInitialize(String className, String methodName, Object page) {
	}

	/**
	 * <p>
	 * 画面のボタン・リンクに対応する全メソッドでExceptionがThrowされた時に呼ばれるメソッドです。<br>
	 * 例外発生後の共通処理を記述する場合は親クラスを作成し、このメソッドを実装します。<br>
	 * 注意1:このメソッドでcatchされたExceptionは明示的にThrowしない場合、例外は無視されます。<br>
	 * 注意2:validateエラーは、catchされません。<br>
	 * </p>
	 * @param className 呼び出されるクラス名
	 * @param methodName 呼び出されるメソッド名
	 * @param page 画面情報を保持するDTO
	 * @param e 発生したThrowable
	 * @throws Throwable 例外
	 */
	public void doCatch(String className, String methodName, Object page, Throwable e) throws Throwable {
	}

	/**
	 * <p>
	 * 画面のボタン・リンクに対応する全メソッドが呼び出された後に呼ばれるメソッドです。<br>
	 * 共通処理を記述する場合は親クラスを作成し、このメソッドを実装します。<br>
	 * </p>
	 * @param className 呼び出されるクラス名
	 * @param methodName 呼び出されるメソッド名
	 * @param page 画面情報を保持するDTO
	 */
	public void doFinalize(String className, String methodName, Object page) {
	}
}


超かーんたーん(o^∀^)oネッ♪