IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Sample IT projects | Web development  >

Project Zero の紹介: 第 1 回 Web アプリケーションのための Restful なサービスを作成する

最新の Web アプリケーションを開発および実行するための強力ながらも単純なプラットフォームを探る

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 初級

Roland Barcia (barcia@us.ibm.com), Certified IT Specialist, IBM 
Steve Ims ( steveims@us.ibm.com), Senior Technical Staff Member, IBM

2007年 10月 09日

Project Zero を紹介する連載の第 1 回目では、強力な Web アプリケーションを作成し、組み立て、そしてデプロイする、このプロジェクトならではの革新的手法を解説付きのツアーで体験してください。この記事ではまず、コミュニティー主導型 Project Zero の概要と Restful な Web サービスを作成する上での規則について説明した後、サンプル手順に沿って環境のセットアップ、Zero プロジェクトの作成、データを公開するための Restful なサービスの作成、およびアプリケーションのテストを段階的に行い、最後に Restful なサービスを使用するサンプル・アプリケーションをインポートします

はじめに

Project Zero は、サービス指向アーキテクチャー (SOA) 準拠の Web 2.0 アプリケーションのアジャイル開発を焦点とした IBM のインキュベーター・プロジェクトです。Web 2.0 を SOA に適用すると、Web 成果物で SOA の範囲を拡大することができます。これはつまり、Web 拡張版の SOA だと考えてください。

Project Zero は、代表的な Web 技術をベースにアプリケーションを作成し、組み立て、実行するための単純な環境を導入します。Project Zero の環境には、Groovy および PHP のスクリプティング・ランタイムが組み込まれ、REST (Representational State Transfer) スタイルのサービス、統合マッシュアップ、そしてリッチ Web インターフェースを作り出すことを目的に最適化されたアプリケーション・プログラミング・インターフェースが備わっています。Project Zero は IBM® 内で始まったインキュベーター・プロジェクトで、その焦点は次世代の動的 Web アプリケーションのアジャイル開発に置かれています。

現在、Project Zero の開発はコミュニティー主導の商業開発プロセスに従ってオープンに進められています。

Web 拡張版 SOA は、HTTP (Hypertext Transfer Protocol) と基本的な Restful な原則に重点を置いた SOA のサブセットです。Web 拡張版 SOA では Web を成功に導いたデザイン・パターンの使用を推奨しているため、アプリケーション設計ではこのパターンに従うのが理にかなっており、そして全体的なメリットにもつながります。このメリットには、以下のものが含まれます。

  • 拡張性。これはキャッシングおよびステートレスな対話からもたらされます。
  • 単純さ。一般的に HTTP と XML、または JSON (JavaScript Object Notation) による解析とレンダリングが前提となります。
  • 共通標準による広範囲にわたる「ネットワーク効果」。例えば、サイトはコンテンツについての詳細を知らなくても Atom や RSS フィードを利用したり、集約したりすることができます。

Project Zero には、技術的目標と社会的目標の両方があります。技術的目標は、以下の重要な 3 つの側面でアプリケーションの開発を容易にするスケーラブルなプラットフォームを提供することです。

作成
スクリプト言語 (現在は Groovy と PHP) のサポート、Restful なパターンを促進する規則、そして再利用可能なアセットのカタログによって開発を容易にすること。
組み立て
異種のサービスに迅速にアクセスし、データ・フロー、オーケストレーション、およびカスタム・メディエーションなどの統合アプリケーションに集約できるようにすること。
デプロイ
よく知られた安定性の高い Java™ 仮想マシン (JVM) をベースにしてアプリケーション中心のランタイム環境を提供し、アジャイル開発用に最適化すること (小フットプリント、高速再起動)。

社会的目標は開発プロセス自体に関係します。Zero はコミュニティー主導型商業開発 (CD/CD) としてオープンに開発されるよう意図されています。つまり、ユーザー・コミュニティーが Zeroの 技術的決定を見守り、左右できるということです。また、ユーザーが Zero 開発チームやソース・コード自体に直接アクセスすることもできます。商用ソフトウェア開発でのこのようなレベルの透明性は IBM にとって新しい試みなので、極めて効果的なサービスの提供につながることを期待しています。

CD/CD に沿って、Zero に関するすべての情報は www.projectzero.org に公開されます。この連載記事では Zero の新たな情報を明らかにすることはありませんが、基礎となる概念を体系的に紹介していきます。




上に戻る


Restful なサービス

REST は、ネットワーク化したシステムを実装する上でのデザイン・パターンを表す用語です。REST は技術でも、標準でもありません。これはリソースを Web で公開するためのアーキテクチャー・スタイルです。Restful なアーキテクチャーは以下の原則に従います。

  • リクエストはクライアントとサーバー間で行われ、本質的にプル・ベースの対話形式を使用します。コンシューマーとなるコンポーネントが、サーバーから状態の表現をプルします。
  • リクエストはステートレスです。クライアントからのリクエストそれぞれに、サーバーがそのリクエストを理解するために必要なすべての情報が含まれていなければなりません。また、リクエストがサーバー側に保管されたコンテキストを利用することはできません。
  • REST は必ずしも、中間層での状態が存在しないことを意味するわけではありません。REST が意味するのは、リソースに対する要求を満たす状態は中間層での状態に依存しないということです。
  • クライアントとサーバーは同じインターフェースに従います。すべてのリソースには、Web 拡張版 SOA での汎用インターフェース、つまり HTTP とそのメソッドである GETPOSTPUTDELETE でアクセスします。

クライアントは指定されたリソースにアクセスします。システムは、HTTP URL などの URL で指定されたリソースで構成されます。

REST (Representational State Transfer) は、World Wide Web をはじめとする分散ハイパーメディア・システムを対象としたソフトウェア・アーキテクチャー・スタイルの 1 つです。

REST は Web 上のサービスを表現するための重要な手法です。REST に関して理解しておかなければならない重要な点は、REST がもっとも有効に機能するのはデータをベースとしたサービスを公開する場合であるということです。こうしたデータ・サービスを組み合わせて調整することによって、新しいアプリケーションを作成することができます (これはよく、マッシュアップと呼ばれます)。以下の例に、クライアントが Restful なサービスをどのようにして確認するかを示します。

http://<host>/customer の場合:

  • GET: 顧客のリストを返します。
  • POST: Customer レコードを作成します。

http://<host>/customer/roland の場合:

  • GET: Roland の顧客レコードを返します。
  • PUT: Roland のレコードを更新します。
  • DELETE: Roland のレコードを削除します。

上記の例で公開されているリソースは Customer です。Customer は /customer という URI によって表されます。特定の顧客を表すには、/customer/ims のように Customer に ID を追加します。リソースにアクセスする目的は、HTTP ヘッダー・メソッドによって定義されます。




上に戻る


Project Zero プログラミングの中心概念

Project Zero は、Web 2.0 と SOA を連携させて次世代の Web ベースのビジネス・アプリケーションをサポートするために特殊化された新しいプラットフォームの基盤です。このセクションでは、その中心概念についていくつか説明します。中心概念をさらに詳しく調べるには、「Project Zero Developer's Guide」(「参考文献」を参照) を参照してください。

システム言語としてのスクリプトと Java

単純化された開発で主流となっているのはスクリプト言語です。Zero では、スクリプトに関連するアプリケーション・プログラミング・インターフェース (API) を単純化することによって、サービスを開発する際のオーバーヘッド削減を支援することを目標としています。デフォルトのスクリプト言語は Groovy です。Groovy は Java をベースとしているため、Java プログラマーはこの言語に簡単に移行することができます。Project Zero は拡張モジュールという手段を使って、PHP もスクリプト言語としてサポートします。

イベント

Zero はイベント・ベースのシステムです。システムの重要な振る舞いはすべて一連のイベントとしてアプリケーションに公開され、そこに該当するイベント状態が設定されます。アプリケーション開発者としての主な仕事は、既知のシステム・イベントに接続する一連のハンドラーを提供し、目的とするアプリケーションの振る舞いを実現することです。Zero の標準イベントは、アプリケーションにとって興味深い重要なアクティビティーです。

例えばシステムを介した HTTP リクエストは一連のイベントを発生させますが、開発者はそのそれぞれに対してハンドラーを作成することができます。この概念を説明しているのが図 1 です。この図には、セキュリティーに関する処理をするためのイベントや、特定の HTTP メソッド (GET | POST) のイベントなどをハンドラーが処理している様子が示されています (イベント処理についての詳細は、「Project Zero Developer’s Guide」のイベント処理に関するセクションを参照してください)。


図 1. イベント
イベント

グローバル・コンテキスト

Project Zero のイベント・ハンドラーには、明示的な入力パラメーター (リクエストなど) と出力パラメーター (レスポンスなど) がありません。Project Zero のイベント・ハンドラーは、イベント・ハンドラーが呼び出されてから次に呼び出されるまでの間に変化する状態を維持することができず、ステートレスであるため、Project Zero ではすべての状態にアクセスしてその状態を維持する手段としてグローバル・コンテキストを用意しています。グローバル・コンテキストは、現行イベントに関するすべての重要なデータをアプリケーションに提供するとともに、アプリケーションを構成するコンポーネントが情報を保管し、共有するためのメカニズムとなります。

グローバル・コンテキストにはスコープがあり、一連のゾーンに分割されています。それぞれのゾーンが維持するデータの可視性とライフ・サイクルは異なります (図 2 を参照)。例えば、ユーザー・ゾーンには特定クライアントのセッション状態が含まれます。このゾーンは該当するクライアントにだけ可視で、データはユーザーがアクティブでなくなるまで維持されます。

リクエスト・ゾーンに含まれるのは現在アクティブなリクエストの状態です。このゾーンはそのリクエストに対して実行されるコンポーネントにのみ可視で、ここに含まれる状態はリクエストの処理が完了するまで維持されます。


図 2. グローバル・コンテキスト
Figure 2. Global context



上に戻る


規則およびアプリケーションのディレクトリー構造

Zero 環境にはいくつかの規則があり、これらの規則に従うことで、Zero アプリケーションの開発は大幅に単純化され、指定しなければならならない構成情報も最小限になります。Zero の目標は、構成情報をできるだけ少なくすることです。一部の規則は一般的なもので、例えばスクリプトをアプリケーションの public フォルダーに配置すると、そのスクリプトは構成データがなくても HTTP リソースに応じて実行することができます。

その他の規則については特定のパターンに合わせて調整されています。図 3 は、Groovy スクリプトを特定のフォルダーに配置する例です。この手法では、その特定フォルダー内のメソッドは、HTTP REST イベントに応答するように自動的に登録されます。Restful なパターンを使ってデータを公開する Restful なサービスを簡単に開発する方法は後で説明します。詳細は、「Project Zero Developer's Guide」の「Virtualized directories」セクションを参照してください。


図 3. 仮想ディレクトリー
仮想ディレクトリー



上に戻る


サンプル・シナリオ

以上の説明で Zero プラットフォームを使用して初めての Restful なサービスを作成する準備はほとんどできたので、まずはこのサービスの概念についてひと通り説明しましょう。使用するのは、以下のサンプルです。

概要

この連載では全体を通して共通のサンプルを使用し、これをベースとしてさまざまな概念を学んでいきます。このサンプルで焦点としているのは、割り戻し (rebates) を行うインセンティブ (incentives) です。利用者 (consumer) は常にインセンティブによる割り戻しの対象となることを期待するため、プロバイダー (provider) はインセンティブを利用できるようにしなければなりません。図 4 のユース・ケースに、さまざまなアクティビティーを図解します。この記事では、インセンティブ・プロバイダーの役割、そしてインセンティブ管理のユース・ケースに的を絞ります。


図 4. ユース・ケース
ユース・ケース

プロバイダーには、システムにインセンティブを入力し、管理する手段が必要になります。インセンティブが、興味の対象となる主なデータです。図 5 に、インセンティブ・アプリケーションのデータ・モデルを示します。


図 5. データ・モデル
データ・モデル

最初は 1 つの表から始めます。今後の記事では、このデータ・モデルを拡張して関係 (relationship) を持たせ、REST パラダイムを使ったさらに複雑なデータを扱う予定です。

Restful なエンドポイントの設計

データ・セットの概要は以上のとおりです。次はデータを Restful な名前空間にマッピングする作業に取り掛かります。通常、特定のエンティティーをリソースにマッピングするための表を作成しておくと大いに役立ちます。表 1 は、リソースの Restful なマッピング例で、これを基に Restful なサービスを作成していきます。


表 1. REST データ
リソース URI メソッド 表現形式 説明
インセンティブ・リスト/incentiveGETJSON オブジェクトの配列インセンティブのリストを取得する
インセンティブ/incentivePOSTJSON オブジェクトインセンティブを新規に作成する
インセンティブ/incentive/<incentiveId>GETJSON オブジェクト個々のインセンティブを取得する
インセンティブ/incentive/<incentiveId>PUTJSON オブジェクト単一のインセンティブを更新する
インセンティブ/incentive/<incentiveId>DELETE単一のインセンティブを削除する

データの表現形式として JSON を選んだ理由は、リッチ・インターネット・アプリケーション (RIA) をシステムへのフロント・エンドとして使用するためです。ブラウザーでの Ajax では JavaScript を主要なプログラミング言語としているため、ほとんどの Ajax ベースのツールキットは JSON に十分に対応可能です (JSON についての詳細は、「参考文献」を参照してください)。

システム要件

この記事のサンプルを実行するには、以下が必要です。

  • Eclipse 3.2 以降。この記事では Eclipse 3.3 リリースを使用しました。
  • Eclipse 用 Project Zero Java および Groovy プラグイン

    このサンプルは、Zero の M1 Release で作成されています。したがって、Eclipse Update Site は必ず http://www.projectzero.org/update/zero.eclipse.M1 に設定してください。

    PHP プラグインはこの演習には必要ありません。

  • この記事に付属のダウンロード zip ファイル。このファイルは C: ドライブに解凍してください。
  • Derby ネットワーク・データベース
  • Eclipse 用 Derby プラグイン
  • Firefox ブラウザー

    この演習には IE を使用することもできますが、私たちは Firefox プラグインを使って POST/PUT/DELETE リクエストをテストしています。IE を使用する場合は、ブラウザーで GET リクエストをテストしてから、この記事の後半でインポートする UI クライアントを使ってサービスをテストしてください。

  • Firefox 用 POSTER プラグイン

