SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

続 Struts 2入門

Struts 2アプリでアノテーションを活用するConventionプラグイン

続・Struts2入門(5)

Conventionプラグインとは

 Struts 2では、Actionクラスの設定をアノテーション(@を接頭辞にしたクラス設定)で定義できます。Struts 2.1系からはこの機能をConventionプラグインとして分離し、正式プラグインとしてStruts 2に同梱されました。Conventionプラグインはアノテーションだけでなく、その他Struts 2でアプリケーションを構築するうえで、さまざまな規約を提供します。

アノテーション宣言の方法

 Actionクラスまたは、Actionメソッドの宣言部分に@をつけて記述します。Actionクラスへの記述方法は以下のようになります。

リスト1 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メソッド単位で設定する場合には次のようになります。

リスト2 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プラグインで利用可能なアノテーションを以下に示します。

表1 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のアノテーションとなります。

※注1

 オブジェクト単位でのバリデーションを提供するフレームワーク。Struts 2.1.8.1でも正式採用されています。

 各アノテーションはActionクラス単位、Actionメソッド単位で設定が可能です。つまりConventionプラグインのアノテーションは、Actionクラスの振る舞いを定義するものです。

 Actionアノテーションについては先程説明したので、残りのアノテーションについて説明をしていきます。

(1)InterceptorRefs

 InterceptorRefsで利用するインターセプタの定義になります。導入するインターセプタを@InterceptorRefで1つずつ定義し、宣言された順から稼動します。

リスト3 InterceptorRefs設定例(抜粋)
@InterceptorRefs({
  @InterceptorRef("jsonValidationWorkflowStack"),
})

 @InterceptorRef内で宣言されている文字列はstruts-default.xmlにて定義されているインターセプタのエイリアス名です。エイリアス名についてはStruts 2のインターセプタの選定(1)(CodeZine)を参照してください。なお、導入するインターセプタは、インターセプタ集合であるインターセプタスタックも利用可能です。

 また、定義したインターセプタに対して設定を変更する場合は、params属性を使って変更します。指定できるパラメータは各インターセプタごとに異なります。

 次の例では、インターセプタ利用の宣言と、params属性を使って変更しているものです。

リスト4 パラメータの設定方法
@InterceptorRefs({
  @InterceptorRef(value="scope" ,
                  params={"session","time",
                          "key","scoped_",
                          "autoCreateSession","true"}),
  @InterceptorRef(value="defaultStack"),
})

 このように、インターセプタ名をvalueで指定し、設定するパラメータの内容をparamsで指定します。

 また、インターセプタスタックに含まれるインターセプタの設定を変更することもできます。その場合はインターセプタのエイリアス名を接頭辞にして、パラメータを定義します。

リスト5 インターセプタスタックへのパラメータの設定方法
@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は必ず/(スラッシュ)から始まります。省略時には/になります。

リスト6 Namespaceの設定方法
@Namespace("/ajax")
public class SampleAction extends ActionSupport {
  …(Actionクラス実装)…
}

 この例でのURLは /コンテキストパス/ajax/sample.action になります。

次のページ
まとめ

この記事は参考になりましたか?

続 Struts 2入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5271 2010/07/15 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー