Hello World Webサービス

次に示す内容は、WebサービスクライアントおよびJava Remoteインタフェース(RMI)から開始するサービスの開発方法を示す例です。 開発プロセスは大まかに次の手順に分けられます。
  1. サービス用Remote Javaインタフェースを書き込みます。
  2. インタフェースをコンパイルします。
  3. rmi2soapコンパイラを使用するスタブおよびスケルトンを作成します。
  4. クライアントを実行します。
  5. サーバを実行します。
  6. サーブレットコンテナのサーバを展開します。
  7. サーバに対してクライアントを実行します。
作成プロセスは各例に含まれるbuild.shおよびbuild.batファイルで表示されます。 作成スクリプトを実行する前に、READMEで始まる環境を設定する必要があります。 env.batenv.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を使用します。 ディレクトリがない場合は、次のコマンドを使用してディレクトリを作成します。
mkdir WEB-INF

cd WEB-INF
mkdir classes
よく知られているjavacコンパイラを使用するインタフェースをコンパイルします。 UNIXシステムの場合
javac -d WEB-INF/classes Hello.java
Windowsの場合
javac -d WEB-INF\classes Hello.java

3 SOAPバインディングの生成

SOAPバインティングを生成する前に、CLASSPATHで利用するクラスディレクトリが必要です。 CLASSPATHを次のように設定します(オペレーティングシステムおよびシェルによって異なります)。
set CLASSPATH=WEB-INF/classes:$CLASSPATH
また、Novell exteNd WSSDKバイナリがPATHにあることを確認します。 次の例を修正し、システム上でNovell exteNd WSSDKをインストールした場所に合わせます。 Unix (バッシュ)の場合
export PATH=/usr/local/wssdk/bin/solaris;$PATH
Windowsの場合
set PATH=C:\wssdk\bin\win32;%PATH%
最後にServletライブラリがCLASSPATHにあることを確認する必要があります。 Tomcatを使用する場合、次を設定する場合があります。
set CLASSPATH=%CLASSPATH%;C:\jakarta-tomcat-4.0.1\lib\servlet.jar
Hello.classファイルの
rmi2soap コンパイラを実行し 、Java RemoteインタフェースからSOAPバインディングを生成します。
rmi2soap -d WEB-INF/classes hello.Hello
rmi2soap コンパイラはJavaコードをWEB-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.java

5 サーバの実装

サーバの実装は他のJavaインタフェースの実装とほとんど同じです。 サーバ実装クラスは_Hello_Skeletonクラスを拡張する必要があります。 この場合、サーバの設定は次の通り簡単です。
package hello;
                                                                           
import java.rmi.Remote;
import java.rmi.RemoteException;
                                                                           
public class HelloImpl extends Hello_ServiceSkeleton
{
    public String sayHello() throws RemoteException
    {
    |   return "Hello World!";
    }
}
拡張すると、Webサービスのサーバ部分をコンパイルできます。
javac -d WEB-INF/classes HelloImpl.java

6 サーバの展開

WARファイルを作成し、希望するサーブレットコンテナを展開できます。 WARファイルを作成する前に、WEB-INFディレクトリにある標準Web.xmlファイルを指定する必要があります。 例としてhelloディレクトリのファイルを1つ参照してください。 WARファイルは次の通り作成します。
jar -cfM services.war WEB-INF
Tomcatを使用している場合、services.warファイルをTomcat webappsディレクトリにコピーしてTomcatを再開します。 クライアントの実行準備が完了し、Hello Worldアプリケーションをテストします。

サーブレットコンテナを使用する代わりに,Novell exteNd WSSDKを送るWebサーバを使用します。 jwebserv を次の通り開始します。

jwebserv -verbose services.war
Novell exteNd WSSDK Serverの使用方法の詳細については、
ここを参照してください。

7 クライアントの実行

クライアントの実行は簡単です。 jwebserv を使用している場合、http://localhost:9090/helloがデフォルトバインディングである際に引数なしでクライアントを実行できます。 Tomcatに対して実行するコマンドラインは次の通りです。
java hello.Client http://localhost:8080/services/hello
クライアントプログラムは「Hellow World!」を出力します。

トンネルツールを使用してワイヤ上で送信される内容を検査します。 トンネルをポート9999で実行します。

tcptunnel 9999 localhost 9090
コマンドライン9999はトンネルポートで、9090はWebサービスが実行しているポートです(デフォルトはTomcatの8080)。 このコマンド実行後、2つのパネルがあるウィンドウを参照する必要があります。

トンネルによってクライアントを再び実行する必要があります。

java hello.Client http://localhost:9999/hello
サーブレットコンテナへのHTTP接続は次の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: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.