インターセプタの概要
Struts2にはインターセプタ(interceptor)と呼ばれる、Actionクラスの前後に処理を挟み込む機能があり、デフォルトで様々なインターセプタが使われている。
インターセプタを大別すると2種類ある。
- Actionクラス全体に仕掛けるものと
- Actionクラスのpublicメソッド(Actionメソッド)単位に仕掛けるもの
メソッド単位に仕掛けるものについては、有効または無効なメソッド名を正規表現で指定する。
入力チェック(Validation)関連の機能はメソッド指定のインターセプタである。
インターセプタの実装方法
インターセプタのクラスはcom.opensymphony.xwork2.interceptorパッケージにある次の2つのどちらかを継承する。
- AbstractInterceptor ( クラス全体 )
- MethodFilterInterceptor ( メソッド指定 )
(または、Interceptorインタフェースを実装してもよい)
Interceptorを実装した例は以下のように。
public class SampleInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
// Action前処理 ////////
// Actionの実行結果(returnした値)
String retString = invocation.invoke();
// Action後処理 ////////
// 遷移先のresultを返す。
// 例えばAction後処理で何か遷移先を変えたい場合にここで変更する。
return retString;
}
}
インターセプタを登録する
インターセプタの登録は、struts.xmlで行う。インターセプタの登録はinterceptorのname属性で名前を指定する。
登録した後は、Actionクラスで簡単に使えるように、インターセプタ・スタックを作成すると良い。
インターセプタ・スタックはインターセプタを複数積み上げたもので、たくさん積み上げて構築するインターセプタの定義を1つに集約できる。
<struts>
<package name="sample-package" abstract="true" extends="json-default">
<interceptors>
<interceptor name="sample"
class="lumi2.SampleInterceptor"></interceptor>
</interceptors>
<interceptor-stack name="sampleStack">
<interceptor-ref name="basicStack" />
<interceptor-ref name="sample" />
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
<interceptor-ref name="jsonValidation" />
<interceptor-ref name="workflow" />
</interceptor-stack>
</package>
</struts>
インターセプタを利用にする
Actionクラスの利用例を次に示す。
struts.xmlのパッケージ名を@ParentPackageに指定すると、package要素で定義した内容を継承する。
@Namespace("/")
@ParentPackage("sample-package")
public class SampleDisplayAction extends ActionSupport {
.........
}