В этом разделе показано, как собрать и развернуть простой веб-сервис и два клиента: консольный клиент и веб-клиент. Исходный код сервиса находится в каталоге tut-install/examples/jaxws/helloservice-war/, а клиенты — в каталогах tut-install/examples/jaxws/hello-appclient/ и tut-install/examples/jaxws/hello-webclient/.
Рисунок 31-1 иллюстрирует, как технология JAX-WS управляет связью между веб-сервисом и клиентом.
Рисунок 31-1. Связь между веб-сервисом JAX-WS и клиентом

Отправной точкой для разработки веб-сервиса JAX-WS является класс Java, аннотированный javax.jws.WebService. Аннотация @WebService определяет класс как конечную точку веб-сервиса.
Интерфейс конечной точки сервиса или реализация конечной точки сервиса (SEI) — это соответственно интерфейс или класс Java, объявляющий методы, которые клиент может вызывать у сервиса. Интерфейс не требуется при создании конечной точки JAX-WS. Класс реализации веб-сервиса неявно определяет SEI.
Можно указать явный интерфейс, добавив элемент endpointInterface в аннотацию @WebService в классе реализации. Затем нужно предоставить интерфейс, который определяет публичные методы, доступные в классе реализации конечной точки.
Основные шаги для создания веб-сервиса и клиента
Основные шаги для создания веб-сервиса и клиента следующие.
-
Закодируйте класс реализации.
-
Скомпилируйте класс реализации.
-
Упакуйте файлы в WAR-файл.
-
Разверните WAR-файл. Артефакты веб-сервиса, используемые для связи с клиентами, создаются сервером GlassFish во время развёртывания.
-
Закодируйте клиентский класс.
-
Используйте цель Maven wsimport для генерации и компиляции артефактов веб-сервиса, необходимых для подключения к сервису.
-
Скомпилируйте клиентский класс.
-
Запустите клиент.
Если вы используете IDE NetBeans для создания сервиса и клиента, среда разработки выполняет задачу wsimport.
В следующих разделах эти шаги рассматриваются более подробно.
Требования к конечной точке JAX-WS
Конечные точки JAX-WS должны соответствовать этим требованиям.
-
Реализующий класс должен быть аннотирован javax.jws.WebService или javax.jws.WebServiceProvider.
-
Реализующий класс может явно ссылаться на SEI через элемент endpointInterface аннотации @WebService, но не обязательно. Если endpointInterface не указан в @WebService, SEI неявно определяется для реализующего класса.
-
Бизнес-методы реализующего класса должны быть публичными и не должны объявляться static или final.
-
Бизнес-методы, предоставляемые клиентам веб-сервисов, должны быть аннотированы javax.jws.WebMethod.
-
Бизнес-методы, предоставляемые клиентам веб-сервисов, должны иметь JAXB-совместимые параметры и типы возвращаемых данных. См. список привязок типов данных JAXB по умолчанию в разделе Типы, поддерживаемые JAX-WS.
-
Реализующий класс не должен быть объявлен final и не должен быть abstract.
-
Реализующий класс должен иметь публичный конструктор по умолчанию.
-
Реализующий класс не должен определять метод finalize.
-
Реализующий класс может использовать аннотации javax.annotation.PostConstruct или javax.annotation.PreDestroy в своих Callback-методах событий жизненного цикла.
Метод @PostConstruct вызывается контейнером до того, как реализующий класс начинает отвечать клиентам веб-сервиса.
Метод @PreDestroy вызывается контейнером перед удалением конечной точки.
Кодирование класса реализации конечной точки сервиса
В этом примере класс реализации Hello аннотируется как конечная точка веб-сервиса с помощью аннотации @WebService. Hello объявляет один метод с именем sayHello, аннотированный @WebMethod, который предоставляет аннотированный метод клиентам веб-сервиса. Метод sayHello возвращает приветствие клиенту, используя переданное ему имя для создания приветствия. Класс реализации также должен определять конструктор по умолчанию — публичный, без аргументов.
package javaeetutorial.helloservice;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public class Hello {
private final String message = "Hello, ";
public Hello() {
}
@WebMethod
public String sayHello(String name) {
return message + name + ".";
}
}
Сборка, упаковка и развёртывание сервиса
Вы можете использовать IDE NetBeans или Maven для сборки, упаковки и развёртывания приложения helloservice-war.
Здесь рассматриваются следующие темы:
Сборка, упаковка и развёртывание сервиса в IDE NetBeans
-
Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).
-
В меню «Файл» выберите «Открыть проект».
-
В диалоговом окне «Открыть проект» перейдите к:
tut-install/examples/jaxws
-
Выберите каталог helloservice-war.
-
Нажмите Открыть проект.
-
На вкладке «Проекты» кликните правой кнопкой мыши проект helloservice-war и выберите «Выполнить».
Эта команда собирает и упаковывает приложение в WAR-файл, helloservice-war.war, расположенный в tut-install/examples/jaxws/helloservice-war/target/ и развёртывает этот WAR-файл в GlassFish Server. Он также открывает интерфейс тестирования веб-сервиса по URL, указанному в Тестирование сервиса без клиента.
Сборка, упаковка и развёртывание сервиса с помощью Maven
-
Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).
-
В окне терминала перейдите в:
tut-install/examples/jaxws/helloservice-war/
-
Введите следующую команду:
Эта команда собирает и упаковывает приложение в WAR-файл helloservice-war.war, расположенный в каталоге target, а затем развёртывает WAR на сервере GlassFish.
Тестирование методов конечной точки веб-сервиса
Сервер GlassFish позволяет тестировать методы конечной точки веб-сервиса.
Здесь рассматриваются следующие темы:
Тестирование сервиса без клиента
Чтобы проверить метод sayHello в HelloService, выполните следующие действия.
-
Откройте интерфейс тестирования веб-сервиса, введя следующий URL в веб-браузере:
http://localhost:8080/helloservice-war/HelloService?Tester
-
В разделе Методы введите имя в качестве параметра метода sayHello.
-
Нажмите sayHello.
Вы перейдете на страницу вызова метода sayHello.
В разделе Method returned вы увидите ответ от конечной точки.
Простой консольный клиент JAX-WS
Класс HelloAppClient является консольным клиентом, который обращается к методу sayHello в HelloService. Этот вызов осуществляется через порт — локальный объект, который действует как прокси для удалённого сервиса. Порт создаётся во время разработки с помощью цели Maven wsimport, которая генерирует переносимые артефакты JAX-WS на основе имеющегося WSDL-файла.
Здесь рассматриваются следующие темы:
Кодирование консольного клиента
При вызове удалённых методов порта клиент выполняет эти шаги.
-
Использует сгенерированный класс helloservice.endpoint.HelloService, который представляет сервис по URI WSDL-файла развёрнутого сервиса:
import javaeetutorial.helloservice.endpoint.HelloService;
import javax.xml.ws.WebServiceRef;
public class HelloAppClient {
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
private static HelloService service;
-
Извлекает прокси для сервиса, также известный как порт, вызывая getHelloPort в сервисе:
javaeetutorial.helloservice.endpoint.Hello port = service.getHelloPort();
Порт реализует SEI, определённый сервисом.
-
Он вызывает метод sayHello порта, передавая строку сервису:
return port.sayHello(arg0);
Вот полный исходный код HelloAppClient.java, который находится в каталоге tut-install/examples/jaxws/hello-appclient/src/main/java/javaeetutorial/hello/appclient/:
package javaeetutorial.hello.appclient;
import javaeetutorial.helloservice.endpoint.HelloService;
import javax.xml.ws.WebServiceRef;
public class HelloAppClient {
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
private static HelloService service;
/**
* @param args аргументы командной строки
*/
public static void main(String[] args) {
System.out.println(sayHello("world"));
}
private static String sayHello(java.lang.String arg0) {
javaeetutorial.helloservice.endpoint.Hello port =
service.getHelloPort();
return port.sayHello(arg0);
}
}
Запуск консольного клиента
Вы можете использовать IDE NetBeans или Maven для сборки, упаковки, развёртывания и запуска приложения hello-appclient. Чтобы собрать клиента, вы должны сначала развернуть helloservice-war, как описано в Сборка, упаковка и развёртывание сервиса.
Здесь рассматриваются следующие темы:
Запуск консольного клиента с IDE NetBeans
-
В меню «Файл» выберите «Открыть проект».
-
В диалоговом окне «Открыть проект» перейдите к:
tut-install/examples/jaxws
-
Выберите каталог hello-appclient.
-
Нажмите Открыть проект.
-
На вкладке «Проекты» кликните правой кнопкой мыши проект hello-appclient и выберите «Сборка».
Эта команда запускает цель wsimport, затем собирает, упаковывает и запускает клиент. Вы увидите выходные данные клиентского приложения на вкладке вывода hello-appclient:
--- exec-maven-plugin:1.2.1:exec (run-appclient) @ hello-appclient ---
Hello, world.
Запуск консольного клиента с помощью Maven
-
В окне терминала перейдите в:
tut-install/examples/jaxws/hello-appclient/
-
Введите следующую команду:
Эта команда запускает цель wsimport, затем собирает, упаковывает и запускает клиент. Выходные данные клиентского приложения выглядят так:
--- exec-maven-plugin:1.2.1:exec (run-appclient) @ hello-appclient ---
Hello, world.
Простой веб-клиент JAX-WS
HelloServlet — это сервлет, который, подобно Java-клиенту, вызывает метод sayHello веб-сервиса. Как и клиентское приложение, он делает этот вызов через порт.
Здесь рассматриваются следующие темы:
Кодирование сервлета
Чтобы вызвать метод для порта, клиент выполняет эти шаги.
-
Он импортирует конечную точку HelloService и аннотацию @WebServiceRef:
import javaeetutorial.helloservice.endpoint.HelloService;
...
import javax.xml.ws.WebServiceRef;
-
Он определяет ссылку на веб-сервис, указывая местоположение WSDL:
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
-
Он объявляет веб-сервис, а затем определяет приватный метод, который вызывает метод sayHello для порта:
private HelloService service;
...
private String sayHello(java.lang.String arg0) {
javaeetutorial.helloservice.endpoint.Hello port =
service.getHelloPort();
return port.sayHello(arg0);
}
-
В сервлете он вызывает этот приватный метод:
out.println("<p>" + sayHello("world") + "</p>");
Ниже приведены важные части кода HelloServlet. Код находится в каталоге tut-install/examples/jaxws/hello-webclient/src/java/javaeetutorial/hello/webclient/.
package javaeetutorial.hello.webclient;
import javaeetutorial.helloservice.endpoint.HelloService;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.WebServiceRef;
@WebServlet(name="HelloServlet", urlPatterns={"/HelloServlet"})
public class HelloServlet extends HttpServlet {
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
private HelloService service;
/**
* Обработка как HTTP <code>GET</code>,
* так и <code>POST</code> запросов.
* @param request объект запроса
* @param response объект ответа
* @throws ServletException ошибка, специфичная для сервлетов
* @throws IOException ошибка ввода/вывода
*/
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<html lang=\"en\">");
out.println("<head>");
out.println("<title>Servlet HelloServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet HelloServlet at " +
request.getContextPath () + "</h1>");
out.println("<p>" + sayHello("world") + "</p>");
out.println("</body>");
out.println("</html>");
}
}
// методы doGet and doPost methods, которые вызывают методы processRequest, and
// getServletInfo
private String sayHello(java.lang.String arg0) {
javaeetutorial.helloservice.endpoint.Hello port =
service.getHelloPort();
return port.sayHello(arg0);
}
}
Запуск веб-клиента
Вы можете использовать IDE NetBeans или Maven для сборки, упаковки, развёртывания и запуска приложения hello-webclient. Чтобы собрать клиента, вы должны сначала развернуть helloservice-war, как описано в Сборка, упаковка и развёртывание сервиса.
Здесь рассматриваются следующие темы:
Запуск веб-клиента в IDE NetBeans
-
В меню «Файл» выберите «Открыть проект».
-
В диалоговом окне «Открыть проект» перейдите к:
tut-install/examples/jaxws
-
Выберите каталог hello-webclient.
-
Нажмите Открыть проект.
-
На вкладке «Проекты» кликните правой кнопкой мыши проект hello-webclient и выберите «Сборка».
Эта задача запускает цель wsimport, собирает и упаковывает приложение в WAR-файл, hello-webclient.war, расположенный в каталоге target, и развёртывает его на сервере GlassFish.
-
В веб-браузере введите следующий URL:
http://localhost:8080/hello-webclient/HelloServlet
Вывод метода sayHello появится в окне.
Запуск веб-клиента с помощью Maven
-
В окне терминала перейдите в:
tut-install/examples/jaxws/hello-webclient/
-
Введите следующую команду:
Эта команда запускает цель wsimport, затем собирает и упаковывает приложение в WAR-файл, hello-webclient.war, расположенный в каталоге target , WAR-файл затем развёртывается на сервере GlassFish.
-
В веб-браузере введите следующий URL:
http://localhost:8080/hello-webclient/HelloServlet
Вывод метода sayHello появится в окне.