Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Введение в технологию Java EE
Вступление
Java Enterprise Edition (или, сокращенно, Java EE) – набор спецификаций и документации ЯП Java для работы с сетевыми приложениями и технологиями, применяемый при решении задач для средних и крупных предприятий. Основная цель спецификаций – обеспечение мультиплатформенности и масштабируемости приложений. Технологии Java EE поддерживаются многими средами разработки, такими как Eclipse и NetBeans. Основные технологии, поставляемые Java EE:
· сервлеты (servlets);
· динамически генерируемые веб-страницы (Java Server Pages);
· веб-сервисы;
· компоненты повторного использования – Enterpirse Java Beans;
· сервис обмена сообщениями (Java Message Queue);
· прочие серверные технологии.
Для обеспечения работы модулей, работающих согласно технологиям, перечисленным выше, используются серверы приложений. На данный момент одним из самых распространенных является сервер приложений GlassFish, входящий в пакет разработчика Java EE SDK. Создаваемые программистами модули необходимо развернуть (deploy) на сервере приложений, для чего они компилируются в особый формат EAR (Enterprise ARchive), подобно тому, как приложения на Java можно компилировать в JAR-модули. Каждый веб-модуль после развертки становится доступным через протокол HTTP и образует отдельную директорию на сервере, имя которой совпадает с именем модуля. В случае локального сервера с настройками по умолчанию путь к корневой папке модуля будет выглядеть как http://localhost:8080/[имя модуля]/. В Eclipse компиляция в EAR и развертывание на сервере осуществляются автоматически.
1. Веб-сервисы
Веб-сервис (также веб-служба) – программная система, идентифицируемая строкой URI (Unified Resource Identifier, универсальный идентификатор ресурсов), ресурсы которой (свойства и методы) описаны с помощью специального языка. Доступ к ресурсам такой системы осуществляется с помощью протокола SOAP (Simple Object Access Protocol, простой протокол доступа к объектам), который представляет собой особым образом сформулированные XML-запросы, передаваемые с помощью интернет-протокола высокого уровня (чаще всего HTTP). По своей архитектуре веб-сервисы напоминают классы объектно-ориентированных ЯП (и в рамках Java EE генерируются на основе классов), однако есть и некоторые различия. Ключевым понятием для веб-сервиса является сообщение (message), состоящее из одной или нескольких переменных. Вместо методов классов в веб-сервисах используются операции (operation), которые характеризуются входным и выходным сообщениями. После вызова операции переменные, входящие во входное сообщение, полученное по протоколу SOAP, интерпретируются как параметры соответствующего метода класса, лежащего в основе сервиса. После завершения работы метода формируется выходное сообщение, содержащее возвращаемое методом значение, которое затем с помощью SOAP отправляется клиенту. Такая архитектура сервиса позволяет вызывать его методы асинхронно.
1.1. Язык WSDL
Для описания общедоступных ресурсов веб-сервиса используется язык WSDL (Web Service Definition Language) на основе XML; среда программирования Eclipse позволяет автоматически создавать такие описания на основе классов Java. В языке определены следующие основные типы данных: строки (xsd:string), целые числа (xsd:int, xsd:long, xsd:short, xsd:integer, xsd:decimal), числа с плавающей запятой (xsd:float, xsd:double), логический тип (xsd:boolean), последовательности байт (xsd:base64Binary, xsd:hexBinary), дата и время (xsd:time, xsd:date, xsd:g), объекты (xsd:anySimpleType). В качестве переменных сообщений также можно использовать последовательности, образованные из фиксированного числа переменных простых типов (это соответствует методам с несколькими входными параметрами). Типичный WSDL-файл имеет структуру, как на рис. 1. Вначале объявляются типы, которые будут использоваться в сервисе. WSDL-описание, приведенное ниже, принадлежит веб-сервису SampleMath с методами
public int add(int x, int y),
public int subtract(int x, int y),
на основании чего было сгенерировано четыре типа данных, соответствующих входным и выходным аргументам метода. Эти типы применяются в описании addRequest и addResponse – входного и выходного сообщений для операции add, а также в соответствующих сообщениях для операции subtract. Операции объявляются в описании интерфейса сервиса (декларация wsdl:portType) и далее в описании привязки сервиса к SOAP (декларация wsdl:binding), причем во втором случае также оговаривается способ вызова (<wsdlsoap:body use="literal"/>). Это позволяет при вызове операции использовать те же имена параметров, что и в исходном методе. В конце WSDL-файла находится собственно декларация веб-сервиса (<wsdl:service>), в которой содержится информация о его местоположении (параметр location). Среда Eclipse поддерживает удобное графическое представление WSDL-файлов; файл, соответствующий веб-сервису SampleMath, показан на рис. 2.
1.2. Протокол SOAP
Как упоминалось ранее, общение с веб-сервисом осуществляется с помощью протокола SOAP. Для вызова операций веб-сервиса, определенной в его WSDL-описании, используется XML-запрос, называемый SOAP-envelope, состоящий в общем случае из заголовка (SOAP-header; может быть пустым) и тела запроса (SOAP-body). Заголовок может содержать дополнительную информацию по запросу, такую как его приоритетность, срок обработки и т. п. В теле содержатся одна или несколько операций веб-сервиса с соответствующими им параметрами. Пример запроса, вызывающего операцию сервиса SampleMath.add(1, 2), приведен на рис. 3. Там же приведено SOAP-сообщение, возвращенное сервисом.
<wsdl:definitions targetNamespace="http://webservice. isofts. ">
<wsdl:types><schema elementFormDefault="qualified"
targetNamespace="http://webservice. isofts. ">
<element name="add"><complexType><sequence>
<element name="x" type="xsd:int"/>
<element name="y" type="xsd:int"/>
</sequence></complexType></element>
<element name="addResponse"><complexType><sequence>
<element name="addReturn" type="xsd:int"/>
</sequence></complexType></element>
<element name="subtract"><complexType><sequence>
<element name="x" type="xsd:int"/>
<element name="y" type="xsd:int"/>
</sequence></complexType></element>
<element name="subtractResponse"><complexType><sequence>
<element name="subtractReturn" type="xsd:int"/>
</sequence></complexType></element>
</schema></wsdl:types>
<wsdl:message name="addRequest">
<wsdl:part element="impl:add" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="subtractResponse">
<wsdl:part element="impl:subtractResponse" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="subtractRequest">
<wsdl:part element="impl:subtract" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part element="impl:addResponse" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:portType name="SampleMath">
<wsdl:operation name="add">
<wsdl:input message="impl:addRequest" name="addRequest"></wsdl:input>
<wsdl:output message="impl:addResponse" name="addResponse"> </wsdl:output>
</wsdl:operation>
<wsdl:operation name="subtract">
<wsdl:input message="impl:subtractRequest" name="subtractRequest"></wsdl:input>
<wsdl:output message="impl:subtractResponse" name="subtractResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SampleMathSoapBinding" type="impl:SampleMath">
<wsdlsoap:binding style="document" transport="http://schemas. xmlsoap. org/soap/http"/>
<wsdl:operation name="add"><wsdlsoap:operation soapAction=""/>
<wsdl:input name="addRequest"><wsdlsoap:body use="literal"/></wsdl:input>
<wsdl:output name="addResponse"><wsdlsoap:body use="literal"/></wsdl:output>
</wsdl:operation>
<wsdl:operation name="subtract"><wsdlsoap:operation soapAction=""/>
<wsdl:input name="subtractRequest"><wsdlsoap:body use="literal"/></wsdl:input>
<wsdl:output name="subtractResponse"><wsdlsoap:body use="literal"/></wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SampleMathService">
<wsdl:port binding="impl:SampleMathSoapBinding" name="SampleMath">
<wsdlsoap:address location="http://localhost:8080/webservice/services/SampleMath"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Рисунок 1. WSDL-описание простого веб-сервиса

