フレームワークを利用したWebアプリケーション開発

はじめに
今日のWebアプリケーション開発では、Webサイトの多様化する機能への対応に加え、リリースまでの開発スピードの迅速化が求められるようになってきています。 それに対応するためには、フレームワークを用いた効率のよい開発を行っていく必要があると考えました。
現在私たちチャーリー・ソフトウェアが開発で利用しているフレームワークのSAStrutsの優れた機能を、まずフレームワークとはどのようなものであるか、そしてSAStrutsの基礎となっている代表的なフレームワークのStrutsとの機能比較等も交えながら説明します。

MVCモデル

Webアプリケーションの開発では、MVC構造を用いたプログラミングが主流となっています。MVCとは Model(処理の実行) View(画面表示) Controller(入力を受付け結果によって表示する画面を制御)の構成を表します。
MVCの構造が登場するまでは、動的に画面を生成するWebアプリケーションでは、画面表示のベースとなるhtmlの中に、入力チェック処理、データベー スからのデータ取得など、さまざまなプログラム処理ロジックを埋め込む方法で作成されていました。このような構造では、画面表示デザインの記述部分と処理 ロジックの混在してしまうため、デザインとプログラム処理が密接に関わり合ってしまいます。これは、デザインの作成、プログラムロジックの作成を同時に行 わなければならないという問題、ちょっとしたデザインの修正でも、プログラムへの影響がでてしまうなどの問題が発生してしまうこととなります。
MVCモデルでは、Model 、View、Controllerの各層毎に分離したアプリケーションを開発がおこなえ、デザイン開発者、プログラム開発者が分担して作業をおこなえ、ま た、画面デザイン中に、ビジネスロジックが混在するような、見とおしの悪い構造のプログラムではなくなるので、Webアプリケーション開発において非常に 有効な手法といえます。

そして、このMVCモデルがベースとなり、さまざまなWeb開発フレームワークに取り入れられています。

フレームワークとは

フレームワークとは、開発方法やプログラム構成を標準化した枠組みを用意するとともに、共通機能として利用される処理(入力値取得、入力チェック、データベース管理など)が提供されるものです。
フレームワークを利用することによって、ビジネスロジックには関わらない共通の実装しなければならない処理をフレームワークに任せることができるため、開 発者は、本来実装しなければいけない処理の作りこみに専念できるようになります。また、フレームワークによりきめられた標準的なプログラムの作成が必要と なるため、多くの開発者がかかわる開発などでは開発者ごとのプログラムの作りかたが統一されたものになるので、別の開発者がみても理解しやすい保守性のよ いプログラムの開発が期待できます。
MVCモデルによる、オープンソースのWEBアプリケーションフレームワークとしては、前述のApacheプロジェクトから提供されている、「Struts」があります。

Struts

Strutsは、MVCモデルを用いた、サーブレットコンテナ上で動作するWEBアプリケーションフレームワークです。
リクエストされたURLによって、実行する処理(Actionクラス)を、xmlファイルの定義(struts-config)に従い実行し、Actionクラスの処理結果によって、struts-configに定義された画面ファイル(jspファイル)を表示します。
また、リクエストされた入力パラメータの内容は、struts-configで指定されたActionフォームクラスに自動で設定されアクションFormでは、入力チェック処理などを実行します。

①ActionServletがリクエストを受取り、定義ファイルを参照して実行するActionを決定する。
②Actionフォームに入力値を取込む。また入力チェックをおこなう。
③Actionクラスを実行する。
④ビジネスロジッククラス(データベースからのデータ取得など)を実行し、処理結果を受取りJavaBeansに結果を格納。
⑤ActionServletへ処理結果を返す。
⑥AvtionServletは、受け取った処理結果より定義ファイルを参照し、表示する画面を決定する。
⑦JavaBeansより画面を編集し表示。

<主な特徴>

MVCモデルにのっとった見通しのよいプログラム構造で開発できる。
入力チェック処理(Validator)が用意されており、Actionフォーム毎に設定ファイルへ定義して利用できる。
画面作成にはタグライブラリを利用により、プログラムコードが排除でき、見やすいタグでの記述ができる。

★しかし、Strutsは大規模システムでは、設定ファイルが肥大化し、管理が困難になってくるという問題がありました。

SAStruts

Strutsは、前述のように入力チェックなど用意された処理を利用 しコーディングが楽になるとともに、決められた構造でのコーディングにより、構造がシンプルにできるなど非常に優れたフレームワークであるのですが、設定 ファイルへ記述する情報が非常に多くなってしまい(画面制御と呼出しクラス情報のすべてを記述しなければなないため)、設定ファイルのメンテナンス管理作 業が増えてしまう問題がありました。
また、プログラム修正の反映にはサーブレットコンテナを再起動しなければならないため、開発時のちょっとした修正の確認に手間がかかり非常に不便でもありました。
SAStrusは、Strutsの優れた基本機能はそのまま利用し、Strutsの不便であった部分を補った開発フレームワークとして登場しました。
Strutsで設定ファイルに記述する必要のあった定義は、SAStrutsでは決められた規則に従ったアクションクラスの配置と命名の規則により判断さ れるようになり、画面からの入力値を受け取る変数領域(フォームクラス)の指定は、クラスファイル内に記述したアノテーションという注釈情報によって定義 し、入力値のチェック処理もアノテーションにより定義ができるので、設定ファイルへの記述は必要ありません。
また、SAStrutsでは、 Seaser2(SeaserProcectのDIコンテナ)の機能と連携して動作するのDI(Dependency Injection)によるコンポーネントの自動生成、およびAOP(Aspect Oriented Programing)を利用し、共通処理の挿入を簡単な挿入など、開発効率の向上が望めるフレームワークです。
その他、Strutsで必要で あったプログラム修正時のサーブレットコンテナ再起動はしなくてもよい、HotDeploy機能。そしてs2Jdbcコンポーネント(データベースアクセ スのインターファイス)を利用した、データベース操作が簡単におこなえる機能も利用できるなど、Strus以上の開発効率の向上が望めるフレームワークと なります。

①各フィルタがリクエストを受取り実行前処理を行う。
・s2Filterがs2Containerを初期化する。
・HotDeployFilerがリクエスト毎にクラスを再ロードする。(HotDeploy)
・routingfilterがリクエストURLを変換し、ActionServletを呼び出す。
②ActionServletは、S2RequestProcessorを呼び出す。
③S2RequestProcessorActionは、Actionクラスのアノテーションで指定されたフォームに
入力値を設定する。
④S2RequestProcessorは、URLに対応したActionクラスを実行する。
⑤Actionクラスは、ビジネスロジッククラスを実行し、エンティティクラスJavaBeansに
結果を受取る。
※データベースからのデータ取得は、s2Jdbcコンポーネントを用いエンティティクラス
JavaBeansへ取得する。
⑥Actionクラスは、ActionServletへ表示画面のパスを返す。
⑦AvtionServletは、受け取った処理結果の画面を呼び出す。
⑧JavaBeansなどから、画面を編集し表示。

<主な特徴>

・Strutsで設定ファイルに記述していた内容は、クラスの作成パッケージおよびクラスの命名ルール、そしてクラスのソースコードに記述したアノテーションを使用して取得するため、設定ファイルの記述が必要ない。

※下記、Strutsの設定との比較

1)Action定義

actionパッケージに、 “Action”で終わる名前で作成したクラスが、Actionとして呼び出される。
(呼び出されたURLからのActionクラスまでの変換は、下記参照)

http://localhost/sample/login/   →  sample.action.LoginAction

1.パッケージ名変換 : アプリケーション名(sample)に “.action”をつける。
2.アクション名変換 : login の先頭を大文字(”L”)にし、末尾に “Action” をつける。

2)Actionフォーム定義

fromパッケージに、 “Form”で終わる名前で作成したフォームクラスを作成。
Actionクラスにフォームクラスを定義し、アノテーション(@ActionForm)を指定すれば、Actionフォームとして利用できる。

3)フォームVAlidatonの定義

フォームクラスの、フィールドに、入力チェックのアノテーション(@Required,MaxLength など)を指定することで入力チェック内容を指定できる。