JDK 6を使用したWebサービスの作成

9529 ワード


サーバ側のJavaクラスがWebサービスを実現するbeanになるには、publicクラス、finalクラス、abstractではなく、共通のデフォルト構造関数が必要であり、finalize()メソッドは絶対に使用できません.Webサービスを実現するBeanになるには、次のような原則に従う必要があります.
この方法はpublicでなければならない.そのパラメータ、戻り値、および例外は、JavaがXML/WSDLマッピングファイルに変換されるルールをJAX RPC仕様ごとに記述しており、パラメータおよび戻り値は元のタイプ、配列などであってもよい.
次はサーバー側のクラスですjava:
package test.jws.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService(targetNamespace = "http://www.jwstest.org")
@SOAPBinding(style = SOAPBinding.Style.RPC)
publicclass HelloWorld {
    @WebMethod(action="toSayHello",operationName="toSayHello",exclude=false)
    @WebResult(name="returnWord")// WSDL 
    public String sayHello(@WebParam(name="userName")String userName) {
        return"Hello:" + userName;
    }
    @WebMethod
    publicint getExp(int i, int j) {
        return i / j;
    }
}
 
これはサーバ側の一般的なビジネスクラスであり,@WebService,@WebMethodなどの注釈記述によりWSDLファイルを生成する.
STEP 2
、実行
wsgen
コマンド#コマンド#
この例では、HelloWorldクラスが存在するディレクトリにwsdlという名前のフォルダを新規作成します.実行:wsgen-cp./bin -r ./wsdl -s ./src -d ./bin -wsdl test.jws.service.HelloWorld.実行するとwsdlフォルダにHelloWorldのwsdl記述ファイルが生成され、srcフォルダに異常記述クラスなどの依存クラスが生成され、binに依存クラスのclassファイルが生成されます.
STEP 3
,
パブリッシュ
Web Service Bean
サービスクラスStartServicesを起動します.java:
package test.jws.service;
import javax.xml.ws.Endpoint;
publicclass StartService {
    publicstaticvoid main(String[] args) {
        Endpoint.publish("http://localhost:8080/webservice/hws", new HelloWorld());
    }
}
     
これは簡単で、Endpointクラスのpublish()メソッドを介してインスタンスパブリッシュアドレスをパブリッシュすることができます.
http://localhost:8080/webservice/hws,httpプロトコル,ホストIPアドレスおよびポート番号を明示し,IEに入力する必要がある
 http://localhost:8080/webservice/hws?wsdlパブリッシュに成功したことを示すメッセージを返します。
<?xml version="1.0" encoding="UTF-8" ?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.jwstest.org"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://www.jwstest.org"
name="HelloWorldService">
<types />
<message name="toSayHello">
<part name="userName" type="xsd:string" />
</message>
<message name="toSayHelloResponse">
<part name="returnWord" type="xsd:string" />
</message>
<message name="getExp">
<part name="arg0" type="xsd:int" />
<part name="arg1" type="xsd:int" />
</message>
<message name="getExpResponse">
<part name="return" type="xsd:int" />
</message>
<portType name="HelloWorld">
<operation name="toSayHello" parameterOrder="userName">
<input message="tns:toSayHello" />
<output message="tns:toSayHelloResponse" />
</operation>
<operation name="getExp" parameterOrder="arg0 arg1">
<input message="tns:getExp" />
<output message="tns:getExpResponse" />
</operation>
</portType>
<binding name="HelloWorldPortBinding" type="tns:HelloWorld">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="toSayHello">
<soap:operation soapAction="toSayHello" />
<input>
<soap:body use="literal"
namespace="http://www.jwstest.org" />
</input>
<output>
<soap:body use="literal"
namespace="http://www.jwstest.org" />
</output>
</operation>
<operation name="getExp">
<soap:operation soapAction="" />
<input>
<soap:body use="literal"
namespace="http://www.jwstest.org" />
</input>
<output>
<soap:body use="literal"
namespace="http://www.jwstest.org" />
</output>
</operation>
</binding>
<service name="HelloWorldService">
<port name="HelloWorldPort"
binding="tns:HelloWorldPortBinding">
<soap:address
location="http://localhost:8080/webservice/hws" />
</port>
</service>
</definitions>
 
STEP 4
,
クライアント実行クラスの生成
cmdコマンドでwsimport-d./を実行bin -s ./src - p test.jws.client.ref
http://10.168.189.182:8080/webservice/hws?wsdlの後、srcディレクトリの下でクライアント呼び出しの2つのクラスが生成されます.
       test.jws.client.ref.HelloWorld.JAva wsdl記述に従って生成されたクライアント実行クラス
test.jws.client.ref.HelloWorldServices.JAvaは、wsdl初期化クライアントHelloWorldのインスタンスをこのような責任で理解します.
binディレクトリの下で対応するクラスファイルを生成します.
注:wsimportコマンドを実行する場合
STEP 3のサービスは必ず起動しなければなりません.そうしないと生成できません.
STEP 4
,
クライアントコール
クライアントがプロシージャClientRunを呼び出す.java:
package test.jws.client;
import test.jws.client.ref.*;
publicclass ClientRun {
    /**
    *@paramargs
    */
    publicstaticvoid main(String[] args) {
        HelloWorldService hws = new HelloWorldService();
        HelloWorld hw = hws.getHelloWorldPort();
        System.out.println(hw.getExp(9, 3));
        System.out.println(hw.toSayHello("zhuoshiyao"));
    }
}
 
開始
STEP 3のサービスは、ClientRunを実行した後、コンソール出力:
3
Hello:zhuoshiyao
注意:テスト済み、Endpoint.publish("http://localhost:8080/webservice/hws", new HelloWorld())
方式はTomcat 6
でパブリッシュされ、ポート番号とパスが競合することはありません.
JKD 6で定義されているWeb Serviceコメント
1.@WebService寸法Web Servicesに露出するクラスまたはインタフェース.属性を含む修飾クラスまたはインタフェースを表す
targetNamespaceはネーミングスペースを定義し、デフォルトは「http://」+「パッケージ名逆組み」です.
name 
Web Service 
の名前です.デフォルトはクラス名です.たとえば、次のようになります.
<
definitions targetNamespace
="
http://service.jws.test/
"
name
="
HelloWorldService
">
portName 
Web Service 
のポート名
serviceName 
Web Service 
のサービス名、たとえば
        
           
<
port name
="
HelloWorldPort
"
binding
="
tns:HelloWorldPortBinding
">
      ...
                 
           

wsdlLocationは、サービスの事前定義WSDLの場所を記述する
endpointInterface定義サービス抽象Webサービス協定のサービスエンドポイントインタフェースの完全な名前     
2.@SOAPBindingは、属性を含む修飾クラスまたはインタフェースを宣言するためのSOAPにおけるWebサービスのメッセージプロトコルを定義します.
style定義メッセージの符号化タイプ
userメッセージのフォーマットタイプを定義する
3.@WebMethodは、プロパティを含むWebサービスの動作方法を定義します.
アクションアクションのアクティビティ
OperationNameこのメソッドに一致するwsdl:operationの名前
Excludeは、このメソッドが露出しているかどうかを示し、デフォルトはfalseです.
4.@WebResultは戻り値を定義します.戻り値タイプはインタフェースクラスまたは抽象クラスではなく、属性を含むパラメータを持たない構造関数が必要です.
name戻り値の名前
partNameは、この戻り値のwsdl:partの名前を表します.
targetNamespace戻り値のXMLネームスペース
ヘッダがtrueの場合、結果はメッセージ本文ではなくメッセージヘッダから取得されます.
5.@WebParamメソッドのパラメータを定義します.パラメータタイプはインタフェースクラスまたは抽象クラスではなく、属性を含むパラメータを持たない構造関数が必要です.
nameパラメータ名
partNameは、このパラメータのwsdl:partの名前を表します.
targetNamespaceパラメータのXMLネームスペース
ヘッダがtrueの場合、結果はメッセージ本文ではなくメッセージヘッダから取得されます.
modeパラメータの流れ(IN、OUTまたはINOUTのいずれか)
wsgenとwsimportコマンドの説明
wsgenコマンドの主な機能は、適切なJAX-WSを生成することです.Webサービスの端末クラスファイルを読み込みます.私たちの例ではtestです.jws.service.HelloWorldは、Webサービスをパブリッシュするために依存するすべてのソースファイルとコンパイルされたバイナリクラスファイルを同時に生成します.通常、WebサービスBeanで使用される例外クラスは、別の記述Beanを生成します.また、WSDLと仕様に準拠したHelloWorldクラスのWebサービスも生成できます.wsgenは、リソースファイルから完全なアクションリストを生成し、正当であることを検証します.Web Service Beanのプライマリ・メソッドに例外が投げ出されたことが示されている場合は、このステップが必要です.そうしないと、サーバはペアをバインドできません.
コマンドパラメータの説明:
-cp定義classpath
-r beanのwsdlファイルの格納ディレクトリを生成する
-s Webサービスを発行するソースファイルの格納ディレクトリを生成します(メソッドに例外が投げ出された場合、その例外の記述クラスソースファイルが生成されます).
-d Webサービスのコンパイルされたバイナリクラスファイルを発行する格納ディレクトリ(クラスを記述するclassファイル)を生成する
wsimportコマンドの主な機能はwsdlファイルに基づいてクライアントのルートとフレームワークを生成し、Webサービスサーバとの通信を担当し、それをインスタンスにカプセル化し、クライアントはローカルインスタンスを使用するように直接使用することができます.
コマンドパラメータの説明:
-dクライアント実行クラスのclassファイルの格納ディレクトリを生成する
-sクライアント実行クラスのソースファイルの格納ディレクトリを生成する
-p生成クラスのパッケージ名を定義