JavaはWebServiceを呼び出します。最初に連絡を取るとき、特に統一された標準的な実装がなければ、それは悪夢だと思うでしょう。 .NETのいくつかのステップで完了できるWebサービスの実装と比較して、Javaの実装を見るのは本当に悲しいことです。しかし、たとえ私たちが悲しいとしても、私たちはまだそれを完了する必要があります。 Javaには、Xfire、Jersey、CXFなど、多くの優れた実装もあります。ここでは、Xfireの実装を一緒に見てみましょう。
1)まず第一に、もちろん私はバッグから降りなければなりません、そして、この普通の人はそれを知っています。 http://xfire.codehaus.org/downloadここに行くことができます、すべてまたは配布することができます。しかし、自信を失うために、奇妙な問題がたくさんあることをお勧めします。
バッグを外したらどうすればよいですか?プロジェクトに入れてください。ナンセンスのようですが、多くの人は何をすべきかわからないだけです。
新しいプロジェクトを構築するために、XfireWebserviceと比較します。これはもちろん、ここでWebプロジェクトです。
私はすべてのパッケージをここに置いています。結局のところ、例を書くとき、うるさいことは必要ありません。さりげなくクリックします。例外情報を表示したい場合は、ゆっくりと追加できます。将来的にエラーを排除するのは簡単ですが、ここではそれをしません。結局のところ、いかなる種類の例外の欠如について醜いことは何もありません。そして、あなたはそれらを自分で排除することができます。
2)まず、Xfireと他のWebServiceフレームワークの違いを理解しましょう。最大の違いは、インターフェイスが必要であり、Xfireを使用して対応するWebサービスを呼び出す必要がある場合、インターフェイスの定義を知っている必要があります。ここには少し制限があると感じています。しかし、これとは別に、ローカルメソッドを呼び出すのと同じように、WebServiceを呼び出すのは非常に便利です。例を直接見てみましょう。
まず、最も重要なインターフェイス:
public Interface IreaderService {public Reader getReader(String name、String Password);パブリックリスト<Reader> GetReaders(); }インターフェイスがありますが、もちろん実装クラスが必要です。そうしないと、インターフェイスには意味がありません。 Public Class ReaderService IreaderService {public Reader getReader(String name、String Password){return new Reader(name、password); } public list <Reader> getReaders(){List <Reader> ReaderList = new ArrayList <Reader>(); readerlist.add(new Reader( "shun1"、 "123")); readerlist.add(new Reader( "shun2"、 "123")); REACORLISTを返します。 }}また、JavabeanとReaderのクラスをご覧ください。
パブリッククラスリーダー{private static final long serialversionuid = 1l;プライベート文字列名;プライベート文字列パスワード。 public reader(){} public reader(string name、string password){this.name = name; this.password = password; } // get/setメソッドはpublic string toString(){return "name:"+name+"、password:"+password; }}ここの読者クラスがシリアル化可能なインターフェイスを実装していることに注意してください、なぜですか?ここでは、まず第一に、WebServiceの原則を理解する必要があります。 Javaの場合、インターネットにオブジェクトをアップロードする必要がある場合、多くの人がもちろんシリアル化について考えるでしょう。ちなみに、これはシリアル化です。これは、読者をパラメーターとして渡す必要があるためです。これは前のバージョンで強制的に実装する必要があります。そうしないと、エラーが報告されます。ただし、最新バージョン(実際、最新バージョンは2007年からもあります。これは、Xfireが開発を停止し、ApacheによってCXFプロジェクトに統合されたためです。これについては、これについて説明します)。それを実装する方法については、CXFに統合されているため、当面はここで深く調査しません。詳細に学びたい場合は、CXFを学ぶ方が良いはずです。
3)上記のインターフェイスとJavabeanの執筆を完了した後、多くの人が尋ねると、多くのWebサービスがWSDLファイルを持っていることがわかります。これについて話す前に、WSDLが何であるかについて話し合いましょう。おそらく、多くの企業がHTTPアドレスのみのインターフェイスを提供し、XML形式を返しているので、私たちも提供しています。これには1つの利点と1つの欠点があります。利点は、私たちの開発がそれほど難しくないことですが、不利な点は、ユーザーに多くの説明ファイルを提供する必要があることです。返されたXMLタグはそれぞれ何を意味しますか?これは何もありませんが、ただ迷惑です。 WebServiceに関しては、不利な点は、もう少し物を開発したことであり、WSDLと呼ばれる統一された説明があるため、それほど多くの説明ファイルを書く必要がないという利点があります。これは、統一された言語に関係なく統一されたWebサービスの説明文書であるため、誰も理解できない問題はありません。
そして、ここでは、Xfireを展開するときに、WSDLファイルを生成するのに役立ちます。
問題は、それを展開する方法です。これは実際には簡単です。 SRCディレクトリに新しいフォルダーMeta-INFを作成し、その中にフォルダーXfireを作成し、ファイルServices.xmlを作成します。次の構造は次のとおりです。
一部の人々は、なぜSRCディレクトリにそれを構築する必要があるのかと尋ねるかもしれません。実際、ここでは規定されたビルドではありませんが、これらのファイルを自分で展開するのに役立つ開発ツールを尋ねる必要があるため、ここに置いた場合、EclipseはTomcatまたは他のコンテナに展開するのに役立ちます。このファイルが配置されているフォルダーレベルは固定されており、変更できないことに注意してください。
services.xmlを直接見てみましょう:
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://xfire.codehaus.org/config/1.0"> <service> <! - weberviceqの名前、あなたはこれを指定するときにこれを指定する必要があります - > - > <namespace> http:// test/helloservice </namespace> <! - interface class-> <serviceclass> com.xfire.servlet.ireaderservice </serviceclass> <! - 実装クラス - > <実装クロス> com.xfire.service </emormenterervice </explimantclass>
コメントを見ても大丈夫です。
4)多くの人がこれで十分だと考えています。いいえ、まだ機能していません。これを指定した場合、他の人はどのように訪れることができますか?対応するリクエストをXfireに転送し、処理する方法。 web.xmlをもう一度変更する必要があります。
変更後、以下は次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <web-app xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xml/nns/javaee xmlns:web = "http://java.sun.com/xml/ns/javaee" xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "webapp_id"バージョン= "3.0 <Servlet-Class> org.codehaus.xfire.transport.http.xfireconfigurableservlet </servlet-class> </servlet> <servlet-name> xfierservlet </servlet-name> <url-pattern>/services/*</url-perthn> </pertern> </web-mapping>
実際、サーブレットと対応するマッピングを追加するだけです。次に、ブラウザに直接入力します。
http:// localhost:8080/xfirewebservice/services/readerservice?wsdl
わかります:
ここに表示されるのはWSDLです。WSDLは、定義するメソッドと返されたタイプを表示します。後でWSDLの説明があります。
5)上記の4つのステップを完了した後、Webサービスの展開を完了しました。他の人は、対応するウェブサービスに電話してメソッドにアクセスできます。 Xfireが提供するクライアントを使用して、公開したばかりのWebサイトサービスにアクセスしましょう。
public class readerclient {public static void main(string [] args){//サービスを作成するために、インターフェイスクラスを渡す必要があります。 //エージェントファクトリー、以下は、対応するインターフェイスクラスの後でxfireproxyfactory Factory = new xfireproxyfactory(xfirefactory.newinstance()。getXfire())を作成することです。 // webServiceアドレス、wsdlを追加する必要はありませんwsdl readerserviceurl = "http:// localhost:8080/xfirewebservice/services/readerservice"; try {//工場を使用して、対応するインターフェイスクラスIreaderService readerService =(iReaderService)factory.create(srcmodel、readerserviceurl)を返します。 reader reader = readerservice.getReader( "shun"、 "123"); System.out.println(Reader); } catch(malformedurlexception e){e.printstacktrace(); }}}このようにして、出力は次のとおりです。
WSDLファイル構造の分析
WSDL(Webサービスの説明言語、Webサービスの説明言語)は、クライアントがドキュメント情報または手順呼び出しを含むサービスにアクセスできるサービスアクセスポイントのセットとしてWebサービスの説明を定義するXMLアプリケーションです(リモート手順コールと同様)。 WSDLは、最初にアクセス操作とアクセス中に使用される要求/応答メッセージを抽象化し、次に特定の輸送プロトコルとメッセージ形式にバインドして、最終的に特定の展開されたサービスアクセスポイントを定義します。関連する特定の展開のサービスアクセスポイントは、組み合わせにより抽象的なWebサービスになります。この記事では、WSDLドキュメントの構造を詳細に説明し、各要素の役割を分析します。
1:WSDL定義
WSDLは、Webサービスを正確に説明するために使用されるドキュメントであり、WSDLドキュメントはWSDL XMLパターンに従うXMLドキュメントです。 WSDLドキュメントは、Webサービスをサービスアクセスポイントまたはポートのコレクションとして定義しています。 WSDLでは、サービスアクセスポイントとメッセージの抽象的な定義は特定のサービス展開またはデータ形式バインディングから分離されているため、抽象的な定義を再度使用できます。メッセージは、交換されたデータの抽象的な説明を指します。ポートタイプは、抽象的な操作のコレクションを指します。特定のポートタイプの特定のプロトコルとデータ形式仕様は、再利用できるバインディングを構成します。 Webアクセスアドレスを再利用可能なバインディングに関連付けると、ポートを定義でき、ポートのコレクションがサービスとして定義されます。
WSDLドキュメントには、通常、7つの重要な要素、つまり型、インポート、メッセージ、ポートタイプ、操作、バインディング、およびサービス要素が含まれています。これらの要素は、WSDLドキュメントのルート要素である定義要素にネストされています。記事の次の部分では、WSDLの基本構造を詳細に紹介します。
2:WSDLの基本構造 - 概要
最初の部分の最後で説明したように、基本的なWSDLドキュメントには7つの重要な要素が含まれています。以下は、これらの要素とその機能を紹介します。
WSDLドキュメントは、Webサービスの定義で次の要素を使用しています。
・タイプ - 特定のタイプシステム(通常はXMLスキーマのタイプシステム)を使用するデータ型によって定義されたコンテナ。
・メッセージ - 通信メッセージのデータ構造の抽象タイプ定義。タイプで定義されたタイプを使用して、メッセージ全体のデータ構造を定義します。
・操作 - サービスでサポートされている操作の抽象的な説明。一般に、単一の操作では、エントリにアクセスするリクエスト/応答メッセージペアを記述します。
porttype-特定のアクセスエントリポイントタイプでサポートされている操作の抽象コレクション。これは、1つ以上のサービスアクセスポイントでサポートできます。
・バインディング - 特定のポートタイプの特定のプロトコルとデータ形式仕様のバインディング。
・ポート - プロトコル/データ形式のバインディングと特定のWebアクセスアドレスを組み合わせた単一のサービスアクセスポイントとして定義されています。
・サービス - 関連するサービスアクセスポイントのコレクション。
WSDLのXMLスキーマは、次のURLと呼ぶことができます:http://schemas.xmlsoap.org/wsdl/
3:WSDLの基本構造 - 詳細な説明
このセクションでは、例を介してWSDLドキュメントの各要素の役割を詳細に説明します。次の例は、単純なWSDLドキュメントの内容です。このドキュメントの生成については、他の記事を参照してください:Xfire Developmentの例 - Helloworld。
Sayhelloと呼ばれる一意の操作をサポートするシンプルなWebサービスWSDLドキュメントは、HTTPでSOAPプロトコルを実行することで実装されています。リクエストは文字列名を受け入れ、処理後に簡単な文字列を返します。ドキュメントは次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <wsdl:definitions targetnamespace = "http://com.xfiredemo/helloservice" xmlns:tns = "http://com.liuxiang.xfiredemo/helloservice" xmlns:wsdlsoap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12 = "http://www.w3.org/2003/05/soap-envelope" xmlns:xsd = "http://www.w3.org/2001/xmlschema" xmlns:soapenc11 = "http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12 = "http://www.w3.org/2003/05/soap-encoding" xmlns:soap11 = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl = "http://schemas.xmlsoap.org/wsdl/"> <wsdl:Types> <xsd:schema xmlns:xsd = "http://www.w3.org/2001/xmlschema" actionfflddefault "" actibleflddefault "" quipfffffffffffmenddefault " TargetNamesSpace = "http://com.liuxiang.xfiredemo/helloservice"> <xsd:element name = "sayhello"> <xsd:complextype> <xsd:sequence> <xsd:element maxocurs = "1" minoccurs = " </xsd:sequence> </xsd:complextype> </xsd:element> <xsd:element name = "sayhelloresponse"> <xsd:complextype> <xsd:sequence> <xsd:element maxoccurs = "1" minoccurs = "1" name = " </xsd:complextype> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name = "sayhelloresponse"> <wsdl: "part =" parameters "element =" tns:sayhelloresponse "/> </wsdl:message> <ws> <wsdl" <wsdl:part name = "parameters" element = "tns:sayhello" /> < /wsdl:message> <wsdl:porttype name = "helloserviceporttype"> <wsdl:operation name = "wayhello"> <wsdl:input name = "sayhellorequest" /> <wslehellquest " name = "sayhelloresponse" message = "tns:sayhelloresponse"/> </wsdl:operation> </wsdl:porttype> <wsdl:binding name = "helloservicehttpbinding" typen Transport = "http://schemas.xmlsoap.org/soap/http"/> <wsdlsoap:operation name = "sayhello"> <wsdlsoap:operation soapaction = ""/> <wsdlsoap:operation soapaction = "" "/>> <wsdlsoap:"/> <> < <wsdlsoap:body use = "literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name = "helloservice"> <wsdl:ポート名= "helloservicehtpport" binding = "tns:helloservicehttpbindlsap"> <wsdlsap location = "http:// localhost:8080/xfire/services/helloservice"/> </wsdl:port> </wsdl:service> </wsdl:定義>
タイプ要素は、XMLスキーマ言語を使用して、WSDLドキュメントの他の場所で使用される複雑なデータ型と要素を宣言します。
インポート要素は、XMLスキーマドキュメントのインポート要素に似ており、他のWSDLドキュメントからWSDL定義をインポートするために使用されます。
メッセージ要素は、WSDLドキュメントのタイプ要素で定義されているXMLスキーマの組み込みタイプ、複雑なタイプ、または要素を使用して、またはインポート要素によって参照される外部WSDLドキュメントで定義されているメッセージのペイロードを説明します。
PortType要素と操作要素は、Webサービスのインターフェイスを説明し、その方法を定義します。 PortType要素と操作要素は、Javaインターフェイスで定義されているメソッド宣言に似ています。操作要素は、1つ以上のメッセージタイプを使用して、入力と出力のペイロードを定義します。
バインディング要素は、ポートタイプ要素と操作要素を特別なプロトコルとエンコーディングスタイルに割り当てます。
サービス要素は、インターネットアドレスを特定のバインディングに割り当てる責任があります。
1。定義要素
すべてのWSDLドキュメントのルート要素は、定義要素です。この要素は、その名前を介してWSDLドキュメントを提供しながら、ドキュメント全体をカプセル化します。この要素には、名前空間を提供する以外に他の機能はないため、詳細に説明しません。
次のコードは、定義要素の構造です。
<wsdl:定義ターゲットネームズスペース= "http://com.liuxiang.xfiredemo/helloservice" xmlns:tns = "http://com.liuxiang.xfiredemo/helloservice" xmlns:wsdlsoap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12 = "http://www.w3.org/2003/05/soap-envelope" xmlns:xsd = "http://www.w3.org/2001/xmlschema" xmlns:soapenc11 = "http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12 = "http://www.w3.org/2003/05/soap-encoding" xmlns:soap11 = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl = "http://schemas.xmlsoap.org/wsdl/"> </wsdl:定義>
2。タイプ要素
WSDLは、基本タイプシステムとしてW3C XMLスキーマ内蔵タイプを採用しています。タイプ要素は、XMLスキーマ内蔵タイプに記載されていないさまざまなデータ型を定義するコンテナとして使用されます。メッセージパーツのペイロードを宣言するとき、メッセージ定義はタイプ要素で定義されているデータ型と要素を使用します。このWSDLドキュメントのタイプ定義:
<WSD:TYPES> <XSD:SCHEMA XMLNS:XSD = "http://www.w3.org/2001/xmlschema" attributeformdefault = "quatified" elementformdefault = "quatified" targetnamespace = "http://////. name = "sayhello"> <xsd:complextype> <xsd:sequence> <xsd:element maxoccurs = "1" minoccurs = "1" name "nillable =" true "type =" xsd:string "/> </xsd:sequence> </xsd:" "> xsd:" " <XSD:complexType> <xsd:sequence> <xsd:element maxoccurs = "1" minoccurs = "1" name = "out" nillable = "true" type = "xsd:string"/> </xsd:sequence> </xsd:complextype> </xsd:element> xsd:/wsdl
上記は2つの要素を定義するデータ定義の部分です。1つはSayhello、もう1つはSayhelloresponseです。
Sayshello:将来の操作の着信部分を説明するために使用される単純な文字列のみを含む複雑なタイプを定義します。
Sayshelloresponse:単純な文字列のみを含む複雑なタイプと、将来の操作を説明するために使用される返品値を定義します。
3.インポート要素
インポート要素を使用すると、現在のWSDLドキュメントの他のWSDLドキュメントで指定された名前空間で定義要素を使用できます。この例では、インポート要素は使用されていません。ユーザーがWSDLドキュメントをモジュール化する場合、この機能は通常非常に効果的です。
インポートの形式は次のとおりです。
<wsdl:Import namespace = "http://xxx.xxx.xxx/xxx/xxx" location = "http://xxx.xxx.xxx/xxx/xxx.wsdl"/>
名前空間属性と場所属性がある必要があります。
名前空間属性:値は、インポートされているWSDLドキュメントで宣言されたTargetNamesSpaceと一致する必要があります。
場所属性:実際のWSDLドキュメントを指す必要があり、ドキュメントを空にすることはできません。
4。メッセージ要素
メッセージ要素は、メッセージを使用してWebサービスのペイロードを説明しています。メッセージ要素は、出力のペイロードまたはメッセージの受け入れを記述できます。また、SOAPファイルヘッダーの内容とエラーの詳細要素についても説明できます。メッセージ要素の定義方法は、RPCスタイルまたはドキュメントスタイルのメッセージングの使用によって異なります。この記事のメッセージ要素の定義では、このドキュメントはドキュメントスタイルのメッセージングを使用します。
<wsdl:メッセージ名= "sayhelloresponse"> <wsdl:part name = "parameters" element = "tns:sayhelloresponse" /> < /wsdl:message> <wsdl:message name = "sayhellorequest"> <wsdl:part name = "elements" tns: "tns:< /wsdl
この部分は、メッセージ形式の抽象的な定義です。2つのメッセージSayhelloresponseとSayhelloreQuestが定義されています。
SayShelloreQuest:wayhello操作の要求メッセージ形式。メッセージフラグメント、名前付きパラメーターで構成され、要素は前に定義したタイプの要素です。
SayShelloresponse:Sayhello操作の応答メッセージ形式は、パラメーターという名前のメッセージフラグメントで構成されており、要素は前に定義した型の要素です。
RPCスタイルのメッセージを使用する場合、ドキュメント内の要素要素を変更するだけで変更する必要があります。
5。ポートタイプ要素
PortType要素は、Webサービスの抽象インターフェイスを定義します。このインターフェイスは、Javaインターフェイスに少し似ており、どちらも抽象型とメソッドを定義し、実装は定義されていません。 WSDLでは、ポートタイプ要素は、Webサービスの実装で使用されるインターネットプロトコル、エンコードスキーム、およびインターネットアドレスを説明するために使用される拘束力とサービス要素によって実装されます。
複数の操作をPortTypeで定義でき、1つの操作をメソッドと見なすことができます。この記事のWSDLドキュメントの定義:
<wsdl:porttype name = "helloserviceporttype"> <wsdl:operation name = "sayhello"> <wsdl:input name = "sayhellorequest" message = "tns:sayhellorequest" /> <wsdl:output name = "sayhelloresponse"メッセージ</wsdl:porttype>
PortTypeは、サービスのコールモードのタイプを定義します。操作は、操作がリクエスト/応答モードであることを示す入力と出力の両方を含むhelloメソッドを含んでいます。リクエストメッセージは、以前に定義されたSayhelloreQuestであり、応答メッセージは前に定義されたSayhelloresponseです。入力は、Webサービスに配信されるペイロードを表し、出力メッセージはクライアントに配信されるペイロードを表します。
6。バインディング
バインディング要素は、抽象的なポートタイプを特定のプロトコルのセット(SOAOおよびHTTP)、メッセージングスタイル、およびエンコードスタイルにマッピングします。通常、結合要素は、プロトコルの独自の要素と一緒に使用されます。この記事の例:
<wsdl:binding name = "helloservicehttpbinding" type = "tns:helloserviceporttype"> <wsdlsoap:binding style = "document" transport = "http://schemas.xmlsoap.org/soap/http"/> soapaction = "" /> <wsdl:input name = "sayhellorequest"> <wsdlsoap:body use = "literal" />> < /wsdl:input> <wsdl:output name = "sayhelloresponse"> <wsdlsoap:body use = "literal" />> wsput> <output> < /wsput> <