本のライブラリーを sMash する

WebSphere sMash の楽しい経験へとつながる身近なシチュエーション

IBM® WebSphere® sMash で、本の Derby データベースとの動的ユーザー・インターフェースと RESTful (REpresentational State Transfer) なインターフェースを作成して、独自のライブラリーの目録作成システムを構築する方法を学んでください。このシステムではいつもの LCRUD (list、create、retrieve、update、delete) 操作もできますが、とりわけ面白い部分は、この新たな素晴らしいソフトウェアを探るところにあります。

Kevin Dzwonchyk, Advisory Software Engineer, WSO2 Inc

Author photoKevin Dzwonchyk は IBM の Advisory Software Engineer で、IBM Software Services の一員として IBM Global Account に勤務しています。1997年に IBM に入社して以来、WebSphere ブランドを重点とした IBM SWG 製品のサポートとサービス、そして開発に携わってきました。現在は、Groovy と PHP スクリプトを使った sMash プラットフォームでの Web 2.0 イノベーションを推進しています。彼が積極的関心を持っているのは、最先端の製品と概念を使用したイノベーションです。



Ron Lynn, Senior Software Engineer, WSO2 Inc

Ron Lynn photoRon Lynn は IBM Web Enablement サポート・チームの Senior Software Engineer で、カリフォルニア州中央の San Joaquin Valley にある小さな農場を拠点として働いています。彼が現在取り組んでいるのは、IBM のパートナー・アプリケーションの可視性向上を焦点とした内部ポータル・プロジェクトです。これまでに何度もポートレット開発やその他の話題に関する著作活動と講演を行ってきた彼は、『Programming Portlets』の共著者でもあります。



2008年 10月 08日

はじめに

状況依存型アプリケーションの定義は、「...特定のニーズを持つ小さなユーザー・グループを対象に作成するソフトウェア」とあります。

まさに、そのようなシチュエーションが身近なところで発生しました。

数百冊の本が収容されている、技巧を凝らして作られた作り付けの本棚がいくつかあり、これらの本棚を塗り直さなければならなくなりました。この作業を行うために、すべての本を本棚からどかしたところ、すべての本を整理し直して目録作成システムを作るには絶好の機会だと思い立ちました。目録作成システムによって、自分たちが持っている本についての情報、そしてそれぞれの本についての詳細を簡単に調べられるようにします。また目録作成システムは、同じ本が 2 冊以上ないかどうかを判断したり、さらには持っていることに気付かなかった本を特定したりするのにも役立ちます。要するに、私たちはアプリケーションが必要な状況に立たされたわけです。これは、IBM WebSphere sMash の性能を試すには絶好の機会です。


sMash で開発する状況依存型アプリケーション

前提条件

この記事では、あらかじめお使いのマシンに WebSphere sMash (あるいは、コミュニティーによる WebSphere sMash の開発用実装、Project Zero) がインストールされていることを前提とします。WebSphere sMash は簡単にダウンロードしてインストールできます。現在用意されているのは、以下の 2 つのバージョンです。

どちらのバージョンを使用しても申し分なく動作しますが、この記事のベースとしては Silverstone の M2 (マイルストーン 2) バージョンを使用しました。

sMash アプリケーションをビルドするには少なくとも 2 つの方法があります。1 つは sMash 用の Eclipse プラグインを使用するという方法、そしてもう 1 つは sMash に付属の見事な Web ベースのアプリケーション・ビルダー、AppBuilder を使用するという方法です。この 2 つの環境には両方とも利点と価値があるので、どちらを使うかは好みの問題です。この演習では、sMash に組み込まれている Web ベースの AppBuilder を使用します。

土台を作成する

アプリケーションを素早く完成させる最も簡単な方法は、ZRM (Zero Resource Model) を使用することです。ZRM を使用すると、データ・ストアを作成するのも、作成したデータ・ストアに RESTful なハンドラーを提供するのも至って簡単に行えます。

データ・ストアを作成するために必要な作業は、データ・ストア用のモデルとして、フィールドとそれぞれのフィールドのオプションを定義する JSON ファイルを作成することだけです。このモデルがデータ・ストアを作成するために使用され、データ・ストアに関するすべてのメタデータ情報の唯一のソースとなります。ZRM は一般に、グリーン・フィールド・アプリケーション (レガシー・データ・ソースを持たないアプリケーションのこと) に使用されます。

