Conventionプラグインとは
Struts 2では、Actionクラスの設定をアノテーション(@を接頭辞にしたクラス設定)で定義できます。Struts 2.1系からはこの機能をConventionプラグインとして分離し、正式プラグインとしてStruts 2に同梱されました。Conventionプラグインはアノテーションだけでなく、その他Struts 2でアプリケーションを構築するうえで、さまざまな規約を提供します。
アノテーション宣言の方法
Actionクラスまたは、Actionメソッドの宣言部分に@をつけて記述します。Actionクラスへの記述方法は以下のようになります。
@Namespace("/ajax")
@ParentPackage("json-default")
@InterceptorRefs({
@InterceptorRef("modelDriven"),
@InterceptorRef("jsonValidationWorkflowStack"),
})
@Results({
@Result(name="input" , type="dispatcher" , location="success.jsp"),
@Result(name="success" , type="dispatcher" , location="success.jsp"),
@Result(name="prefs" , type="json" , params={"root" , "prefnames"})
})
public class SampleAction extends ActionSupport {
// …(Actionクラス実装部分)…
}
また、Actionメソッド単位で設定する場合には次のようになります。
public class SampleAction extends ActionSupport {
@Action("execute")
public String execute() throws Exception {
return "success";
}
}
なお、@Actionで定義していない場合のURLは、Actionクラス名を大文字ごとに分割して全て小文字にして、ハイフンでつないだものになります。例えばSampleExecValidationActionクラスは、sample-exec-validation.actionで呼び出されます。この場合、Actionクラス名が長ければURLも長くなってしまうので、通常は@Actionで利用しやすい名前を指定します。
以上のように、クラスないしはメソッドの上の行にてアノテーションで宣言をします。ここで設定した内容は、Struts 2の設定ファイルであるstruts.xmlで設定できる内容を網羅することができ、設定内容の継承ルールも同じです。つまり、Actionクラスの設定は、struts.xml(Struts 2設定ファイルXML)と共存できるので、以上から次のようなことも可能です。
- アプリケーション共通の設定はstruts.xml
- Actionクラスごとに特化した設定はアノテーションで定義(共通設定を一部上書き)
なお、設定の優先順位は以下のようになっています。上にあるほど優先順位が高いものになります。
- メソッドごとの設定
- クラスごとの設定
- 継承元クラスの設定
- パッケージごとの設定
- グローバル設定(struts.xml)
- struts-default.xml
アノテーションの種類
Conventionプラグインで利用可能なアノテーションを以下に示します。
| アノテーション名 | 説明 |
| Action(s) | Actionクラスの定義。主にメソッド単位の定義でさらに詳細な設定ができる |
| InterceptorRef(s) | Actionクラスが利用するインターセプタ/インターセプタスタック定義 |
| Result(s) | Actionクラスのreturn後の遷移先、遷移タイプを指定 |
| Namespace | struts.xmlでのpackageと同じ。Actionクラスが属するグループやURLパスにもなる |
| ResultPath | Resultにて遷移先と指定したファイルのパスを指定。WEB-INF以下からの相対パス |
| ParentPackage | 継承するpackageを指定。他のActionやstruts.xmlの内容を継承できる |
| ExceptionMapping | 例外発生時のハンドリングをActionクラスで定義できる |
上記以外のアノテーションは、Validation、Oval Framework(※注1)、Spring frameworkのアノテーションとなります。
オブジェクト単位でのバリデーションを提供するフレームワーク。Struts 2.1.8.1でも正式採用されています。
各アノテーションはActionクラス単位、Actionメソッド単位で設定が可能です。つまりConventionプラグインのアノテーションは、Actionクラスの振る舞いを定義するものです。
Actionアノテーションについては先程説明したので、残りのアノテーションについて説明をしていきます。
(1)InterceptorRefs
InterceptorRefsで利用するインターセプタの定義になります。導入するインターセプタを@InterceptorRefで1つずつ定義し、宣言された順から稼動します。
@InterceptorRefs({
@InterceptorRef("jsonValidationWorkflowStack"),
})
@InterceptorRef内で宣言されている文字列はstruts-default.xmlにて定義されているインターセプタのエイリアス名です。エイリアス名についてはStruts 2のインターセプタの選定(1)(CodeZine)を参照してください。なお、導入するインターセプタは、インターセプタ集合であるインターセプタスタックも利用可能です。
また、定義したインターセプタに対して設定を変更する場合は、params属性を使って変更します。指定できるパラメータは各インターセプタごとに異なります。
次の例では、インターセプタ利用の宣言と、params属性を使って変更しているものです。
@InterceptorRefs({
@InterceptorRef(value="scope" ,
params={"session","time",
"key","scoped_",
"autoCreateSession","true"}),
@InterceptorRef(value="defaultStack"),
})
このように、インターセプタ名をvalueで指定し、設定するパラメータの内容をparamsで指定します。
また、インターセプタスタックに含まれるインターセプタの設定を変更することもできます。その場合はインターセプタのエイリアス名を接頭辞にして、パラメータを定義します。
@InterceptorRefs({
@InterceptorRef(value="defaultStack" ,
params={"staticParams.merge","true",
"staticParams.overwrite","true"}
),
})
インターセプタ定義をする場合には、インターセプタの集合であるインターセプタスタックを利用するかどうか、スタック内にどのインターセプタが含まれているかを必ず確認しましょう。もし重複して設定してしまった場合には誤動作の原因になります。
(2)Namespace
Namespaceは、Actionクラスを束ねるpackageを指定するものです。Namespaceにて指定した値はURLパスにもなります。他のActionクラスや、struts.xmlにて同じNamespace(package)を指定した場合には、同じpackageに所属することになります。
Namespaceは必ず/(スラッシュ)から始まります。省略時には/になります。
@Namespace("/ajax")
public class SampleAction extends ActionSupport {
…(Actionクラス実装)…
}
この例でのURLは /コンテキストパス/ajax/sample.action になります。
