Strutsユーザガイド
クイックリンク
ホーム
目次
はじめに
モデル コンポーネント
ビュー コンポーネント
コントローラ コンポーネント
リソース
私たちは誰でしょう
1. はじめに
1.0 必要条件

このユーザガイドは現役のWeb開発者向けに書かれており、 Javaを使ったWebアプリケーションがどのように動作するかを知っていることを、前提としています。 このドキュメントを読む前に、以下のコアテクノロジの基礎について理解しておいて下さい:

他のプラットフォームでWebアプリケーションの作成経験があるならば、恐らく以下の内容は理解できると思いますので、 必要に応じて上記のリファレンスを参照してください。これらは、Javaを使った殆ど全てのWeb開発プロジェクトで必要とされるコアテクノロジです。

1.1 序文:過去に向かって!(Strutsの略歴)

Java Servlet が最初に発明されたとき、多くのプログラマはそれが良い事であることをすぐに悟りました。 Java Servletは標準的なCGIより速く、パワフルで、ポータブルで、無限の拡張性がありました。

しかし、ブラウザに応答を返すためにHTMLに長々とprintln()文を書くことは、やっかい且つ問題を含んでいました。 それに対する答えがJavaServer Pages(Servletを裏返しにしたもの)でした。 それにより、開発者は容易にJavaコードとHTMLを混合し、Servletの長所をすべて持つことができました。 非常に人気がありました。

Java webアプリケーションはすぐに「JSPセントリック(JSP中心)」となりました。 それ自体悪いことではありませんでしたが、フロー制御問題および他のWebアプリケーション固有の問題を解決することは、 ほとんどできませんでした。

明らかに別のモデルが必要でした ...

多くの頭のいい開発者は、Webアプリケーションを配置させるためにJavaServer PageとServletを 一緒に使用することができるかもしれないことを悟りました。Servletはフロー制御を手伝うことができました。 また、JSPはHTMLを書く厄介な作業に注力することができました。 やがて、JSPとServletを一緒に利用する方法は、モデル2(JSPを単独使用するのはモデル1)として知られるようになりました。

もちろん、SUNのもとでは新しいことは何もありません... また、多くの人はJSPモデル2がSmallTalkの古典的な モデル-ビュー-コントローラ デザインパターンに続くことをすぐに指摘しました。 現在では、モデル2とMVCという用語は同じように使われるのが普通です。

Strutsプロジェクトは、Javaコミュニティーに標準MVCフレームワークを提供するため、 Craig R.McClanahanによって2000年5月に開始されました。 2001年7月には、Struts1.0がリリースされました。 私の考えでは、Javaモデル2の開発はこれと全く同じにはならないでしょう。

1.2 モデル-ビュー-コントローラ('MVC')デザインパターン

MVCデザインパターンでは、アプリケーションフローは中央のコントローラによって制御されます。 コントローラはリクエスト(Strus場合はHTTPリクエスト)を、適切なハンドラにを委譲します。 ハンドラはモデルに結びついていて、リクエスト-モデル間のアダプターの役割をします。 モデルはアプリケーションのビジネスロジックや状態を表したりカプセル化します。 その後、制御は通常、コントローラを通って適切なビューへ転送されます。 転送はマッピングの集合(通常データベースまたは構成ファイルからロードされる)を調べることにより決定することができます。 これは、ビューおよびモデルの間の疎結合を提供し、アプリケーションの作成・維持をとても簡単にすることができます。

1.3 Strutsフレームワーク概要

モデル-ビュー-コントローラデザインパターンに忠実に、Strutsアプリケーションは主に3つのコンポーネントを持っています : Servletコントローラ(Strutsによって提供される)、JavaServer Pages("ビュー")、およびアプリケーションのビジネスロジック(あるいは"モデル")。 これら全てがお互いにどのように適合するかたどってみましょう。

コントローラは、JavaServer Pageや開発者によって作られるorg.apache.struts.action.Actionのサブクラスなど、 フレームワーク中の他のオブジェクトに対してHTTPリクエストを束ねて送ります。 初期化された時、コントローラは設定リソースファイルを解析します。 設定リソースは、(色々な事項の中で)アプリケーションに関するorg.apache.struts.action.ActionMappingを定義します。 コントローラはHTTPリクエストをアプリケーションアクションに向けるために、これらのマッピングを使用します。

アクションマッピングは通常以下のように定義されます:

  • リクエストパス (または "URI")、
  • リクエストに従い動作するオブジェクトの型 (アクションのサブクラス) 、
  • 及び、必要となる他のプロパティ

アクションオブジェクトは、クライアント(通常はWebブラウザ)に対するリクエストやレスポンスを処理することができます。 また、どこかへ制御がフォワードをされることを示します。 例えば、ログインが成功した場合、ログインアクションはメインメニューにリクエストをフォワードしようとするでしょう。

アクションオブジェクトはアプリケーションのコントローラサーブレットやサーブレットのメソッドに対するアクセスができます。 アクションオブジェクトが制御をフォワードする場合、JavaBeanなどの共有されるオブジェクトをJavaサーブレットにより共有される標準コレクションの一つに格納することにより、 間接的にフォワードすることが来ます。

アクションオブジェクトはショッピングカートbeanを作成し、 カートにアイテムを加え、セッションコレクションにbeanを置いて、 別のマッピングに制御をフォワードすることができます。 マッピングはユーザのカート内容を表示するためにJSPを使うでしょう。 各クライアントが自分のセッションを持っているので、勿論各々自分のショッピングカートを持つことができるでしょう。 Strutsアプリケーションでは、ほとんどのビジネスロジックはJavaBeansを使用して表すことができます。 アクションはJavaBeanのプロパティを、それらが実際にどのように動作するかを知らなくても呼び出すことが出来ます。 これによりビジネスロジックがカプセル化され、それによりアクションはエラーハンドリングと、制御をどこにフォワードするのかだけに集中できます。

JavaBeansは入力フォームを管理するためにも使用することができます。 Webアプリケーションの設計中の重要な問題は、リクエスト間でユーザが入力したものを保持し検証することです。 Strutsでは、org.apache.struts.action.ActionFormのサブクラスを作ることで簡単にフォームbeanクラスを作ることができます。 そして、入力フォームのデータを簡単に保管することができます。 フォームbeanは、標準(共有コンテキストコレクション)の1つの中に保存され、 それにより他のオブジェクト、特にアクションオブジェクトからも使用することができます。

フォームbeanは、ユーザからのデータを集めるためにJSPによって利用されます... ユーザ入力の検証のためにアクションオブジェクトによって利用されます... そしてフォームフィールドを再設定するために再びJSPによって利用されます。 バリデーションエラーの場合、Strutsにはエラーメッセージを上げて表示するための共有メカニズムがあります。

Strutsのフォームbeanは設定リソースの中で定義され、共有プロパティ名を使用してアクションマッピングとリンクされます。 リクエストがフォームbeanを使うアクションを呼ぶ場合、コントローラServletはフォームbeanを取り出すか、あるいは生成し、 それをアクションオブジェクトへ渡します。 その後、その入力フォームが表示される前に、アクションオブジェクトはフォームbeanの内容をチェックし、 そしてフォームが扱えるようにメッセージをキューすることができます。 準備ができている場合、アクションオブジェクトはその入力フォーム(普通はJSP)に対するフォワーディングを備えた制御を返すことができます。 その後、コントローラはHTTPリクエストに応答することができ、Java Server Pageにクライアントを向けることができます。

Strutsフレームワークは、自動的にフォームbeanの内容をフィールドに設定できるカスタムタグを。 あとフレームワークについて、多くのJavaServe Page が知る必要のある唯一のことは、 適切なフィールド名およびフォームをどこにサブミットするかです。 アクションによってキューされたメッセージのようなコンポーネントは、 単一のカスタムタグを使用して出力することができます。 他のアプリケーション特有のタグも、JSPから実装の詳細を隠すように定義ができます。