ここで、カード目録の単純なモデルを定義してみましょう。ライブラリーを整理する術に長けている読者にとっては、このモデルに定義する単純なフィールドのセットに眉をひそめるかもしれません。ごもっともです。しかし、これは状況依存型アプリケーションであり、その目標はニーズを満たすものを素早く完成させることだという点を考慮してください。

  1. AppBuilder を起動する
    1. まずは AppBuilder を起動するところから始めます。コマンドラインから appbuilder コマンドを実行してください。このコマンドはこれまで変更されてきているので、操作している sMash のバージョンによっては入力内容を調整しなければならないかもしれません。これは、Windows® と Linux® の両方に当てはまります。このそれぞれのオペレーティング・システムに対応したスクリプト (バッチ・ファイル) があり、通常はそのスクリプトで問題なく実行されますが、問題がある場合は環境変数を調べてください。パスに Java™ と zero ディレクトリーが含まれていて、JAVA_HOME 環境変数がパス内の Java と同じ Java に設定されている必要があります (この間違いを犯した著者の 1 人が赤面しています)。M2 バージョンでは appbuilder と入力するだけで、スクリプトに渡すことのできるパラメーターのリストが表示されます (図 1)。

      図 1. AppBuilder スクリプトのパラメーター
      AppBuilder スクリプトのパラメーター
    2. AppBuilder の起動が完了すると、コマンド・ウィンドウに図 2 のようなメッセージが表示されます。

      図 2. 正常に起動した AppBuilder
      正常に起動した AppBuilder

      上記は明らかに Windows コマンドラインから起動した場合ですが、Linux でも同じようになります。Firefox がインストールされている場合、初めて AppBuilder を使用すると AppBuilder の Welcome パネルが表示されます (図 3)。Firefox がインストールされていなければ、コマンド・ウィンドウに表示された URL (http://localhost:8070) をブラウザーに入力してください。

      図 3. AppBuilder の Welcome パネル
      AppBuilder の Welcome パネル

      Welcome 画面以外の AppBuilder パネルが表示されたとしても心配無用です。おそらくこれまでに AppBuilder を起動したことがあるというだけに過ぎません。

      通常、AppBuilder はマシン上でローカルに実行されます。projectzero.org のフォーラムには、サーバー上で AppBuilder を実行しなければならない構成の場合にはどうすればよいかという投稿がありますが、この話題についてはこの記事では触れません。

  2. アプリケーションを作成する
    1. 使いやすさを目的に設計された AppBuilder では、簡単な 3 つのステップによるアプリケーションの作成プロセスが Welcome パネルに説明されています (図 4)。

      図 4. アプリケーションの作成
      アプリケーションの作成

      上記のステップに従うには、まず、左側にある緑の Actions ボックス (図 5) に表示された Create new application リンクをクリックします。

      図 5. AppBuilder の Actions ボックス
      AppBuilder の Actions ボックス
    2. Create new application ダイアログ (図 6) のすべてのフィールドに適切な値を入力または選択した後、Create ボタンをクリックします。図 6 には私たちが選択した内容 (アプリケーション名は「CardCatalog」) が示されていますが、他の値を使用しても構いません (その場合には、使用した値を覚えておいてください)。

      図 6. アプリケーションの新規作成
      アプリケーションの新規作成
    3. 今までに作成したアプリケーション、AppBuilder に取り込んだアプリケーションを含め、すべてのアプリケーションのリストが表示されます。図 7 には新しく作成した CardCatalog ライブラリー・アプリケーションしか表示されていませんが、リストから該当する CardCatalog アプリケーションを見つけてそのタイトルをクリックします。

      図 7. アプリケーションのリスト
      アプリケーションのリスト

      上記の操作によって、アプリケーション・プロジェクト・スペースに移動することになります。これで、アプリケーションのリソース、テンプレート、モデルなどの作成に取り掛かることができます。

  3. データ・モデルを作成する
    1. アプリケーションのデータ・モデル定義の作成を開始すると、まず始めに参考用のヘルプ・ページが表示されます (図 8)。新しいファイルを作成するにしても、既存のファイルを編集するにしても、このページから作業を開始できます。この演習では新しいファイルを作成するため、緑の Recent Files ボックス内で New File リンクをクリックします。

      図 8. データ・モデルの作成
      データ・モデルの作成
    2. するとドロップダウン・ボックスに選択可能な複数のファイル・パスが表示されます (図 9)。これから作成するのはデータ・モデルなので、このリストから新しいモデル定義として、Zero Resource Model in /app/models を選択します。

      図 9. ファイル・パスの選択項目
      ファイル・パスの選択項目
    3. File Create ダイアログでは、モデル定義ファイルの名前を選べます。この例では、「books」という名前にします。

      図 10. File Create ダイアログ
      File Create ダイアログ

      定義ファイルの名前は重要です。なぜなら慣例により、この名前がリソースの名前に使用されるためです。つまり、このリソースを呼び出すための URL は http://localhost:8080/resources/books となります。また、定義ファイルの名前はタイプ名でもあり、該当するタイプのすべてのインスタンスは、この定義に指定された制約に従う必要があります。

      名前を入力して、Create ボタンをクリックします。

    4. すると Missing Dependency ダイアログが表示されます (図 11)。

      図 11. Missing Dependency ダイアログ
      Missing Dependency ダイアログ

      Add ボタンをクリックします。これにより、以下の zero.resource 依存関係が自動的に ivy.xml ファイルに追加されます。

      <dependency name="zero.resource" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

      基本的に、上記の依存関係が WebSphere sMash にこのアプリケーションで ZRM を使用するという意図を伝えるため、WebSphere sMash は ZRM を使用できるようにするための条件を作り出します。

    5. books.json ファイルは現時点で編集用に開ける状態になっていますが、その前に、左側の列にある ivy.xml ファイルをクリックしてください。追加された zero.resource 依存関係が確認できるはずです。または Dependencies タブをクリックして、依存関係が追加されていることを確認するという方法もあります (図 12 では、リストの最後に追加されています)。

      図 12. Application Dependencies タブ
      Application Dependencies タブ

      zero.resource 依存関係が見当たらない場合は、ivy.xml ファイルに追加しなければなりません。その方法は、直接ファイルを編集するか、または上記の依存関係パネル (図 11) を使用するかのいずれかです。

    6. books.json を開きます。モデル編集用のユーザー・インターフェースはこれまで変更が重ねられてきました。図 13 に記載しているユーザー・インターフェースは M2 バージョンです。このバージョンでは、エディターで視覚的にフィールドを追加することができます。

      図 13. モデル・エディター
      モデル・エディター

      フィールドのそれぞれについて、String ボタンをクリックして新しいストリング値を追加し、次に Open field editor ボタンをクリックしてフィールド・プロパティー・エディターを開きます。Basic タブでフィールド名の値を入力し、Advanced タブでフィールドのサイズを入力します。デフォルトのフィールド・サイズは 50 文字ですが、多くのフィールドにはこのサイズでは足りません。そのため、フィールド名とサイズには以下の値を入力してください。

      • name, 512
      • author, 512
      • description, 1024
      • isbn, 17

      内部ではどうなっているかを覗いてみたい場合には、Explorer タブをクリックし、ファイルまでナビゲートして開いてください。ファイルの内容はリスト 1 のようになっているはずです。

      リスト 1
      {
          "collections": {
          }, 
          "fields": {
              "name": {"label": "", "required": false,  "type": "string", 
                  "description": "", "default_value": "", "max_length": 512
              }, 
              "author": {"label": "", "required": false"type": "string", 
                  "description": "", "default_value": "", "max_length": 512
              }, 
              "description": {"label": "","required": false,"type": "string",
                   "description": "", "default_value": "", "max_length": 1024
              }, 
              "isbn": {"label": "", "required": false,  "type": "string", 
                  "description": "", "default_value": "", "max_length": 17
              }
          }
      }

      お使いの WebSphere sMash のバージョンにこの素晴らしい GUI エディター (図 13) がインストールされていない場合には、上記の JSON コードを books.json ファイルに追加してモデルを作成することができます。

      フィールドはもちろん好きなように追加したり、変更したりできますが、このコードの場合の内容を検討してみましょう。

      • fields 要素はモデル定義の必須部分です。そのため、そこになければならないという以外には、ほとんど説明することはありません。
      • 続いて各フィールドに名前が指定され、それぞれのフィールドがデータベース・フィールドを表します。
      • さらにそれぞれのフィールドが少なくとも型で修飾されます。
      • このコードには少々メタデータを追加し、各ストリングの max_length を定義しています。デフォルトの max_length は 50 文字なので、ほとんどすべてのストリング・フィールドには最大長の値を設定し直さなければなりません。
      • 明示的に識別されたフィールドの他、さらに以下の 2 つのフィールドが自動的に作成されることになります。
        • id フィールド。100 から自動的に増分される整数フィールドで、このデータ・インスタンスの固有 ID として作成されます。
        • updated フィールド。インスタンスの最終更新のタイムスタンプが入るフィールドです。
  4. データ・モデルを同期させる

    次はモデルを同期させて、データベースを作成するために必要な SQL を生成して実行する段階です。それにはコマンドラインを使用することも、AppBuilder 内部から行うこともできます。いずれの方法にしても、実行するコマンドは zero model sync なので、同じ出力結果となります。ここでは、AppBuilder を使用した場合の方法を説明します。

    1. 先頭の Console タブをクリックし、次に左側のナビゲーション・バーで Command Prompt リンクをクリックします。

    2. Enter a zero command text フィールドzero model sync と入力してから、緑の Enter ボタンをクリックします。出力結果はリスト 2 のようになります。

    リスト 2
    Available commands: zero,svn,clear,help
    * Commands are run from the current application root directory. 
    command> zero model sync
    CWPZC9225I: Using default Derby database configuration. Located at -> db/resource in 
    	application root.
    CWPZC9223I: Found 1 model types
    CWPZC9212I: Created table -> BOOKS for Type -> books using SQL ->
        CREATE TABLE books (
            name VARCHAR(512),
            author VARCHAR(512),
            description VARCHAR(1024),
            isbn VARCHAR(17),
            id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 100, 
    	INCREMENT BY 1) NOT NULL,
            updated TIMESTAMP NOT NULL
        )
    
    CWPZT0600I: Command model sync was successful

    これで見事に空のモデルが作成されました。自分を褒めてあげてください。

  5. モデルにデータを追加する

    今度はモデルにデータを入力して、アプリケーションを実行したときに表示される内容を用意します。それには、app/models/fixtures ディレクトリーにロード・ファイルを作成する必要があります。これらのデータ・ファイルもリソース・モデル定義ファイルと同じく JSON ファイルで、モデルにロードされるオブジェクトが含まれます。データ・ファイルならではの特徴は、数種類のリソース・モデルのデータを含められることです。例えば、他に「authors」というモデルがある場合、データ・ファイルには「books」モデルと「authors」モデル両方のデータを含められます。

    1. モデルにロードするデータ・ファイルを作成するには、Recent Files ボックス内の New File リンクをクリックしてから Other File を選択します (図 14)。

      図 14. データ・ファイルの作成
      データ・ファイルの作成
    2. この場合も File Create ダイアログ (図 10) が表示されるので、作成するデータ・ファイルのパスとファイル名を入力します。この例で設定するパスは /app/models/fixtures、ファイル名は load.json です。ライブラリーの出発点として、このファイルにはとりあえず 2 冊の本についてのデータを入力します (リスト 3 を参照)。

      リスト 3
      [
          {
              "type": "books",
              "fields": {
                  "name": "Programming Portlets",
                  "author": "Ron Lynn, Joey Bernal, Peter Blinstrubas, Usman Memon, 
      			Cayce Marston, Tim Hanis, Varad Ramamoorthy, and Stephan 
      			Hepper",
                  "description":  "Shameless plug",
                  "isbn": "978-1-931182-28-7"
              }
          },
          {
              "type": "books",
              "fields": {
                  "name": "The Pragmatic Programmer",
                  "author": "Andrew Hunt and David Thomas",
                  "description":  "Good stuff",
                  "isbn": "0-201-61622-X"
              }
          }
      ]
    3. app/models/fixtures ディレクトリーに置かれたデータ・ファイルをモデルにロードするには、zero model loaddata <filename> コマンドを実行します。同じくコマンドラインに移動するか、AppBuilder コンソールを使用するかのどちらかの方法で、以下のコマンドを実行してください。

      command> zero model loaddata load.json

      どの方法でコマンドを実行したかに関わらず、リスト 4 のようなメッセージが表示されます。このメッセージが、ロードが正常に完了したことを示します。

      リスト 4
      command> zero model loaddata load.json
      CWPZC9225I: Using default Derby database configuration. Located at -> 
      	db/resource in application root.
      File -> C:\zero\CardCatalog\app\models\fixtures\load.json
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {description=Shameless plug, isbn=978-1-931182-28-7, 
      	name=Programming Portlets, author=Ron Lynn, Joey Bernal, Peter 
      	Blinstrubas, Usman Memon, Cayce Marston, Tim Hanis, Varad 
      	Ramamoorthy, and Stephan Hepper}
      
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {description=Good stuff, isbn=0-201-61622-X, name=The Pragmatic 
      	Programmer, author=Andrew Hunt and David Thomas}
      
      CWPZT0600I: Command model loaddata was successful
    4. ブートストラップ・データ (新しく作成したモデルで常に必要となるデータ) がある場合、またはブートストラップ・データを作成したい場合には、app/models/fixtures ディレクトリーに initial_data.json という名前を付けたファイルを作成します。この特殊なデータ・ファイルは、データベースが作成または再作成されると常にロードされるため、上記のデータをロードするステップが必要なくなります。自動的にロードされるという点以外には、initial_data.json に他のデータ・ファイルとの違いはありません。この重宝な機能は、ZRM を使用してアプリケーションを開発する際に時間を節約してくれます。

    データがロードされたら、データのテストに取り掛かれますが、その前にちょっとした現状の確認をするのにも、今がよいタイミングです。

  6. モデル設計を繰り返す

    経験から言うと、通常、適切なデータ・モデル設計に作り上げるまでには、プロジェクトの間中何度もデータ・モデル設計を繰り返すことになります。そのため、このプロセスを楽しくするとまではいかなくても、その苦痛を和らげるいくつかの機能を紹介したいと思います。

    zero model sync コマンドは、いつでも好きなときに実行できます。それまでに作成されたモデルがあったとしても、作成済みのモデルはそのまま残し、新しいモデルが作成されます。モデルを変更する場合でも、このコマンドは作成済みのモデルに影響しません。

    一例として、「books」モデルに注釈用のフィールドを追加するとします。その場合、単純にモデルを編集してフィールドを追加することになります。これは GUI エディターでは簡単な作業で、前にフィールドを追加したときと同じように notes フィールドを追加して、サイズを 1024 に設定するだけの話です。もう 1 つの方法としては、リスト 5 に示すようにファイルを編集します。

    リスト 5
    {
        "fields" : {
            "name": {"type": "string", "max_length": 512}, 
            "author": {"type": "string", "max_length": 512}, 
            "description": {"type": "string", "max_length": 1024}, 
            "isbn": {"type": "string", "max_length": 17},
            "notes": {"type": "string", "max_length": 1024}
        }
    }

    これで zero model sync を実行すると、モデルはすでに存在することから、何の変更も行われないことがわかります (リスト 6)。

    リスト 6
    command> zero model sync
    CWPZC9225I: Using default Derby database configuration. Located at -> db/resource in 
    	application root.
    CWPZC9223I: Found 1 model types
    CWPZC9224I: Type -> books already created with table name -> books
    CWPZT0600I: Command model sync was successful

    sync コマンドは既存のモデルを変更しないので、モデルの変更を反映させるには zero model reset コマンドを実行する必要があります。このコマンドを実行すると、テーブルが削除されてから作り直されます (リスト 7)。

    リスト 7
    command> zero model reset
    CWPZC9225I: Using default Derby database configuration. Located at -> db/resource in 
    	application root.
    CWPZC9223I: Found 1 model types
    CWPZC9215I: Executed SQL ->
        DROP TABLE books
    
    CWPZC9212I: Created table -> BOOKS for Type -> books using SQL ->
        CREATE TABLE books (
            name VARCHAR(512),
            author VARCHAR(512),
            description VARCHAR(1024),
            isbn VARCHAR(17),
            notes VARCHAR(1024),
            id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 100, 
    	INCREMENT BY 1) NOT NULL,
            updated TIMESTAMP NOT NULL
        )
    
    CWPZT0600I: Command model reset was successful

    この記事がカンファレンスでのセッションだとしたら、この時点で同じ疑問を持った何十人もの出席者が揃って手を挙げることでしょう。その質問は、「テーブル内のデータはどうなるのか」というものです。それに対する私の答えは、「データは破棄され、消えてなくなります」です。するとさらに、「そのデータを維持する必要があるとしたらどうするのか」という質問攻めにあうはずですが、問題はありません。その場合には、WebSphere sMash がカバーしてくれています。

    データを維持するには、SQL についてどれだけの知識があるかによって、実際には 2 つの方法があります。1 つは、zero.data を使用して直接データベース・テーブルを更新するという方法ですが、これはこの記事の範囲外なので、Project Zero の Web サイトで用意しているドキュメントを読んでください。

    もう 1 つの方法は、データをファイルにダンプし、モデルを変更してリセットしてから、ダンプしたデータを新しいモデルに再ロードするというものです。

    1. データのダンプは、zero model dumpdata コマンドを実行すると、以下のように至って簡単に完了します。

      command> zero model dumpdata app/models/fixtures/exported.json
      CWPZT0600I: Command model dumpdata was successful

    2. 次に、モデルを更新して変更内容を反映させます。この例の場合は、「published」という名前の新しいデータ・フィールドを追加してから、zero model reset コマンドを実行するだけで済みます (リスト 8)。

      リスト 8
      command> zero model reset
      CWPZC9225I: Using default Derby database configuration. Located at -> 
      	db/resource in application root.
      CWPZC9223I: Found 1 model types
      CWPZC9215I: Executed SQL ->
          DROP TABLE books
      
      
      CWPZC9212I: Created table -> BOOKS for Type -> books using SQL ->
          CREATE TABLE books (
              name VARCHAR(512),
              author VARCHAR(512),
              description VARCHAR(1024),
              isbn VARCHAR(17),
              notes VARCHAR(1024),
              published DATE,
              id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 
      	100, INCREMENT BY 1) NOT NULL,
              updated TIMESTAMP NOT NULL
          )
      
      
      CWPZT0600I: Command model reset was successful
    3. 「published」フィールドはこの時点で、使用可能になっていることに注目してください。上記のコマンドが完了したら、前にデータをロードしたときと同じように、zero model loaddata コマンドを使用してエクスポートしたデータをリロードします (リスト 9)。

      リスト 9
      command> zero model loaddata exported.json
      CWPZC9225I: Using default Derby database configuration. Located at -> 
      	db/resource in application root.
      File -> C:\zero\CardCatalog\app\models\fixtures\exported.json
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {notes=null, description=Shameless plug, 
      	isbn=978-1-931182-28-7, updated=2008-10-03 10:20:15, name=Programming 
      	Portlets, id=100, author=Ron Lynn, Joey Bernal, Peter Blinstrubas, Usman 
      	Memon, Cayce Marston, Tim Hanis, Varad Ramamoorthy, and Stephan Hepper}
      
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {notes=null, description=Good stuff, isbn=0-201-61622-X, 
      	updated=2008-10-03 10:20:15, name=The Pragmatic Programmer, id=101, 
      	author=Andrew Hunt and David Thomas}
      
      CWPZT0600I: Command model loaddata was successful

    これで、モデルは更新されて、データも維持されることになります。しかしこれで終わりではありません。データには値を含めていなかったため、データ・フィールドに入力する作業がまだ残っています。

    ここからは、新しいデータ・モデルを RESTful なサービスとして簡単に公開する方法を説明します。

RESTful なサービスを作成する

モデルを RESTful なサービスとして公開するために、ZRM では素晴らしく簡単な方法を用意しています。この方法では、たった 1 行のコードを作成するだけでデータ・モデルが公開されます。

  1. ファイル・エディター (図 14) に戻り、今度は New Fileをクリックして新しいファイルを作成します。今回選択するのは、Resource Handler in /app/resources です。モデルの名前は「books」となっているので、このハンドラーにも同じ名前を付ける必要があります (図 15)。

    図 15. リソース・ハンドラーの作成
    リソース・ハンドラーの作成
  2. エディターが表示されたら、以下のコード行を books.groovy ファイルに入力し、その他のコードはすべて削除します。

    ZRM.delegate()

    データ・モデルをサービスとして公開するために必要なのは、このたった 1 つの呼び出しだけです。

  3. 早速アプリケーションを起動して、その機能を確かめてみましょう。AppBuilder の右上隅にある緑の矢印アイコンの横に表示された Start リンク (図 16) をクリックしてください (この Start ボタンのすぐ横には URL とポート番号も表示されています。この情報はこの後、サービスをテストするときに必要になります)。

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

    Start ボタンが Stop ボタンに変われば、アプリケーションが起動したことになります。

    WebSphere sMash の大きな利点の 1 つは、起動したアプリケーションでは変更が自動的に適用されるため、コードなどに変更を加えた後にアプリケーションを停止して、再起動する必要がないことです。アプリケーションが起動したら、いよいよテスト段階です。このサービスで何ができるのかを確かめてください。

LCRUD をテストする

ここでは、RESTful なサービスの一覧表示関数、作成関数、更新関数、そして削除関数をテストする 2 つの方法を検討します。最初の方法では、Poster のようなツールを使用します。Poster は Firefox のアドオンで、RESTful な呼び出しを実行し、返された JSON オブジェクトを確認することができます。これは RESTful なサービスの開発者にとって、非常に便利なツールです。2 番目の方法では、WebSphere sMash の Dojo datagrid ウィジェットを使用して、単純なユーザー・インターフェースをサービスに追加します。

Poster

Poster は、クライアントと RESTful なサービスとの間で行われる通信の核心にまで踏み込む素晴らしいツールですが、あまりユーザー・フレンドリーではありません。

Poster は Firefox のアドオンで、Web ベースの GUI を一切使わずに RESTful なサービスを調べて、テストすることができます。Poster をダウンロードした後 (「参考文献」を参照)、以下の手順に従ってください。

  1. Poster を開きます。ヒント: Poster がインストールされている場合、Firefox ウィンドウの下部に小さい「P」アイコンが表示されます。このアイコンをクリックすると、Poster が開きます。

  2. Poster の URL 欄には、AppBuilder の右上隅に表示されているホストとポート番号を使って http://localhost:8080/resources/books と入力します。

  3. GET アクションの横にある GO ボタンをクリックします (図 17)。

    図 17. Poster の実行
    Poster の実行

    すると Poster は、新しく作成されたサービスにリクエストを送信し、データベース内のすべての本のリストを返します (図 18)。

    図 18. Poster のレスポンス
    Poster のレスポンス

    Poster を使ってサービスを行うと、さまざまなことができます。

    • id を基準に本を取得するには、以下のような URL を使用します。
      http://localhost:8080/resources/books/100
      上記では、id が 100 に設定された本を取得します。
    • 以下のようにフィールドを基準にしてリクエストをフィルタリングすることができます。
      http://localhost:8080/resources/books?name__startswith=Programming
      または、http://localhost:8080/resources/books?name__contains=Port.
      これらのフィルターは、モデルのフィールドでも使用することができます。フィルタリング・パラメーターを網羅したリストについては、projectzero.org に記載されている zero リソース・フィルター条件を参照してください。
    • Poster を使って新しいデータを作成することもできます。それには、元のリストの URL に戻ればよいだけです。
      http://localhost:8080/resources/books.
  4. コンテンツ・タイプ (Content Type) は application/json に、アクション (Actions) は POST メソッドに、そして送信するコンテンツ (Content to Send) はリスト 10 のデータに設定します。

    リスト 10
    {“name”:”Dojo:  The Definitive Guide”,”author”:”Matthew A. Russell”,
    ”description”:”“,”isbn”:”978-0-596-51648-2”,”notes”:”Loaned to Kevin”}

    設定し終わると、図 19 のような内容になっているはずです。

    図 19. データの新規作成
    データの新規作成

    POST アクションの横にある GO ボタンをクリックすると、図 20 のようなレスポンスが表示されます。

    図 20. Post のレスポンス
    Post のレスポンス
  5. もう一度、本を一覧表示してみると、新しい本が一覧の中に確認されるはずです (図 21)。

    図 21. 新規データの表示
    新規データの表示

おっと!操作を誤ってしまいました。図 21 の結果には新しい本が 2 回続けて表示されていることから、GO ボタンを何回かクリックしてしまったに違いありません。しかしこれは不幸中の幸いで、これを使ってレコードをサービスから削除する方法を説明できます。

  1. 図 21 を見ると、入力した本の重複したレコードは、id の値がそれぞれ 102 と 103 に設定されたレコードであることがわかります。id が 103 の本を削除するには、項目 103 を指すように URL を設定し、メソッドを DELETE メソッドに変更して GO をクリックするだけです。削除に成功すると、200 レスポンス・コードが表示されます。

    図 22. レコードの削除
    レコードの削除
  2. LCRUD でまだ調べていないのは、更新操作だけとなりました。更新を行うには、PUT アクションを使用します。この例では、前の手順で入力した本を更新します。「Kevin」が記事のこの部分を読んだ後、本を返却したからです。更新する場合も同じく、URL に更新対象の特定の本を指定し、コンテンツ・タイプ (Content Type) とアクション (Actions) をそれぞれ application/jsonPUT に設定して、更新するコンテンツを送信します (図 23)。

    図 23. データの更新
    データの更新

    すべてのフィールドを送信しないと、一部のデータが消去されてしまうことに注意してください。

Datagrid

