IPZ / IPZ_lab3_WebServices
.docЛабораторная работа 3
"API JAX-WS"
Цель – приобрести навыки работы с API "JAX-WS" (Java API for XML Web Services).
1. Теоретические сведения.
"JAX-WS" является частью платформы "J2EE" – набора "Java"-спецификаций и документаций, созданных с ориентацией на клиент-серверную архитектуру для решения задач масштабов предприятий (масштабируемость и переносимость как преследуемые цели).
Использование API "JAX-WS" при разработке Web-сервисов (сервисов) предоставляет следующее преимущество:
- упрощение непосредственно процесса разработки, а также процедуры развертывания полученного программного продукта на сервере приложений. В качестве последнего может, в частности, быть использован "Apache Tomcat 7.0" [3], "Oracle GlassFish Server 3.1" [4] или "JBoss Application Server 7" [5].
В работе будет использоваться сервер "GlassFish" по следующим причинам:
- является интегрированным с IDE "NetBeans 7.2.1";
- предоставляет средства тестирования сервисов (это снимает потребность в создании интерфейса клиента с целью проверки работоспособности сервисов).
Для запуска "GlassFish"-сервера в среде "NetBeans" необходимо выполнить такую последовательность действий:
- Вкладка "Службы" > "Серверы" > "GlassFish Server 3.1.2" > "Запустить" (процесс запуска займе порядка десятков секунд).
Для перехода к панели администрирования (управления развернутыми сервисами в частности) предназначен порт "4848". С этой целью в Web-браузере необходимо ввести запрос следующего вида:
> http://<<host_name>>:4848/common/index.jsf
// для случая обращения к локальному серверу
// <<host_name>> == localhost (127.0.0.1)
Например, элементы Web-интерфейса "Deploy an Application" и "List Deployed Applications" предоставляют средства развертывания сервисов и управления (мониторинга в частности) уже развернутыми сервисами соответственно.
Для тестирования сервисов и просмотра их wsdl-описаний используются порт "8080":
> http://<<host_name>>:8080/<<project_name>>/ \
<<service_name>>Service?wsdl
> http://<<host_name>>:8080/<<project_name>>/ \
<<service_name>>Service?Tester
// <<project_name>> - название созданного "NetBeans"-проекта
// <<service_name>> - "имя" Java-класса сервиса
Архитектура "JAX-WS" приведена на рис. 1.
Рисунок 1 – Ключевые компоненты и связи между ними
На рис. 1 компонент "SOAP" представляет одноименный протокол (Simple Object Access Protocol) обмена структурированными сообщениями между клиентским интерфейсом и сервисом (на основе XML).
В общем случае интерфейс клиента может быть реализован следующими путями:
- в качестве консольного приложения (выбор этого пути можно рассматривать в качестве альтернативы тестированию);
- с использованием "JSP"- и "Servlet"-технологий.
Процедура создания Web-ориентированного "NetBeans"-проекта следующая:
- "Ctrl+Shift+N" > "Java Web" > "Web-приложение".
В общем случае, преследуемая конечная цель при создании подобного проекта заключается в развертывании Web-приложения на заданном сервере приложений. В связи с этим, приведем "Java"-файлы (классы) в составе проекта:
- интерфейс сервиса (задание прототипов реализуемых методов);
- класс, включающий непосредственно реализации методов ("имя" класса ассоциируется с "именем" сервиса);
- класс, включающий метод "void main(String[] args)", в теле которого осуществляется вызов метода, предназначенного для развертывания сервиса на сервере приложений (метод "publish()" статического класса "Endpoint"):
public static Endpoint publish(java.lang.String address,
java.lang.Object implementor);
// address – URI, ассоциированный с интерфейсом сервиса;
// implementor – экземпляр сервиса.
Шаблоны соответствующих "Java"-классов приведены в листингах 1 – 3.
Листинг 1 – Шаблон интерфейса сервиса
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface ServiceInterface {
@WebMethod <<method_type_1>> <<method_name_1>>(<<operands>>);
@WebMethod <<method_type_2>> <<method_name_2>>(<<operands>>);
...
// использование аннотаций "@WebService" и "@WebMethod" есть
// путь специфицирования интерфейса сервиса и прототипов
// реализуемых сервисом методов соответственно.
}
Листинг 2 – Шаблон реализации методов сервиса
import javax.jws.WebService;
@WebService(endpointInterface = "ServiceInterface")
// значение опционального параметра (String) endpointInterface
// должно соответствовать "имени" интерфейса
public class ServiceImpl implements ServiceInterface {
@Override
// директива "@Override" используется с целью проверки, что
// метод переопределен
public <<method_type_1>> <<method_name_1>> (<<operands>>) {
...
}
@Override
public <<method_type_2>> <<method_name_2>> (<<operands>>) {
...
}...
}
Листинг 3 – Шаблон "main()"-класса
import javax.xml.ws.Endpoint;
public class ServicePublisher {
public static void main(String[] args) {
Endpoint.publish("URI",new ServiceImpl());
// аргумент "URI" есть строка следующего формата:
// "http://<<domain_name>>:<<port>>/<<project_name>>/ \
// <<service_interface_name>>"
// "URI" может иметь, например, следующий вид:
// "http://localhost:8080/WebProject/ServiceInterface"
}
}
2. Выполнение работы.
Задание 1. Развертывание и тестирование сервиса.
Вариант 1. В сервисе должны быть реализованы следующие методы:
- "метод 1.1" – возвращает строку символов обратной очередности (например, "abc" -> "cba");
- "метод 1.2" – символы 'a' входной строки заменяются на '_';
- "метод 1.3" – в качестве аргумента передается строка, каждый символ которой есть десятичное число; результат должен представлять собой строковый эквивалент суммы элементов входной строки в бинарном виде (например, "123" -> "110").
Вариант 2. Реализуемые методы следующие:
- "метод 2.1" – в качестве результата возвращает число единиц в бинарном коде, переданном в виде строки;
- "метод 2.2" – на вход подается десятичное целое число, представленное в виде строки; результат работы метода есть булево значение ("TRUE" – сумма 2-х первых цифр равна сумме двух последних цифр; в противном случае – "FALSE");
- "метод 2.3" – в качестве аргумента передается строка; в случае, если строка содержит подпоследовательность вида "12", в качестве результата формируется новая строка вида "…(12)…" (например, "ab3c12d" -> "ab3c(12)d"); в противном случае возвращается строка символов обратной очередности ("abc" -> "cba").
Примечание 1: в табл. 1 приведены методы, рекомендуемые к использованию.
Таблица 1 – Методы работы со строками
№ |
Метод |
Описание |
1 |
public char CharAt(int index); |
- получение заданного символа строки (); |
2 |
public StringBuilder append \ (char c); |
- формирование строки; |
3 |
public String toString(); |
- преобразование объекта в строку; |
4 |
public static String \ toBinaryString(int i); |
- преобразование целого значения в бинарную строку-эквивалент; |
5 |
static Integer valueOf(char c); |
- получение "ASCII"-кода символа. |
Примечание 2: формат (шаблон) результата тестирования (для "метода 1.3" в частности) приведен на листинге 4.
Листинг 4 – Снимок окна Web-браузера
Method_2 Method invocation
---------------------------------------------
Method parameter(s) // переданные операнды и их значения
Type |
Value |
java.lang.String |
12 |
---------------------------------------------
Method returned
java.lang.String : "11" // результат работы метода
---------------------------------------------
SOAP Request // SOAP-запрос к сервису
---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header/>
<S:Body>
<ns2:Method_2 xmlns:ns2="http://my/">
<arg0>12</arg0> // входные данные
</ns2:Method_2>
</S:Body>
</S:Envelope>
---------------------------------------------
SOAP Response // SOAP-ответ (сервис -> интерфейс клиента)
---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:sayByeResponse xmlns:ns2="http://my/">
<return>11</return> // возвращаемое значение
</ns2:sayByeResponse>
</S:Body>
</S:Envelope>
Часть 2. Создание интерфейса клиента.
Контрольные вопросы:
-
Прокомментировать архитектуру "JAX-WS" (рис. 1).
-
Кратко описать назначения "Java"-файлов, созданных с целью развертывания сервиса. Дать определение процедуре развертывания.
-
Прокомментировать аннотации (директивы) "@WebService" и "@WebMethod". Верно ли утверждение, что сервис может быть ассоциирован лишь с одним методом?
-
Пояснить обоснованность проведения тестирования сервиса: указать специфику, а также выделить преимущества в сравнении с использованием консольной реализации интерфейса клиента.
Литература
-
Vohra, D. Java 7 JAX-WS Web Services: A practical, focused mini book for creating Web Services in Java 7 [Text] / D. Vohra. – Birmingham-Mumbai.: Packt Publishing, 2012. – 64 p. – ISBN 978-1-84968-720-1.
-
Проектирование и разработка Web-сервисов JAX-WS 2.0 [Электронный ресурс] / Н. Балани, Р. Хати. – Режим доступа: \www/ URL: http://www.ibm.com/developerworks/ru/edu/ws-jax/section2.html. – Загл. с экрана.
-
Apache Tomcat [Электронный ресурс] – Режим доступа: \www/ URL: http://tomcat.apache.org. – Загл. с экрана.
-
Oracle GlassFish Server [Электронный ресурс] – Режим доступа: \www/ URL: http://glassfish.java.net/. – Загл. с экрана.
-
JBoss Application Server 7 [Электронный ресурс] – Режим доступа: \www/ URL: http://www.jboss.org/jbossas. – Загл. с экрана.
© Шкарупило В.В., Ильяшенко М.Б.