Conventionプラグイン

Struts2.1のアクションクラスがPOJOであることと同様に、Struts1系と比較したStruts2.1の利点として良く取り上げられるのが、Struts2.1の定義ファイルは最小限で済むという点です。

Struts1系では、定義ファイルstruts-config.xmlに、利用するアクションクラスやフォームクラス、アクションクラスの処理結果をもとにした遷移先のJSPファイルを記述する必要がありました。Struts2.1では、先のリスト3、リスト4で実現できるような簡単なWebアプリケーションであれば、定義ファイルであるstruts.xmlは不要です。

この定義ファイルを減らす機能が、Struts2.1で新たに追加されたConventionプラグイン(struts2-convention-plugin-2.1.6.jar)です(Struts2.0で同様の機能を提供していたCodebehindプラグイン[struts2-codebehind-plugin -x.x.x.jar]は非推奨になっていますので、注意して下さい)。

しかし、Conventionプラグインを利用するにあたっては守らなければならない約束事がいくつかあります。アクションクラスとJSPに関する主な約束事は次のとおりです。

アクションクラスに関する約束事

  • アクションクラスは、struts、struts2、action、actionsという名前のパッケージ(もしくは、それらのパッケージよりも下のパッケージ)に配置する
  • アクションクラスは、 名前を「Action」で終わらせるか、com.opensymphony.xwork2.Actionをimplements(AcctionSupportはActionをimplements)する
  • アクションのURIは、パッケージstruts、struts2、action、actionsの下から始まり、アクションクラスの名前からActionを外したものになる

JSPに関する約束事

  • JSPは/WEB-INF/content/以下(のフォルダ)に配置する。content以下のフォルダはアクションクラスを配置したフォルダ構成と同じにする
  • アクションクラスから遷移するJSPの名は、アクションクラスの名前からActionを外したものになる

以下、これらを遵守した例を簡単に示しておきます。

表2: 約束事の例

パッケージ構成 URI 遷移先のJSP
/sample/action/HogeAction /hoge /WEB-INF/content/hoge.jsp
/sample/action/hoge/FugaAction /hoge/fuga /WEB-INF/content/hoge/fuga.jsp

図2: HelloWorldの動作

図3: HelloWorldの構成

アクションクラスとアノテーション

Conventionプラグインと同様に定義ファイルを減らすために、Struts2.1ではアノテーションを利用することができます。ここでは代表的なアノテーションであるActionアノテーションとResultアノテーションについて触れておきましょう。

Actionアノテーションは、アクションメソッドをカスタマイズするアノテーションです。例えば、「public String methodName()」の形式を守ればexecuteという名称を使わないアクションメソッドを利用することもできます。また、Actionsアノテーションで複数のActionアノテーションをまとめることで複数のURIで同じメソッドを呼び出すこともできます。

リスト5は、ActionsアノテーションとActionアノテーションのサンプルです。「/sample/hello」でexecute()メソッドが、「/sample/goodmoning」と「/sample/goodnight」でhoge()メソッドがアクションメソッドとして動作します。

リスト5: ActionsアノテーションとActionアノテーションのサンプル

@Action("/sample/hello")
public String execute() {
……
}

@Actions( { @Action("/sample/goodmoning"), @Action("/sample/goodnight") })
public String hoge() {
……
}

Resultアノテーションは、アクションクラスやアクションメソッドの遷移先であるJSPをカスタマイズすることができます。複数のResultアノテーションをResultsアノテーションでまとめることで、複数の遷移先を指定することができるようになります。

リスト6は、ResultsアノテーションとResultアノテーションのサンプルです。アクションメソッドの戻り値が「hoge」の場合、hoge.jspが表示されます。

リスト6: ResultsアノテーションとResultアノテーションのサンプル

@Results({@Result(name="hoge", location="hoge.jsp")})
public class HelloAction {
    public String execute() {
        ……
        return "hoge";
        ……
    }
}