その他、以下のツールが役に立ちます。




上に戻る


Project Zero を使って初めての Restful なサービスを作成する

Restful なマッピングについて多少の知識が備わったところで、早速サンプルの作成を始めましょう。

  1. まず、以下の手順に従って Zero プロジェクトを作成します。
    1. Eclipse メインメニューから New > Project を選択します (図 6 を参照)。

      図 6. プロジェクトの新規作成
      プロジェクトの新規作成

    2. Project ウィザードで Zero > Project Zero Application を選択し、Next をクリックします (図 7 を参照)。

      図 7. Project Zero Application
      Project Zero

    3. プロジェクトの名前として RebateIncentiveServices と入力し、Finish をクリックします。

      図 8. RebateIncentiveServices
      Rebate Incentive Services

  2. 次のステップでは、Project Zero のディレクトリー構造とツールを検討します。
    1. 図 9 に、Zero プロジェクトを構成する重要なディレクトリーの概要を示します。この図で吹き出しを付けているフォルダーは、コーディングが可能なそれぞれのエリアです。これらのディレクトリーは、主にプロジェクトの app フォルダーの下にあり、Java パースペクティブの Project Explorer ビューでは Java ソース・フォルダーとして表示されます。

      図 9. アプリケーションのディレクトリー構造
      アプリケーションのディレクトリー構造

      Java
      java フォルダーは、アプリケーション用 Java コードを配置する場所です。
      Public
      public フォルダーには、ブラウザーに対してサービスを提供するすべての成果物を配置します。成果物の例としては、HTML ファイル、JavaScript ファイル、Groovy ファイル、ブラウザーで実行可能なテンプレートなどがあり、PHP スクリプトが含まれる場合もあります。
      Resources
      /app/resources フォルダーに含まれるのは、Restful な呼び出しに応じて起動されるスクリプト (Groovy または PHP) です。これらのスクリプトは、さまざまな HTTP メソッドに対応します。このディレクトリーに含まれるスクリプトは自動的にハンドラーとして登録されます。サンプルではこのディレクトリーを使用します。
      Errors
      /app/errors フォルダーには、エラーに応じて自動的にレンダリングされる Groovy テンプレートなど、スクリプト・テンプレート・ファイルが含まれます。レンダリングされるレスポンスを定義するのはファイルのネーミング・パターンです。例えば、error5xx.gt はサーバー 500 エラーのときのレスポンスとして呼び出される Groovy テンプレートを定義します。
      Scripts
      /app/scripts ディレクトリーには、実際はアプリケーション専用となる Groovy スクリプトまたはクラスを定義することができます (java ディレクトリーとほとんど同じです)。ここに定義する GroovyBean やメソッドは、public の Groovy スクリプトからでも、resources の Groovy スクリプトからでも呼び出すことができます。この手法によって、モデル・ビュー・コントローラー・パターン (MVC) に準拠したアプリケーションを作成することができます。
      Views
      /app/views ディレクトリーには、イベントへのレスポンスとしてレンダリング可能なテンプレート・ファイルを配置します。public ディレクトリーに含まれるスクリプトとは異なり (これらのスクリプトはダイレクト URL アクセスをベースに実行されます)、このディレクトリーに含まれるビューは別のスクリプトへのレスポンスとして実行することができます。コントローラー・スクリプトはバックエンド・ロジックにアクセスしてから、ビューをレンダリングするビュー・スクリプトに制御を渡すことができます。

      アプリケーションのディレクトリー構造についての詳細は、「Project Zero Developer’s Guide」(「参考文献」を参照) に記載されています。

    2. 図 10 で吹き出しを付けている config ディレクトリーには、Zero アプリケーションに必要な重要なファイルが含まれます。

      図 10. config ディレクトリー
      config ディレクトリー

      Ivy.xml
      Zero プラットフォームは Ivy フレームワークを使用して依存関係を管理します。Zero アプリケーションはパッケージ化されてパッケージになりますが、ivy.xml によってどのパッケージに依存するかを定義することができます。Zero パッケージは Ivy リポジトリーに保管され、Ivy ランタイムがこれらのパッケージを解決します。

      Ivy はプロジェクトの依存関係を管理 (記録、追跡、解決、レポート) するためのツールで、以下の特徴が備わっています。

      • 柔軟性と構成可能性

        Ivy は基本的にプロセスにとらわれず、特定の方法論や構造に束縛されることがないため、広範な依存関係の管理とビルド・プロセスに適応するために必要な柔軟性と構成可能性が備わっています。

      • Apache Ant との密接な統合

        Ivy はスタンドアロンのツールとして使用できますが、Apache Ant と連動させると非常に効果的に機能し、依存関係の解決からレポートおよび公開に至るまでの強力な Ant タスクを行います。

      Ivy についての詳細は、Apache インキュベーター、または Project Zero Developer's Guide の依存関係およびパッケージングに関するセクションを参照してください。

      logging.properties
      logging.properties ファイルは文字通り、Java ロギング・プロパティーを構成できるファイルです。Zero で使用するのは JDK (Java Development Kit) ロギングです (Zero ロギングについての詳細は、Project Zero Developer's Guide のロギングに関するセクションを参照してください)。
      Zero.config
      zero.config ファイルは、Zero アプリケーションでの主要な構成ファイルを定義するファイルです。このファイルに、ハンドラーなどの成果物、セキュリティー、データ・ソース、そしてその他すべての必要な構成を設定します。zero.config ファイルは複数あっても構いません。このサンプルでは、zero.config を使用してデータベース構成を定義します。サンプルで使用するのは /app/resources フォルダーなので、ハンドラーを明示的に構成するのではなく、Zero が事前定義するハンドラーに REST を呼び出させます (構成についての詳細は、Project Zero Developer's Guide の「Configuration」セクションを参照してください)。

      図 11 で吹き出しを付けているのは、Eclipse ツールの機能です。Zero プラグインには依存関係の管理に役立つツールが用意されているため、これらのツールを使って、Ivy フレームワークが Zero アプリケーションの依存関係をダウンロードして解決するために使用するローカル・リポジトリーとリモート・リポジトリーを管理することができます。依存関係の解決とは、Zero アプリケーションにパッケージを追加することです。



      図 11. 依存関係の管理
      依存関係の管理

      Manage repositories
      ローカル・リポジトリーを表示し、リモート・リポジトリーからパッケージをダウンロードするためのツールを提供します (図 12 を参照)。


      図 12. Manage Repository
      Manage repository

      Resolve アイコン
      Resolve アイコンは、ローカル・リポジトリーと構成済みリモート・リポジトリーの両方から、ワークベンチ内の依存関係を解決します。
      Resolve メニュー項目
      Resolve メニュー項目は、ローカル・リポジトリーから依存関係を解決します。
  3. Restful なサービスを作成するには、データベース内にテーブルを作成しなければなりません。このサンプルにはダイナミック・リンク・ライブラリー (DLL) が用意されています。演習ではネットワーク・バージョンの Derby を使用します (Eclipse 用 Derby プラグインもインストールしたことを思い出してください)。
    1. RebateIncentiveServices を右クリックして Import を選択します (図 13 を参照)。

      図 13. 成果物のインポート
      成果物のインポート



    2. 図 14. ファイル・システム
      ファイル・システム

    3. サンプル・コードのダウンロード zip ファイルが C ドライブに解凍されていれば、From directory フィールドには C:\ProjectZeroArticleSeries\Part1 が入力されているはずです。Into folder フィールドには RebateIncentiveServices が設定されます。dbscripts フォルダーを選択し (図 15 を参照)、Finish をクリックしてください。

      図 15. DB スクリプト
      DB スクリプト

    4. プロジェクト内の dbscripts という名前のフォルダーが表示されるので、このフォルダーに含まれる Incentives.sql を開きます。このスクリプトは incentive テーブルを作成し、2 件のレコードをテーブルに挿入します。

      図 16. Incentives.sql
      Incentives.sql

      リスト 1 に、このスクリプトを記載します。



      リスト 1. データベース・スクリプト
                                  
      CONNECT 'jdbc:derby://localhost:1527/INCENTIVEDB;create=true;';
      
      drop
                                  table Incentive;
      
      create
                                  table Incentive (
      		incentiveid INTEGER
                                  NOT
                                  NULL GENERATED ALWAYS AS IDENTITY,
      		name VARCHAR(256) NOT
                                  NULL,
      		description VARCHAR(256) NOT
                                  NULL,
      		providername VARCHAR(50) NOT
                                  NULL,
      		incentivetype VARCHAR(128),
      		validfrom TIMESTAMP,
      		validto TIMESTAMP,
      		website VARCHAR(256)
      );
      
      alter
                                  table Incentive ADD
                                  CONSTRAINT Incentive_PK PRIMARY
                                  KEY (incentiveid);
      
      INSERT
                                  INTO Incentive (name,description, providername,incentivetype,validfrom,validto,website) 
                      values ('Key Account Energy Efficiency Grant Program',
      'Alameda P&T offers its commercial customers grants of up to $25,000
       for energy efficient building design and equipment in new commercial
       construction, or other approved unique energy efficient projects.',
      'Alameda Power and Telecom','Energy',
      TIMESTAMP('2007-06-22 00:00:00.000'),
      TIMESTAMP('2007-10-30 00:00:00.000'),
      'http://www.alamedapt.com/electricity/com_savings.html' );
      
      INSERT
                                  INTO Incentive (name,description, providername,incentivetype,validfrom,validto,website) 
                      values (
      'Power Management for Personal Computer (PC) Networks',
      'Avista Utilities Power Management for Personal Computer (PC) 
      Networks offers incentives to commercial customers.',
      'Avista Utilities','Energy',
      TIMESTAMP('2007-09-01 00:00:00.000'),
      TIMESTAMP('2008-06-30 00:00:00.000'),
      'http://www.avistautilities.com/saving/conservation/power_management.asp'  );
      
      

    5. プロジェクトを右クリックし、Apache > Add Apache Derby nature (ただし、Eclipse 用 Apache Derby プラグインがインストール済みであること) を選択します (図 17 を参照)。

      あるいは、コマンドラインを使って Derby を起動し、手動で ij を実行するという方法もあります。



      図 17. Apache Derby プラグイン
      Apache Derby プラグイン

    6. もう一度プロジェクトを右クリックし、今度は Apache Derby > Start Derby Network Server を選択します (図 18 を参照)。

      図 18. Derby ネットワーク・サーバーの起動
      Derby ネットワーク・サーバーの起動

    7. コンソールでデータベースが稼動していることを確認します。

      図 19. 稼働中の Derby データベース
      稼働中の Derby データベース

    8. Incentive.sql スクリプトを右クリックして Apache Derby > Run sql script running 'ij' を選択します (ij は、Derby データベース・スクリプトを実行するためのコマンドライン・ツールです)。

      図 20. ij による SQL スクリプトの実行
      ij による SQL スクリプトの実行

    9. コンソールを見て、テーブルが作成され、レコードが挿入されていることを確認します。

      図 21 データベース・スクリプトの実行結果
      データベース・スクリプトの実行結果

  4. ivy.xml ファイルについては前に説明しましたが、Zero プロジェクトを作成するときにはコアとなる Zero パッケージと Webtools パッケージが提供されます。コア・パッケージに含まれるのは、イベント・ハンドラーおよび Restful なサービスの作成に必要なライブラリーと、グローバル・コンテキストとのやりとりやセキュリティーに必要なライブラリーです。Web Tools プロジェクトには、デフォルトの index ページ、リクエスト・インスペクター、エラー検出ツールなどをはじめとする、便利な一連のツールが含まれます。詳細は、「Project Zero Developer’s Guide」(「参考文献」を参照) の「Developer Web tools (開発者用 Web ツール)」セクションを参照してください。

    このステップでは、上記の 2 つのパッケージをアプリケーションに追加します。これらのデータ・アクセス・ライブラリーと Derby クライアントの Java アーカイブ (JAR) ファイルがデータベースに接続しなければなりません。

    1. ivy.xml ファイルを開きます (図 22 を参照)。

      図 22. ivy.xml
      ivy.xml

    2. 上記のステップによって ivy.xml エディターが開きます。このエディターで Add をクリックします (図 23 を参照)。

      図 23. Zero パッケージの追加
      Zero パッケージの追加

    3. zero:zero.data パッケージを選択し (図 24 を参照)、フィルターが Latest minor version に設定されていることを確認してから OK をクリックします。

      図 24. zero.data パッケージ
      zero.data パッケージ

    4. 上記のステップを繰り返して org.apache.derby:derbyclient を追加します。これにより、Derby に接続するために必要な JDBC (Java Database Connectivity) クライアントの JAR が追加されます。

      図 25. Derby クライアント
      Derby クライアント

    5. Update dependencies アイコンを選択します。するとこのツールが ivy.xml を読み取り、リモート・リポジトリーとローカル・リポジトリーの最新バージョンを検索します (このサンプルでは、後で Resolve オプションを使用します)。

      図 26. 依存関係の更新
      依存関係の更新

    6. OK をクリックしてツールにリモートのバージョンをチェックさせます。

      図 27. 更新する依存関係の選択
      更新する依存関係の選択

  5. これでアプリケーションに必要なライブラリーは用意できたので、今度は実行時のデータベース構成をセットアップします。zero.config ファイルが使用するのは INI スタイルの構成です。config/zero.config ファイルの内容は、関連するキーと値のペアの「スタンザ」で構成されています。

    スタンザは、「グローバル・コンテキストに保管」、「別の構成ファイルを組み込む」といったディレクティブに関連付けられます。Project Zero の目標の 1 つは、アプリケーションを実行するために必要な構成作業を最小限にすることですが、どうしても一部の構成は必要になります。

    1. config フォルダーを展開し、zero.config ファイルを開きます (図 28 を参照)。

      図 28. zero.config
      zero.config

    2. 図 29 に、追加するスタンザを記載します。

      図 29. データベースの構成
      データベースの構成

      スタンザはディレクティブで始まります。上記の図で示している箇所で、保管されるキーと値のペアを検討してください。リスト 2 にこのテキストを記載します。このテキストは C:\ProjectZeroArticleSeries\Part1\dbconfig.txt から貼り付けることもできます。



      リスト 2. データベース構成
                                  
      [/app/db/incentiveDB/config]
      class=org.apache.derby.jdbc.ClientDataSource
      serverName=localhost
      portNumber=1527
      databaseName=INCENTIVEDB
      connectionAttributes=create=true
      

      Project Zero のデータ・ライブラリーは、アクセス時にこの構成を読み取ります。図 29 で強調表示している /app/db に続く incentiveDB 名に注目してください。コードでは、この名前を使用することになります。これについては、Restful なサービスを作成するときにもう少し詳しく説明します。




上に戻る


データを公開する Restful なサービスを作成する

いよいよ、インセンティブ・データを公開する Restful なサービスを作成する段階にきました。Project Zero でサービスを作成するには何通りかの方法がありますが、共通する 1 つの目標は、組み込みサポートを利用して自動的に Groovy スクリプトを Restful なサービスとして公開することです。

Project Zero には Eclipse プラグインを使用します。以下の規則は、コマンドライン・バージョンの Zero を使用する Eclipse 以外にも適用されることを覚えておいてください。Project Zero を使用すると REST ベースのサービスをいかに簡単に作成できるかがわかるはずです。

Groovy スクリプトの作成

Groovy スクリプトの名前は、REST サービスを起動させるために使う URL の名前に対応します。例えば URL が /resources/incentive であれば、incentive.groovy という名前のファイルが必要になります。

  1. /app/resources フォルダーを右クリックし、以下に示すように New > File を選択します。

    図 30. ファイルの新規作成
    ファイルの新規作成

  2. ファイル名として incentive.groovy と入力します。.

    図 31. incentive.groovy
    incentive.groovy

  3. Groovy サポートをプロジェクトに追加するかどうかを尋ねるプロンプトが表示されたら、Yes をクリックします。

    図 32. Groovy サポート
    Groovy サポート

インセンティブの管理

インセンティブを管理するために提供しなければならない機能には、すべてのインセンティブのリストの作成、個々のインセンティブの取得、そしてインセンティブの作成、更新、削除があります。最初に作成するのは、インセンティブのリストの作成機能です。クライアントがインセンティブのリストを表示するには、/resources/incentive を呼び出します。

  1. 先ほど作成した incentive.groovy ファイルを開きます。

    図 33. incentive.groovy
    Incentive.groovy

  2. スクリプト・コードを直接入力すれば、あらゆる HTTP メソッドに対応したスクリプトが作成されます。しかし、ここで必要なのは HTTP メソッドごとに異なるアクションです。それには、該当する HTTP メソッドに自動的に応答する特殊なハンドラー・メソッドを定義します。以下の表に、これらのコールバックを要約します。

    URI HTTP メソッド Groovy メソッド 説明
    /incentive GET onList() インセンティブのリストを返す
    /incentive POST onCreate() 新しいインセンティブ (複数可) を作成し、リソースの場所を返す
    /incentive PUT onPutCollection() インセンティブの集合を更新する
    /incentive DELETE onDeleteCollection() インセンティブの集合を削除する
    /incentive/<incentiveId> GET onRetrieve() ID を基準にインセンティブを取得する
    /incentive/<incentiveId> PUT onUpdate() 個々のインセンティブを更新する
    /incentive/<incentiveId> DELETE onDelete() 個々のインセンティブを削除する
    /incentive/<incentiveId> POST onPostMember() 個々のメンバーを選択した場所に送信する


    この記事では、上記のうち 1 番目、2 番目、5 番目、6 番目、7 番目のコールバックを作成します。

  3. リストのユース・ケースを最初に作成してテストするため、リスト 3 のコード・スニペットを追加します。このコードは C:\ProjectZeroArticleSeries\Part1\list.txt から貼り付けることもできます。

    リスト 3. インセンティブのリスト作成
                            
    import zero.data.groovy.Manager;
    
    def onList()
    {
    	def dm = Manager.create("incentiveDB");
    	request.json.output = dm.queryList("select * from incentive");
    	request.view="JSON";
    	render();
    }
    

    このコードの内容は以下のとおりです。

    • Project Zero のデータ API から Manager オブジェクトを使用します。Manager オブジェクトが提供するのは SQL クエリーを実行するのに便利なメソッドです。Java バージョンと Groovy バージョンの 2 つがあり、Java バージョンは Groovy でも機能しますが、Groovy バージョンの場合は GString を入力として渡したり、クロージャーを使用したりするなどの Groovy ショートカットを利用します。create を実行するときには、/app/db/incentiveDB/config 構成で使用されているストリングを渡します。

    • Manager のリスト全体を選択して request.json.output に割り当てます。結果を通常の Groovy 変数に割り当てているように思えるかもしれませんが、ここではそれより遥かに多くのことが行われます。すべての状態はグローバル・コンテキストに維持されることを思い出してください。Project Zero には、GlobalContext にデータを保管したり、ここから取得したりするための Java API が用意されています。

      例えば、以下のコードを見てください。

      String data = GlobalContext.get("/request/myData");

      このコードはグローバル・コンテキストのリクエスト・ゾーンからストリングを取得します。すると Project Zero の groovy スクリプトがさらにグローバル・コンテキスト・データの暗黙的ビルドのサポートを追加します。これらのスクリプトは、ゾーン (app、user、request、event) ごとに 4 つの変数を事前定義しています。そのため、Groovy での以下のコードは:

      request.myData = "Hello"

      以下のコードと同じことになります。
      GlobalContext.put("/request/myData","Hello);

      このように、Groovy でショートカットを利用すると作成するコードの量が少なくなります。このサンプルでは、リストをリクエスト・ゾーンの /request/json/output に保管します。グローバル・コンテキストについての詳細は、Project Zero Developer's Guide (「参考文献」を参照) を参照してください。

    結果が GlobalContext に保管されると、ViewEngine という別のオブジェクトが使用されます。Project Zero は結果コンテキストのさまざまなレンダリング方法をサポートするため、出力ストリームを明示的に作成することも (直接レンダリング)、アプリケーション・コードとイベント・ハンドラーが OutputStream (/request/outputstream) および PrintWriter (/request/writer) オブジェクトを使って直接レスポンス・エンティティーに書き込むことも可能です。

    以下は Java の例です。

    // Content of a Java class
    PrintWriter writer = (PrintWriter) GlobalContext.get("/request/writer");
    writer.println("Hello World.");

    すべての Groovy スクリプト (テンプレートを含む) のデフォルト出力は、アプリケーション開発者が println メソッドを使って直接レスポンスに書き込めるようにレスポンス書き出しプログラムとなっています。レンダリングについての詳細は、Project Zero Developer's Guide の Rendering Results (レンダリング結果) のセクションを参照してください。

    Project Zero には、一般的なレスポンス処理用レンダラーのライブラリーが用意されています。レンダラーを起動するには通常、以下のステップが必要です。

    1. グローバル・コンテキストの /request/view の値を該当するレンダラーに設定します。
    2. レンダラーに固有の値を GlobalContext に追加設定します。
    3. 以下を呼び出します。
      zero.core.views.ViewEngine.render() 

      ただし、Groovy REST Handler 内から render() を単独で呼び出すと、View Engine レンダラーが起動される結果となります。

    zero.core には、View、Error、XML、および JSON レンダラーが組み込まれていますが、Atom レンダラーが含まれる Atom パッケージを追加することもできます。

    このサンプルでは JSON ハンドラーを使用しますが、代わりに Groovy テンプレートを使用するという手段もあります。その場合は、Groovy テンプレートを /app/views フォルダーに保管し、request.view をテンプレートの名前に設定してください。

    このように、上記で説明した規則によって、作成しなければならないコードが大幅に減ります。

アプリケーションの起動によるテスト

この時点でアプリケーションを起動すると、至って簡単に onList をテストすることができます。

  1. プロジェクトを右クリックして Run as > Project Zero Application を選択します (図 34 を参照)。

    図 34. Project Zero アプリケーションの実行
    Project Zero アプリケーションの実行

  2. コンソールで、アプリケーションが起動してポート 8080 をリッスン中であることを確認します。

    図 35. ポート 8080 で実行中のアプリケーション
    ポート 8080 で実行中のアプリケーション

  3. ブラウザーを立ち上げ、http://localhost:8080 と入力します。すると、デフォルトの Zero ページが表示されます (これは、前に説明した Web Tools ライブラリーに含まれるツールの 1 つです)。ここで表示されるのはデフォルトの index ページですが、独自の index.html ファイルを追加すると、デフォルトではなくそのファイルが優先されるようになります。

    図 36. デフォルトのホーム・ページ
    デフォルトのホーム・ページ

  4. View > SideBar > Poster を選択して Firefox の Poster ツールを起動します。.

    図 37. Poster プラグインの実行
    Poster プラグインの実行

  5. URL として http://localhost:8080resources/incentive を入力し、GET をクリックします。

    図 38. インセンティブの GET
    インセンティブの GET

  6. Response ウィンドウがポップアップ表示され、以下のようにレスポンスのペイロードが示されます。表示形式は JSON 配列で、それぞれのエントリーが JSON オブジェクトとなっています。

    図 39. JSON 形式での結果
    JSON 形式での結果

  7. オプションで、XML 形式でのレンダリングをテストすることもできます。それには、リスト 4 に示すようにビュー・タイプを XML に変更します。

    リスト 4. XML 形式による結果
                            
    def onList()
    {
    		def dm = Manager.create("incentiveDB");
    request.xml.output = 
        dm.queryList("select * from incentive");
    		request.view="XML";
    		render();
    }
                        

  8. Poster プラグインでもう一度 GET をクリックし、XML 形式での結果を表示します (図 40 を参照)。

    図 40. XML 形式での結果
    XML 形式での結果

    コードは必ず JSON に戻しておいてください。

サービスへのアクセス

次は、ID を渡して特定の Restful なサービスにアクセスする onRetrieve メソッドを作成します。

  1. incentive.groovy ファイルに、以下の図 41 またはリスト 5 の onRetrieve メソッドとコードを入力します。これは C:\ProjectZeroArticleSeries\Part1\retrieve.txt から貼り付けることもできます

    図 41. インセンティブを取得するコード
    インセンティブを取得するコード



    リスト 5. 単一のインセンティブの取得
                            
    def onRetrieve()
    {
    def dm = Manager.create("incentiveDB");
    request.json.output = dm.queryFirst(
    "select * from incentive where incentiveid = 
     ${request.params.incentiveId[0].get()}");
    	request.view="JSON";
    	render();
    } 
    

    onList メソッドのときと同じように、Manager のインスタンスを作成してクエリーを実行します。このサンプルには、いくつか重要なポイントがあります。

    • このメソッドは URI、/resources/incentive/1 を実行することによって呼び出されます。1 は、目的のインセンティブの ID です。この ID を where 節に渡すには、URI からアクセスしなければなりません。すると Zero によって自動的に GlobalContext にパス情報が設定されます。例えば、request.params.incentiveId[0] の場合に返される値は 1 です。以下の表に、パラメーターへのアクセス方法の例をいくつか記載します。

      URI パラメーター
      /incentive/1 request.params.incentiveId[0] == 1
      /incentive/1/provider?location=NJ request.params.location[0] == NJ


    • クエリー内では Groovy GString の組み込みサポートが使用されています。GString では、式言語を使ってストリング・リテラル内の変数を参照できます。そのため、以下のクエリー・ストリング・リテラル:
      select * from incentive where incentiveid = ${request.params.incentiveId[0].get()} 
      

      GlobalContext に直接アクセスすることができます。別の手段として、データ・アクセス・ライブラリーの API を使うこともできます。これらの API では POJO (Plain Old Java Object) を渡したり、:property 形式の入力を使用できたりする他、? 型のパラメーターもサポートします。詳細は、Project Zero Developer's Guide (「参考文献」を参照) の Project Zero での JavaDocs の data セクション、および 「Data access」セクションを参照してください。
  2. ファイルを保存します。Firefox の Poster ツールに戻り、URL http://localhost:8080/resources/incentive/1 を入力して GET をクリックします (図 42 を参照)。この結果、1 件のレコードを持つ JSON オブジェクトが表示されます。

    図 42. 単一のインセンティブの場合の JSON 形式による結果
    単一のインセンティブの場合の JSON 形式による結果

サンプルへの追加

今度は onCreate()onUpdate()onDelete() メソッドを追加します。

  1. リスト 6 のコードを incentive.groovy に入力するか、C:\ProjectZeroArticleSeries\Part1\updateMethods.txt から貼り付けます。

    リスト 6. インセンティブの作成、更新、削除
                            
    def onCreate()
    {
    	def dm = Manager.create("incentiveDB");
    	def incentive = zero.json.JsonType.fromData(request.input.get()).getJson();
    	def newKey = dm.insert("insert into incentive
     (name,description,providername,incentivetype,validfrom,validto,website)
     values(${incentive.name},${incentive.description},${incentive.providername},
    ${incentive.incentivetype},${incentive.validfrom},${incentive.validto},
    ${incentive.website})",['incentiveid']);
        
    	locationUri = zero.core.utils.URIUtils.getAbsoluteUri(request.path) + '/' + newKey
        request.headers.out.Location = locationUri
        request.status = HttpURLConnection.HTTP_NO_CONTENT
    }
    
    def onUpdate()
    {
    	def dm = Manager.create("incentiveDB");
    	def incentive = zero.json.JsonType.fromData(request.input.get()).getJson();
    	dm.update("update incentive set name =
     ${incentive.name},description = $incentive.description ,providername =
     $incentive.providername,incentivetype=$incentive.incentivetype,validfrom=
    $incentive.validfrom,validto=$incentive.validto,
    website=$incentive.website where
     incentiveid=${request.params.incentiveId[0].get()}");
    	request.status = HttpURLConnection.HTTP_NO_CONTENT
    	
    } 
    
    def onDelete()
    {
    	def dm = Manager.create("incentiveDB");
    def newKey = dm.update("delete from incentive where incentiveid=
    ${request.params.incentiveId[0].get()}");
    	request.status = HttpURLConnection.HTTP_NO_CONTENT;
    }
    

    このコードの内容は以下のとおりです。
    • データ・アクセス API には、更新を実行するメソッドがあります。onDeleteonUpdate が使用する汎用更新メソッドによって、データベースに InsertUpdateDelete 文を渡すことができます。onCreate() は、主キーを返すように定義された特殊な挿入メソッドも使用します。このメソッドは、データベースが主キーを生成する場合に役立ちます。
    • onCreate メソッドは、新しく作成されたリソースの URL を設定します。これは REST パターンの必須条件です。
    • すべての更新では、戻りの型が no Content に設定されます。
    • 特殊化されたzero.json.JsonType.fromData を使用すると、メッセージ本体が JSON オブジェクトの Java 表現に変換されます。
  2. Poster を使用して http://localhost:8080/resources/incentive を入力します。Content to Send には、リスト 7 の JSON オブジェクトを追加します (または、C:\ProjectZeroArticleSeries\Part1\insertUpdatePayload.txt から貼り付けます)。

    リスト 7. JSON ペイロードの作成
                            
    {"providername":"Hawaii Gas Company ",
    "website":"http://www.hawaiigas.com/rebate/commercial.html",
    "description":"Existing Commercial Utility Gas customers of The Gas Company 
    may apply for a rebate for new gas equipment..",
    "name":"Commercial Switch to Gas Program",
    "incentivetype":"Energy","validto":"2007-09-01 13:01:23.123456",
    "validfrom":"2008-06-30 13:01:23.123456"}
    

  3. POST を選択します (図 43 を参照)。

    図 43. インセンティブの POST
    インセンティブの POST

  4. レスポンスはステータス 204 で、場所は新規リソースの http://localhost:8080/resources/incentive/3 に設定されているはずです (図 44 を参照)。

    図 44. POST の結果
    POST の結果

  5. レスポンスを閉じて Poster ツールに戻ります。新規の URL http://localhost:8080/resources/incentive/3 を入力し、GET をクリックして項目が作成されていることを確認します。

    図 45. 作成されたインセンティブの GET
    作成されたインセンティブの GET

  6. 作成したレコードと一致するレスポンスを受け取るはずです。

    図 46. 新規インセンティブの GET
    新規インセンティブの GET

  7. C:\ProjectZeroArticleSeries\Part1\insertUpdatePayload.txt からもう一度、ペイロードを貼り付けます。
  8. incentiveTypeGas に変更します (リスト 8 の JSON オブジェクトを参照)。

    リスト 8. JSON ペイロードの更新
                            
    {"providername":"Hawaii Gas Company ",
    "website":"http:\/\/www.hawaiigas.com\/rebate\/commercial.html",
    "description":"Existing Commercial Utility Gas customers of The Gas
     Company may apply for a rebate for new gas equipment..",
    "name":"Commercial Switch to Gas Program",
    "incentivetype":"Gas",
    "validto":"2007-09-01 13:01:23.123456",
    "validfrom":"2007-09-01 13:01:23.123456"}
    

  9. リソースの URL http://localhost:8080/resources/incentive/3 とペイロードを入力し、PUT をクリックします。

    図 47. インセンティブの PUT
    インセンティブの PUT

  10. ステータスが 204 のレスポンスを受け取るはずです。

    図 48. ステータスが 204 の結果
    ステータスが 204 の結果

  11. リソースでもう一度 GET を実行し、正常に更新されたことを確認します。

    図 49. インセンティブの削除
    インセンティブの削除

  12. 最後に、URL が http://localhost:8080/resources/incentive/3 のままの状態で Delete をクリックします。以下に示すように、ステータスが 204 のレスポンスを受け取るはずです。

    図 50. Delete の実行に対するステータスが 204 の結果
    Delete の実行に対するステータスが 204 の結果

  13. GET を実行します。今度は空の結果になるはずです (連載の今後の記事では、エラー処理をコードに追加します)。



上に戻る


サンプル RIA クライアントをインポートする

Restful なサービスが機能するようになったら、今後は Restful なサービスを使用するサンプル RIA をインポートします。この記事はクライアントには重点を置いていないため、インポートするクライアントの内容についてと、どのようにして REST をマッシュアップ・アプリケーションの基盤とするかについては簡単に説明します。

Zero での UI サポートについては、連載の今後の記事で説明します。
現在、Project Zero には Dojo Toolkit 4.3 が含まれているので、このサンプルでは Dojo ベースのアプリケーションを使用します。ここでは基本的な Dojo サポート、そしてインポートしたヘルパーを使用します。

以下の手順に従って、Dojo パッケージをプロジェクトに追加します。

  1. 前と同じように config フォルダーにある ivy.xml を開き、dojo:dojo(0.4.3) をアプリケーションに追加します。

    図 51. Dojo パッケージの追加
    Dojo パッケージの追加

  2. このプロジェクトを右クリックして Zero Tools > Resolve を選択します。これで、ローカル・リポジトリーから Dojo の依存関係が解決されます。

    以前に説明したように、Update dependencies アイコンを使用してリモート・リポジトリーからロードすることもできます。



    図 52. Dojo の依存関係の解決
    Dojo の依存関係の解決

  3. コンソール・ビューで Stop をクリックしてアプリケーションを停止します (図 53 を参照)。コードを変更する場合とは異なり、新規ライブラリーの追加や zero.config の更新を行うときにはアプリケーションを再起動する必要があります。

    図 53. アプリケーションの停止
    アプリケーションの停止

これで、コードをインポートして検討する準備ができました。

  1. プロジェクトの public フォルダーを右クリックして Import を選択します。

    図 54. UI コードのインポート
    UI コードのインポート

  2. From directory に、C:\ProjectZeroArticleSeries\Part1\webapp と入力します。webApp ボックスにチェック・マークを付け、Into folder が public になっていることを確認します (図 55 を参照)。

    図 55. Import ウィザード
    Import ウィザード

ここで、コードを簡単に検討します。

  1. index.html ファイルを開きます (図 56 を参照)。

    図 56. index ページの検討
    index ページの検討

  2. インセンティブ・クライアントはウィジェットとして作成されています。Restful なクライアントを Dojo ウィジェットとして作成することは、容易にマッシュアップして統合できるモジュラー・クライアントを実現する上での基本です。図 57 に、ページ上で単一の宣言となっているインセンティブ・ウィジェットを示します。

    このサンプルには、別のウィジェットをシミュレートする JavaScript も追加されています。このウィジェットがインセンティブ・ウィジェットをサブスクライブして Restful なイベントを表示します。



    図 57. 2 つのウィジェット
    2 つのウィジェット

  3. zero.incentive.widget フォルダーの下には、Dojo ウィジェットを作成するために必要なコードがあります。Dojo ウィジェットを構成するのは主に、HTML テンプレート、スタイル用 CSS ファイル、そして JavaScript 関数です。Dojo ウィジェットの作成はそれだけでも 1 つの記事の話題になります。Dojo Toolkit およびウィジェットについては「参考文献」を参照してください。図 58 ではウィジェット・ファイルに吹き出しを付けて示してあります。

    図 58. Dojo ウィジェットのコード
    Dojo ウィジェットのコード

  4. リスト 9 は、Dojo ウィジェットが Restful なサービスを起動する方法を焦点とした IncentiveWidget.js ファイルからの抜粋です。ここに指定されているサンプル JSONRestService の JavaScript クラスについて少し説明すると、このサンプルではウィジェットが listData メソッドを呼び出してサービスを起動しています。また、Dojo のパブリッシュ/サブスクライブ関数を使用して、Restful なサービス起動時に関するイベントを出力している点も重要です。これによって、周辺のウィジェットはデータがアクセスされたことを検出します。

    一部のデータは本質的にセキュアであることを念頭に置いてください。信頼できないソースからの純粋な JavaScript のマッシュアップは非常に危険な場合があります。セキュアなパターンについては、連載の今後の記事で詳しく検討します。



    リスト 9. JSON の REST 呼び出し
                            
    postCreate: function(){
    		
    		dojo.debug("postCreate, setting subscriptions");
    		
    		//Load Widget
    		dojo.event.topic.subscribe(this.inputTopic, this, this.listIncentives);
    		
    		//Get Incentives Events
    		dojo.event.topic.subscribe(this.getAllTopic, this, this.bindIncentives);
    
    listIncentives:function (){
    		zero.rest.JsonRestService.listData(this.restUri,this.getAllTopic,this.errorListTopic);
    	},
    	bindIncentives:function(data){
    			dojo.debug("Binding to -> " + this.incentiveTable);
    			for(i = 0; i < data.length ; i++)
    			{
    				data[i].validto = dojo.date.fromIso8601 (data[i].validto);
    				data[i].validfrom = dojo.date.fromIso8601 (data[i].validfrom);
    				data[i].website = '<a href=\"' +
      data[i].website + '\" target="_blank">' + data[i].website + '</a>';
    			}
    			this.incentiveTable.store.setData(data);
    			this.showIncentiveFormButton.show();
    			this.editIncentiveFormButton.show();
    			this.deleteIncentiveButton.show();	
    	}
    

  5. zero.rest フォルダーの下にある JsonRestService.js ファイルを開きます (図 59 を参照)。コードには、すべての Restful なイベントに対するコールバック・メソッドが含まれることに注目してください。ここでは dojo.io.bind() メソッドと Dojo のパブリッシュ/サブスクライブ関数を使用してイベントの完了を通知しています。このコードは、「Developer's Guide」にも記載されています。

    図 59. JsonRestService.js
    JsonRestService.js

それでは以下の手順に従って、クライアント・アプリケーションを実行してください。

  1. アプリケーションを再起動します。それには、以下に示す Eclipse を実行するための右三角のアイコンを使用することができます。

    図 60. アプリケーションの再起動
    アプリケーションの再起動

  2. ブラウザーを立ち上げて http://localhost:8080/ にアクセスします。Web Tools の index ページではなく、アプリケーションの index ページが表示されることに注目してください。インセンティブ・ウィジェットがリスト・データを呼び出し、周辺ウィジェットがイベントを表示しています。

    図 61. ロードされたアプリケーション
    ロードされたアプリケーション

  3. 新しいインセンティブを追加するために Add New Incentive をクリックします。

    図 62. 新規インセンティブの追加
    新規インセンティブの追加

  4. データを入力します (JSON ペイロードを例として使用するか、図 63 を参考にしてください)。

    図 63. 新規インセンティブの追加フォーム
    新規インセンティブの追加フォーム

  5. Submit をクリックします。すると、新しく作成したリソースが表に追加されます。

    図 64. インセンティブの更新
    インセンティブの更新

  6. 新しく作成したリソースを強調表示し、Edit Selected Incentive をクリックします。

    リソースを選択すると、個々のリソースを取得する onRetrieve メソッドが実行されます。

  7. 任意のフィールドを更新し、Submit をクリックします。

    Dojo のバージョン 4.3 には、フォーム・データを表示するドロップダウン日付ウィジェットに小さなバグがあります。Dojo サイトで更新を調べるか、ウィジェットに直接データを設定してください。



    図 65. Dojo バージョン 4.3 でのバグ
    Dojo バージョン 4.3 でのバグ

  8. 最後に、リソースを強調表示して Delete Selected Incentive をクリックします。

    図 66. インセンティブの削除
    インセンティブの削除

  9. リストが更新されるはずです (図 67 を参照)。

    図 67. インセンティブの削除結果
    インセンティブの削除結果

  10. 周辺ウィジェットに表示された REST イベントとペイロードを検討します。

    図 68. マッシュアップされたウィザード
    マッシュアップされたウィザード

おめでとうございます! これで、Project Zero での初めての Restful なサービスの作成が完了しました。




上に戻る


まとめ

この記事では、Web 指向のアプリケーション、つまり Web 拡張版 SOA を作成するための新しいプラットフォーム、Project Zero を紹介し、Project Zero のアーキテクチャー、そして Restful なサービスを作成して Web 2.0 開発を容易にする方法を説明しました。この記事の比較的単純なサンプルで使用したのは、よく実行されるパターンです。

より複雑なデータを対象とした Restful なサービスの作成方法を説明する第 2 回をお見逃しなく。次回の記事を読むと、十分機能的な Web 拡張版 SOA を組み立て、セキュアにしたものを提供する上で役に立つ、この Project Zero プラットフォームの他の機能を理解することができます。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
sample codei-zero1code.zip13KBHTTP
ダウンロード形式について


参考文献

学ぶために
  • 代表的な Web 技術をベースに簡単にアプリケーションを作成、アセンブル、実行するための環境を導入する Project Zero の全容を学んでください。

  • Project Zero Developer's Guide では、Zero アプリケーションのアーキテクチャーを定義する中心概念を説明しています。

  • 現在進行中の開発についてのヘルプ、フィードバック、注意、議論などには Project Zero フォーラムを活用してください。

  • Java プラットフォーム用のアジャイルな動的言語、Groovy について学んでください。

  • Project Zero アプリケーションや Project Zero を対象とした新しい PHP 機能拡張を開発するために PHP をインストールおよび構成する方法を読んでください。

  • developerWorks の Project Zero に関するその他の記事、チュートリアルを参照してください。

  • JavaScript のツールキット、Dojo と Dojo ウィジェットに関するすべてを学んでください。

  • REST (Representational State Transfer) については、Roy Thomas Fielding の論文「Architectural Styles and the Design of Network-based Software Architectures」を読んでください。

  • JSON および Project Zero での JJSON サポートについての詳細を調べてください。

  • オープン開発プラットフォーム、Eclipse に関するすべてを読んでください。

  • Mozilla による Web ブラウザー、FirefoxPoster プラグインの詳細を調べてください。

  • 完全に Java で実装されたオープン・ソースのデータベース、Apache Derby について読んでください。

  • Web 作成者と Web マスターを対象とした caching tutorial で、キャッシングについて詳しく学んでください。

  • コミュニティー