JavaRush /จาวาบล็อก /Random-TH /บริการเว็บ ขั้นตอนที่ 2 จะทำให้การเขียนลูกค้าง่ายขึ้นได้อ...
eGarmin
ระดับ

บริการเว็บ ขั้นตอนที่ 2 จะทำให้การเขียนลูกค้าง่ายขึ้นได้อย่างไร

เผยแพร่ในกลุ่ม
ในบันทึกย่อนี้ ฉันต้องการทบทวนโค้ดไคลเอ็นต์บริการเว็บที่เราเขียนไว้ในขั้นตอนที่แล้วอีกครั้ง ในกรณีนี้ ฉันจะถือว่าคุณเปิด IDEA และอยู่ในโปรเจ็กต์จากขั้นตอนที่ 1 บริการเว็บของเราควรเปิดตัวในโปรเจ็กต์นี้:
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 ที่เราชื่นชอบซึ่งเรียกว่า JDK ใน Java มียูทิลิตี้พิเศษที่เรียกว่าwsimport แต่ สิ่งแรกก่อนอื่น... ก่อนอื่น มาสร้างโปรเจ็กต์ใหม่ใน IDEA โดยเลือกFile > New Project... จากเมนู และตั้งชื่อโปรเจ็กต์HelloWS เมื่อเราถูกถามว่าจะเปิดโครงการที่สร้างขึ้นใหม่ได้ที่ไหน เราต้องตอบNew Windowเช่น ในหน้าต่างใหม่ เพราะฉันจะทราบอีกครั้งว่าเป็นสิ่งสำคัญมากที่จะต้องเปิดโปรเจ็กต์ก่อนหน้านี้ เพราะ เราจำได้ตั้งแต่ขั้นตอนที่ 1 ว่าเรามีบริการเว็บที่ทำงานอยู่ในโปรเจ็กต์นั้น แน่นอนคุณสามารถเปิดใช้งานผ่านคอนโซล Windows ได้ แต่ฉันไม่ชอบทำอย่างนั้น จากโปรเจ็กต์ใหม่ ให้เปิดคอนโซลโดยเลือกView > Tool Windows > TerminalหรือเพียงกดAlt+ F12 ตอนนี้เราอยู่ในรากของโครงการ และเราต้องเข้าไปใน โฟลเดอร์ srcดังนั้นเราจึงป้อนคำสั่งต่อไปนี้ลงในคอนโซล: cd src ถึงเวลาใช้ ยูทิลิตี้ wsimportแล้ว มันทำงานบนหลักการต่อไปนี้: เราส่ง คำอธิบาย WSDL ไปให้ และเพื่อเป็นการตอบสนอง มันจึงสร้างไฟล์ stub (ที่เรียกว่าStub-classes) ซึ่งมีฟังก์ชันทั้งหมดที่เราต้องการในการเข้าถึงบริการเว็บอยู่แล้ว ru.javarush.wsคลาสเหล่า นี้จะถูกวางไว้ในแพ็คเกจ หากคุณถามว่าชื่อแพ็กเกจมาจากไหน คำตอบก็คือ ชื่อแพ็กเกจคือเนมสเปซเป้าหมายที่กลับรายการจากคำอธิบายWSDL จำแอตทริบิวต์targetNamespaceในแท็กdefinitionsจากWSDL ที่นั่นเรามีข้อความต่อไปนี้http:// ws.javarush.ru/เขียน และนี่ไม่ใช่ที่อยู่ไซต์ นี่เป็นธรรมเนียมในการอธิบายเนมสเปซใน xml และหากเราละทิ้งhttp://และขยายสิ่งที่เหลืออยู่ในลำดับย้อนกลับ เราจะได้ชื่อแพ็คเกจของเรา ดังนั้น เรามาเรียกใช้ยูทิลิตีนี้กันดีกว่า: wsimport -keep http://localhost:1986/wss/hello?wsdl เพื่อให้ใช้งานได้ ต้องระบุเส้นทางไปยัง ตัวแปรสภาพแวดล้อม PATHหรือคุณสามารถใช้เส้นทางแบบเต็มไปยังยูทิลิตี้ดังกล่าวได้ สำหรับฉันมันอยู่ในโฟลเดอร์ C:\ Program Files\Java\jdk1.8.0_31\bin โปรดทราบว่าสิ่งที่คุณต้องทำคือส่งไฟล์WSDL ผ่านปุ่ม –keepซึ่งสามารถเข้าถึงได้จากระยะไกลผ่านลิงก์ เว้นแต่ว่าเราได้ปิดใช้งานบริการเว็บแล้ว คลาส stub เหล่านี้คืออะไร? มีเพียงสองคนเท่านั้น หนึ่งในนั้นก็คือHelloWebServiceซึ่งโดยพื้นฐานแล้วเป็นอินเทอร์เฟซบริการเว็บเดียวกับที่เราสร้างขึ้นด้วยตนเองในขั้นตอนที่ 1 ความแตกต่างนั้นน้อยมากและอยู่ที่ความจริงที่ว่าคำอธิบายประกอบที่เราพบแล้วนั้นถูกใช้แตกต่างกันเล็กน้อย และนอกจากนี้ ยังมีการใช้คำอธิบายประกอบเพิ่มเติมด้วย ซึ่ง ฉันบอกว่าฉันไม่รู้อะไรเลย แต่เนื่องจากทุกอย่างทำงานให้เราโดยไม่มีพวกเขามาก่อน เห็นได้ชัดว่าพวกเขาจึงไม่บังคับ คลาสที่สองคือ stub ซึ่งHelloWebServiceImplServiceสืบทอดมาจากคลาส Serviceเราได้พบกับ ชั้นเรียนServiceในลูกค้าของเรา แล้ว ฉันจะไม่ให้รหัสของคลาสนี้เพราะ... ฉันแทบจะไม่พร้อมที่จะอธิบายทุกบรรทัด แต่สาระสำคัญของชั้นเรียนนั้นมาจากความจริงที่ว่าทุกสิ่งที่เราเขียนก่อนหน้านี้ในไคลเอนต์ด้วยตนเองเพื่อเชื่อมต่อกับบริการเว็บนั้นถูกสร้างขึ้นโดยอัตโนมัติในชั้นเรียนนี้ และเราเพียงแค่ต้อง เรียกวิธีใดวิธีหนึ่งแล้วเราจะมีทุกอย่างในแบบ openwork ดังนั้นเรามาเขียนโค้ดของลูกค้าของเราใหม่ในโปรเจ็กต์ใหม่โดยใช้คลาสเหล่านี้และตรวจสอบให้แน่ใจว่าโค้ดนั้นกระชับมากขึ้น ขั้นแรก ใน โฟลเดอร์ 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! ณ จุดนี้ บางทีเราอาจทำสิ่งนี้ให้เสร็จได้ ขั้นตอนเพราะว่า เป้าหมายของเขาบรรลุเป้าหมายแล้ว เราตระหนักดีว่าหากมี คำอธิบาย WSDLของบริการบนเว็บjdkก็พร้อมที่จะมอบการสร้างstubคลาส stub โดยอัตโนมัติเพื่อทำให้การเขียนไคลเอนต์สำหรับบริการบนเว็บนี้ง่ายขึ้น ในความคิดของฉัน นี่เป็นคุณสมบัติที่มีประโยชน์มากเมื่อคุณต้องการทดสอบบริการเว็บของผู้อื่น และไม่ดูคำอธิบาย WSDL ของมัน มองไปสู่อนาคต ในบทความถัดไปเกี่ยวกับบริการบนเว็บ ฉันต้องการสรุปแนวคิดเกี่ยวกับวิธีการปรับใช้บริการเว็บในคอนเทนเนอร์เซิร์ฟเล็ต Tomcat และในเซิร์ฟเวอร์แอปพลิเคชันต่างๆ เพื่อให้คุณไม่จำเป็นต้องเรียกใช้บริการเว็บเนื่องจาก แอปพลิเคชันแยกต่างหาก เหมือนที่เราทำใน 2 ขั้นตอนแรก แต่ก่อนหน้านั้น ฉันคิดว่าเป็นการดีกว่าถ้าจะอธิบายสั้นๆ ในหัวข้อว่าเซิร์ฟเล็ต เซิร์ฟเล็ตคอนเทนเนอร์คืออะไร และแตกต่างจากแอปพลิเคชันเซิร์ฟเวอร์และเว็บทั่วไปอย่างไร ... นอกจากนี้เราจะต้องสร้างภาพรวมโดยย่อของแอปพลิเคชันเซิร์ฟเวอร์ซึ่งในความคิดของฉันสมควรได้รับความสนใจของเรา
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION