JavaRush /Java Blog /Random-TW /網頁服務。步驟2.如何簡化客戶端的編寫?
eGarmin
等級 41

網頁服務。步驟2.如何簡化客戶端的編寫?

在 Random-TW 群組發布
在此簡短說明中,我想重新回顧我們在上一步中編寫的 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和其中的屬性targetNamespacename呼叫建構函數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?wsdlHelloWebService,這本質上與我們在步驟 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 有何不同…。此外,我們還必須對應用程式伺服器進行簡要概述,我認為這值得我們關注。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION