■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年11月16日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.127

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.SOAPのアプリケーション(Webサービス)
========================================================


では、簡単なプログラム(Webサービス)を作ってみましょう。


(1) Eclipseを起動し、パッケージ・エクスプローラーの中で右クリックし、
「新規」→「プロジェクト」を選択します。

(2) 「新規プロジェクト」ウインドウが開くので、「Javaプロジェクト」を選択し、
「次へ」ボタンをクリックします。

(3) プロジェクト名を
JStudySOAP
と入力し、「終了」ボタンをクリックしましょう。

(4) パッケージ・エクスプローラー内にできたJStudySOAPの中のsrcを右クリックし、
「新規」→「パッケージ」を選択します。

(5) パッケージの「名前」を
jp.co.flsi.lecture.soap
と入力し、「終了」ボタンをクリックしましょう。

(6) パッケージ・エクスプローラー内にできたjp.co.flsi.lecture.soapを右クリックし、
「新規」→「クラス」を選択します。

(7) 「名前」を
WebService1
と入力し、「終了」ボタンをクリックしましょう。

(8) このWebService1クラスを下記のようなソース・コードに編集しましょう。
--------------------------------------------------------
package jp.co.flsi.lecture.soap;

public class WebService1 {
   public String searchBestItem(String[] keywords) {
      return "ItemNumber:00123, ItemName:No.1 Product";
   }

   public String placeAnOrder(String itemNumber, int quantity, String customerId) {
      return "Order(ITEM:" + itemNumber + " x QUANTITY:" + quantity + ") accepted.";
   }
}
--------------------------------------------------------

これをB社の受注用のメソッドとし、このメソッドをA社に開放することにします。

そのためには、このWebService1クラスをAxisにデプロイする必要があります。
デプロイするためには、上で作ったクラスをAxisのフォルダーに配置する(コピーする)
ことと、配置(デプロイ)の情報をAxisに教えるという2種類の作業が必要になります。

まず、作成したクラスをAxisのフォルダーにコピーする方法ですが、以前Webアプリケー
ションをTomcatにデプロイしたときと同じように、WEB-INFフォルダー配下のclasses
フォルダーにパッケージごとコピーすることになります。あるいはJARファイルにした
場合は、WEB-INFフォルダー配下のlibフォルダーにコピーします。
今回は、JARではなくクラスのファイルのままでコピーすることとし、下記のように
作業しましょう。

(1) コピー元は、Eclipseのワークスペースの中のJStudySOAPプロジェクトの中の
jp.co.flsi.lecture.soapというパッケージに入っているのですから、

C:\JavaWorks\JStudySOAP\bin\jp\co\flsi\lecture\soap

という名前のフォルダーの中にコピーすべきWebService1のクラスが入っている
訳です。(必要なのはソースではなくバイトコードなので、srcフォルダーのもの
ではなくbinフォルダーのほうを使います。)

これをパッケージごとコピーするのですから、jpフォルダーごとごっそりコピーす
ることになります。

(2) 貼り付け先は、
C:\Tomcat6.0\webapps\axis\WEB-INF\classes
となります。
ここに(1)のjpフォルダーごとファイルをコピーすると、

C:\Tomcat6.0\webapps\axis\WEB-INF\classes\jp\co\flsi\lecture\soap

というフォルダーができて、このsoapフォルダーの中にWebService1.classファイル
がはいっている状態になります。


次にデプロイの情報をAxisに教える方法ですが、このためには、WSDD
(Web Service Deployment Descriptor = Webサービス・デプロイメント記述子)
というファイルを作成します。

その前に、まず、WSDDファイルを置くためのディレクトリー(フォルダー)を用意
しておきましょう。
そのディレクトリー名をws_workとすることにし、C:ドライブ直下にフォルダーを
作成することにしましょう。たとえば、コマンド・プロンプトでこのフォルダー
を作成するには、

C: [Enter]
cd \ [Enter]
mkdir ws_work [Enter]

と操作します。(ここで[Enter]はEnterキーを押すことを意味する。)

(なお、開発に使うコンピューターとデプロイするコンピューターが異なる場合は、
WSDD関連の作業は開発側ではなくデプロイするコンピューターで行うものですので
間違えないでください。)

では、このフォルダー内にdeploy.wsddというファイル名で下記のようなWSDDファイル
を作成してください。
--------------------------------------------------------
<deployment    name="test" xmlns="http://xml.apache.org/axis/wsdd/"
         xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
         xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
         xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
  <service name="WebService1" provider="java:RPC" >
    <namespace>http://webservice.flsi.co.jp/</namespace>
    <parameter name="className" value="jp.co.flsi.lecture.soap.WebService1" />
    <parameter name="allowedMethods" value="*" />
  </service>
</deployment>
--------------------------------------------------------

