Struts 2のアーキテクチャ

それでは、Struts 2の解説に入りましょう。まずは、アーキテクチャの概要です。

Struts 2が準拠する仕様

Struts 2が準拠している各仕様は以下のとおりです。

  • JavaSE 5.0
  • Servlet API 2.4
  • JSP API 2.0

各仕様とも最新の仕様ではありませんが、動作させるアプリケーションサーバ(または、Webコンテナ)が上記仕様に対応しているかを確認してください。Tomcatで動作させる場合には、バージョン5.5以上を利用すれば問題ありません。

Struts 2アプリケーションの構成

Struts 2は、多くのWebアプリケーションフレームワークと同様に、MVCモデル2アーキテクチャパターンを採用しています。ただし、コントローラ部はサーブレットではなく、Dispatcher Filterと呼ばれるサーブレットフィルタとして提供されています。この、Dispatcher Filterがアプリケーションに対する全てのHTTPリクエストを受け取り、各種設定に沿った制御を実施することによって、リクエスト処理が実行されるようにアーキテクチャが設計されています。

Struts 2アプリケーションの動作概要を図1に示します。

図1: Struts 2の動作概要

Struts 2では下記のようなリソースによってアプリケーションが構成されます(上図と併せてご覧ください)。

  • ディスパッチャフィルタ(Dispatcher Filter): リクエストを受け取りアプリケーション全体を制御するコントローラで、Struts 2が提供しています

  • インターセプタ(Interceptor): インターセプタはHTTPリクエストの処理を実際に行います。インターセプタはリクエストパラメータ処理、例外処理などの単位でStruts 2が複数用意しており、これを順に実行することでStruts 2はリクエストの処理を実施していきます。実行順序やインターセプタの管理はStruts 2が実施するため、通常はアプリケーション側ではその存在を意識する必要はありません

  • アクション(Action): アクションはリクエストURLに対応してアプリケーションが用意するクラスで、リクエストパラメータの保存と業務ロジック(アプリケーションとしてのリクエスト処理)を担当します。オブジェクトの生成はStruts 2が必要に応じて自動的に実施します。アクションを実装するクラスは、特別なクラスの継承やインタフェースの実装を必要としません。すなわち、POJO(Plain Old Java Objects)として作成する事が可能です。また、アクションのオブジェクトはリクエスト毎に生成されるため、スレッドセーフで作成する必要もありません

  • JSP: Struts 2は標準の設定では、結果ページを生成するためにJSPを採用しています

  • Custom Tag: JSPの作成を助ける、様々なカスタムタグを提供しています。JSPではこのカスタムタグを利用してHTMLの生成やアプリケーションデータへのアクセスなどを行います

Struts 2アプリケーションの動作概要

では、前掲の図を用いて、各リソースがHTTPリクエストを受信してから、HTTPレスポンスを返すまでにどうのように振舞うかを順に説明しましょう。図中の丸数字で行っている処理は、以下のとおりです。

  • (1)リクエストの受信: ブラウザより送信された全てのHTPPリクエストはStruts 2が提供するDispatcher Filterがうけとります

  • (2)リクエスト処理: Dispatcher FilterがInterceptor群を呼び出します。定義に従って様々なInterceptorが順に実行されます

  • (3)リクエストパラメータの伝播: リクエストパラメータをアクションにセットするInterceptorによって、リクエストパラメータがアクションに伝播されます。アクションにはリクエストパラメータに対応する属性とそのセッタメソッドを定義しておきます

  • (4)業務ロジックの実行: アクションを実行するインターセプタによって、Webブラウザで発生したイベント(サブミットボタンやハイパーリンクのクリック)に対応したアクションのメソッドが呼び出されます。標準ではexecuteという名前のメソッドです。業務ロジックの処理結果(検索結果など)は、アクション自身の属性として保持しておきます

  • (5)次の処理を指定: アクションでの業務ロジック処理が終了した場合、その次に実施する処理を指定し、戻り値としてインターセプタへ返します

  • (6)次の処理の実行: アクションから指定された次の処理を実行します。図はレスポンスを生成するためにJSPの実行を指定している例です。JSPの実行以外にも、別のアクションを実行したり、リダイレクトレスポンスを生成させたりする事ができます

  • (7)業務ロジックの結果参照: (5)でアクションが保持している業務ロジックの結果データを、Struts 2が提供しているカスタムタグを利用して参照します

  • (8)HTTPレスポンスの返却: JSPによって生成されたHTMLがWebブラウザへ返されます

以上のような手順でリクエスト処理が終了します。リクエストURLとアクションの対応はXML形式の設定ファイルで指定します。この辺りは、他の多くのWebアプリケーションフレームワークと同じです。しかし、アクションがデータと処理を1つのクラスで扱うようになっており、オブジェクト指向的に設計できる点が、最近の設計思想と言えるでしょう。さらに、今回は紹介出来ませんが、命名規則やアノテーションによって各種設定ファイルの記述を極端に省略する事も可能となっています。