Struts 1のチュートリアル 2
すべての不具合の表示(defects.jsp)
ユーザーは、不具合を追加、編集、または削除できます。たとえば、ユーザーがレコードを編集する場合、ハンドラはまずHTTPServletRequestからIDを取得し、それをActionのexecuteメソッドにパラメータとして渡します。executeメソッドは、次に、ビジネス層内のメソッドを呼び出して不具合を取得し、それをデータが読み込まれる編集フォームに転送します。新しい不具合を追加する場合は、空白のフォームが表示されます。
ユーザーが自分で入力した不具合を解決することはあり得ないため、追加フォームにはフィールドのサブセットのみが表示されます。
新しい不具合に関する情報の入力(addDefect.jsp)
不具合の更新(editDefect.jsp)
Struts 1では、入力文字列の変換が常に適切に行われるとは限らないため、場合によっては、開発者がフォームデータを変換し、それをドメインオブジェクトに渡す必要があります。
DateConverterクラスは、日付フィールドに対してこの処理を行います。追加、編集、または削除が正しく行われると、ユーザーはリストに再び戻ります。最初のActionであるDefectsListは、そのexecuteメソッドを自動的に呼び出しました。executeメソッドで事足りる場合も多いのですが、関連するアクションを開発者が1つのActionオブジェクトにまとめることができるように、Struts 1にはDispatchActionクラスが用意されています。DispatchActionでは、methodという要求パラメータを使用して、呼び出すメソッドをStruts Actionに指示します。したがって、executeに代わって、add、edit、deleteなどのメソッドを定義して、各種類の要求を処理できます。
DispatchActionを使用するには、アプリケーションのActionオブジェクトでActionではなくDispatchActionを拡張し、呼び出すメソッドを識別するフォームパラメータを定義する必要があります。DefectsActionから不具合を削除するメソッドを次に示します。
DefectsActionのdeleteメソッド
public ActionForward delete( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { long id = Long.parseLong(request.getParameter("id")); //Invoke business layer to delete the object using the id... return mapping.findForward("list"); }
Struts 1開発者は、Apache Commons Validatorフレームワークを使用してデータを検証できます。検証を有効にするには、「struts-config.xml」ファイルにValidatorプラグインを登録し、ActionFormsがActionFormではなくValidatorFormを拡張する必要があります。
検証ルールは「validation.xml」ファイルで宣言できます。たとえば、不具合の説明が必須であることが「validation.xml」ファイルで宣言されているものとします。その場合、レコードを保存する前に、Actionによってvalidateメソッドが呼び出されます。ユーザーが説明を入力していなかった場合は、Struts ActionErrorsコレクションが読み込まれ、その内容が<html:errors/>タグによってビューページに表示されます。
<form name="actionForm"> <field property="defect.description" depends="required"> <arg0 key="defects.description"/> </field> </form>
保存時のフォームの検証
ActionMessages errors = form.validate(mapping, request);
if (!errors.isEmpty()) {
saveErrors(request, errors);
「addDefect.jsp」に表示される検証エラーメッセージ
Struts 1バージョンのdefect-trackerに関する説明も、終わりに近づいてきました。Struts 1の復習だと思って読んでいただければ幸いです。しかし、これまでに作成してきたアプリケーションは、このままでは実際に動作しません。StrutsはWebフレームワークを提供しますが、ビジネスロジックを実装したり、データをデータベースに保存するアプリケーション部分については役立ちません。
ビジネスロジックは、EJB(Enterprise JavaBean)で実装される個別のビジネス層か、Strutsの概念を持たないプレーンなJavaクラスにまとめるのが最適です。ビジネス層ロジックを編成するのに適したフレームワークとして評判が良いのが、Springフレームワークです。Springは、フレームワークに不慣れな人でも利用できる依存性注入タイプのフレームワークです。Springでは、Javaクラスとその依存関係を構成ファイルで宣言しておくと、実行時に依存オブジェクトを手動で取得しなくても、自動的に注入されます。さらに、Springには多くの便利な機能が用意されており、さまざまなJavaフレームワークおよびツールセットとの統合も可能です。
defect-trackerの場合、私は主に2つの理由でSpringフレームワークを選択しました。第一に、Springは非常に一般的であり、Strutsとの統合性に優れています。多くのStruts 1アプリケーションでも、既にSpringが使用されています。第二に、詳しくは後述しますが、Struts 2ではSpringとの統合性がさらに強まり、Strutsとの間での引数の処理も向上しています。
Spring開発者はかなりの割合でStrutsを使用するため、SpringにはStruts 1との連携のためのクラスが用意されています。Strutsを使用するには2つの方法があり、1つはSpringのContextLoaderPluginを使用して注入を管理するという方法で、もう1つはSpringのActionSupportクラスを使用してSpringのアプリケーションコンテキストを取得するという方法です。どちらの方法もごく簡単に実装できます。
本稿のテーマはStrutsであるため、アプリケーションのビジネス層とデータ層については簡単に触れるにとどめますが、今回のアプリケーションではこの2つの層にSpringを使用し、永続化についてはHibernateフレームワークを利用しました。Springとdefect-trackerアプリケーションを連携させるための手順を、以下に簡単に示します。
最初に、「web.xml」ファイル内でSpring構成ファイルを指定する必要があります。
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/application-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context. ContextLoaderListener</listener-class> </listener>
SpringのActionSupportクラスを使用するのが最も簡単な方法であり、ここではその方法を使用しています。ActionメソッドでSpringが管理するBeanを取得し、それを使用してビジネスロジックを呼び出します。たとえば、DefectsActionクラスのsaveメソッドでSpringのコンテキストを取得し、DefectManagerビジネスインターフェイスの実装で提供されるメソッドを呼び出します。
...
WebApplicationContext ctx = getWebApplicationContext();
DefectsManager mgr = (DefectsManager) ctx.getBean("defectsManager");
mgr.saveDefect(defect);
...
DefectManagerにはビジネスルールをコーディングします。たとえばユーザーが不具合に対して解決方法を入力したら、DefectManagerは自動的にそのユーザーを監査し(もちろん本当のアプリケーションで実際の名前を取得します)、DefectのisResolvedフラグをtrueに設定します。すると、SpringはHibernateを呼び出して、必要なデータベース処理を行います。Spring対応のActionクラス(DefectsListおよびDefectsAction)の完全なリストについては、リンク先を参照してください。