Strutsフレームワークにおけるのカスタムタグは、 Javaプラットフォームに組み込まれた国際化機能を使用するように設計されています。 全てのフィールドラベルおよびメッセージはメッセージリソースから取り出すことができます。 また、Javaはクライアントの国および言語に合ったリソースを、自動的に供給することができます。 別の言語にメッセージを供給するためには、単に別のリソースファイルを追加してください。

国際化の観点は別にして、このアプローチへの別の利点は、フォーム間で一貫したラベルを付けられることと、 一箇所からラベルおよびメッセージをすべて調査できることです。

最も単純なアプリケーションでは、アクションオブジェクトがリクエストに関連したビジネスロジックを扱うでしょう。 しかしほとんどの場合、アクションオブジェクトは実際のビジネスロジックを実行するために、別のオブジェクト(普通はJavaBean)を呼び出すべきです。 これは、アクションをビジネスロジックよりも、エラーハンドリングや制御フローに集中させることになります。 他のプラットフォーム上の再利用できるように、ビジネスロジックJavaBeansは如何なるWebアプリケーションオブジェクトも参照すべきではありません。 アクションオブジェクトはHTTPリクエストから必要とされる詳細を解釈して、規則的なJava変数としてそれらをどんどんビジネスロジックbeanへ渡すべきです。

例えば、データベースアプリケーションでは、このようになります:

  • ビジネスロジックBeanはデータベースに接続し参照を行い、
  • ビジネスロジックBeanはアクションに結果を返し、
  • アクションはリクエストのフォームBeanに結果を格納し、
  • JSPが結果をHTMLのフォームに表示する。

アクションもJSPも結果がどこから来るのか、知る必要も(気にする必要も)ありません。 どのようにパッケージされていて、どのようにそれを表示すればよいのか、さえ知っていればよいのです。

このユーザーガイドの残りでは、様々なStrutsコンポーネントについてより詳しく説明します。 Strutsのリリースは、もちろんフレームワークの様々な様相をカバーするいくつかの開発者ガイド、 サンプルアプリケーション、 標準のJavaDoc API、それともちろん完全なソースコードを含んでいます!

StrutsはApache Software Foundation ライセンスの基で配布されます。 コードは著作権保護されていますが、任意のアプリケーションで自由に使用することができます。詳細に関しては、 ASFライセンスをご覧下さい。

1.4 モデル:システムの状態およびビジネスロジックJavaBeans

MVCベースのシステムのモデル 部分は、2つの概念 -- システムの内部状態、およびその状態を変更するために講ずることができるアクション -- に分けることができます。 文法用語を使って言えば、状態情報を名詞(モノ)として、 アクションを動詞(それらのモノの状態変更)として考えられるでしょう。

一般に、アプリケーションは、状態の詳細を表すプロパティを持った1つ以上のJavaBeanの集合として、システムの内部状態を表すでしょう。 アプリケーションの複雑さによって、これらのbeanは自己完結したり(そして、それらの状態情報を何らかの方法で永続的に保存する方法を知っている)、 あるいは、必要に応じて外部ソース(データベースのような)から情報を検索する方法を知っているでしょう。 エンティティ Enterprise JavaBeans(EJB)もまた、内部状態を表すために一般に使用されます。

大規模アプリケーションでは、しばしばビジネスロジックアクションを、 システムにおいて状態情報を維持するbeanに呼ばれるメソッドとして表します。 例えば、あなたはユーザ毎のセッションスコープにショッピングカートbeanを、 ユーザが購入決定したアイテムセットを表すプロパティと一緒に保持しているかもしれません。 このbeanは、ユーザのクレジットカードを承認して、配送のために注文を倉庫へ送るcheckOut()メソッドを持っているかもしれません。 別のシステムは、恐らくセッションEnterprise JavaBeans(セッションEJB)として利用可なアクションを別々に表すでしょう。