Рисунок 2. Схема сервиса, полученная с помощью Eclipse
<soapenv:Envelope xmlns:soapenv=http://schemas. xmlsoap. org/soap/envelope/
xmlns:q0=http://webservice. isofts.
xmlns:xsd=http://www. w3.org/2001/XMLSchema
xmlns:xsi="http://www. w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<q0:add>
<q0:x>1</q0:x>
<q0:y>2</q0:y>
</q0:add>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv=http://schemas. xmlsoap. org/soap/envelope/
xmlns:xsd=http://www. w3.org/2001/XMLSchema
xmlns:xsi="http://www. w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<addResponse xmlns="http://webservice. isofts. ">
<addReturn>3</addReturn>
</addResponse>
</soapenv:Body>
</soapenv:Envelope>
Рисунок 3. SOAP-запрос к сервису и возвращенное им XML-сообщение
2. Сервлеты
Для доступа к веб-сервисам используются сервлеты – Java-программы, выполняемые на стороне сервера и расширяющие его функциональность. Сервлеты широко применяются в технологии Java EE, в частности, в них преобразуются страницы на языке JSP. Базовая функциональность сервлетов заложена в возможности обработки ими HTTP-запросов GET и/или POST. Согласно спецификации веб-приложений, возможно задавать (с помощью конфигурационных XML-файлов) области действия определенных сервлетов (servlet mapping). Решение, какой из доступных сервлетов будет задействован, принимается на основании анализа URL-адреса запроса. Например, веб-сервисы, которые по умолчанию располагаются в папке /services проекта, обрабатываются стандартным сервлетом Apache Axis. С помощью него, в частности, можно получить WSDL-описание сервиса, расположенное по адресу /services/[название сервиса]?wsdl. Этот же сервлет осуществляет парсинг посылаемых на сервер SOAP-сообщений, их передачу соответствующему Java-классу и составление SOAP-сообщений с результатами работы. Таким образом Axis обеспечивает полную функциональность веб-сервиса.
3. Взаимодействие с веб-сервисами
Среда программирования, предназначенные для работы с сетевыми приложениями, такие как Java и , предоставляют возможность создания клиентов для веб-сервисов на основе их WSDL-описания. При этом скрывается большая часть черновой работы по обеспечению работы клиента, например, составление корректных SOAP-запросов и парсинг возвращаемых сервисом SOAP-сообщений – эти действия осуществляются клиентской частью технологии Apache Axis.
3.1. Взаимодействие с веб-сервисами в ЯП Java
В среде Eclipse есть удобный инструмент для создания клиентских программ, использующих веб-сервисы. После задания адреса сервиса на основании его WSDL-описания для обеспечения работы клиента создаются 5 Java-файлов:
1. локатор сервиса (service locator), осуществляющий нахождение веб-сервиса;
2. интерфейс локатора;
3. стаб для SOAP-привязки (SOAP binding stub) – клиентский стаб, предназначенный для составления и парсинга SOAP-сообщений;
4. интерфейс сервиса;
5. прокси-класс, реализующий этот интерфейс; использует клиентский стаб и локатор для доступа к операциям веб-сервиса.
Например, для вышеописанного сервиса SampleMath автоматически созданные классы и интерфейсы будут называться SampleMathServiceLocator, SampleMathService, SampleMathSoapBindingStub, SampleMath, SampleMath-Proxy (в порядке их описания выше). Обращение к операции SampleMath.add будет выглядеть подобным образом:
SampleMath svc = new SampleMathProxy();
try {
System.out.println(svc. add(2, 3));
} catch (RemoteException e) {
System.err.println("Error occurred while accessing the web service");
e.printStackTrace();
}
3.2. Взаимодействие с веб-сервисами в среде MS.NET
В.NET также существует утилита для создания клиентских программ, работающих с веб-сервисами, называющаяся wsdl. exe. Она создает файлы на любом из доступных языков. NET, которые можно подключить к проекту и использовать веб-сервис, как локальный класс:
SampleMathService _service = new SampleMathService();
try
{
int result = 0;
switch (idx)
{
case 0: result = _service. add(arg0, arg1);
break;
case 1: result = _service. subtract(arg0, arg1);
break;
}
}
catch (Exception exc)
{
MessageBox. Show(exc. Message, "Error",
MessageBoxButtons. OK, MessageBoxIcon. Error);
}
Инструкция по использованию графического интерфейса примера
Работа с веб-сервисами рассматривается на примере вышеописанного сервиса SampleMath.

