この簡単なメモでは、前の手順 で作成した Web サービス クライアント コードをもう一度見ていきたいと思います。この場合、IDEA が開いており、その中にステップ 1 のプロジェクトがあると仮定します。Web サービスはこのプロジェクトで起動する必要があります。
package ru.javarush.client;
// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;
// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;
public class HelloWebServiceClient {
public static void main(String[] args) throws MalformedURLException {
// создаем ссылку на wsdl описание
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
// Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
// 1-ый аргумент смотрим в атрибуте targetNamespace
// 2-ой аргумент смотрим в атрибуте name
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
// Теперь мы можем дотянуться до тега service в wsdl описании,
Service service = Service.create(url, qname);
// а далее и до вложенного в него тега port, чтобы
// получить ссылку на удаленный от нас an object веб-сервиса
HelloWebService hello = service.getPort(HelloWebService.class);
// Ура! Теперь можно вызывать удаленный метод
System.out.println(hello.getHelloString("JavaRush"));
}
}
事前にどれだけ知っておく必要があるかに注目してください。さらに、wsdl記述にアクセスする必要があります (これがないと、申し訳ありませんが、方法がありません)。
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
この XML ファイルを自分で開き、タグdefinitions
とその属性を確認し、targetNamespace
コンストラクname
ターを呼び出す必要がありますQName
。
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
その場合は、手動でタグに接続する必要がありますservice
。
Service service = Service.create(url, qname);
そしてその中のタグにport
:
HelloWebService hello = service.getPort(HelloWebService.class);
その後でのみ、リモート メソッドを呼び出すことができます。
hello.getHelloString("JavaRush")
問題は、私たちの曾祖父たちが戦場で亡くなったのに、今ではすべて手作業でやっているのはこのためなのか、ということです。そして、それが私たちの Web サービスではなく、他の誰かの Web サービスである場合も同様です。そうなると、このプロセスはさらに不快になります。XML 形式は、人間ではなく機械が読み取るように設計されています。汚れ仕事は機械に任せて、そのプロセスを楽しみましょう。このために特別なことをする必要はありません。なぜなら... Java で JDK と呼ばれる私たちのお気に入りの SDK には、wsimportと呼ばれる特別なユーティリティが含まれています。まず最初に... まず、メニューから[ファイル] > [新しいプロジェクト...]を選択し、プロジェクトにHelloWSという名前を付けて、IDEA で新しいプロジェクトを作成しましょう。新しく作成したプロジェクトをどこで開くかを尋ねられたら、New Windowと答える必要があります。新しいウィンドウで開きます。前のプロジェクトが開いていることが非常に重要であることにもう一度注意します。ステップ 1 から、そのプロジェクトで Web サービスが実行されていることを思い出します。もちろん、Windows コンソールから単純に起動することもできますが、私はそれは好きではありません。新しいプロジェクトから、[表示] > [ツール ウィンドウ] > [ターミナル]を選択するか、単にAlt+F12を押してコンソールを開きます。ここではプロジェクトのルートにいます。srcフォルダーに移動する必要があるので、コンソールに次のコマンドを入力します。cd src
次に、wsimportユーティリティを使用します。これは次の原則に基づいて動作します。WSDL記述を渡し、それに応答してスタブ ファイル (いわゆるStub
-classes) を作成します。このファイルには、Web サービスにアクセスするために必要なすべての機能がすでに含まれています。これらのクラスはパッケージに配置されますru.javarush.ws
。パッケージ名の由来を尋ねると、その答えは次のとおりです。パッケージ名は、WSDL記述のターゲット名前空間を逆にしたものです。WSDLのtargetNamespace
タグ内の属性を覚えておいてください。そこには次のように書かれていました。これはサイトのアドレスではなく、XML で名前空間を記述するのが通例です。残ったものを破棄して逆の順序で展開すると、パッケージ名が得られます。それでは、ユーティリティを実行してみましょう。 ユーティリティが機能するには、そのパスをPATH環境変数に指定する必要があります。あるいは、単純にフル パスを使用することもできます。私の場合、それはフォルダーC:\Program Files\Java\jdk1.8.0_31\binにあります。必要なのは、–keep key を介してWSDLファイルを渡すことだけです。これは、Web サービスを無効にしていない限り、リンクを介してリモートから利用できます。これらのスタブ クラスとは何ですか? それらは2つだけです。そのうちの 1 つは、definitions
http:// ws.javarush.ru/
http://
wsimport -keep http://localhost:1986/wss/hello?wsdl
HelloWebService
これは、手順 1 で手動で作成した Web サービス インターフェイスと本質的に同じです。違いは最小限であり、すでに遭遇したアノテーションの使用方法が若干異なることと、追加のアノテーションが使用されるという事実にあります。何も知らないと言いましたが、以前はそれらがなくてもすべてうまくいったので、明らかに必須ではありません。2 番目のクラスはスタブでHelloWebServiceImplService
、クラスを継承しますService
。Service
クライアント内ですでにこのクラスに遭遇しています。このクラスのコードは説明しません。なぜなら... そのすべての行を説明する準備はほとんどできていませんが、このクラスの本質は、Web サービスに接続するために以前にクライアントに手動で記述したすべての内容がこのクラスで自動的に作成され、必要なのは次のことだけです。そのメソッドの 1 つを呼び出すと、すべてが透かし彫りになります。そこで、これらのクラスを使用して新しいプロジェクトでクライアントのコードを書き直し、コードがより簡潔になるようにしましょう。まず、新しいプロジェクトのsrcフォルダーにpackage を作成し、その中にメソッドを持つru.javarush.client
クラスを作成しましょう。 HelloWebServiceClient
main
package ru.javarush.client;
// подключаем классы-заглушки
import ru.javarush.ws.*;
public class HelloWebServiceClient {
public static void main(String[] args) {
// подключаемся к тегу service в wsdl описании
HelloWebServiceImplService helloService = new HelloWebServiceImplService();
// получив информацию из тега service подключаемся к самому веб-сервису
HelloWebService hello = helloService.getHelloWebServiceImplPort();
// обращаемся к веб-сервису и выводим результат в консоль
System.out.println( hello.getHelloString("JavaRush Community") );
}
}
コードの解析は初歩的なものであり、コメントで説明した内容で十分です。クライアントを起動すると、次の行が表示されます。Hello, JavaRush Community!
同時に、ステップ 1 のプロジェクトのクライアントは作業を続行し、クライアントに書き込んだテキストを表示します。つまり、Hello, JavaRush!
この時点で、おそらく、これを完了できます。ステップ、なぜなら 彼の目標は達成されました。Web サービスのWSDL記述があれば、 jdk がスタブ クラスの自動生成を提供して、stub
この Web サービスのクライアントの作成を簡素化できることに気付きました。私の意見では、これは、 WSDL の記述を覗くのではなく、他の人の Web サービスをテストしたい場合に非常に便利な機能です。 将来への展望 Web サービスに関する次の記事では、Web サービスを Tomcat サーブレット コンテナおよびさまざまなアプリケーション サーバーにデプロイして、Web サービスを実行する必要がないようにする方法について概要を説明したいと思います。最初の 2 つのステップで行ったように、別のアプリケーションを作成します。しかしその前に、サーブレット、サーブレット コンテナとは何か、またそれらがアプリケーション サーバーや通常の Web とどのように異なるのかというトピックについて、少し脱線したほうがよいと思います。さらに、アプリケーション サーバーについて簡単に概要を説明する必要がありますが、これは注目に値すると思います。
GO TO FULL VERSION