次に示す内容は、WebサービスクライアントおよびJava Remoteインタフェース(RMI)から開始するサービスの開発方法を示す例です。 開発プロセスは大まかに次の手順に分けられます。作成プロセスは各例に含まれる
- サービス用Remote Javaインタフェースを書き込みます。
- インタフェースをコンパイルします。
- rmi2soapコンパイラを使用するスタブおよびスケルトンを作成します。
- クライアントを実行します。
- サーバを実行します。
- サーブレットコンテナのサーバを展開します。
- サーバに対してクライアントを実行します。
build.sh
およびbuild.bat
ファイルで表示されます。 作成スクリプトを実行する前に、READMEで始まる環境を設定する必要があります。env.bat
、env.sh
、またはenv.csh
ファイルを使用して簡単に作成環境が設定できます。1 Hello Remoteインタフェース
Hello WorldアプリケーションのRMIは次の通りです。 Helloインタフェースにはパラメータがなく、文字列を返すsayHello
というメソッドが1つあります。 RMIはオブジェクト実装とそのクライアントの間のコントラクトとして機能します。package hello; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; }2 インタフェースのコンパイル
サーブレットWARファイルを後で作成する場合にディレクトリ構造が必要となるため、ターゲットディレクトリのWEB-INF/classes
を使用します。 ディレクトリがない場合は、次のコマンドを使用してディレクトリを作成します。よく知られているjavacコンパイラを使用するインタフェースをコンパイルします。 UNIXシステムの場合mkdir WEB-INF
cd WEB-INF
mkdir classesWindowsの場合javac -d WEB-INF/classes Hello.javajavac -d WEB-INF\classes Hello.java3 SOAPバインディングの生成
SOAPバインティングを生成する前に、CLASSPATH
で利用するクラスディレクトリが必要です。CLASSPATH
を次のように設定します(オペレーティングシステムおよびシェルによって異なります)。また、Novell exteNd WSSDKバイナリがset CLASSPATH=WEB-INF/classes:$CLASSPATHPATH
にあることを確認します。 次の例を修正し、システム上でNovell exteNd WSSDKをインストールした場所に合わせます。 Unix (バッシュ)の場合Windowsの場合export PATH=/usr/local/wssdk/bin/solaris;$PATH最後にServletライブラリがset PATH=C:\wssdk\bin\win32;%PATH%CLASSPATH
にあることを確認する必要があります。 Tomcatを使用する場合、次を設定する場合があります。Hello.classファイルのrmi2soap コンパイラを実行しset CLASSPATH=%CLASSPATH%;C:\jakarta-tomcat-4.0.1\lib\servlet.jar、Java RemoteインタフェースからSOAPバインディングを生成します。
rmi2soap コンパイラはJavaコードをrmi2soap -d WEB-INF/classes hello.HelloWEB-INF/classes
ディレクトリに生成し、同じディレクトリに生成されたJavaコードをコンパイルします。 次のクラスはhelloJavaパッケージで作成されます。
?
Hello_Stub.class // stub _Hello_ServiceSkeleton.class // inheritance based skeleton _Hello_ServiceTieSkeleton.class // delegation based skeleton HelloService.class // service interface HelloServiceImpl.class // service implementation class スタブおよびスケルトンのソースファイルを保存する場合は-keepフラグ付きrmi2soapを実行します。 コマンドラインフラグの詳細については、rmi2soap のマンページを参照してください。
4 クライアントの実装
クライアントの実装はJNDIを使用して、サービスオブジェクトを検索します。 サービスは順番に使用されリモートサービスのスタブを作成します。 クライアントソースは次の通りです。スタブ上のエンドポイントアドレス設定に適した方法では、package hello; import javax.xml.rpc.Stub; import javax.naming.InitialContext; public class Client { public static void main(String[] args) throws Exception { | // get the initial context | InitialContext ctx = new InitialContext(); | | // lookup the service for Hello | HelloService svc = (HelloService) | ctx.lookup("xmlrpc:soap:hello.HelloService"); | | // get the hello stub | Hello hello = (Hello) svc.getHelloPort(); | | // set the end point address | ((Stub)hello)._setProperty("javax.xml.rpc.service.endpoint.address", | args.length > 0 ? args[0] :"http://localhost:9090/hello"); | | // invoke the service | System.out.println(hello.sayHello()); } }javax.xml.rpc.service.endpoint.address
プロパティを使用します。 そのプロパティを使用すると、Webサービスのクライアント部分をコンパイルできます。javac -d WEB-INF/classes Client.java5 サーバの実装
サーバの実装は他のJavaインタフェースの実装とほとんど同じです。 サーバ実装クラスは_Hello_Skeleton
クラスを拡張する必要があります。 この場合、サーバの設定は次の通り簡単です。拡張すると、Webサービスのサーバ部分をコンパイルできます。package hello; import java.rmi.Remote; import java.rmi.RemoteException; public class HelloImpl extends Hello_ServiceSkeleton { public String sayHello() throws RemoteException { | return "Hello World!"; } }javac -d WEB-INF/classes HelloImpl.java6 サーバの展開
WARファイルを作成し、希望するサーブレットコンテナを展開できます。 WARファイルを作成する前に、WEB-INFディレクトリにある標準Web.xmlファイルを指定する必要があります。 例としてhelloディレクトリのファイルを1つ参照してください。 WARファイルは次の通り作成します。Tomcatを使用している場合、jar -cfM services.war WEB-INFservices.war
ファイルをTomcatwebapps
ディレクトリにコピーしてTomcatを再開します。 クライアントの実行準備が完了し、Hello Worldアプリケーションをテストします。サーブレットコンテナを使用する代わりに,Novell exteNd WSSDKを送るWebサーバを使用します。 jwebserv を次の通り開始します。
Novell exteNd WSSDK Serverの使用方法の詳細については、 ここを参照してください。jwebserv -verbose services.war
7 クライアントの実行
クライアントの実行は簡単です。 jwebserv を使用している場合、http://localhost:9090/helloがデフォルトバインディングである際に引数なしでクライアントを実行できます。 Tomcatに対して実行するコマンドラインは次の通りです。クライアントプログラムは「Hellow World!」を出力します。java hello.Client http://localhost:8080/services/helloトンネルツールを使用してワイヤ上で送信される内容を検査します。 トンネルをポート9999で実行します。
コマンドライン9999はトンネルポートで、9090はWebサービスが実行しているポートです(デフォルトはTomcatの8080)。 このコマンド実行後、2つのパネルがあるウィンドウを参照する必要があります。tcptunnel 9999 localhost 9090トンネルによってクライアントを再び実行する必要があります。
サーブレットコンテナへのHTTP接続は次のSOAPメッセージで確認されます。java hello.Client http://localhost:9999/hello
?
<Envelope
?xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'
?xmlns='http://schemas.xmlsoap.org/soap/envelope/'
?xmlns:xsd='http://www.w3.org/1999/XMLSchema'
?xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance'
?xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/'>
?<Body>
? <ns1:sayHello SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
?? xmlns:ns1='http://www.hello'>
? </ns1:sayHello>
?</Body>
</Envelope>図 1: Hello Worldのクライアントからサーバへ送られるSOAPメッセージ サーバから返信されるSOAP応答メッセージは次の通りです。
<Envelope
?xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'
?xmlns='http://schemas.xmlsoap.org/soap/envelope/'
?xmlns:xsd='http://www.w3.org/1999/XMLSchema'
?xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance'
?xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/'>
?<Body>
? <ns1:sayHelloResponse SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
?? xmlns:ns1='http://www.hello'>
?? <result xsi:type='xsd:string'>Hello World!</result>
? </ns1:sayHelloResponse>
?</Body>
</Envelope>図 2: Hello Worldのサーバからクライアントへ戻されるSOAPメッセージ
Copyright © 2000-2003, Novell, Inc.All rights reserved. |