ここで、<service name="WebService1" ...というのは、Webサービスの名前を
WebService1と指定しており、
<parameter name="className" value="jp.co.flsi.lecture.soap.WebService1" />
は、そのクラス名が(パッケージ名を先頭に付けて)
jp.co.flsi.lecture.soap.WebService1であることを指定しています。
また、<parameter name="allowedMethods" value="*" />は、すべての公開可能なメソッド
を使用可能にすることを指定しています。

WSDDの内容については、また後で詳しく説明しますが、ここでは特に<service ...>から
</service>の間にはさまれている<namespace>http://webservice.flsi.co.jp/</namespace>
を頭に入れておいてください。このnamespace(ネームスペース = 名前空間)というもの
は、Webサービスの名前の接頭辞のようなものですが、これは後でJavaに変換するときに
パッケージ名に使用されることになりますので、その時まで記憶しておいてください。

ちなみに、最初の4行にあるxmlnsも名前空間を指定するものですが、これは標準の(WSDD
などで規定されている)名前空間ですので、決まり文句だと思ってください。
自分でWSDDファイルを作成するときも、これらをそのままコピーして利用するだけで済み
ます。(これも詳しくは、後ほど説明します。)



続いて、このファイルが存在するフォルダーをカレント・ディレクトリーにしましょう。
たとえば、コマンド・プロンプトで

C: [Enter]
cd \ws_work [Enter]

と操作します。

このフォルダーで、デプロイのためのコマンドを実行します。

実行にあたっては、あらかじめTomcatを起動しておく必要があります(Axisが稼動
している必要があるため)。

デプロイのためのコマンドはJavaのプログラムなのですが、AxisのAPIを呼び出す
ため、AxisのJARをクラスパスに登録しておく必要があります。

vol.070でJAVA_HOMEを環境変数に登録したように恒久的に使えるように登録しても
いいのですが、ここでは一時的に使うだけにして、次のようにコマンドを打ち込み
ましょう。(各行の最後にはEnterキーを押す。)

--------------------------------------------------------
set AXIS_LIB=D:\Tomcat6.0\webapps\axis\WEB-INF\lib

set CLASSPATH=.
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\axis.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\axis-ant.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIb%\commons-discovery-0.2.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\commons-logging-1.0.4.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\jaxrpc.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\log4j-1.2.8.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\saaj.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar
--------------------------------------------------------

そしてデプロイをするためには次のようなコマンドを実行します。

--------------------------------------------------------
java org.apache.axis.client.AdminClient deploy.wsdd
--------------------------------------------------------

つまり、AxisのAdminClientというクラスを実行してWSDDファイルを読み込ませ
るだけでデプロイが実行されるわけです。

そして、コマンド・プロンプト上に

