■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2008年11月30日 楽しいJava講座 - 初心者から達人へのパスポート vol.129 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ [このメールマガジンは、画面を最大化して見てください。] ======================================================== ◆ 01.SOAPのアプリケーション(Webサービス) ======================================================== 前回のWebService1Clientクラスのソース・コードを少し見ておきましょう。 -------------------------------------------------------- package jp.co.flsi.lecture.soap.client; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import jp.co.flsi.webservice.WebService1; import jp.co.flsi.webservice.WebService1Service; import jp.co.flsi.webservice.WebService1ServiceLocator; public class WebService1Client { public static void main(String[] args) throws RemoteException, ServiceException { WebService1Service locator = new WebService1ServiceLocator(); WebService1 webService = locator.getWebService1(); String[] longArray = new String[] {"munyamunya", "funyafunya"}; String s = webService.searchBestItem(longArray); System.out.println("Result of searchBestItem() = " + s); String itemNumber = "A007"; int quantity = 2; String customerId = "C007"; s = webService.placeAnOrder(itemNumber, quantity, customerId); System.out.println("Result of placeAnOrder() = " + s); } } -------------------------------------------------------- このうち、 WebService1Service locator = new WebService1ServiceLocator(); WebService1 webService = locator.getWebService1(); の部分に注目しましょう。このwebServiceがスタブ(stub)のオブジェクトです。 スタブというのは、Webサービスの代理者(proxy)のようなオブジェクトで、Webサービス の実体がネットワークを隔てて遠隔地にあるのに対し、スタブがクライアントの プログラムと同じコンピューター内にあることによって、Webサービスのオブジェクトが あたかも同じコンピューター内にあるかのように見せかけるものです。 そして、このスタブのメソッドを呼び出すという形式で、遠隔地にあるWebサービスのメ ソッドを簡単に呼び出すことができます。 そして、このwebServiceというオブジェクトはWebService1ServiceLocatorのインスタンス であるlocatorというオブジェクトのgetWebService1()というメソッドを呼び出すことに よって取り出しています。 このgetWebService1()というメソッドを呼び出す段階でWebサービスのURLが指定され、 生成されるスタブ・オブジェクトと実際のWebサービスの実体との結びつきが与えられ ます。 実際に、jp.co.flsi.webserviceパッケージの中のWebService1ServiceLocatorクラスの ソース・コードを覗いて見て下さい。getWebService1()メソッドでは、WebService1_address という変数名を通して"http://localhost:8080/axis/services/WebService1"というURLを 渡していることがわかりますね。そして引数付きのメソッドの場合は、引数で指定されたURL を渡していることがわかります。 というわけで、Webサービスの実体が遠隔地にある場合(ローカルなコンピューターにはない 場合)は、前回もお話したように、このgetWebService1()メソッドの引数としてURLを指定 すればいいことがわかります。 前回は、URLを指定する場合の具体的なソース・コードの例を提示していなかったので、 この場で提示しておきましょう。 -------------------------------------------------------- package jp.co.flsi.lecture.soap.client; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import jp.co.flsi.webservice.WebService1; import jp.co.flsi.webservice.WebService1Service; import jp.co.flsi.webservice.WebService1ServiceLocator; public class WebService1Client { public static void main(String[] args) throws RemoteException, ServiceException { WebService1Service locator = new WebService1ServiceLocator(); WebService1 webService = null; String url = "http://localhost:8080/axis/services/WebService1?wsdl"; try { webService = locator.getWebService1(new URL(url)); } catch (MalformedURLException e) { e.printStackTrace(); } String[] longArray = new String[] {"munyamunya", "funyafunya"}; String s = webService.searchBestItem(longArray); System.out.println("Result of searchBestItem() = " + s); String itemNumber = "A007"; int quantity = 2; String customerId = "C007"; s = webService.placeAnOrder(itemNumber, quantity, customerId); System.out.println("Result of placeAnOrder() = " + s); } } -------------------------------------------------------- ここで、URLのパッケージ名は以前にもお話したようにjava.netですが、いつものように コンテンツ・アシストを使えば自動的に出てきますね。 また、MalformedURLExceptionを処理しなければならないことは前回お話しなかった けれど、これを処理しないことにはnew URLの部分がエラーになる(赤色の下線が現れる) ことからわかりますね。こういう場合は、以前もお話したように、赤色の下線のところに カーソルを置いて、Ctrl + 1を押してから「try/catchで囲む」を選択すれば、自動的に try/catch文が挿入されるのでしたね。 実際、上のソース・コードでもそうやってtry/catch文を生成しています。 そこだけ、e.printStackTrace();という文が使われていることからもわかると思います。 このe.printStackTrace();を使っている部分は、実用的なアプリケーションではLog4Jと いうオープン・ソースを使ってログに書き出すようにするのが定石なので、Log4Jの使い方 についても後ほど詳しく説明いたします。 ところで、このクライアント・プログラムとWebサービスの実体が別々のコンピューター上に ある場合は、上記のlocalhostの代わりにWebサービスがデプロイされているコンピューター のIPアドレスを入れることをお忘れなく。 なお、URLの中の"?wsdl"の部分は省略できます。 それから、WebService1ServiceLocatorクラスのgetWebService1()メソッドが返すオブジェクト がWebService1SoapBindingStubのインスタンスであることにも注目しましょう。 このWebService1SoapBindingStubがスタブのクラスです。 続いて、 String s = webService.searchBestItem(longArray); や s = webService.placeAnOrder(itemNumber, quantity, customerId); の部分に注目して下さい。これらは、Webサービスのメソッドを呼び出している 部分ですが、このようにローカルにあるスタブのメソッドを呼び出すという形式 のコーディングをするだけで、遠隔地のWebサービスのメソッドを呼び出し、その 処理結果を受け取ることができるわけです。 で、実際のスタブ側のこれらのメソッドがどうなっているのか、WebService1SoapBindingStub クラスのソース・コードを見てみましょう。 WebService1SoapBindingStubのsearchBestItem()メソッドやplaceAnOrder()メソッドでは、 org.apache.axis.client.Callやjavax.xml.namespace.QNameというクラスを使ってWebサービス を呼び出していることがわかります。(ちゃんとソース・コードを読む必要はありません。 雰囲気だけ感じとってください。)なんだか、わかりにくいソース・コードが書かれている な、という程度に感じとっていただければ結構です。 これらのCallクラスやQNameクラスを直接使ってクライアントのプログラムを書くことも 可能なのですが、わかりにくいのでスタブを利用するわけです。 では、念のためにCallクラスやQNameクラスを使ったプログラムも書いてみることにしま しょう。 (次回に続く) では、今日はここまでにします。 何か、わからないところがありましたら、下記のWebページまで質問を お寄せください。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ★ホームページ: 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) 2008 Future Lifestyle Inc. 不許無断複製 |