SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Struts 1/Struts 2 Webアプリケーションフレームワークの比較

同じアプリケーションを元にStrutsの進化を知る

ダウンロード サンプルソース (27.5 KB)

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)の完全なリストについては、リンク先を参照してください。

次のページ
Struts 2の場合 1

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Michael Klaene(Michael Klaene)

Sogeti USAの主任コンサルタント。IT関連で10年以上の経験があり、J2EE、.NET、Oracleの設計と開発が専門。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1959 2008/01/18 17:15

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー