ここまでで、Struts 2アプリケーションの動作イメージは理解してもらえたでしょうか。以降では、アプリケーションの作り方を実コードを交えながら説明を行い、より一層理解を深めていただこうと思います。今回紹介するサンプルアプリケーションは、ログインをするだけの簡単なサンプルです。

サンプルアプリケーション作成の準備

なにはともあれ、まずは環境を準備する必要があります。Struts 2アプリケーションはJava EEのWebアプリケーションとして動作するので、アプリケーションのディレクトリ構造は必然的に下記のようになります。

WEB-INF/libディレクトリ内には Struts 2 アプリケーションが動作するために最低限必要となる下記のJARファイルを配置する必要があります。

  • commons-logging-1.0.4.jar
  • freemarker-2.3.8.jar
  • ognl-2.6.11.jar
  • struts2-core-2.0.9.jar
  • xwork2.0.4.jar

これらファイルは Strut2のサンプルアプリケーション struts-blank アプリケーション内のものを利用するのが簡単です。

Webデプロイメントディスクリプタの定義

まずはStruts 2アプリケーション全体の設定を行うWebデプロイメントディスクリプタファイル(WEB-INF/web.xml)を作成します。とはいえ、このファイルは下記のように非常に簡単な定義を行うのみです。

リスト1: web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts2 Test01</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

<filter>要素と<filter-mapping>要素によってStruts 2のコントローラであるFilterDispatcherが全てのリクエストに対して定義されているのがおわかり頂けると思います。あとは、<welcome-file-list>要素にてアプリケーションの最初の1ページを表示するための定義していますが、このファイルの中身は後ほど紹介します。

コントローラへの動作定義

続いて、コントローラに対するアプリケーションの動作の定義ファイル(struts.xml)を作成します。このファイルは、リクエストURLとアクションクラスの対応や、アクションの実行結果に対応した次の処理(ページの生成や、アクション実行など)の定義などを記述するファイルで、Struts 2アプリケーションの中核をなすものです。Struts 2では、各ファイルの命名規約やアノテーションによってこのファイルの記述を大幅に省略する事も可能ですが、まずは省略せずに全てを記述する方法を紹介します。

まずは、1リクエストURLに対応したアクション(Login)を用意し、このアクションが実行された後に対応するページ(Login.jsp)を表示する定義をします。この定義は下記のようになります。

リスト2: struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="example" namespace="/example" extends="struts-default">

        <action name="Top" class="example.Top">
            <result name="success" >/example/Top.jsp</result>
        </action>

    </package>

</struts>

このファイルはクラスパスの先頭(頂上)にstruts.xmlという名前で配置しておけば、Struts 2が自動的に読み込むようになっています。定義は、XMLのドキュメントタイプ定義に続いて<struts>要素内にアプリケーションの動作定義、すなわちアクションを定義します。全てのアクションは<package>要素内にネストして指定します。

パッケージ(<package>要素)の説明をする前にアクションの定義をみてみましょう。アクションは<action>要素にて定義します。要素のname属性にはこのアクションの名前、class属性にはこのアクションが呼ばれた際に実行するクラス(アクションクラスと本稿では呼びます)を指定します。例ではTopという名前のアクションをexample.Topクラスが実装している事を示しています。この定義によって、WebブラウザからアクションTopに対するHTTPリクエストが送られてきた場合に、この定義が実行される事になります。この時のURLは.../Top.actionとなります。...はホスト名やアプリケーション名などで、http://host1/test01/Top.actionなどとなります。サフィックスの.actionはStruts 2がアクションに対するリクエストである事を検出するための記述です。

<action>要素内には、アクションの実行結果によって次に実行すべき処理を定義します。これは<result>要素にて<action>要素にネストさせて定義します。要素にはname属性にてアクションの実行結果の状態を示す文字列(本稿ではoutcomeと呼びます)を定義します。例では、アクションが文字列"success"を返した場合に/example/Top.jspを実行するように定義しています。実行結果によって異なるページを表示する場合は<result>要素を複数定義すればよいのですが、この方法は後ほど紹介します。ちなみに、name属性がsuccessの場合はname属性の定義を省略する事が可能です。

このようにしてstruts.xmlファイルにアクションを定義していく訳ですが、Struts 2では、パッケージという概念で複数のアクションをグルーピングして管理する事ができるようになっています。この定義を行うための要素が、先ほど説明を後回しにした<package>です。

パッケージにはユニークな名前とアクションに付加するURLのパスが指定できます。例ではexampleという名前のパッケージを定義しています。さらに、このパッケージ内に定義するアクションは全て/exampleというパスが付与されたURLに対応するよう定義しているので、実際には.../アプリケーション名/example/Top.actionというリクエストに対応したアクションを例では定義している事になります。<package>要素のname属性は必須ですが、それ以外の要素は省略可能です。extends属性に指定している"struts-default"は、このパッケージの処理はStrutsの標準の処理を実施する事を示しており、リクエスト処理を変更したい場合に異なる値を定義することになりますが、通常はこのままの定義となります。