--------------------------------------------------------
- 要求されたクラス(javax.activation.DataHandler と javax.mail.internet.MimeMultipart)が見つかりませ
ん。Attachmentサポートが利用できません。 / [en]-(Unable to find required classes (javax.activation.D
ataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.)
ファイルdeploy.wsddの処理中 / [en]-(Processing file deploy.wsdd)
<Admin>処理を実行しました / [en]-(Done processing)</Admin>
--------------------------------------------------------

というようなメッセージが出ていれば(エラーメッセージが出ていなければ)OKです。
(上のメッセージは、Axisのインストール時にオプションの(必須ではない)JARファイルを
インストールしていないために出力されるものであり、エラーではありません。)


なお、上のコマンドはまとめてバッチ・ファイルにしておけば、あとでデプロイの
やり直しが必要になったときなどに何度でも簡単に実行できますから便利ですが、
ただし、これではLinuxなどの他のシステムでは使えません。

こういうものは、Javaの世界では通常はAntというツールを使って行うのが普通です。

というわけで、後でAntの使い方を説明します。

(UNIXなどでC言語やC++のプログラミングをしたことのある人ならMakeファイルという
ツールを使ったことがあると思いますが、AntはMakeファイルに類似したツールで、
しかもMakeファイルよりも汎用性や使い勝手の優れたツールになっています。)

なお、Ant自体もJavaで作られており、Eclipseの内部でも使われています。
AntもやはりApacheソフトウエア・ファウンデーションによって作られたオープン・
ソースです。

詳しくは、また後ほど説明いたします。


さて、上記のデプロイが成功したことを確認するためには、Webブラウザーを起動して
次のURLを入力してみて下さい。

http://localhost:8080/axis/services/WebService1?wsdl
(Axisを稼動している(デプロイした)コンピューターとは別のコンピューターで
Webブラウザーを起動している場合は、上のlocalhostをAxisを稼動しているコン
ピューターのIPアドレスに読み替えてください。)


こうすると、デプロイしたWebサービスのインターフェース(呼び出し方法)が
記述された内容が表示されます。これはWSDL(Web Service Description Language
 = Webサービス記述言語)と呼ばれる言語で書かれており、通常、WSDLファイルと
呼ばれているものです。

WSDLはCORBAのIDL(Interface Definition Language)に相当するもので、他のプロ
グラムからWebサービスを呼び出すために必要な情報を記述するためのものです。

詳しくは、後で説明しますが、ここではこのWSDLファイルが自動的に生成されている
ことに注目してください。これは先ほどデプロイのコマンドを実行したときに
自動生成されたものです。
これに対して、CORBAの場合はIDLのファイルを自分で作成する必要があり、かなり
面倒です。


以上で、Webサービスを提供する側の作業は終わりです。



次に、Webサービスを呼び出して利用する側のJavaプログラム(SOAPのクライアントの
プログラム)を作ってみましょう。

この場合も、やはりAxisのAPIを呼び出しますので、AxisのJARをクラスパスに登録
しておく必要があります。

これは、先ほどコマンド・プロンプトで作業したときとまったく同じですので、
先ほどのようにコマンド・プロンプトを開いておいて、

--------------------------------------------------------
set AXIS_LIB=D:\Tomcat6.0\webapps\axis\WEB-INF\lib

set CLASSPATH=.
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\axis.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\axis-ant.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIb%\commons-discovery-0.2.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\commons-logging-1.0.4.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\jaxrpc.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\log4j-1.2.8.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\saaj.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar
--------------------------------------------------------

を実行するわけです。(先ほどのコマンド・プロンプトを開いたままで
あれば、既に実行済みですから、何もしなくても済みます。)

そして次のようなコマンドを実行しましょう。

--------------------------------------------------------
java org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/services/WebService1?wsdl
--------------------------------------------------------
(Axisを稼動している(デプロイした)コンピューターとは別のコンピューターで
上のコマンドを実行する場合は、上のlocalhostをAxisを稼動しているコンピューター
のIPアドレス(またはドメイン名)に読み替えてください。)

そうすると、カレント・ディレクトリー(以前のコマンド・プロンプトのままで
あれば、C:\ws_work)にjp\co\flsi\webserviceというフォルダーが作られ、
その中に4つほどJavaのソース・ファイルができているはずです。

これは、先ほどのコマンドの末尾に指定したWSDLをネットワーク上から読み取って、
そのインターフェースに応じたJavaのソース・コードを自動生成してくれたもの
です。(これはスタブと呼ばれ、Webサービスを呼び出すために使われるWebサービス
の代理クラスのようなものです。)

ここで思い出して欲しいのは、先ほどWSDDファイル内に書いておいた名前空間が
http://webservice.flsi.co.jp/だったことです。このうちのwebservice.flsi.co.jp
の部分をひっくり返した名前が、上のスタブのパッケージ名になるのです。(そのパッケー
ジ名をフォルダー名に展開するとjp\co\flsi\webserviceになる。)


では、Eclipseに戻って、SOAPのクライアントのプログラムを入れるための
プロジェクトを作成しておきましょう。

(1) Eclipseのパッケージ・エクスプローラーの中で右クリックし、
「新規」→「プロジェクト」を選択します。

(2) 「新規プロジェクト」ウインドウが開くので、「Javaプロジェクト」を選択し、
「次へ」ボタンをクリックします。

(3) プロジェクト名を
JStudySoapClient
と入力し、「終了」ボタンをクリックしましょう。


このプロジェクトのsrcフォルダーの中にさきほどのスタブをパッケージごとコピー
しましょう。そのためには、先ほどのjp\co\flsi\webserviceフォルダーをエクスプローラー
で開いておき、その根元のjpフォルダーをドラッグしてEclipseのパッケージ・エクスプローラー
の中のJStudySoapClientプロジェクトの中のsrcフォルダーにドロップします。

さて、このままだと、JStudySoapClientプロジェクト配下に赤い×マークが付きますね。
つまり、エラーの状態になります。
これは、AxisのJARファイルをJStudySoapClientプロジェクトのクラスパスに追加して
いないからです。

というわけで、追加しておきましょう。

(1) Eclipseのパッケージ・エクスプローラーの中でJStudySoapClientプロジェクトを
右クリックし、「ビルド・パス」→「ライブラリーの追加」を選択
します。

(2) 「ライブラリーの追加」ウインドウにおいて「ユーザー・ライブラリー」
を選択し、「次へ」ボタンをクリックします。

(3) 「ユーザー・ライブラリー」ボタンをクリックします。

(4) 「新規」ボタンをクリックします。

(5) 「ユーザー・ライブラリー名」に

axis

と入力し、「OK」ボタンをクリックします。

(6) 「axis」を選択し、「JARの追加」ボタンをクリックします。

(7) 「JARの選択」ウインドウで、

C:\Tomcat6.0\webapps\axis\WEB-INF\lib

の中のすべてのJARファイルを複数選択し、「開く」ボタンをクリックします。

(8) 「設定」ウインドウの「OK」ボタンをクリックします。

(9) 「ライブラリーの追加」ウインドウの中で「axis」にチェック・
マークが付いていることを確認し、「終了」ボタンをクリックします。


これで×マークは消えましたね。



(次回に続く)


では、今日はここまでにします。

何か、わからないところがありましたら、下記の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. 不許無断複製