The Apache Project

Struts はどのように動くのか?

Struts はどのように動くのか?

JavaサーブレットはWebブラウザが送信するリクエストを扱うようにデザインされています。 JSP(Java ServerPages)は動的なWebページを生成するようにデザインされており、 そのページは変化のないサイトを変化のあるアプリケーションに変えます。 StrutsはWebブラウザからのリクエストを適切なServerPageに中継する交換台として、 特別なサーブレットを使用します。 これがWebアプリケーションの設計、構築、管理を非常に容易にしてくれます。

Strutsのメカニズムと依存関係について詳しく説明します。

  • Webアプリケーションを開発する場合、デプロイメント記述子 (WEB-INF/web.xml) を必ず作成しなければなりません。 このファイルには開発するWebアプリケーションの設定が記述されています。 設定としては、ウェルカムページ(リクエストでファイル名が指定されない場合にディレクトリ上に表示されるファイル)、 サーブレット(パスや拡張子名)へのマッピング、それらのサーブレットへのパラメータなどがあります。
    このファイルで、指定したマッピング(通常、.doという拡張子) への全てのリクエストを扱うサーブレットとして、Strutsの ActionServlet を設定します。これが上に述べた「交換台」です。
    同じファイルで、Struts内部で1つまたは複数の設定ファイルを使うように ActionServlet を設定します。
    このページの説明では、Webアプリケーションをサーバの/myappにインストールし、 そこから可能な限り最も単純な設定を使用していると仮定しています。
    デプロイメント記述子の詳細を知る必要がありましたら、 Sun MicrosystemsのJava サイトに サーブレット仕様がありますのでそちらをご利用下さい。
  • (1つまたは複数の)Struts設定ファイルで、アプリケーションのコントローラコンポーネントにパスを関連づけます。 このコンポーネントは Action クラスとして知られています(例: "login" ==> LoginAction クラス)。 この方法で、届いたリクエストがhttp://myhost/myapp/login.doの時にコントローラコンポーネントである LoginActionを呼び出すように、StrutsのActionServletに伝えるのです。
    このURLの中の.do拡張子に注意してください。この拡張子をつけると、 あなたの使用しているコンテナ(例: Tomcat)はActionServletを呼び出します。 ActionServletは"login"という単語をあなたの行いたいことと見なします。 この設定を参照し、LoginActionを実行します。
  • Strutsでは、Actionごとにアクションの結果として表示されるページの名前も設定します。 アクションの結果として複数のビューが出力されるはずです(たいていの場合、少なくとも2つあります。 一つは成功した場合、もう一つは失敗した場合です)。
    Action(あなたが作成したコントローラコンポーネント)はこれらの論理的な 結果マッピング名がベースになっています。"success", "failure", "ready", "ok", "UserIsIncompetent" などの単語を使ってActionServletに報告を返します。 Strutsシステムは(あなたが書いた設定を通して)適切な特定のページへどのようにフォワードするかを理解しています。 この方法には、XML設定ファイルを編集するだけでビュー層の再設定ができるという利点もあります。 この時点で、Strutsはどのようにコントローラコンポーネントへ委譲するか、 コントローラの処理結果として何を表示するかを理解しています。 アプリケーションの「モデル」部分は完全にあなた次第で、コントローラコンポーネント内から呼び出されます。
  • Struts設定ファイル内のアクション(またはアクションの集合)とJava Beanを関連づけることも出来ます。 このJava Beanは、ビューとコントローラ層の間でやり取り可能な、 フォームや表示データのリポジトリとして使用されます。
    これらのBeanは (LoginActionのような) コントローラコンポーネントや、 コントローラに関連したビューページから自動的に見えるようになっています。
    ユーザがフォームに正しいデータを入力する手助けとなるよう、 Strutsシステムを使ってこれらのBeanを検証することも出来ます。 Beanと一緒にセッション情報を送れるので、ビューの複数ページ、 コントローラの複数Actionに渡ってフォームを使うことができます。
    : このデータを(クライアント向かう)ビュー層で見るためには、 何らかの種類のサーバサイド技術(JSP, Velocity, XSLT)を利用しなくてはいけません (普通のHTMLではダメです)。 Strutsはサーバ側で動作するため、クライアントのビューはサーバ側で作成しなければなりません。 通常フォームが発行する(POST/GET)メソッドを通してクライアントはデータを送り返し、 Strutsシステムはそのデータをコントローラコンポーネントを呼び出す前にBeanに書き込みます。
  • Webアプリケーション内でユーザが見るビューに相当するのがページです。 JSPページやVelocityテンプレート、XSLTページなどが使えます。 JSPタグのセットはStruts配布に含まれているのですぐに使えますが、 標準のプレゼンテーション技術ならどれでもStrutsで使えます。
    Strutsアプリケーションでは普通のHTMLファイルも使えますが、 その場合はすべての動的機能の利点をまったく生かせません。
    StrutsのJSPタグライブラリのサンプルの他にも、 好きなプレゼンテーション技術と組み合わせてこのフレームワークを使いやすくするパッケージがいくつもあります。 Velocityテンプレートについては、Struts用のVelocityビューツールがあります。 アプリケーションでXSLTを使用したいのなら、stxxStrutsCXのどちらかを選ぶことができます。
    これらのパッケージはStrutsフレームワークの標準要素のルックアンドフィールを、 元のプレゼンテーション技術のシームレスな一部分のようにすることができます。 また、Strutsは他の技術と組み合わせやすくなっています。必要であれば、 JSPやVelocityテンプレート、XSLTを同じ一つのアプリケーションでまとめて使うことができるのです。
    Strutsは標準サーブレット技術に準拠しているので、どんなJavaプレゼンテーション技術でも組み合わせて使えるはずです。
  • Strutsフレームワークはコントローラに焦点を合わせていますが、 プレゼンテーション層はどんなアプリケーションでも重要な役割を占めています。 StrutsのJSPタグライブラリには、作成するビューで動的なデータが使いやすくなるように、 汎用のタグやStruts固有のタグをたくさん盛り込んでいます。
    このカスタムJSPタグはStrutsコードベースのかなりの割合を占めています。 ご参考までに、バージョン1.1b3時点で、StrutsコアのJavaコードが約28,000行なのに対し、 (Tilesを含む)タグライブラリのJavaコードは約41,000行です。
    これらのタグは、JSPにたくさんのJavaコードを埋め込まずに、 ビュー層とコントローラ層をくっつけるのに役立ちます。これによってページはXMLみたいになり、 通常のJSPよりもWebデザイナが扱いやすくすることが可能です。 また、コントローラとビューとの間の依存性を最小限にするのに役立ちます。
    このカスタムタグは、フォーム生成(そして上述の、見えないところでのBeanとのやり取り)、 他のページへの論理フォワード、そしてWebアプリケーションの他のアクションの起動で使用します。
    また、国際化やエラーメッセージなどに役立つタグもあります。
    これらの機能はすべて、あなたがStrutsで用意する設定ファイルに何らかの形で依存します。

重要なこととして、ここで説明したメカニズムは ActionServlet がリクエストを扱う場合のみ有効であることを覚えておいてください。

このメカニズムが動作するのは、リクエスト発行によってコンテナ(例: Tomcat, WebSphereなど) がActionServletを呼びだす場合だけなので、 Strutsに依存したページがActionServletにマップされたリクエスト (例: .do 拡張子を持つもの) を通して処理されているか確認しなくてはいけません。