ユーザー・フレンドリーな Dojo コンポーネント、datagrid を使用する場合の手順は以下のとおりです。

  1. まず始めに、Dojo をプロジェクトに追加します。Dependencies タブを表示して、Add をクリックしてください。zero.dojo モジュールを見つけてこれを選択し、Add をクリックします (図 24)。この操作によって、zero.dojo が依存関係の 1 つとして表示されます。

    図 24. 依存関係
    依存関係
  2. 次に、/public ディレクトリーに新しい HTML ページを作成し、リスト 11 のコンテンツを入力して datagrid.html という名前を付けます。

    リスト 11
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Testing with the Datagrid</title>
        <script type="text/javascript" src="/dojo/dojo.js"
            djConfig="parseOnLoad: true"></script>
        <script type="text/javascript">
            dojo.require("dojo.parser");
            dojo.require("zero.resource.DataStore");
            dojo.require("zero.grid.DataGrid");
        </script>
        <style type="text/css">
            @import "/dijit/themes/soria/soria.css";
            @import "/dojo/resources/dojo.css";
            @import "/zero/grid/DataGrid/DataGrid.css";
            @import "/dojox/grid/_grid/Grid.css";
            @import "/dojox/grid/_grid/soriaGrid.css";
        </style>
    </head>
    <body class="soria">
        <!-- DataStore instance -->
        <div dojoType="zero.resource.DataStore" jsId="bookstore"
             contextRoot="" resourceCollection="books"></div>
    
        <!-- DataGrid instance -->
        <div dojoType="zero.grid.DataGrid" id="datagrid"
            store="bookstore" style="width: 600px; height: 300px;"></div>
    </body>
    </html>
  3. サーバーをまだシャットダウンしていないという前提で、上記の作業が終わったら新しいブラウザーに URL、http://localhost:8080/datagrid.html を入力します。すると、データベース内にあるすべての本のリストが表示されます。これで完了です。

この datagrid には LCRUD操作を支援するさまざまな機能があります。上記の簡単な例で、組み込み Dojo ウィジェットを備えたデータ・ストア、あるいは独自のカスタム Dojo ウィジェットとして RESTful なサービスを使用する基本的な方法を理解していただけたと思います。これを出発点とすれば、RESTful なサービスと対話する動的ユーザー・インターフェースを難なく作成できるはずです。


まとめ

この記事では、WebSphere sMash を使って、本の Derby データベースへの動的ユーザー・インターフェースと RESTful (REpresentational State Transfer) なインターフェースを作成し、独自の単純な目録作成システムを組み立てていく方法を説明しました。この演習を通して、通常の LCRUD (list、create、retrieve、update、delete) 操作を実行する方法を学びましたが、それにも増して、私たちがこのサンプルを組み立てたときと同じように、皆さんにもこの新しいソフトウェア製品を楽しく体験してもらえることを期待しています。


ダウンロード

内容ファイル名サイズ
Sample application filesCardCatalog-1.0.0.zip100 KB

参考文献

学ぶために

製品や技術を入手するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere, Web development
ArticleID=349799
ArticleTitle=本のライブラリーを sMash する
publish-date=10082008