JavaRush /Blog Java /Random-VI /Dịch vụ web. Bước 2. Làm thế nào để đơn giản hóa việc viế...
eGarmin
Mức độ

Dịch vụ web. Bước 2. Làm thế nào để đơn giản hóa việc viết thư cho khách hàng?

Xuất bản trong nhóm
Với ghi chú nhanh này, tôi muốn xem lại mã máy khách dịch vụ web mà chúng tôi đã viết ở bước trước . Trong trường hợp này, tôi sẽ giả định rằng bạn đã mở IDEA và trong đó có dự án từ Bước 1. Dịch vụ web của chúng tôi sẽ được khởi chạy trong dự án này:
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"));
    }
}
Lưu ý chúng ta cần biết trước bao nhiêu. Ngoài thực tế là bạn cần quyền truy cập vào mô tả wsdl (không có điều này, xin lỗi, không có cách nào):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
bạn cần phải tự mở tệp xml này và xem thẻ definitions, trong đó có các thuộc tính targetNamespacenameđể gọi hàm tạo QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
sau đó bạn cần kết nối thủ công với thẻ service:
Service service = Service.create(url, qname);
và trong đó vào thẻ port:
HelloWebService hello = service.getPort(HelloWebService.class);
và chỉ sau đó chúng ta mới có thể gọi phương thức từ xa:
hello.getHelloString("JavaRush")
Câu hỏi đặt ra là: đây có phải là lý do tại sao ông cố của chúng ta đã chết trên chiến trường để bây giờ chúng ta phải làm tất cả bằng tay? Và nếu đó thậm chí không phải là dịch vụ web của chúng tôi mà là của người khác. Sau đó, quá trình này sẽ còn khó chịu hơn. Định dạng XML được thiết kế để máy đọc chứ không phải con người. Vì vậy, hãy để máy thực hiện công việc bẩn thỉu và tận hưởng quá trình này. Đối với điều này, chúng ta không cần phải làm gì đặc biệt, bởi vì... SDK yêu thích của chúng tôi, được gọi là JDK trong Java, bao gồm một tiện ích đặc biệt gọi là wsimport . Nhưng điều đầu tiên trước tiên... Trước tiên, hãy tạo một dự án mới trong IDEA bằng cách chọn Tệp > Dự án mới... từ menu và đặt tên cho dự án là HelloWS . Khi được hỏi nơi mở dự án mới tạo, chúng tôi cần trả lời Cửa sổ mới , tức là. trong một cửa sổ mới, vì tôi sẽ lưu ý một lần nữa rằng điều rất quan trọng là dự án trước đó được mở, bởi vì Chúng tôi nhớ từ Bước 1 rằng chúng tôi có dịch vụ web đang chạy trong dự án đó. Tất nhiên, bạn có thể chỉ cần khởi chạy nó thông qua bảng điều khiển Windows, nhưng tôi không thích làm điều đó. Từ dự án mới, hãy mở bảng điều khiển bằng cách chọn View > Tool Windows > Terminal hoặc chỉ cần nhấn Alt+F12 . Bây giờ chúng ta đang ở trong thư mục gốc của dự án và cần vào thư mục src , vì vậy chúng ta nhập lệnh sau vào bảng điều khiển: cd src Bây giờ là lúc sử dụng tiện ích wsimport . Nó hoạt động theo nguyên tắc sau: chúng tôi chuyển cho nó một mô tả WSDL và để đáp lại, nó tạo ra các tệp sơ khai (được gọi là Stub-classes), vốn đã chứa tất cả chức năng mà chúng tôi cần để truy cập dịch vụ web. Các lớp này sẽ được đặt trong gói ru.javarush.ws. Nếu bạn hỏi tên gói đến từ đâu thì câu trả lời là: tên gói là không gian tên đích đảo ngược từ mô tả WSDL . Ghi nhớ thuộc tính targetNamespacetrong thẻ definitionstừ WSDL . Ở đó chúng tôi đã viết như sau http:// ws.javarush.ru/. Và đây không phải là địa chỉ trang web, đây là cách mô tả các không gian tên trong xml theo thông lệ và nếu chúng tôi loại bỏ http://và mở rộng những gì còn lại theo thứ tự ngược lại, chúng tôi sẽ nhận được tên gói của mình. Vì vậy, hãy chạy tiện ích: wsimport -keep http://localhost:1986/wss/hello?wsdl Để nó hoạt động, đường dẫn đến nó phải được chỉ định trong biến môi trường PATH hoặc bạn chỉ cần sử dụng đường dẫn đầy đủ đến nó. Đối với tôi nó nằm trong thư mục C:\Program Files\Java\jdk1.8.0_31\bin . Xin lưu ý rằng tất cả những gì bạn cần làm là chuyển tệp WSDL qua khóa –keep , khóa này có sẵn từ xa thông qua một liên kết, tất nhiên trừ khi chúng tôi đã tắt dịch vụ web. Những lớp sơ khai này là gì? Chỉ có hai người trong số họ. Một trong số đó làHelloWebService, về cơ bản là cùng một giao diện dịch vụ web mà chúng tôi đã tạo thủ công ở Bước 1. Sự khác biệt là rất nhỏ và nó nằm ở chỗ các chú thích mà chúng tôi đã gặp được sử dụng hơi khác một chút và ngoài ra, các chú thích bổ sung cũng được sử dụng, điều này Tôi đã đề cập rằng tôi không biết gì cả, nhưng vì mọi thứ đều hiệu quả với chúng tôi mà không có chúng trước đây nên rõ ràng chúng không bắt buộc. Lớp thứ hai là stub HelloWebServiceImplService, kế thừa từ lớp Service. Chúng tôi đã gặp lớp này Servicetrong ứng dụng khách của mình. Tôi sẽ không đưa ra mã của lớp này, bởi vì... Tôi hầu như chưa sẵn sàng để giải thích tất cả các dòng của nó, nhưng bản chất của lớp này nằm ở chỗ mọi thứ mà trước đây chúng tôi đã viết trong ứng dụng khách theo cách thủ công để kết nối với dịch vụ web đều được tạo tự động trong lớp này và chúng tôi chỉ cần gọi một trong các phương thức của nó và chúng ta sẽ có mọi thứ trong openwork. Vì vậy, hãy viết lại mã của khách hàng trong một dự án mới bằng cách sử dụng các lớp này và đảm bảo mã ngắn gọn hơn. Đầu tiên, trong thư mục src của dự án mới, hãy tạo một gói ru.javarush.clientvà trong đó một lớp HelloWebServiceClientcó phương thức 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") );
    }
}
Phân tích mã là cơ bản và những gì tôi mô tả trong phần nhận xét là khá đủ. Sau khi khởi chạy ứng dụng khách, chúng ta sẽ thấy dòng: Hello, JavaRush Community!Đồng thời, ứng dụng khách từ dự án từ Bước 1 sẽ tiếp tục làm việc và hiển thị văn bản mà chúng tôi đã viết trong đó, cụ thể là: Hello, JavaRush! Tại thời điểm này, có lẽ, chúng ta có thể hoàn thành việc này Bước đi, bởi vì mục tiêu của anh ấy đã đạt được. Chúng tôi nhận thấy rằng nếu có mô tả WSDL của một dịch vụ web thì jdk sẵn sàng cung cấp cho chúng tôi khả năng tạo stubcác lớp sơ khai tự động để đơn giản hóa việc viết ứng dụng khách cho dịch vụ web này. Theo tôi, đây là một tính năng rất hữu ích khi bạn muốn thử nghiệm dịch vụ web của người khác và không xem mô tả WSDL của nó . Nhìn về tương lai Trong bài viết tiếp theo về các dịch vụ web, tôi muốn phác thảo các ý tưởng về cách triển khai một dịch vụ web vào vùng chứa servlet Tomcat và vào các máy chủ ứng dụng khác nhau, để bạn không cần phải chạy dịch vụ web dưới dạng máy chủ. ứng dụng riêng biệt, như chúng tôi đã làm trong 2 bước đầu tiên. Nhưng trước đó, tôi nghĩ sẽ tốt hơn nếu viết một đoạn ngắn về chủ đề servlet, bộ chứa servlet là gì và chúng khác với máy chủ ứng dụng và web thông thường như thế nào... . Ngoài ra, chúng ta sẽ phải có một cái nhìn tổng quan ngắn gọn về các máy chủ ứng dụng , theo ý kiến ​​​​của tôi, đáng được chúng ta quan tâm.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION