■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2009年01月12日 Java総合講座 - 初心者から達人へのパスポート vol.135 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ [このメールマガジンは、画面を最大化して見てください。] ======================================================== ◆ 01.SOAPのアプリケーション(Webサービス) ======================================================== では、今回からは、実用的なアプリケーションに近い例を用いてWebサービス の開発手順を学んでいくことにしましょう。(ただし、話を簡単にするために、 アプリケーションは、なるべく単純化します。) アプリケーションとしては、旅行の予約システムを考えることにします。 皆さんが旅行するとなると、旅行会社のパック旅行を利用するか、あるいは、旅行会社 に行き先と日にちを伝えて、ホテルや交通機関の予約を取ってもらうのが普通ではない でしょうか。 パック旅行も、最近のものはホテルや交通機関にいくつかの選択肢があって、自分で 好みのものを選べるものが多くなってきましたね。 このとき、たとえばホテルの予約が必要なときは、旅行会社は、お客様からの希望や日にち を元に、希望条件に合うホテルを探して客室の空き具合をホテルに確認します。そして、 空き部屋のあるホテルをお客様に知らせて、お客様から承諾をもらった上で、ホテルに客室 の予約を取ります。 これをいちいち電話などで行っていたのでは煩雑ですし、旅行会社の担当者やホテル側が 途中で話を取り違えて間違った予約をしてしまうという問題も起こります。 そこで、ホテル側が空き部屋の検索や予約をWebサービスにして提供し、旅行会社がその Webサービスを呼び出してホテルの検索や予約を行うようなシステムを組んでおけば、 煩雑さが軽減し、間違いも減少します。 さらには、旅行会社の予約サービスをWebアプリケーションで提供するようにして、お客様 がホテルなどの予約も含めた旅行の予約を自分で直接行えるようにしておけば、さらに 作業が削減され、旅行会社がお客様の要望を取り違えるといった間違いもなくなります。 というわけで、ホテルを経営する会社(仮にH社とする)がホテルの客室の予約業務をWebサー ビスの形で提供することにし、それに合わせて旅行会社(仮にR社とする)も旅行の予約業務 をWebアプリケーションの形で提供するという場面を想定して、お話していくことにします。 まず、Webサービスのサーバー側、クライアント側に、それぞれ下記のような システムを考えることにしましょう。 サーバー側(H社側): Webサービスとして以下のようなシステムを考える。 (H_1) ホテルの空き部屋の検索: 宿泊開始年月日、宿泊日数、宿泊人数、などを入力すると、該当するすべての 空き部屋の情報(部屋番号など)を返してくれる。 (H_2) ホテルの客室の予約: 部屋番号、宿泊開始年月日、宿泊日数、宿泊者(複数の場合は代表者)の氏名・住所・ 電話番号、宿泊人数を入力すると、該当する部屋の予約を取ってくれる。 クライアント側(R社側): Webアプリケーションとして以下のようなシステムを考える。 (R_1) 旅行の検索&予約: 出発地、行き先、旅行開始年月日、旅行日数、旅行者人数などを入力すると、適切な 交通経路と交通機関、ホテルなどの候補リストを表示してくれる。また、候補リスト から選択したホテルや交通機関などに対して、予約ができる。 ところで、近年のビジネスはスピードが勝敗の大きな要因の一つといわれており、 新しいサービスを提供するためのアプリケーションも、他社よりも早く開発して 提供することが望まれます。 ホテル側も、開発するWebサービスはいち早くクライアントに使ってもらいたいし、 旅行会社も、利用できるWebサービスがあれば、いち早くWebアプリケーションに 組み込んで、顧客が利用できるようにしておきたいものです。 そのためには、Webサービスのインターフェースを先に決定しておき、それに 基づいて、サーバー側、クライアント側ともにアプリケーションを開発していく (クライアント側もサーバー側のWebサービスが完成する前から開発を進められる) という手順を取ります。 このインターフェースは、Javaでは文字通りinterfaceというキーワードを使って定義 できるのでしたね。(忘れた人はvol.021を参照) このインターフェースさえ決めてしまえば、AxisではWSDLを自動生成することが でき、WSDLがあればクライアント側はWebサービスのインターフェースを知ること ができるので、Webサービスを呼び出すアプリケーションを開発していくことが できます。 というわけで、まず、Webサービスのインターフェースを決定しておきましょう。 ただし、このWebサービスでは、メソッドの引数や戻り値が少々複雑になります (実用的なアプリケーションではこれが普通だが)ので、引数や戻り値を構造体 (複数のデータを持つ構造を型にしたもの)として表現することにします。 (構造体はC言語やC++ではstructという型を使って表現しますが、Javaではクラス を使います。) たとえば、上記H_1のメソッドの引数は、 宿泊情報(構造体):StayInfoInput というクラスにしておき、H_1のメソッドの戻り値は、 空き部屋の情報(構造体):RoomInfo というクラスの配列にしておきましょう。(配列にするのは、候補となる部屋が複数 ありえるからです。) そして、これらそれぞれのクラスには、 [宿泊情報(構造体):StayInfoInputに含まれるデータ] 宿泊開始年月日(YYYYMMDD形式):startDate 宿泊日数:numOfNights 同室宿泊人数:numOfLodgers 最低料金(1泊1人当たり):minRatePerNight 最高料金(1泊1人当たり):maxRatePerNight 設備等:facilities:部屋の種類、Web(インターネット)閲覧の可否など(Facilities型) ただし、Facilitiesという型は別のクラスとして定義しておきます。 [空き部屋の情報(構造体):RoomInfoに含まれるデータ] 部屋番号:roomNum 定員:capacity 料金(1泊1人当たり):chargePerNight 部屋の種類:roomType:シングル、ダブル、ツイン、スイート、など Web(インターネット)閲覧の可否:webBrowsable:可(true)、不可(false) のように、複数のデータを変数として持たせることにします。 この程度の数のデータであれば、構造体にするほどのことは無いと思うかも知れません が、現実的なアプリケーションでは、これよりもずっとたくさんの変数が必要になりま すので、煩雑さを避けて管理しやすくするために構造体にするのです。 では、実際にこれらの構造体を作ってみましょう。 Eclipseを起動して、以下のように、クラスを作成してください。 (1) JStudySOAPプロジェクトの配下にjp.co.flsi.lecture.soap.hotelinterface というパッケージを作成し、その配下に次の内容でFacilitiesクラスを 作成します。 -------------------------------------------------------- package jp.co.flsi.lecture.soap.hotelinterface; public class Facilities { public String[] roomTypes; public boolean webBrowsable; } -------------------------------------------------------- (2) 同じくjp.co.flsi.lecture.soap.hotelinterfaceパッケージの配下に 次の内容のStayInfoInputクラスを作成します。 -------------------------------------------------------- package jp.co.flsi.lecture.soap.hotelinterface; public class StayInfoInput { public String startDate; public int numOfNights; public int numOfLodgers; public int minRatePerNight; public int maxRatePerNight; public Facilities facilities; } -------------------------------------------------------- (インターフェースを決定するためと言えども、通常の変数はJavaのinterfaceでは定義 できないので、クラスにするのです。) (3) 同じくjp.co.flsi.lecture.soap.hotelinterfaceパッケージの配下に 次の内容のRoomInfoクラスを作成します。 -------------------------------------------------------- package jp.co.flsi.lecture.soap.hotelinterface; public class RoomInfo { public int roomNum; public int capacity; public int ratePerNight; public String roomType; public boolean webBrowsable; } -------------------------------------------------------- (4) 同様にして、H_2のメソッドの引数として使用するクラス(RoomReserveInfoという 名前にする)をjp.co.flsi.lecture.soap.hotelinterfaceパッケージの配下に 次の内容で作成しましょう。 -------------------------------------------------------- package jp.co.flsi.lecture.soap.hotelinterface; public class RoomReserveInfo { public int roomNum; public String startDate; public int numOfNights; public String name; public String address; public String telNo; public int numOfLodgers; } -------------------------------------------------------- 各変数(フィールド)に対するsetterメソッドやgetterメソッドが無いことと、その 代わりに変数がすべてpublicになっていることに注意してください。 この書き方なら、コーディングが簡単で済みます。 これじゃカプセル化されていないじゃないか、と心配する人もいるかも知れませんが、 心配ありません。 これらのクラスは、あくまでWSDLファイルを自動生成するためだけに使うもので、実際に 実装時に使われるクラスは、逆にWSDLファイルから自動生成されます。(ここらへんは、 次回のお話になります。) では、続いて、Webサービスのメソッドのほうですが、jp.co.flsi.lecture.soap.hotelinterface パッケージの配下にHotelというインターフェース名で、次のような内容のインターフェー スとして作成することにしましょう。 (クラスではなくinterfaceであることに注意して下さい。) -------------------------------------------------------- package jp.co.flsi.lecture.soap.hotelinterface; public interface Hotel { public RoomInfo[] findRooms(StayInfoInput stayInfo); public boolean reserveRoom(RoomReserveInfo reserveInfo); } -------------------------------------------------------- このうち、findRooms()がH_1のメソッドで、reserveRoom()がH_2のメソッドです。 では、これらのファイルからWSDLファイルを自動生成させることにしましょう。 そのために、まず、Antのビルド・ファイルを作成しましょう。 (次回に続く) では、今日はここまでにします。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ★ホームページ: http://www.flsi.co.jp/Java_text/ ★このメールマガジンは 「まぐまぐ(http://www.mag2.com)」 を利用して発行しています。 ★バックナンバーは http://www.flsi.co.jp/Java_text/ にあります。 ★このメールマガジンの登録/解除は下記Webページでできます。 http://www.mag2.com/m/0000193915.html ★このメールマガジンへの質問は下記Webページにて受け付けて います。わからない所がありましたら、どしどしと質問をお寄 せください。 http://www.flsi.co.jp/Java_text/ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Copyright (C) 2009 Future Lifestyle Inc. 不許無断複製 |