エンタープライズ:特集 2003/10/06 18:00:00 更新


特集:第1回 フレームワーク「Struts」の基礎を知る (4/8)

統括的なフレームワークの必要性

 そこで登場するのが、ユーザーからの入力処理やユーザーへの出力処理をサポートする統合的なフレームワークだ。フレームワークを利用すれば、どのようなWebアプリケーションでも必要となるであろう、定型的な処理をフレームワークが担ってくれる。具体的には、「ユーザーからの入力データの受け取り」、「入力データのエラーチェック」、「ユーザーへのデータの出力」などを統一された方法で扱えるようになる。

 たとえば、サーブレットでクライアントにデータを出力する場合には、doGetメソッド(またはdoPostメソッド)を実装し、PrintWriterオブジェクトのoutメソッドを使い、HTMLタグも含めて出力する処理が必要だ。しかしフレームワークを利用すれば、クライアントへの出力を担ってくれる。開発者はWebアプリケーションごとに固有の処理――たとえば、データベースへの読み書き処理など――をし、クライアントへの出力に埋め込みたい動的な値をメソッドで返す実装だけで済む。つまりフレームワークを使えば、少ないコーディングで、目的のWebアプリケーションを構築できるようになるというわけだ。

ただしフレームワーク利用の問題点もある

 フレームワークには、デメリットもある。まず第一に、フレームワーク自身を学習するために時間を要するという点だ。フレームワークは多機能であるため、JSPやサーブレットのように単純な動作ではない。そのため、使うためにはフレームワークの構造全体の理解、そして提供されるクラスライブラリの使い方を覚える必要がある。

 またフレームワークは万能ではないという点もデメリットとして挙げられる。フレームワークは、汎用的な処理を想定したもののため、何らかの特殊な処理をするアプリケーションでは対応しきれない場合や、無理に利用しようとすると処理が複雑になる可能性がある。

One Point:
フレームワークの種類によって、得手不得手が異なる。この特集では「Struts」を解説するわけだが、常にStrutsを使うことが適切なアプローチであるとはいえない。場合によっては、「Jakarta Turbine」や「OpenSymphory(WebWork)」など、ほかのフレームワークを使ったほうがよい場面もあるのだ。

 さらに重要な点は、フレームワーク自身に不具合があるかもしれないという懸念だ。自分が記述したコードであれば気合いで見直せるが、フレームワーク自体に不具合があるとどうしようもない。そのためフレームワークを使う場合には、普及しており、情報が多いものを採用するのがよいのだ。

 今回取り上げるJakarta Projectの「Struts」は、人気のあるフレームワークであり広く普及している。また、日本語による情報が多いのも好都合だ。Strutsは、オープンソースのフレームワークであるため、不具合があっても、それを修正できるというメリットもある。

Strutsの仕組み

 Strutsの仕組みを見ていくことにしよう。

 Strutsはカスタムタグも含めて提供する統合的なWebアプリケーションのフレームワークである。全体構造は、Fig.4のようになっている。

fig04.gif

Fig.4■Strutsの仕組み


リクエストはActionServletが受け取る

 詳しくはすぐ後に解説するが、Strutsが作用するのは、クライアントからのリクエストのパスとして「http://サーバー名/アプリケーション名/foo.do」や「http://サーバー名/アプリケーション名/bar.do」のように、パス部分が「.do」で終わる場合のみである。

 パス部分が「.do」で終わるURLを受け取ると、ActionServletオブジェクトが動作するのだ。このActionServletは、Strutsに含まれるクラスでありサーブレットコンテナによって実体化される。Strutsでは、すべてのリクエストをActionServletオブジェクト統括的に扱う。

One Point:
web.xmlファイルの定義を変更すれば、パス部分を「.do」ではないものに変更することもできる。

URLのマッピング

 ActionServletは、要求されたURLを調べ、どのクラスを呼び出さなければならないかを判断する。つまり、クライアントが「/foo.do」として呼び出してきたのか、「/bar.do」で呼び出してきたのかなどを調べ、それぞれfoo.doの際の処理、bar.doの場合の処理のように振り分ける。

 この振り分けを定義するのが、struts-config.xmlというStrutsの設定ファイルだ。struts-config.xmlファイルは、WEB-INFディレクトリに配置され、ActionServletによって参照される。また、struts-config.xmlファイルには、あらかじめURLのパスと実体化すべきクラスのマッピング情報を記述しておく。

1. ActionFormサブクラス

 Webアプリケーションに入力フォームがある場合には、struts-config.xmlファイルに定義されているマッピング情報により、ActionFormサブクラスが実体化される。そして、入力フォームに入力されたデータをActionFormサブクラス内に実装されている同名のgetter/setterメソッドを呼び出し、保存および参照をする。

 たとえば入力フォームに「UserName」という項目があれば、ActionFormサブクラスに実装されたsetUserNameメソッドが呼び出される。setUserNameメソッドで値を保存する仕組みを実装すれば、入力フォームに入力された文字列データを保持できるというわけだ。

 ActionFormサブクラスのオブジェクトに保持したデータは、後述のActionサブクラス内での処理やJSPファイルにおいてカスタムタグを用い、値を参照することができる。また、値の参照にはgetXXXメソッド(XXXは埋め込む際に使われる名前)が使われる。

One Point:
ActionFormサブクラスは必須ではない。Strutsの入力フォームのサポート機能を使わない場合には、ActionFormサブクラスなしで動作させることもできる。

2. Actionサブクラス

 ActionServletは、struts-config.xmlファイルで定義されているマッピング情報を使い、Actionサブクラスを実体化、そして限定されるexecuteメソッドを呼び出す。executeメソッドには、Webアプリケーションが行いたい処理を実装しておく。executeメソッドには、前述の「1.」項で実体化されたActionFormサブクラスのオブジェクトが引数として渡される。そのため、executeメソッド内では、入力フォームに入力された文字データを読み取ることができるのだ。

 Actionサブクラスで注意したい点は、インスタンスが1つであり、複数のクライアントが同時に接続した場合にはexecuteメソッドが並行して呼び出される可能性がある点だ。そのため、executeメソッドの実装はスレッドセーフな設計にしなければならない。

出力の決定

 executeメソッドでは、戻り値として、ActionForwardオブジェクトを返すよう実装しておく必要がある。

 詳しくは次回に解説するが、通常はexecuteメソッドに引数として渡されるActionMappingオブジェクトのfindForwardメソッドを呼び出す。その得たActionForwardオブジェクトを返せばよいのだ。findForwardメソッドは、struts-config.xmlファイルの記述から適切なActionForwardオブジェクトを得るためのメソッドだ。

 ActionServletは、戻り値として得たActionForwardオブジェクトを参照し、クライアントにどのJSPファイルを返すべきかを判断する。そして、そのJSPファイルをJSP/サーブレットコンテナに渡す。これにより、JSPファイルの実行結果がクライアントに返される。

One Point:
出力は一般にJSPページだが、JSPファイル以外にすることもできる。たとえば、静的なHTMLファイル、画像ファイルを返すように実装しても問題ない。

 Strutsで用意されているカスタムタグには、ActionFormサブクラスのオブジェクトの参照できるものが用意されている。そのため、前工程のActionサブクラス内のexecuteメソッドで、ActionFormサブクラスのオブジェクトに何らかの値を設定しておき、JSPファイルでカスタムタグを使えばよい。すると、出力結果に値を埋め込むことが可能となるわけだ。

前のページ | 1 2 3 4 5 6 7 8 | 次のページ

[大澤文孝,ITmedia]