ในบันทึกย่อนี้ ฉันต้องการทบทวนโค้ดไคลเอ็นต์บริการเว็บที่เราเขียนไว้ในขั้นตอนที่แล้วอีกครั้ง ในกรณีนี้ ฉันจะถือว่าคุณเปิด 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 ขั้นตอนแรก แต่ก่อนหน้านั้น ฉันคิดว่าเป็นการดีกว่าถ้าจะอธิบายสั้นๆ ในหัวข้อว่าเซิร์ฟเล็ต เซิร์ฟเล็ตคอนเทนเนอร์คืออะไร และแตกต่างจากแอปพลิเคชันเซิร์ฟเวอร์และเว็บทั่วไปอย่างไร ... นอกจากนี้เราจะต้องสร้างภาพรวมโดยย่อของแอปพลิเคชันเซิร์ฟเวอร์ซึ่งในความคิดของฉันสมควรได้รับความสนใจของเรา
GO TO FULL VERSION