一方より小規模なアプリケーションでは、利用可能なアクションがコントローラの役割の一部であるActionクラス内に埋め込まれるかもしれません。 ロジックが非常に単純な場合、あるいは他の環境でのビジネスロジックの再使用を考慮しない場合、これは適切です。 Strutsフレームワークは、これらのアプローチのどれもサポートしますが、Actionクラスが果たす(「何を行うべきであるか決定する」)役割からビジネスロジック(「行うべきもの」)を分けることを強く推薦します。

1.5 ビュー: JSPページおよびプレゼンテーションコンポーネント

一般にStrutsベースのアプリケーションのビュー部分は、 JavaServer Pages(JSP)技術を使用して構築されます。 JSPは「テンプレートテキスト」と呼ばれる静的なHTML(あるいはXML)テキストを含むことができます。 加えて、(ページリクエスト時に)特別なアクションタグの解釈に基づいた動的な内容を挿入する能力を持っています。 JSP環境は <jsp:useBean>のような標準のアクションタグのセットを含んでいます(その目的は JavaServer Pages Specificationに書かれています)。 さらに、標準機能として独自のタグを定義することができます(それらは"カスタムタグライブラリ"としてまとめられます)。

Strutsは、ユーザインターフェースを作成することを容易にする膨大なカスタムタグライブラリを含んでいて、 それらは完全に国際化されています。 そして、システムのモデル部分の一部であるActionFormと素直に相互動作します。 これらのタグの使用は、詳細にその後議論します。

JSPページおよびそれらが含んでいるアクションとカスタムのタグに加えて、 ビジネスオブジェクトがリクエスト時にそれらの現在の状態に基づいて HTML(あるいはXML)でそれら自身を表現できることが、 多くの場合必要になります。 そのようなオブジェクトから与えられた出力は、 標準のアクションタグである<jsp:include>を使って、結果の JSPページに簡単に入れることができます。

1.6 コントローラ:ActionServletとActionMapping

アプリケーションのコントローラ部分は、 クライアント(通常、ユーザはWebブラウザを実行しています)からリクエストを受け取ることに集中し、 どのビジネスロジック機能が実行されるか判断し、 それから、適切なビューコンポーネントへ次のフェーズのユーザインターフェースを生成する責務を委譲します。 Strutsでは、コントローラの主要なコンポーネントはActionServletクラスです。 このServletは、ActionMappingsの集合によって設定されます。 アクションマッピングは、入って来るリクエストのリクエストURIと対応するpathを定義します。 そして、通常Action クラスの完全修飾名を定義します。 全てのアクションはorg.apache.struts.action.Actionを継承しています。 アクションはビジネスロジックをカプセル化し、結果を解釈し、 最終的にレスポンスを作成するために適切なビューコンポーネントに制御を割り当てます。

Strutsは、フレームワークを操作するのに必要な標準以外の追加プロパティを持ったActionMappingクラスの利用をサポートします。 これは、あなたがあなたのアプリケーションに特有の付加的な情報を格納することを可能にしますが、 フレームワークの残りの特徴ももっと利用してください。 加えて、Strutsでは制御が転送されるべき論理的な"名前"を定義します。 それにより、対応するJSPページの実際の名前が何か知らなくても、 アクションのメソッドは(例えば)"Main Menu"ページを尋ねることができます。 これらの機能は、ビューロジック(何が、対応するページの名前であるか)と制御ロジック(何を、次にするか)を分離するのに大いに役立ちます。

Next: モデルコンポーネントの構築


[訳注: これは芦沢 嘉典が翻訳しました。日本語訳に対するコメントがあれば、report@jajakarta.orgに送って下さい。]
Copyright (c) 2000-2002, Apache Software Foundation