MOSA Developer News [MOSADeN=モサ伝] 2002-12-17 第35号

新居雅行のJava Watch on the X-C #011

WebObjects 5.2に加わった
Direct to Web Servicesを使う

2002年 12月 12日 木曜日
新居雅行(msyk@msyk.net)


WebObjects 5.2を利用して、Webサービスを利用し、それにクライアントからアクセスするための一連の手順を紹介します。WebObjects 5.2とOpenBaseが稼働している環境では、この手順に従って作業をすることで、Webサービスを実際に動かすことができます。どんな機能なのかの概要を知りたい場合、あるいはデモをしなければならない場合などにご参考にしてください。

ここでは、OpenBaseで最初から用意されているデータベースであるWOMoviesを利用します。データベース自体は通常は最初から稼働していますが、稼働しないようにしているのであれば、OpenBase Managerで稼働させるなどの準備を行ってください。

EOModelerであらかじめモデルファイルを作成

/Developer/ApplicationsにあるEOModelerをダブルクリックして起動します。起動後、FileメニューのNew(Command+N)を選択して、新たにモデルを作成します。最初にNew Model Wizardが起動して、対話式に設定を行います。最初のダイアログボックスでは使用するアダプタを選択するので、ここではOpenBaseを使うためにJDBCを選択してNextボタンをクリックします。

続いてJDBCの接続設定を行うダイアログボックスが表示されます。同じMacで稼働しているOpenBaseに対して接続をする場合は、以下のようにURLを入力すればいいでしょう。接続するデータベースの名前はWOMoviesなので、パスとしてデータベース名を指定をします。ユーザ名とパスワードは初期状態では設定されていないので空欄にします。本来はDriverは指定する必要があるのですが、OpenBaseでは指定しなくても使えます。入力すればOKボタンをクリックします。

次のようなダイアログボックスが表示されるので、ここではチェックをすべてはずしておいて、Nextボタンをクリックします。今回は単に1つのテーブルだけを利用するので、基本的にはそれで問題はないはずです。

モデルに含めるテーブルを選択するダイアログボックスになるので、ここではすべてを選択しておきます。最初から選択されているので、操作としてはFinish{タンをクリックするだけです。

モデルファイルのウインドウが表示されました。テーブルがエンティティとして並んでいるのが見えます。

FileメニューのSave(Command+S)を選択して、モデルをファイルとして保存します。ファイル名やフォルダは適当でかまいません。後でモデルファイルをダイアログボックスで指定するので、ホームフォルダなど分かりやすいところに置いておくのがいいでしょう。

以上で利用するデータベース、WOMoviesのモデルファイルが作成されました。

Webサービスを提供するアプリケーションを作る

続いて、Project BuilderでWebサービスを提供するサーバアプリケーションを作成します。Project Builderで、ファイルメニューから新規プロジェクト(Command+Shift+N)を選択します。プロジェクトの新規作成のためのアシスタントが表示されます。まず最初に、WebObjectsのグループにあるDirect to Web Services Applicationを選択します。そして、次へボタンをクリックします。

プロジェクト名やプロジェクトを保存するフォルダは、適当に設定しておき、次へボタンをクリックします。

Java2 EEとの統合の設定を行いますが、ここではJava2 EEのコンポーネントは利用しないので、チェックは入れないで、そのまま次へボタンをクリックします。

使用するEOAdaptorを選択します。ここでは、最初からJDBCのフレームワークだけが選択されているので、そのまま次へボタンをクリックします。

フレームワークの選択となっていますが、必要なフレームワークは最初から設定されているので、そのまま次へボタンをクリックします。

EOModelの選択となっています。ここでは、まず、Addボタンをクリックして、さきほどWOMoviesデータベースをもとに作成したモデルファイルを選択してリストに追加します。

ファイルを指定するダイアログボックスが表示されるので、さきほどEOModelerで作成したモデルファイルのWOMovies.eomodeldを選択してChooseボタンをクリックします。

アシスタントの最期の画面になります。Build and launch project nowのチェックボックスをはずして、Finishボタンをクリックします。

アプリケーションのプロジェクトが作成されました。ResoucesグループにあるPropertiesファイルをクリックして選択します。そのファイルの内容を一部修正します。

まず、#WOAutoOpenInBrouser=true という記述を、WOAutoOpenInBrouser=false とします。これによって、Webアプリケーション起動時に自動的にブラウザを開いてアプリケーションに接続するという処理を行わなくなります。

そして、#WOPort=55555 という記述を、WOPort=8080 にします(ここでは8080にしましたが、8080も使っていることもあるので、たとえば WOPort=5555 のように指定する方が問題ないでしょう)。イコールの右は、TCPのポート番号で、開発マシンで使用していないポート番号を指定します。なお、80にすると、起動時にそのポートが使っているというエラーが出るので、ここでは80は指定しないでおきます。

Command+Rなどでアプリケーションを実行します。とりあえずは、ソースはまったく変更しなくて、いきなり起動します。これで、データベースをWebサービスとして公開するアプリケーションが開発マシン内で動き出しています。Webサービスの設定は別途、ユーティリティを使って行います。

Webサービスとしての動作をユーティリティで設定

/Developer/ApplicationsにあるWebServicesAssistantを起動します。少し待つと、URLを指定するダイアログボックスが表示されるので、サーバのアドレスとポートを指定します。ここでは同じマシンでWebサービスが提供されているので、アドレスはhttp://localhostとなります。ポートは、さきほどPropertiesファイルでWOPortのパラメータとして指定した数値を指定します。ここでは、8080を指定します。

正しく接続できれば、次のような設定のウインドウが表示されます。

最初からサービスが1つ提供されていますが、ここでは新たにNew Serviceアイコンをクリックして、新たなサービスを追加します。すると、Service Nameなど、サービスの設定を行うコントロール類が表示されます。Service NameとしてはgetMovieInfoとしておきます。そして、Public Entityesでは、ここで使用するテーブルを指定しますが、右側でMovieを選択して、←のボタンをクリックして、左側のリストに登録しておきます。

続いて、New Operationアイコンをクリックして、新しいオペレーションを追加します。ここでのオペレーションはメソッドに対応するものです。

New Operationボタンをクリックすると次のようなダイアログボックスが出てきます。Nameにはメソッド名としてgetMovieを指定します。そして、Entityとしてデータを取り出すテーブルであるMovieをポップアップメニューから選択します。Typeは検索処理をさせるのでsearchのままでいいでしょう。ServicesはgetMovieInfoが選択されているのを確認してOKボタンをクリックします。

OKボタンをクリックすると、次のように、このオペレーション(メソッド)の設定を行う画面に切り替わります。

まず、Return SOAP Structureのチェックボックスをオンにしておきます。

Argumentsのタブでは、メソッドを呼び出すときのパラメータを指定します。ここでは、categoryフィールドをパラメータとしてメソッドを呼び出すことにします。Operatorでは=を選択しましたが、これにより、パラメータに与えたデータと同じデータがcategoryフィールドにあるレコードをだけを抽出するメソッドとなります。右側でcategoryを選択して、←ボタンをクリックすることで、パラメータとして左がに登録されます。

Return Valuesのタブでは、メソッドの実行を行った結果戻すデータを規定します。ここでは、titleフィールドの値を戻すことにします。右側でtitleを選択して、←ボタンをクリックすることで、戻り値に含めるフィールドとして左がに登録されます。

以上で、Webサービスのメソッドが定義されました。Testボタンをクリックすると、メソッド呼び出すのテスト用のウインドウになります。ここで、CategoryにActionなどと実際に存在するデータを入力して、Testボタンをクリックすると、Resultのところに、取り出されたデータが表示されます。これは、実際にWebサービスを利用した結果となります。

以上の作業で、Webサービスのメソッドが1つ追加されました。まったくプログラミングは行っていません。Webサービスのサーバを単に用意し、その動作はユーティリティで規定するだけです。

なお、ここでFreezeボタンをクリックすることで、メソッドの処理をソースとして書き出すことができます。これにより、あるメソッドをJavaプログラムでカスタマイズできます。複雑なロジックがからむメソッドでも、パラメータと戻り値といったインタフェース部分をユーティリティで設定して、その後にFreezeさせて、さらにプログラムを作り込むといったことができます。

日本語の問題についての暫定的な解決

なお、このままだと日本語のデータでは問題がでるようです。レスポンスのエンコードをUTF-8にすることで、データベースからの取り出しについてはとりあえずうまく行くようです。ただし、Application.javaのソースの、Applicationクラスのコンストラクタに以下のコードを入れておけば、データベースにある日本語の文字列はとりあえずうまくいくということのようです。

WOMessage.setDefaultEncoding("UTF-8");

しかしながら、更新や追加のときにクライアントからデータを送る場合については、確実なやり方はまだ見つかっていないようです。おそらく、Knowledge BaseやTIL等でいずれ公開されるでしょうから、日本の開発者にとっては要チェックな情報となるでしょう。

Webサービスのクライアント

WebObjects 5.2は、Webサービスのクライアント機能も含まれていますが、もっと簡単にクライアントを作る方法としては、AppleScriptを利用することです。AppleScriptを利用すると、コマンド1つでWebサービスを呼び出すことができます。AppleScriptを使ったWebサービス利用は、送信パラメータとして、レコード型やリスト型でデータを与えて、Webサービスからの結果はレコードないしはリスト型のリストというようになっています。つまり、行きも帰りもAppleScriptのデータタイプで処理されるので、Webサービスを使っていても、XMLは目にしないというわけです。

以下はプログラムの例です。

ポイントはcall soapコマンドですが、コマンドを出す相手をtellで指定します。アプリケーション名はURLを指定しますが、ドメイン名に加えて、背後で動いているWebサービスアプリケーションのパスをまず続けて指定します。つまり、/cgi-bin/WebObjects/WOText.woa が稼働しているWebアプリケーションです。さらに、ws と続けて、引き続いてサービス名の getMovieInfo を指定することで、アシスタントで定義したWebサービスを利用できます。

call soapコマンドの引数はいくつか指定が必要ですが、とりあえずテストをするだけなら、method nameとparametersだけでもOKです(Appleのサンプルプログラムでは、他にいくつかの設定が含まれています)。parametersでは、パラメータ名とデータを指定したレコードになっていなければなりません。なお、AppleScriptの後半はcall soapで得られた結果(the result)を単にイベントログに1行ずつ書き込むために記載したもので、call soapの結果をたとえばイベントログや結果ウインドウで表示するのでもかまわないでしょう。call soapで得られた結果は、レコードのリストとなっています。repeatで1つ1つのリストの項目を取り出すと、そのデータはレコードです。データベース側でも1レコードに対応していますが、ユーティリティのResult Valuesで指定したPublic Nameを手がかりにして、レコード型のデータからtitle ofで項目を取り出せば、その文字列はtitleフィールドのデータになっているというわけです。

謝辞

いくつかの情報と示唆をいただいた有限会社テクニカル・ピットの倉橋浩一さんに、この場を借りてお礼を申し上げます。

関連情報


2002年 12月 12日 木曜日