Лекция 22 SOAP Интернет объединяет в себе много различных платформ, а информация содержится в разнообразных источниках данных. Концепция веб-сервисов (Web.

Презентация:



Advertisements
Похожие презентации
Web - сервисы. Веб-служба, веб-сервис (англ. web service) идентифицируемая веб-адресом программная система со стандартизированными интерфейсами.англ.веб-адресоминтерфейсами.
Advertisements

WEB- ТЕХНОЛОГИИ Лекция 6. Понятие Web- сервисов 1 Интерфейс в глобальную сеть для некоторого абстрактного программного обеспечения, этот интерфейс позволяет.
Web-службы SOAP, WSDL, UDDI, GXA среда, 11 декабря 2013 г.среда, 11 декабря 2013 г.среда, 11 декабря 2013 г.среда, 11 декабря 2013 г.среда, 11 декабря.
SOAP Содержание лекции Протокол SOAP. Структура SOAP-сообщения: конверт, заголовок, тело сообщения. Стандарты WS-Addressing и WS-Security. SOAP-Fault.
Низкоуровневые операции в ИС. Сокеты в C#. Понятие сокета Если требуется получить доступ к сетевым операциям низкого уровня, в программе следует использовать.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
1 Диаграммы реализации (implementation diagrams).
ДонНУ, кафедра КТ, проф.В.К.Толстых WCF-службы Создание и тестирование.dll-библиотеки WCF-служб Из цикла лекций «Internet-технологии разработки приложений»
Лекция 11 Тема «Формы » Преподаватель: Халелова Е.Н.
ДонНУ, кафедра КТ, проф.В.К.Толстых Web-службы (Web-сервисы) введение введение Разработка в среде Delphi Из цикла лекций «Internet-технологии разработки.
Реализация концепции построения и формирования отраслевой системы государственного учета, регистрации и мониторинга (ОСГУРМ) информационных ресурсов сферы.
Интернет- технологии МИИГаИК. Указание XML-документов в ориентире на будущее
К построению и контролю соблюдения политик безопасности распределенных компьютерных систем на основе механизмов доверия А. А. Иткес В. Б. Савкин Институт.
WEB- ТЕХНОЛОГИИ Лекция 1. WEB- ПРИЛОЖЕНИЯ 1 Особый тип программ, построенных по архитектуре « клиент - сервер » Основа получение запросов от пользователя.
Рассматриваемые темы Введение в Web Services EJB и Web Services 2-1.
Тема 5. Основы современной технологии программирования Программирование в средах современных информационных систем. Интегрированные системы разработки.
Архитектура метаданных WWW. Язык RDF Архитектура метаданных WWW RDF.
SAX Simple API for XML Презентацию подготовила Иванова Анна, гр. 950б.
СИСТЕМА SLS-УПРАВЛЕНИЕ БИЗНЕС-ПРОЦЕССАМИ Июль, igr.net.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Транксрипт:

Лекция 22

SOAP Интернет объединяет в себе много различных платформ, а информация содержится в разнообразных источниках данных. Концепция веб-сервисов (Web Services) призвана решить эту задачу объединения, интеграции разнородных систем на основе открытых стандартов.

Основные положения модели веб- сервисов Веб-сервисы являются концепцией создания таких приложений, функции которых можно использовать при помощи стандартных протоколов Интернет. Концепция веб- сервисов реализуется при помощи ряда технологий, которые стандартизованы World Wide Web Consortium (W3C). Взаимосвязь этих технологий можно условно представить следующим образом.

XML является фундаментом для создания большинства технологий, связанных с веб- сервисами. Для удаленного взаимодействия с веб- сервисами используется Simple Object Access Protocol (SOAP). SOAP обеспечивает взаимодействие распределенных систем, независимо от объектной модели, операционной системы или языка программирования. Данные передаются в виде особых XML документов особого формата.

Согласно определению W3C, веб-сервисы это приложения, которые доступны по протоколам, которые являются стандартными для Интернет. Нет требования, чтобы веб-сервисы использовали какой-то определенный транспортный протокол. Спецификация SOAP определяет, каким образом связываются сообщения SOAP и транспортный протокол Технология Universal Description, Discovery and Integration (UDDI) предполагает ведения реестра веб-сервисов. Подключившись к этому реестру, потребитель сможет найти веб-сервисы, которые наилучшим образом удовлетворяют его потребностям

Веб-сервисы позиционируются как программное обеспечение промежуточного слоя. Использовать веб-сервисы могут как клиентские приложения, непосредственно работающие с пользователем, так и другие приложения. Веб-сервисы размещаются на серверах приложений. Существует несколько концепций применения Веб-сервисов. 1. Веб-сервисы как реализация логики приложения (бизнес-логики). То есть, создание нового приложения бизнес-логика, которого реализуется в веб-сервисе.

2. Веб-сервисы как средство интеграции. То есть, использование веб-сервиса как способа доступа удаленных клиентов к внутренней ИС компании, или для организации взаимодействия компонента (например, EJB, COM-компонента) с различными удаленными клиентами.

Рассмотрим пример создания и развертывания Веб –сервиса. Пусть Веб- сервис возвращает строку клиенту. Тогда класс, реализующий данный Веб-сервис будет иметь вид (HelloService.java): package samples.mysimple; public class HelloService{ private static int a=25; public HelloService(){a++;} public String myMethod(String s){ return s+Integer.toString(a); } }

Таким образом, логика Веб-сервиса заключена в методе myMethod. Клиент, вызывающий данный Веб-сервис будет иметь следующий вид (Client.java): package samples.mysimple; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import javax.xml.rpc.ParameterMode; import javax.xml.namespace.QName; public class Client{ public static void main(String [] args) throws Exception { String endpoint = " String method = "myMethod"; String s1 ="Hello";

//Создаем клиента для использование Web-сервиса Service service = new Service(); //Создаем класс динамического связывания клиента с Веб- сервисом Call call = (Call) service.createCall(); //Указываем где находится Веб -Сервис call.setTargetEndpointAddress(new java.net.URL(endpoint)); //Указываем метод, который будем вызывать. call.setOperationName( new QName(" method)); // Определяем тип параметра, передаваемого в метод, в XML формате call.addParameter( "op1", org.apache.axis.encoding.XMLType.XSD_STRING, ParameterMode.IN);

//Определяем тип возвращаемого методом значения,в XML формате call.setReturnType(org.apache.axis.encoding. XMLType.XSD_STRING); //Вызываем метод String ret = (String)call.invoke( new Object [] { s1 }); System.out.println("Got result : " + ret);}}

Рассмотрим процедуру развертывания данного Веб-сервиса. Для использования данного Веб-сервиса необходимы: 1.Apache Tomcat 2.Apache axis(axis2) 3.Пакет Xerces-J-bin zip(сайт Apache) 4.xml-security-bin-1_4_4.zip(сайт Apache) (Далее предполагается, что Apache Tomcat уже установлен в директории C:\Tomcat) 1. Разворачиваем пакет axis-bin-1_4.zip в директорию C:\axis

2. Копируем папку axis из директории c:\axis\webapp в директорию c:\tomcat\webapp 3. Копируем все jar файлы из директории c:\axis\lib в директорию c:\tomcat\webapps\axis\WEB-INF\lib\, а также их архивов Xerces-J-bin zip и xml-security-bin-1_4_4.zip 4. Создаем переменные окружения set AXIS_HOME=/usr/axis set AXIS_LIB=$AXIS_HOME/lib set AXISCLASSPATH =$AXIS_LIB/axis.jar:$AXIS_LIB/commons-discovery.jar: $AXIS_LIB/commons- logging.jar: $AXIS_LIB/jaxrpc.jar:$AXIS_LIB/saaj.jar: $AXIS_LIB/log4j jar:$AXIS_LIB/xml-apis.jar: $AXIS_LIB/xercesImpl.jar export AXIS_HOME; export AXIS_LIB; export AXISCLASSPATH

5. Создаем папку c:\axis\samples\mysimple\ и копируем туда файлы Client.java и HelloService.java 6. Копилируем данные файлы >javac –cp все необходимые jar файлы из папки c:\tomcat\webapps\axis\WEB-INF\lib\ *.java 7. Создаем дескрипторы развертывания в папке c:\axis\samples\mysimple\ deploy.wsdd undeploy.wsdd

Файл deploy.wsdd имеет вид:

Файл undeploy.wsdd имеет вид: 8. Создаем папку mysimple в каталоге c:\tomcat\webapps\axis\WEB- INF\classes\samples\ 9. Копируем в эту папку файл HelloService.class 10. Запускаем Tomcat c:\tomcat\bin\>startup

11. Развертываем Веб-сервис c:\axis\samples\mysimple\>java –cp все необходимые jar файлы из папки c:\tomcat\webapps\axis\WEB- INF\lib\ org.apache.axis.client.AdminClient deploy.wsdd На экране должно появиться Done processing, А также в файле c:\tomcat\webapps\axis\WEB- INF\server-config.wsdd запись типа:

12. Запускаем клиент >java –cp все необходимые jar файлы из папки c:\tomcat\webapps\axis\WEB-INF\lib\ samples.mysimple.Client Общая структура SOAP сообщения SOAP-сообщение представляет собой XML- документ; сообщение состоит из трех основных элементов: конверт (SOAP Envelope) заголовок (SOAP Header) тело (SOAP Body)

Пример SOAP сообщения: February 12 18:02:00

Конверт (SOAP Envelope) SOAP Envelope является самым «верхним» элементом SOAP сообщения. Содержит корневой элемент XML-документа. Описывается с помощью элемента Envelope с обязательным пространством имен для версии 1.2 и для версии 1.1. У элемента Envelope могут быть атрибуты xmlns, определяющие пространства имен, и другие атрибуты, снабженные префиксами.

Envelope может иметь необязательный дочерний элемент Header c тем же пространством имен заголовок. Если этот элемент присутствует, то он должен быть первым прямым дочерним элементом конверта. Следующий дочерний элемент конверта должен иметь имя Body и то же самое пространство имен - тело. Это обязательный элемент и он должен быть вторым прямым дочерним элементом конверта, если есть заголовок, или первым если заголовка нет. Элементы Header и Body могут содержать элементы из различных пространств имен

Заголовок SOAP (SOAP Header) Первый прямой дочерний элемент конверта. Не обязательный. Заголовок кроме атрибутов xmlns может содержать 0 или более стандартных атрибутов: encodingStyle actor (или role для версии 1.2) mustUnderstand relay

Атрибут encodingStyle В SOAP-сообщениях могут передаваться данные различных типов (числа, даты, массивы, строки и т.п.). Определение этих типов данных выполняется в схемах XML (обычно XSD). Типы, определенные в схеме, заносятся в пространство имен, идентификатор которого служит значением атрибута encodingStyle. Атрибут encodingStyle может появиться в любом элементе SOAP-сообщения, но версия SOAP 1.2 запрещает его появление в корневом элементе Envelope.

Атрибут actor Тип данных URI. Задает адрес конкретного SOAP- сервера, которому предназначено сообщение. SOAP-сообщение может пройти через несколько SOAP-серверов или через несколько приложений на одном сервере. Эти приложения выполняют предварительную обработку блоков заголовка послания и передают его друг другу. Все эти серверы и/или приложения называются SOAP-узлами (SOAP nodes). Спецификация SOAP не определяет правила прохождения послания по цепочке серверов. Для этого разрабатываются другие протоколы, например, Microsoft WS-Routing.

В версии 1.2 атрибут actor заменен атрибутом role, потому что в этой версии SOAP каждый узел играет одну или несколько ролей. Спецификация пока определяет три роли SOAP-узла: Роль envelope/role/ultimateReceiver играет конечный, целевой узел, который будет обрабатывать заголовок. Роль envelope/role/next играет промежуточный или целевой узел. Такой узел может играть и другие, дополнительные роли.

Роль envelope/role/none не должен играть ни один SOAP-узел. Атрибут mustUnderstand Тип данных boolean. По умолчанию 0. Если значение равно 1, то SOAP-узел при обработке элемента обязательно должен учитывать его синтаксис, определенный в схеме документа, или совсем не обрабатывать сообщение. Это повышает точность обработки сообщения. В версии SOAP 1.2 вместо цифр нужно писать true или false.

Атрибут relay Тип данных boolean. Показывает, что заголовочный блок, адресованный SOAP- посреднику, должен быть передан дальше, если он не был обработан. Необходимо отметить, что если заголовочный блок обработан, правила обработки SOAP требуют, чтобы он был удален из уходящего сообщения. В блоках заголовка могут быть атрибуты role, actor и mustUnderstand. Действие этих атрибутов относится только к данному блоку.

Рассмотрим пример: 5

SOAP-сообщения с вложениями Существуют ситуации, когда клиент и сервер должны обмениваться данными в формате, отличном от текстового. С точки зрения обмена данными все нетекстовые данные рассматриваются как данные в двоичных кодах. Двоичные данные включаются в сообщение в виде «вложения». Структура SOAP- сообщения с вложениями имеет вид:

Этот протокол определяет пересылку SOAP- сообщения внутри MIME-сообщения, состоящего из нескольких частей. Первая часть MIME-сообщения- часть SOAP - содержит XML: конверт SOAP с вложенными в него заголовком и телом сообщения. Остальные части - вложения - содержат данные в любом формате, двоичном или текстовом. Каждая часть предваряется MIME-заголовком, описывающим формат данных части и содержащим идентификатор части

Рассмотрим пример: MIME-Version: 1.0 Content-Type: Multipart/Related; boundary=MIME_boundary; type="application/xop+xml"; start=" "; start-info="text/xml" Content-Description: An XML document with binary data in it --MIME_boundary

Content-Type: application/xop+xml; charset=UTF-8; type="text/xml" Content-Transfer-Encoding: 8bit Content-ID:

--MIME_boundary Content-Type: image/jpg Content-Transfer-Encoding: binary Content-ID: // двоичное представление файла изображения --MIME_boundary--

Axis2 В основе инфраструктуры Web-сервисов Apache Axis2 лежит новая модель XML документов AXIOM, обеспечивающая эффективную обработку сообщений SOAP, в отличии от Axis. AXIOM - одна из основных инноваций в Axis2, и одна из причин того, что Axis2 показывает гораздо лучшие рабочие характеристики, чем оригинальный Axis.

API модели AXIOM ближе всего к DOM по общим свойствам, но имеет собственные характерные черты. Например, методы доступа построены на основе java.util.Iterator экземпляров класса для доступа к компонентам. Вместо индексации компонентов в списке навигатор использует методы getNextOMSibling() и getPreviousOMSibling() из класса org.apache.axiom.om.OMNode для последовательного продвижения по узлам на уровне дерева документа (сходные с DOM в этом случае).

Такое структурирование методов доступа и навигации отвечает работе по построению дерева по требованию, поскольку это значит, что AXIOM может позволить перейти к первому дочернему элементу стартового элемента без необходимости сперва обработать все родительские элементы для стартового. AXIOM построен на основе интерфейса StAX анализатора. Таким образом, AXIOM использует интерфейсы StAX Reader и Writer для обмена с внешним миром, как показано на схеме:

Естественно, можно использовать SAX и DOM для взаимодействия с AXIOM. AXIOM использует builder, чтобы построить XML модель в памяти, но не всю модель, а только часть. Рассмотрим пример использования AXIOM модели. Пусть имеется XML фрагмент:

Eran Chinthaka Axis2 Ambalangoda, Sri Lanka Ajith Harshana Axis2 Kuliyapitiya, Sri Lanka

Предположим пользователь хочет получить проект первого служащего. Таким образом, в памяти достаточно построить модель представляющую только первые четыре строки. Остальные строки остаются нетронутыми в потоке. Тогда, если понадобится проект второго сотрудника builder построит первые 9 строк. Стоит заметит, что AXIOM архитектура не зависит от языка программирования. Код использующий AXIOM будет иметь вид:

import org.apache.axiom.om.*; import org.apache.axiom.om.impl.builder.StAXOMBuilder; import java.io.*; import javax.xml.stream.*; import java.util.*; public class Main { public static void main(String[] args) { try{ FileReader soapFileReader = new FileReader("my.xml"); XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader( soapFileReader); OMFactory omFactory = OMAbstractFactory.getOMFactory(); StAXOMBuilder builder = new StAXOMBuilder(omFactory, parser); OMElement documentElement = builder.getDocumentElement(); //получаем елементы дочерние к rottag OMElement childElement=documentElement.getFirstElement();

//Получаем дочерние элементы у первого Employees OMElement employeesChild=childElement.getFirstElement(); int i=0; for (Iterator iter = employeesChild.getChildElements(); iter.hasNext(); ) { OMNode child = (OMNode)iter.next(); if(i==1){ //На экране элемент Axis2 child.serialize(System.out);/ } i++; }

Одним из наиболее интересных свойств AXIOM является его встроенная поддержка стандартов W3C XOP и MTOM, используемых в последних версиях приложений SOAP. Эти два стандарта работают вместе: оптимизированная двоичная компоновка XML - XML-binary Optimized Packaging (XOP) обеспечивается логическое включение в XML любых двоичных данных; механизм оптимизации передачи сообщений MTOM (SOAP Message Transmission Optimization Mechanism) применяет технику XOP к сообщениям SOAP. XOP и MTOM являются принципиальными характеристиками нового поколения инфраструктур Web- серверов, поскольку они обеспечивают поддержку интероперабельных приложений (т.е. взаимодействие приложений) и тем самым устраняют текущие проблемы в данной области.

XOP работает с данными, представленными в системе кодировки символов с основанием 64. Base64 кодировка преобразует любые значения данных в ASCII символы, пригодные для печати, используя один символ ASCII для представления каждых 6 битов информации исходных данных. Поскольку двоичные данные не могут быть размещены в XML (XML работает только с символами, а не непосредственно с байтами; даже использование номера кода символа недопустимо в XML), кодировка base64 незаменима для размещения двоичных данных в сообщениях XML.

Язык WSDL Для описания интерфейса программной компоненты, включая спецификацию корректных сообщений, был разработан язык WSDL (Web Service Definition Language). Описание на языке WSDL включает в себя следующие семь составляющих:

Описание типов передаваемых данных. При использовании кодирования SOAP Document оно состоит из схемы XML, определяющей корректные сообщения, получаемые программной компонентой в теле пакета SOAP. Описание входящих и исходящих сообщений, которые связываются с описанными типами данных. Описание операций (сервисов программной компоненты), с каждой из которых связывается входящее и исходящее сообщение.

Описание типов портов (идентификаторов программных компонент), с каждым из которых связывается некоторый набор операций. Описание привязок ( binding ), связывающие типы портов и их сообщений с определенным типом кодирования тела пакета, а также с версией протокола SOAP. Описание портов, связывающие типы портов и соответствующие им привязки с конкретными URL. Общее описание службы (интерфейса программной компоненты) как совокупности портов.

Рассмотрим описание на языке WSDL интерфейса компоненты, которое содержит два сервиса – сложение двух чисел и сложение последовательности чисел. В корневом элементе указаны все используемые пространства имен, включая пространство протокола SOAP 1.2

В элементе wsdl:types описываются все типы данных. Тип Add будет связан со входящим сообщением сервиса сложения двух чисел, а тип AddResponse – с его исходящим сообщением.

Типы SumList и SumListResponse предназначены для сообщений сервиса сложения списка чисел.

В элементах wsdl:message типы данных связываются с идентификаторами сообщений.

В элементе wsdl:portType описываются абстрактные операции и используемые ими сообщения. Операция Add складывает два числа

Операция SumList складывает несколько чисел

В элементе wsdl:binding операции связываются с транспортным протоколом (HTTP), версией протокола SOAP (1.2) и типом кодирования тела пакета (SOAP- Document). Данный тег определяет как части сообщения будут располагаться в теле SOAP body, атрибут use оперделяет как сообщение буде кодироваться. Значение literal означает, что части сообщения определяются схемой типов.

В элементе wsdl:service интерфейс программной компоненты связывается с типом порта, с некоторой привязкой, а также с конкретным URL, используемым в дальнейшем для вызова веб службы.

Стоит заметить, что в настоящий момент существует два различных способа представления информации в теле пакета SOAP – кодирование SOAP RPC (в двух вариантах) и кодирование SOAP Document. Кодирование SOAP RPC предназначено исключительно для передачи параметров удаленного вызова и определяет сообщение как имя метода и список параметров. При использовании кодирования SOAP Document, которое является фактическим стандартом в настоящий момент, сообщение представляет собой XML документ со схемой и пространством имен, заданными в описании сервиса на языке WSDL. Хотя обычно сообщение и состоит из имени метода удаленного объекта и списка его параметров, но сама спецификация кодирования не фиксирует как либо его содержание.

Получение кода из WSDL В состав Axis2 входит инструмент WSDL2Java, служащий для формирования кода из описания сервиса WSDL. Можно использовать этот инструмент напрямую, запуская класс org.apache.axis2.wsdl.WSDL2Java из приложения Java, или посредством задачи Ant, подключаемого модуля Maven или подключаемых модулей Eclipse или IDEA. В инструменте WSDL2Java реализовано множество параметров командной строки, и их число постоянно растет. В документации по Axis2 содержится полный список этих параметров, поэтому здесь мы рассмотрим только наиболее важные из их числа:

-o path Определяет директорию, в которой будут создаваться классы и файлы (по умолчанию используется рабочая директория) -p package-name Определяет пакет, в который будут записываться формируемые классы (по умолчанию используется пространство имен WSDL) -d name Определяет среду связывания данных (adb для ADB, xmlbeans для XMLBeans, none для отключения связывания данных; по умолчанию используется adb) -uw Распаковывает упакованные документально- литеральные сообщения, только для поддерживаемых сред (на сегодняшний день это ADB) -s Формирует только синхронный клиентский интерфейс -ss Формирует серверный код -sd Формирует файлы для установки на сервере -uri path Задает путь к WSDL для формируемого сервиса

Формирование WSDL из кода В состав Axis2 также входит инструмент Java2WSDL, который вы можете использовать для создания определения сервиса WSDL на основе существующего кода сервиса. Однако полезность этого инструмента страдает от множества ограничений, в том числе невозможности работы с классами коллекций Java и отсутствия гибкости при структурировании XML, формируемого классами Java.

В Axis2 (начиная с версии 1.2) реализована полная поддержка нескольких вариантов связывания и готовится поддержка еще нескольких. Рассмотрим некоторые из них. Axis2 Data Binding ADB (Связывание данных Axis2) - это расширение Axis2 для связывания данных. В отличие от других сред связывания данных, код ADB можно использовать только вместе с Web- сервисами Axis2. Это обстоятельство значительно ограничивает использование ADB, однако оно также даёт определенные преимущества. Поскольку ADB интегрировано с Axis2, код может быть оптимизирован под требования Axis2

В WSDL2Java реализована полная поддержка формирования кода ADB, в том числе формирование классов модели данных, соответствующих компонентам схемы XML. В базовом варианте формирования кода ADB используется прямая модель, в которой каждому входящему и исходящему сообщению, используемым в каждой операции, назначается отдельный класс. Рассмотрим пример подобного связывания. Пусть необходимо создать Web сервис, который производит сложение двух целых чисел.

1.Создадим абстрактный класс, в котором определена операция сложения package hello; public abstract class Hello{ public abstract Result add(Input in); } 2. Классы Result и Input имеют вид: package hello; public class Input{ private int a; private int b; public void setA(int a){ this.a=a; } public void setB(int b){ this.b=b; } public int getA(){ return a; } public int getB(){ return b; } }

package hello; public class Result{ private int res; public void setRes(int r){ res=r; } public int getRes(){ return res; } } 3. Данные классы Hello.java,Result.java и Input.java необходимо скомпилировать, поместив их в директорию hello javac hello/Hello.java 4. Необходимо сгенерировать описание сервиса WSDL(или написать вручную, тогда пункты 1-3 не нужны) java2wsdl -cn hello.Hello -cp. -sn Hello

Как результат получим следующий wsdl файл:

5. Создаем скелет Web сервиса на основе wsdl файла Hello.wsdl, созданного на предыдущем шаге. wsdl2java -uri Hello.wsdl -ss -sd 6. Логика Web сервиса должна быть заключена в классе HelloSkeleton.java. Данный класс имеет вид: package hello; public class HelloSkeleton{ public hello.AddResponse add ( hello.Add add ) { //Данный код был добавлен в ручную, это логика Web сервиса hello.AddResponse resp=new hello.AddResponse(); hello.xsd.Input inp=add.getArgs0(); hello.xsd.Result res=new hello.xsd.Result(); res.setRes(inp.getA()+inp.getB()); resp.set_return(res); return resp; }}

7. Компилируем и создаем пакет Hello.aar, используя ant. build.xml создается автоматически. 8. Генерируем клиентский stub wsdl2java -uri Hello.wsdl -o client В результате в папке client появятся два файла HelloStub.java HelloCallbackHandler.java 9. Развертываем axis2 под Tomcat. Для этого в каталоге webappsсоздаем поддиректорию axis2 и копируем туда директорию webapps в axis2. А затем копируем lib из axis2 в lib Tomcat 10. Запускаем Tomcat и заходим по ссылке localhost:8086/axis2/axis2-admin/ Вводим login: admin рassword: axis2

11.Разворачиваем Web сервис, заходя по ссылке и выбирая файл Hello.aar. 12. Клиент, обращающийся к Web сервису будет иметь вид: import hello.*; public class Main { public static void main(String[] args) { try { HelloStub stub = new HelloStub(null, " HelloStub.Add add=new HelloStub.Add(); HelloStub.Input inp=new HelloStub.Input(); inp.setA(30); inp.setB(20); add.setArgs0(inp);

HelloStub.AddResponse resp=stub.add(add); System.out.println(resp.get_return().getRes()); } catch (org.apache.axis2.AxisFault e) { e.printStackTrace }catch(java.rmi.RemoteException e){ e.printStackTrace(); } } } После запуска на экране поучим 50.

XMLBeans XMLBeans - это общая среда обработки XML, в состав которой входит слой связывания данных. Она создавалась как проект BEA Systems, а впоследствии была передана организации Apache Foundation. XMLBeans была первой формой связывания данных, поддерживаемой Axis2, и продолжает быть наиболее популярным вариантом работы с Axis2, особенно со сложными определениями схем.

XMLBeans отличается от ADB тем, что в ней добавляется класс для документа, который содержит класс ввода или вывода. Совокупный эффект при использовании XMLBeans по сравнению с ADB состоит в добавлении уровня создания объектов. В Axis2 нет поддержки распаковки XMLBeans, поэтому и нет способа избежать этого дополнительного уровня объектов. В результате классы, сформированные XMLBeans, получаются более сложными для использования, чем их эквиваленты в других средах связывания данных.

Рассмотрим тот же пример с сложением двух целых чисел, что и в случае ADB. Шаги 1-4 остаются теми же самыми, что и в случае ADB. Шаг 5. Создаем скелет Web сервиса на основе wsdl файла Hello.wsdl, созданного на предыдущем шаге. wsdl2java -uri Hello.wsdl -ss -sd -d xmlbeans Шаг 6. Логика Web сервиса должна быть заключена в классе HelloSkeleton.java. Данный класс имеет вид:

package hello; public class HelloSkeleton{ public hello.AddResponseDocument add( hello.AddDocument add ) { hello.AddDocument.Add addd=add.getAdd(); hello.xsd.Input inp=addd.getArgs0(); int sum=inp.getA()+inp.getB(); hello.xsd.Result res=hello.xsd.Result.Factory.newInstance(); res.setRes(sum); hello.AddResponseDocument respDoc= hello.AddResponseDocument.Factory.newInstance(); hello.AddResponseDocument.AddResponse addResp = hello.AddResponseDocument.AddResponse.Factory.newInstance(); addResp.setReturn(res); respDoc.setAddResponse(addResp); return respDoc; } }

Шаг 7. Компилируем и создаем пакет Hello.aar, используя ant. build.xml создается автоматически. Шаг 8. Генерируем клиентский stub wsdl2java -uri Hello.wsdl -d xmlbeans –o client В результате в папке client появятся папки resources src с набором java файлов и xsd файлов.

Шаг 9-11 аналогичны ADB. Шаг 12. Клиент, обращающийся к Web сервису будет иметь вид : public static void main(String[] args) { try { HelloStub stub = new HelloStub(null," hello.AddDocument adds= hello.AddDocument.Factory.newInstance(); hello.xsd.Input inp=hello.xsd.Input.Factory.newInstance(); inp.setA(20); inp.setB(30); hello.AddDocument.Add addd= hello.AddDocument.Add.Factory.newInstance(); addd.setArgs0(inp); adds.setAdd(addd);

hello.AddResponseDocument resp= stub.add(adds); System.out.println(resp.getAddResponse().getReturn().getRes()); }catch (org.apache.axis2.AxisFault e) { e.printStackTrace(); }catch(java.rmi.RemoteException e){ e.printStackTrace(); } } На экране получим 50. Стоит отметить, что клиент не запустится без папки schemaorg_apache_xmlbeans, находящейся в директории resources(в папке client). Перед запуском клиента необходимо прописать путь к этой папке, либо скопировать ее к другим пакетам клиентского приложения в соответствующей среде разработки.