在此簡短說明中,我想重新回顧我們在上一步中編寫的 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")
問題是:這就是我們的曾祖父戰死沙場的原因,所以我們現在只能靠手工完成這一切嗎?如果它甚至不是我們的網路服務,而是其他人的。那麼這個過程就會更加不愉快。XML 格式旨在由機器而非人類讀取。所以讓機器來做髒活,享受過程吧。為此,我們不需要做任何特別的事情,因為...... 我們最喜歡的 SDK(在 Java 中稱為 JDK)包含一個名為wsimport的特殊實用程式。但首先要做的事情...首先,讓我們在 IDEA 中建立一個新項目,方法是從選單中選擇File > New Project...並將該項目命名為HelloWS。當我們被問到在哪裡打開新創建的項目時,我們需要回答New Window,即 在新視窗中,因為我會再次指出,打開上一個項目非常重要,因為 我們記得在第 1 步中,我們的 Web 服務在該專案中運行。當然,您可以簡單地透過 Windows 主機啟動它,但我不喜歡這樣做。在新專案中,透過選擇View > Tool Windows > Terminal開啟控制台,或只需按Alt+F12。現在我們位於專案的根目錄中,我們需要進入src資料夾,因此我們在控制台中輸入以下命令:cd src
現在是時候使用wsimport實用程式了。它的工作原理如下:我們向它傳遞一個 WSDL描述,作為回應,它會建立存根檔案(所謂的Stub
類別),其中已經包含我們存取 Web 服務所需的所有功能。這些類別將被放置在包中ru.javarush.ws
。如果你問包名從何而來,答案是:包名是WSDL描述的反向目標命名空間。記住WSDLtargetNamespace
標記中definitions
的屬性。在那裡我們寫了以下內容。這不是網站位址,這是在 xml 中描述名稱空間的習慣方式,如果我們丟棄並以相反的順序擴展剩餘的內容,我們將得到套件名稱。因此,讓我們運行該實用程式:為了使其工作,必須在PATH環境變數 中指定它的路徑,或者您可以簡單地使用它的完整路徑。對我來說,它位於資料夾C:\Program Files\Java\jdk1.8.0_31\bin中。請注意,您所需要做的就是透過–keep key 傳遞WSDL文件,該文件可透過連結遠端訪問,當然,除非我們停用了 Web 服務。這些存根類別是什麼?他們只有兩個人。其中之一是http:// ws.javarush.ru/
http://
wsimport -keep http://localhost:1986/wss/hello?wsdl
HelloWebService
,這本質上與我們在步驟 1 中手動創建的 Web 服務介面相同。區別很小,在於我們已經遇到的註釋的使用方式略有不同,此外還使用了額外的註釋,這我提到我什麼都不知道,但既然以前沒有它們,一切都對我們有用,那麼它們顯然不是強制性的。第二個類別是stub HelloWebServiceImplService
,它繼承自class Service
。我們已經在我們的客戶端遇到過這個類別Service
。我不會給出這個類別的程式碼,因為...... 我還沒準備好解釋它的所有內容,但該類別的本質歸結為這樣一個事實:我們之前在客戶端中手動編寫的用於連接到Web 服務的所有內容都是在此類中自動創建的,我們只需要呼叫它的方法之一,我們將擁有鏤空的一切。因此,讓我們使用這些類別在新專案中重寫客戶的程式碼,並確保程式碼更加簡潔。首先,在新專案的src資料夾中,建立一個包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 服務編寫用戶端的過程。在我看來,當您想要測試別人的 Web 服務而不是查看其WSDL描述時,這是一個非常有用的功能。 展望未來 在下一篇關於 Web 服務的文章中,我想概述如何將 Web 服務部署到 Tomcat servlet 容器和不同的應用程式伺服器中,這樣您就不需要像下面那樣運行 Web 服務:一個單獨的應用程序,就像我們在前兩個步驟中所做的那樣。但在此之前,我認為最好先離題一下什麼是 servlet、servlet 容器以及它們與應用程式伺服器和常規 Web 有何不同…。此外,我們還必須對應用程式伺服器進行簡要概述,我認為這值得我們關注。
GO TO FULL VERSION