Jakartaプロジェクトにおいて、サーブレットコンテナであるTomcatと双へきを成すのが、MVCフレームワークのStrutsです。Strutsを利用することにより、Webアプリケーションを簡単にMVCモデルで開発できるようになります。本稿ではStrutsを利用するメリットとその仕組み、ほかのアプリケーションとの連携、そして、無償で利用できる(残念ながらオープンソースではありませんが)Strutsの統合開発環境「Exadel Struts Studio Community Edition」を用いたグラフィカルなWebアプリケーションの開発について紹介します。
本稿でのStrutsの解説は概要となりますが、Strutsについてより詳しく知りたい場合は、「Jakartaプロジェクト カンタンStruts」「Javaオープンソース徹底攻略」を参考にしてください。
さて、Strutsの解説を行う前に、まず、MVCモデルに従わない開発の問題点を見てみましょう。MVCモデルを用いない開発は、JSP Model1と呼ばれており、このJSP Model1による開発は、JSPの中にビジネスロジックを埋め込み、ページの遷移先をJSP自身に記述します。この方法でのシステム構成を図示すると図1のようになります。
図1 JSPによる開発
ページの遷移と、ビジネスロジックを1つのページに記述しています。このモデルでは、次のような問題があります。
- ビジネスロジックが画面のコードと混在しているため、ビジネスロジックの内容を確認するために、画面のコード(JSP)を読む必要がある
- ページ遷移が複雑になったときに、ページ遷移状況の確認が難しくなる(各ページのコードを順番に追う必要があるため)
ところで、JSPには、タグライブラリと呼ばれる機能が用意されています。このタグライブラリとJavaBeansを組み合わせてビジネスロジックを記述すると、JSPにビジネスロジックを記述する必要がなくなります。タグライブラリのタグを挿入するだけでよくなるため、1.の問題は解消されますが、どのロジックが実行されているかを知るには、やはりJSPの中身を確認する必要があります。また、2.はいかなる方法でも解決できません。
比較的小規模のシステムの場合であれば、この方法でうまく設計/実装することができます。ただし、ページ数が増えると図1はクモの巣のような構造になってしまい、ページ遷移を確認するのは困難になります。
これに対してMVCモデルをWebアプリケーションに最適化したMVC Model2を適用した開発スタイルは、JSP Model2と呼ばれています。StrutsをベースとしたMVCモデルに移行すると、開発者が意識するコードは図2に示すように各ファイルの役割がすっきりします。
図2 Strutsによる開発
ページの遷移情報はStrutsの設定ファイルであるstruts-config.xmlに集約され、ビジネスロジックと画面が明確に分離できます。
StrutsはWebアプリケーションを開発するための以下のエッセンスを提供していますので、簡単にWebアプリケーションを開発できるようになります。それと同時に複雑な構成を持ったWebアプリケーションの作成を防ぐことができます。
- 画面
JSPもしくはVelocityのテンプレートが利用できます。最も普及しているJSPを利用する場合は、ビジネスロジックの実行結果を表示するために、タグライブラリを利用します。また、Velocityの場合は、Velocity Toolsを利用します。
- 画面遷移情報
各画面のフォームがsubmitされたときに実行するビジネスロジック、ビジネスロジックの実行結果、どのページに遷移するかといった、画面遷移情報をstruts-config.xmlに記述します。
- ビジネスロジック実行
ビジネスロジックをJavaBeansやEJBなどを利用して提供し、アクションクラスでは、ビジネスロジックの実行するBeanの呼び出しと、ビジネスロジックの実行結果から次に遷移する画面を決定するコードのみを埋め込み、コントローラとして実装した方が、設計上、コントローラとモデルを明確に分けることができるのでよいでしょう。
- 入出力情報
フォーム情報/ビジネスロジックの実行結果はフォームBeanを利用してやりとりされます。フォームBeanは、通常アクションクラスとペアになっています。このフォームBeanは、Struts 1.0まではユーザーがクラスを作成する必要がありましたが、Struts 1.1からはDynaFormBean(入力値の妥当性検証なし)やDynaValidatorForm(入力値の妥当性検証あり)が提供されているため、struts-config.xmlで、プロパティ情報を定義すれば、ユーザーがフォームBeanを作成する必要がなくなりました。
- 入力値の検証情報
Strutsでは、ユーザーがフォームに入力した値を検証するValidatorを利用すると簡単に入力値のチェックを行うことができます。struts-config.xmlに必要な設定を行い、郵便番号、メールアドレス、数字などに対する検証情報を定義したvalidator-rule.xmlと、Webフォーム(フォームBean)のどのフィールドを検証するか設定したvalidation.xmlを用意することで、Validatorを利用できます。
- アプリケーションリソース
メッセージやエラーメッセージをアプリケーションリソースとして定義します。Validatorによる入力値の検証を行う場合は、エラーメッセージをアプリケーションリソースで定義する必要があります。
COLUMN
StrutsでVelocityを使う
最近リリースされたVelocity-Toolsを利用すると、より直感的なテンプレートエンジンであるVelocityを利用することもできます。これまで国内でVelocityが利用される機会は少なかったのですが、日本におけるサーブレットの第一人者である原田洋子氏の活動もあり、普及の兆しを見せています。最近、Ja-JakartaプロジェクトでもVelocityの翻訳プロジェクトのコミッタが増員されたので、今後の展望に期待したいところです。
Webアプリケーションの開発には、MVCモデルの要素だけでなく、ユーザー認証などのさまざまな機能が必要となってきます。ここでは、Strutsを利用する場合に必要な機能、あると便利なアプリケーションを紹介します。
- ユーザー認証
Strutsの機能を利用して、ログイン画面を作成することができます。作成のためのサンプルも用意されています。認証の機能については、アプリケーションサーバの機能であるJAASやレルム機能を利用する方法もあります。JAASやレルムを利用すれば、BASIC認証やFORMベース認証などの認証方法の選択、データベース、LDAP、ファイルなど、ユーザー認証情報の保存先の選択、コードレスの認証などの利点があります。可能であればこちらを利用するのがよいでしょう。
- 暗号化
クレジットカードの番号を扱うショッピングサイトなどではメッセージを暗号化していますが、暗号化のためにApacheとApacheをSSL(TLS)対応にするmod_sslモジュールを組み合わせたり、アプリケーションサーバのSSL機能を利用します。ハードウェアSSLアクセラレータを利用することもあるでしょう。
- データベースとの連携
データベースとの連携は、JDBCを利用して行うこともできますが、最近では、CMPやO/Rマッピングツールを用いることが多くなっています。データベースのテーブルとJavaオブジェクトを透過的にマッピングし、JDBCを利用したコードを記述することなくJavaオブジェクトを簡単にデータベースにWrite/Readできる点がメリットです。CMPとO/Rマッピングツールを比較すると、CMPの方が永続化フィールドごとにトランザクションやセキュリティを細かく制御できるメリットがありますが、最近では、CMPはパフォーマンスが悪い、フィールドごとの細かいトランザクション制御が必要な局面が少ないなどの理由で、Torque、Hibernate、JDOなどのO/Rマッピングツールに注目が集まっています。
- トランザクション制御
データベースを利用する場合は、一連の処理をトランザクションで実行する必要があります。JDBCを直接利用する場合は、データベースを読み書きするコネクションをうまくトランザクションの中で使う必要があります。また、EJBを利用する場合はSessionBeanで、Facadeパターンを用いてトランザクション区間の処理をラッピングしてもよいでしょう。JDBCを直接利用する場合や、JavaオブジェクトとRDBMSのテーブルをマッピングするO/Rマッピングを利用する場合などは、JTAを利用します。J2EEアプリケーションサーバを利用する場合は、JTAの機能を提供しているので、簡単にJTAを利用できますが、Tomcatを用いる場合は、オープンソースのJTM実装であるJOTM/Tyrexなどを利用することになります。これらを使えば簡単にトランザクション区間を設定できます。