Struts!

Revised: 30th/Nov./2002

strut

Struts とはなんだろうか

Struts は、Web アプリケーションのフレームワークです。開発しているのは、Jakarta プロジェクトというところであり、ここは、HTTP サーバで有名な Apache Software Foundation 内のプロジェクトの一つであり、Java 関係のサーバ技術を開発しています。Tomcat というアプリケーション・サーバを開発しているところでもあり、Struts も、Jakarta プロジェクトのサブ・プロジェクトの一つです。Jakarta では、Tomcat 然り、Struts 然り、Turbin 然り、Ant 然り、Alexandria 然り、25個のサブプロジェクトが走っています(2003年1月現在)。

フレームワークとはなんだろうか

Struts フレームワークでは、ウェッブ・アプリケーションとして共通の機能をまとめたパッケージです。アプリケーション開発者は、それらの提供される機能の枠組みの中で、必要な部分だけを開発することになります。一言で言えば、フレームワークとは不完全なアプリケーションのことであり、開発者はそれを完成させることで、一つのアプリケーションを開発することになります。ウェッブ・アプリケーションを開発する度に、何度も同じように必要となるような、"Boring" な作業を減らすための工夫ですね。

これによって、ユーザのコーディング量は格段に減らせるのですが、フレームワークがどのような機能を提供してくれているのかを勉強する必要があります。

Servlet/JSP と MVC モデル

MVC とは何か

Struts は MVC モデルに則っています。そもそも MVC 自体は、ソフトウェアを、データの実体であるモデル、ユーザインタフェースであるビュー、全体の制御を司るコントローラの三つに分割して考えるデザイン・パターンであり、古くからある良く知られた概念です。これは専ら GUI アプリケーションの設計概念で使われており、 Java でも Swing も MVC モデルに則って設計されています。

サーブレット登場

サーバサイドの Java はサーブレットから始まりした。サーブレットは CGI のようなマルチプロセスで起動/終了を繰り返すようなヘビーなものではなく、マルチスレッドでサーバに常駐する形で動作するため、サーバへの負荷低減に貢献し、すぐに広く使われるようになりました。しかし、 HTML の出力で println() を繰り返す面倒で退屈な作業は、ダブル・クオーテーションをバックスラッシュでエスケープする必要がある、 HTML の階層構造が一見して分かりにくいなどのバギーな問題も含んでいました。

JSP 全盛

これに応える形で JSP が登場するや、今度はサーバサイドのアプリケーションは JSP 中心に開発されるようになりました。 JSP は HTML 文書の中に、スクリプトレットという仕組みで Java のコードを挿入することが可能であり、実行時には自動的にサーブレットに変換してくれます。JSP はあたかも JavaScript のようなお手軽感が受けて大いに使われるようになったのです。

JSP の限界

しかし、 JSP にスクリプトレットを埋め込んでコーディングすると、文書の見栄えを変更しにくいという問題が生じます。HTML 側では、描画機能を持つ要素や属性は廃止して、 CSS を使うようになり、 HTML 文書は提示したい文書の意味を要素構造で表現することに専念できるようになっています。一方、複数の要素を間に挟むような、大域的で複雑なスクリプトレットが含まれていると、いざ文書の要素構造を変更したくとも、新規に JSP の設計段階から開発し直す必要も生じてきます。最後の最後に、クライアントから「なんかダサいなー」といわれても、もはや開発しなおすだけの時間も予算も人間も割けない・・・ということも珍しくありません。

アプリケーションに求められる機能要件が複雑化するに従い、 JSP 中心の開発は行き詰ります。現在のコスト/分業体制では、頻繁に更新の必要がある HTML 部分をいちいち変更できるだけの人員を、SEとして調達することは不可能だからです。一方、今まで HTML の更新に当たっていたヴィジュアル・デザイナに、複雑/高度な JSP の HTML 部分だけ選り分けて編集させるのも酷というものです。第一、 JSP は多くの HTML オーサリングツールでは編集できず、HTML のソースコードを編集しなければならないかもしれません。

MVC の必要

そこで、サーバサイドの Java でも MVC モデルを使うようになりました。 MVC はそれぞれ、ビーン、JSP、サーブレットに割り当てます。JSP は限りなく HTML に近づけて、プレゼンテーション・ロジックは特別な要素による呼び出しで実装し、ビジネス・ロジックはサーブレットに丸投げします。ビジネス・ロジック、処理対象のデータへのアクセス、セッションの管理など、個別の機能はビーンで提供し、それらの間で制御の流れを管理するのがサーブレットです。サーブレットは、JSP のフォームから要求を受け取り、必要な機能を持ったビーンを呼び出し、処理結果を JSP に渡します。モデル(ビーン)とビュー(JSP)はコントローラー(サーブレット)を介して独立しているので、モデルの汎用性を高め、ビューの変更が容易になります。

サーバサイド Java の MVC モデルを Model 2 と呼び、 JSP centric の設計と区別することがあります。

MVCモデル
図:MVC モデル

Struts とはなんだろうか

Strutsとは、 Apache Jakarta プロジェクトが開発しているフレームワークです。もう言ったか。では、 Struts とは MVC モデルにのっとったウェブ・アプリケーション用のフレームワークであり、フレームワークとは……。これももう言いいましたね。では MVC モデルとは、 Model-View-Control の概念に……。これも言いました。要するに、 Struts とは、 MVC モデルに則ったウェッブ・アプリケーションなのです。

Struts のサイトでは、Struts が従うオープン・ソース・ライセンスである Apache Software License、利用上のドキュメントが公開されています。

Struts の概要

既に聞き飽きているとおり、 Struts は MVC モデルに基づいたフレームワークです。ウェッブ・アプリケーションで必要な MVC の骨格が提供されています。

モデル層では、フォームデータを格納するフォーム・ビーンを提供、ビュー層ではタグ・ライブラリを提供、コントロール層ではアクション・クラス、アクション・マッピングを提供しています。特に、アクション・マッピングではコンフィギュレーション・ファイル (struts-config.xml) を使って、 Java のオブジェクト・モジュールから分離しているので、柔軟な実装が可能となっています。

実は、Struts で提供されているクラス群が厳密に MVC に適合しているかというと、そうでもありません。開発者の設計思想に応じて、特定のモジュールに M の仕事をさせたり、 C の仕事をさせたりということが発生します。しかし、全体として MVC モデルに従っていることは間違いないことであり、重要なことは、アプリケーションの規模や特性に応じて、一貫した設計思想に基づき、 Struts を利用することにあります。

Struts コンポーネント

ここでは Struts で提供される代表的なコンポーネント紹介します。

ActionServlt

クライアントは JSP のフォームなどのインタフェースを通して要求を投げてきます。この要求を最初に受け取るのがアクション・サーブレットです。アクション・サーブレットは適切なビジネス・ロジックを呼び出し、応答を JSP に投げてクライアントに応答します。

ActionMapping

アクション・サーブレットは、アクション・マッピング [org.apache.struts.action.ActionMappings] にしたがって、要求に特定のモジュールをディスパッチします。アクション・マッピングは要求された URL パターンに対して、クラスの完全限定名をマッピングしており、ビジネスロジックをカプセル化したアクション・クラス [org.apache.struts.action.Action] へのマッピングと、応答の JSP へのマッピングを行います。アクション・マッピングを介して、ビューとコントローラは独立性を保つことができます。

Action

Action サブクラスのオブジェクトは、要求/応答をハンドリングし、コントローラにディスパッチの情報を指示します。制御の受け渡し先はアクション・マッピングから受け取るのですが、アクション・サーブレットはアクション・オブジェクトを介してアクション・マッピングから独立しており、遷移情報の変更に対して、アクションサーブレットの耐性を高めることができます。

アクション・オブジェクトは要求/応答をハンドリングするため、そのメソッド perform() でビーンを呼び出して処理を委譲しますが、ビジネス・ロジックを直に書き込むことも可能です。しかし、アクション・オブジェクトを使う目的が、実装を論理名でラッピングすることにあるので、よほど小規模でない限りは、アクション・オブジェクト内でのビジネス・ロジックのコーディングは避けたほうが賢明です。

ActionForm

ActionForm [org.apache.struts.action.ActionForm] サブクラスは要求の保持と妥当性検証を司ります。自動的にコンテキスト・コレクションに格納されるため、ユーザ要求が当該アプリケーションを通してグローバルに利用可能になります。従って、妥当性検証時にも一貫したエラー制御を提供できます。

ActionFormBean

ActionFormBean [org.apache.struts.action.ActionFormBeans] は Struts コンフィギュレーションファイルの form-bean 要素から呼び出し、実行時に ActionForm オブジェクトを生成します。

MessageResources

Struts ではメッセージのローカライズの思想に基づき、 message recource アプローチをとっています。これは、フィールドのラベルやメッセージを MessageRecources [org.apache.struts.util.MessageResources .MessageResources] から取得するもので、メッセージやラベルを一元管理する仕組みを提供します。例えば、別言語を追加するときには、対応するメッセージ・リソース・ファイルを一つ追加すれば、Java のリソースバンドルを利用してロケールに応じた言語で出力されるようになります。

本稿では、ごく簡単なアプリケーションの実装を通して、Struts をいかに動作させるのかを紹介します



Copyright © 2002 SUGAI, Manabu. All Rights Reserved.