JavaRush /Java Blog /Random-KO /웹 서비스. 2단계. 클라이언트 작성을 단순화하는 방법은 무엇입니까?
eGarmin
레벨 41

웹 서비스. 2단계. 클라이언트 작성을 단순화하는 방법은 무엇입니까?

Random-KO 그룹에 게시되었습니다
이 간단한 메모에서 이전 단계 에서 작성한 웹 서비스 클라이언트 코드를 다시 살펴보고 싶습니다 . 이 경우 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");
definitions이 xml 파일을 직접 열고 태그 와 그 안에 있는 속성을 살펴 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 라는 특수 유틸리티가 포함되어 있습니다 . 하지만 먼저 할 일이... 먼저 메뉴에서 파일 > 새 프로젝트...를 선택 하고 프로젝트 이름을 HelloWS 로 지정하여 IDEA에서 새 프로젝트를 만들어 보겠습니다 . 새로 생성된 프로젝트를 어디에서 열 것인지 물으면 New Window 로 대답해야 합니다 . 즉, 새 창에서 이전 프로젝트가 열려 있는 것이 매우 중요하다는 점을 다시 한 번 언급하겠습니다. 1단계에서 해당 프로젝트에서 웹 서비스가 실행되고 있다는 것을 기억합니다. 물론 Windows 콘솔을 통해 간단히 실행할 수도 있지만 저는 그렇게 하는 것을 좋아하지 않습니다. 새 프로젝트에서 View > Tool Windows > Terminal 을 선택 하거나 간단히 Alt+F12 를 눌러 콘솔을 엽니다 . 이제 프로젝트의 루트에 있고 src 폴더 로 들어가야 하므로 콘솔에 다음 명령을 입력합니다. 이제 wsimportcd src 유틸리티를 사용할 차례입니다 . 이는 다음 원칙에 따라 작동합니다. WSDL 설명을 전달 하고 이에 대한 응답으로 웹 서비스에 액세스하는 데 필요한 모든 기능이 이미 포함된 스텁 파일(소위 -classes)을 생성합니다 . 이러한 클래스는 패키지에 배치됩니다 . 패키지 이름이 어디서 왔는지 묻는다면 대답은 다음과 같습니다. 패키지 이름은 WSDL 설명에서 반대의 대상 네임스페이스입니다. WSDL 의 태그에 있는 속성을 기억하세요 . 거기에는 다음과 같은 내용이 기록되어 있습니다 . 그리고 이것은 사이트 주소가 아니며 XML에서 네임스페이스를 설명하는 것이 관례적인 방식이며, 남은 것을 역순으로 버리고 확장하면 패키지 이름을 얻게 됩니다. 이제 유틸리티를 실행해 보겠습니다. 이 유틸리티 가 작동하려면 해당 경로를 PATH 환경 변수에 지정해야 합니다 . 아니면 단순히 전체 경로를 사용할 수도 있습니다. 나에게 그것은 C:\Program Files\Java\jdk1.8.0_31\bin 폴더에 있습니다 . 웹 서비스를 비활성화하지 않는 한 링크를 통해 원격으로 사용할 수 있는 –keep 키를 통해 WSDL 파일을 전달하기만 하면 됩니다 . 이 스텁 클래스는 무엇입니까? 그 중 두 개만 있습니다. 그 중 하나는Stubru.javarush.wstargetNamespacedefinitionshttp:// ws.javarush.ru/http://wsimport -keep http://localhost:1986/wss/hello?wsdlHelloWebService이는 본질적으로 1단계에서 수동으로 생성한 웹 서비스 인터페이스와 동일합니다. 차이점은 미미하며 이미 접한 주석이 약간 다르게 사용된다는 점과 추가 주석이 사용된다는 점입니다. 나는 아무것도 모른다고 말했지만, 이전에는 그것들 없이도 모든 것이 우리에게 잘 맞았기 때문에 그것들은 분명히 필수는 아닙니다. 두 번째 클래스는 HelloWebServiceImplServiceclass 에서 상속되는 stub 입니다 Service. Service우리는 이미 클라이언트에서 클래스를 접했습니다. 이 수업의 코드는 공개하지 않겠습니다. 왜냐하면... 모든 행을 설명할 준비가 거의 되지 않았지만 클래스의 본질은 이전에 웹 서비스에 연결하기 위해 클라이언트에서 수동으로 작성한 모든 것이 이 클래스에서 자동으로 생성된다는 사실로 귀결됩니다. 메소드 중 하나를 호출하면 모든 것이 공개 작업으로 처리됩니다. 따라서 이러한 클래스를 사용하여 새 프로젝트에서 클라이언트의 코드를 다시 작성하고 코드가 더 간결한지 확인하겠습니다. 먼저 새 프로젝트의 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 이 웹 서비스에 대한 클라이언트 작성을 단순화하기 위해 스텁 클래스의 자동 생성을 제공할 준비가 되어 있다는 것을 깨달았습니다. 내 생각에 이것은 다른 사람의 웹 서비스를 테스트하고 WSDL 설명 을 엿보고 싶지 않을 때 매우 유용한 기능입니다 . 미래 살펴보기 웹 서비스에 대한 다음 기사에서는 웹 서비스를 Tomcat 서블릿 컨테이너와 다른 애플리케이션 서버에 배포하는 방법에 대한 아이디어를 개략적으로 설명하여 웹 서비스를 하나의 도구로 실행할 필요가 없도록 하고 싶습니다. 처음 2단계에서 했던 것처럼 별도의 애플리케이션을 적용합니다. 하지만 그 전에 서블릿, 서블릿 컨테이너가 무엇인지, 애플리케이션 서버 및 일반 웹과 어떻게 다른지에 대해 잠시 이야기를 나누는 것이 더 나을 것 같습니다 . 또한 우리는 애플리케이션 서버에 대한 간략한 개요를 작성해야 할 것입니다 . 제 생각에는 주목할 만한 부분입니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION