■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      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. 不許無断複製