Hello World Webサービス

WebサービスクライアントおよびWSDLドキュメントから開始するサービスの開発方法を示す例です。 RMIおよびWSDLがクライアントおよびサーバ間のコントラクトとして同様の機能をもっているため、この例はRMIがあるhelloの例とほとんど同じです。 開発プロセスは大まかに次の手順に分けられます。
  1. サービスのためにWSDLを書き込みます。
  2. WSDLをコンパルし、wsdl2soapコンパイラを使用するスタブおよびスケルトンを作成します。
  3. クライアントを実装します。
  4. サーバを実装します。
  5. サーブレットコンテナでサーバを展開します。
  6. サーバに対してクライアントを実行します。

1 Hello WSDLドキュメント

Hello WorldアプリケーションのWSDLは次の通りです。 portType Helloには、sayHelloという1つの操作があります。これには入力メッセージがなく、文字列が含まれる出力メッセージがあります。 RMIと同様にWSDLドキュメントはオブジェクトの実装およびそのクライアント間のコントラクトとして機能します。
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="HelloService"
 targetNamespace="http://www.helloWSDL"
 xmlns="http://schemas.xmlsoap.org/wsdl/"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:tns="http://www.helloWSDL" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <types/>
 <message name="sayHelloRequest"/>
 <message name="sayHelloResponse">
  <part name="arg0" type="xsd:string"/>
 </message>
 <portType name="Hello">
  <operation name="sayHello">
   <input message="tns:sayHelloRequest"/>
   <output message="tns:sayHelloResponse"/>
  </operation>
 </portType>
 <binding name="HelloBinding" type="tns:Hello">
  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="sayHello">
   <soap:operation soapAction="http://www.helloWSDL/sayHello"/>
   <input>
    <soap:body
     encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
     namespace="http://www.helloWSDL" use="encoded"/>
   </input>
   <output >
    <soap:body
     encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
     namespace="http://www.helloWSDL" use="encoded"/>
   </output>
  </operation>
 </binding>
 <service name="HelloService">
  <port binding="tns:HelloBinding" name="HelloPort">
   <soap:address location="http://localhost:9090/helloWSDL"/>
  </port>
 </service>
</definitions>
説明どおり、WSDLドキュメントは通常手動で書き込まれませんが、RMIのような別のインタフェースの記述から生成されます。 たとえば、WEDLは次のコマンドを使用してHello RMIから生成されます。
   rmi2wsdl -xsd http://www.w3.org/2001/XMLSchema -soap http://localhost:9090/helloWSDL helloWSDL.Hello

この例に添付されるWSDLドキュメントにはサービスURLが「http://localhost:9090/helloWSDL」であるSOAPバインディングがあります。 サービスを展開する場所によって、文字列を変更する必要があります。

2 WSDLのコンパイルおよびSOAPバインティングの生成

このディレクトリ構造はサーブレットWARファイルを作成する際に必要であるため、WEB-INF/classesと呼ばれるターゲットディレクトリを使用します。 ディレクトリを作成する際次のコマンドを実行します。
mkdir WEB-INF

cd WEB-INF
mkdir classes
また、Novell exteNd WSSDKバイナリがPATHにあることを確認します。たとえば、次のように入力します。
set PATH=C:\wssdk\bin\win32;%PATH%
最後にServletライブラリがCLASSPATHにあることを確認する必要があります。 Tomcatを使用する場合、次のとおり設定できます。
set CLASSPATH=%CLASSPATH%;C:\jakarta-tomcat-3.2.1\lib\servlet.jar
Hello.wsdlファイルで
wsdl2java コンパイラを実行してWSDLドキュメントをコンパイルし、SOAPバインディングをWSDLファイルから生成します。
wsdl2java -package helloWSDL -d WEB-INF/classes Hello.wsdl
wsdl2javaコンパイラはJavaコードをWEB-INF/classesディレクトリに生成し、同じディレクトリに生成されたJavaコードをコンパイルします。 wsdl2javaが背後でrmi2soapを起動するため、通常のクラスはhelloWSDL Javaパッケージで作成されます。
?
Hello.java // The generated RMI?interface
Hello.class // compiled Hello file
HelloBinding_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フラグ付きwsdl2javaを実行します。 コマンドラインフラグの詳細については、wsdl2java のマンページを参照してください。

3 クライアントの実装

クライアントをコンパイルする前に、 CLASSPATHで利用できるクラスディレクトリが必要です。 CLASSPATHを次のように設定します(オペレーティングシステムおよびシェルによって異なります)。
set CLASSPATH=WEB-INF/classes:$CLASSPATH
クライアントの実装はJNDIを使用してリモートサービスのスタブを検索します。 クライアントソースは次の通りです。
package helloWSDL;
                                                                           
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:helloWSDL.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/helloWSDL");
    |                                                                      
    |   // invoke the service
    |   System.out.println(hello.sayHello());
    }
}
                                                                           
この処理が終了すると、Webサービスのクライアント部分をコンパイルできます。
javac -d WEB-INF/classes Client.java

4 サーバの実装

サーバの実装は他のJavaインタフェースの実装とほとんど同じです。 サーバ実装クラスは_Hello_ServiceSkeletonクラスを拡張する必要があります。 この場合、サーバの設定は次の通り簡単です。
package helloWSDL;
                                                                           
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

5 サーバの展開

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

サーブレットコンテナを使用する代わりに,Novell exteNd WSSDKを送るWebサーバを使用します。 Novell exteNd WSSDK Serverの使用方法の詳細については、 ここを参照してください。 Novell exteNd WSSDK Serverを使用する場合、修正なしでクライアントを展開および実行します。

6 GETサポート

サーブレットコンテナまたはNovell exteNd WSSDK ServerでWebサービスを展開すると、ブラウザでサービスのhttp URLにヒットした場合デフォルトHTMLページが表示されます。 このページには4つのリンクがあります。 最初のリンクはサービスで実装されるWSDLを表示するWSDLドキュメントです。 2番目のリンクはWSDL用に生成されたJava Remoteインタフェースを表示するRemoteインタフェースです。 3番目のリンクはJavaクラスへマップされたxmlタイプを表示するタイプマッピングです。 タイプマッピングに関する詳細については、ここをクリックしてください。 4番目のリンクはhtml形式をランタイム時に生成し、WSDLまたはリモートインタフェースで定義された操作を起動するテストサービスです。 操作パラメータの情報が入力できます。さらにすべての情報を収集し、操作を起動して結果を表示します。 この機能はセキュリティ上の理由により無効にできます。 サーブレット展開記述子のjbroker.web.test.disableパラメータはテストサービス動作を無効にするためfalseに設定する必要があります。

デフォルトGET動作は実装にサーブレットのdoGetメソッドを書き込むことによって上書きできます。 Novell exteNd WSSDK Serverでサービスを展開する場合、doGetの実装によってデフォルトGET動作は上書きされません。

7 クライアントの実行

クライアントの実行は簡単です。
java helloWSDL.Client
クライアントプログラムは「Hellow World!」を出力します。 RMI Hello World
を参照してクライアントからサーバへ送信されるSOAPメッセージを確認してください。
Copyright © 2000-2003, Novell, Inc.All rights reserved.