Рисунок 4. Вид главного окна интерфейса
1. Для запуска главной формы примера достаточно выбрать в меню сайта пункт «Технологии → Веб-сервисы → Пример» и действовать в соответствии с приведенной там инструкцией. Должно появиться главное окно графического интерфейса, вид которого изображен на рис. 4. Для запуска серверной части программы нужно нажать кнопку «Запустить» в верхней части окна; после этого отчет о запуске будет отображаться в окне. Сервер можно в любой момент остановить, нажав на соответствующую кнопку. Для того чтобы проверить, был ли развернут модуль на сервере программ, можно открыть в браузере адрес http://localhost:8080/webservice/ – там должна отображаться страница, как на рис. 5.

Рисунок 5. Вид главной страницы веб-модуля
2. Для запуска клиентской части (см. рис. 6) следует нажать кнопку «Запустить» в нижней части окна. Количество клиентских программ не ограничено.

Рисунок 6. Вид клиентской части программы
3. Для проверки работы веб-сервиса следует в клиентской части программы ввести аргументы для функции сложения или отрицания, поставляемые сервисом, и нажать на кнопку «Вызвать». Результаты должны отобразиться как у клиентской части программы, так и в логе доступа к сервису на главной странице веб-модуля. Методы веб-сервиса можно также тестировать непосредственно из веб-модуля (см. рис. 7) – для этого достаточно перейти по соответствующей ссылке на главной странице.

Рисунок 7. Тестирование сервиса из веб-страницы


