Conventionプラグインとは
一言で説明すると、
Struts2のActionクラスに関する設定を、「すべて」アノテーションで定義できる
これにより、以下のことが言えます
struts.xmlにはActionクラスの振る舞いを書かない!
Actionクラスの動きは、Actionクラス自身がもっている!
つまり、設定ファイルからActionクラスの定義が消えることで、アプリケーションの全体設定(共通設定)だけ書くところになり、きれいになり、他にもいくつかの「しきたり」ができ、自由奔放に実装できるStruts2のActionクラスを整理できる。
といいこと尽くしなので導入しない手はありません。
Actionで設定したアノテーションの設定を見る
Struts2には現在のアプリケーション設定を一望できるConfig-Browserプラグインがありますので、これを導入するだけで良いです。
※設定から何から全部見れてしまうため、くれぐれも本番環境にはConfig-Browserプラグインは載せないようにしましょう。
アノテーションで設定するもの
以下のものを設定できます。
- @Namespace : struts.xmlのpackageと同じ。URLの一部となる。スラッシュ(/)から始まる。
- @ParentPackage : 設定を継承する @Namespace または package
- @InterceptorRefs : 利用するインターセプタ&インターセプタスタック
- @Results : Actionクラスのreturn値に対する遷移先( レスポンス先 )
- @ExceptionMappings : 例外発生時の遷移先
- @Action : ActionクラスのURLパスを設定 ( メソッド単位にも設定可能 )
リクエストされたURLとActionクラスのマッピングは次のルールで一意に決まります。
@Namespaceの値/@Actionの値
例えば、@Namespace("/master/user")、publicメソッドに@Action("search")とした場合は、
/(コンテキストパス)/master/user/search
@Namespace("/check")、@Action("")とした場合は、
/(コンテキストパス)/check/
@Namespace("/")、@Action("")とした場合は、
/(コンテキストパス)/
となります。
※Conventionプラグイン利用時は.actionを省略できる( Conventionプラグインの初期設定 )
Conventionプラグインの設定に関するあいまいさ
Actionクラスの@Namespaceと@Actionのルールについては、少しゆるい設定ができます。
- 1つのActionで複数のpublicメソッド+@Actionを用意すると、URLを分割できる。
- 複数のActionクラスで、同じ@Namespaceを共有できる。
このため、仕組み上では複数のActionクラスをグルーピングして、同じ@Namespaceに含めることもできます。
つまり好き勝手に作れる気楽さはありますが、複数人で作る場合にはルールが必要です。
また、例え複数のActionクラス内で、完全に同一の@Namespaceと@Actionの組み合わせがあった場合は、エラーが発生することはなく、「どちらかが優先されます」
どちらかはわかりません
ですので、ルール作りが必要です。