WebサービスクライアントおよびWSDLドキュメントから開始するサービスの開発方法を示す例です。 RMIおよびWSDLがクライアントおよびサーバ間のコントラクトとして同様の機能をもっているため、この例はRMIがあるhelloの例とほとんど同じです。 開発プロセスは大まかに次の手順に分けられます。
- サービスのためにWSDLを書き込みます。
- WSDLをコンパルし、wsdl2soapコンパイラを使用するスタブおよびスケルトンを作成します。
- クライアントを実装します。
- サーバを実装します。
- サーブレットコンテナでサーバを展開します。
- サーバに対してクライアントを実行します。
1 Hello WSDLドキュメント
Hello WorldアプリケーションのWSDLは次の通りです。 portType Helloには、sayHelloという1つの操作があります。これには入力メッセージがなく、文字列が含まれる出力メッセージがあります。 RMIと同様にWSDLドキュメントはオブジェクトの実装およびそのクライアント間のコントラクトとして機能します。説明どおり、WSDLドキュメントは通常手動で書き込まれませんが、RMIのような別のインタフェースの記述から生成されます。 たとえば、WEDLは次のコマンドを使用してHello RMIから生成されます。<?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>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
と呼ばれるターゲットディレクトリを使用します。 ディレクトリを作成する際次のコマンドを実行します。また、Novell exteNd WSSDKバイナリがPATHにあることを確認します。たとえば、次のように入力します。mkdir WEB-INF
cd WEB-INF
mkdir classes最後にServletライブラリがset PATH=C:\wssdk\bin\win32;%PATH%CLASSPATH
にあることを確認する必要があります。 Tomcatを使用する場合、次のとおり設定できます。Hello.wsdlファイルでwsdl2java コンパイラを実行してWSDLドキュメントをコンパイルし、SOAPバインディングをWSDLファイルから生成します。set CLASSPATH=%CLASSPATH%;C:\jakarta-tomcat-3.2.1\lib\servlet.jarwsdl2javaコンパイラはJavaコードをWEB-INF/classesディレクトリに生成し、同じディレクトリに生成されたJavaコードをコンパイルします。 wsdl2javaが背後でrmi2soapを起動するため、通常のクラスはwsdl2java -package helloWSDL -d WEB-INF/classes Hello.wsdlhelloWSDL
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
を次のように設定します(オペレーティングシステムおよびシェルによって異なります)。クライアントの実装はJNDIを使用してリモートサービスのスタブを検索します。 クライアントソースは次の通りです。set CLASSPATH=WEB-INF/classes:$CLASSPATHこの処理が終了すると、Webサービスのクライアント部分をコンパイルできます。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()); } }javac -d WEB-INF/classes Client.java4 サーバの実装
サーバの実装は他のJavaインタフェースの実装とほとんど同じです。 サーバ実装クラスは_Hello_ServiceSkeleton
クラスを拡張する必要があります。 この場合、サーバの設定は次の通り簡単です。拡張すると、Webサービスのサーバ部分をコンパイルできます。package helloWSDL; 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.java5 サーバの展開
WARファイルを作成し、希望するサーブレットコンテナを展開できます。 WARファイルを作成する前に、WEB-INFディレクトリにある標準Web.xmlファイルを指定する必要があります。 例としてhelloディレクトリのファイルを1つ参照してください。 WARファイルは次の通り作成します。Tomcatを使用している場合、services.warファイルをTomcat webappsディレクトリにコピーしてTomcatを再開します。 クライアントの実行準備が完了し、Hello Worldアプリケーションをテストします。 Tomcatを使用する場合、WebサービスのURLはコマンドライン上(またはWSDLドキュメント)で 「http://localhost:8080/services/helloWSDL」に変更する必要があります。jar -cfM services.war WEB-INFサーブレットコンテナを使用する代わりに,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 クライアントの実行
クライアントの実行は簡単です。クライアントプログラムは「Hellow World!」を出力します。 RMI Hello World例を参照してクライアントからサーバへ送信されるSOAPメッセージを確認してください。java helloWSDL.Client
Copyright © 2000-2003, Novell, Inc.All rights reserved. |