Технология создания веб-сервисов на базе стандарта  JAX-WS & JAXB Малышкин Фёдор  ( [email_address] ) 9 ноября 2007
Введение <ul><li>Веб-сервис – это метод коммуникации с использованием огромного количества протоколов и данными в виде стр...
WSDL <ul><li>WSDL – Web Service Description Language. </li></ul><ul><li>WSDL  является  XML  словарём, который позволяет о...
Логическая структура  WSDL <ul><li><wsdl:definitions ....> </li></ul><ul><li><!–  Импорт определений из других источников ...
Элементы  WSDL <ul><li>import  –  позволяет частям веб-сервиса быть распределёнными между несколькими файлами и быть скомп...
Элементы  WSDL <ul><li>types  –  определяет типы используемые веб-сервисами. </li></ul><ul><li><types> </li></ul><ul><li><...
Элементы  WSDL <ul><li>types  –  определяет типы используемые веб-сервисами. </li></ul>
Элементы  WSDL <ul><li>message  -  описывает данные, которые путешествуют между веб-сервисом и клиентом в терминах, описан...
Элементы  WSDL <ul><li>portType  –  определяет опреации, которые веб-сервис обеспечивает. </li></ul><ul><li><portType name...
Элементы  WSDL <ul><li>binding  –  определяет, как операции и сообщения, описанные в  message  и  portType , привязываются...
Элементы  WSDL <ul><li>service  – группирует ранее описанные порты и этим определяет сервис. </li></ul><ul><li><service na...
Разработка «обычных»  веб-сервисов  <ul><li>Класс  Java: </li></ul><ul><li>@WebService </li></ul><ul><li>public class Usua...
Разработка «обычных»  веб-сервисов <ul><li>Генерация с помощью  WSGEN  необходимых артефактов и  WSDL </li></ul><ul><li>Ра...
Потери «обычных» веб-сервисов <ul><li>«Обычные» веб-сервисами отличаются от «нормальных» только одним – отсутствием информ...
Пример «стандартного»  веб-сервиса <ul><li>Загружаем  WSDL  «нормального» веб-сервиса в  XMLSpy  и пробуем вызвать. </li><...
Преимущества «стандартных» веб-сервисов <ul><li>Доступ к информации о структуре  XML  на стадии анализа веб-сервиса. </li>...
Пример сгенерированного клиента для «стандартного» веб-сервиса <ul><li>@WebMethod </li></ul><ul><li>@WebResult(name = &quo...
Пример сгенерированного клиента для «стандартного» веб-сервиса <ul><li>Каждый метод имеет в качестве параметров и возвраща...
Создание « стандартного » веб-сервиса. Вариант 1. <ul><li>Создание  WSDL </li></ul><ul><li>Генерация артефактов с помощью ...
Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Создание классов носителей-данных для обмена. Классы носители-да...
Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>package edu.sefer.home.ws; </li></ul><ul><li>import java.util.Da...
Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Создания класса веб-сервиса, подобно   обычному подходу, но с вх...
Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Генерация артефактов с использованием  WSGEN , подобно обычному ...
Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Развёртывание и вызов… </li></ul>
Создание « стандартного » веб-сервиса. Вариант 3. <ul><li>Генерация   или создание  WSDL  схемы вручную. </li></ul><ul><li...
Выводы <ul><li>Варианты 1 и 2 наиболее удобны, если интерфейсы взаимодействия уже оговорены и устоялись. </li></ul><ul><li...
Вопросы? <ul><li>? </li></ul>
Upcoming SlideShare
Loading in …5
×

Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

6,894 views

Published on

Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,894
On SlideShare
0
From Embeds
0
Number of Embeds
35
Actions
Shares
0
Downloads
60
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

  1. 1. Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB Малышкин Фёдор ( [email_address] ) 9 ноября 2007
  2. 2. Введение <ul><li>Веб-сервис – это метод коммуникации с использованием огромного количества протоколов и данными в виде структурированного XML. </li></ul><ul><li>Название пошло от основного протокола передачи, использовавшегося на заре создания технологии – HTTP. </li></ul><ul><li>Сейчас в качестве протоколов передачи кроме HTTP, могут использоваться JMS ( протокол передачи сообщений Java), SMTP , TCP… </li></ul><ul><li>Даже данные могут передаваться не в виде XML. </li></ul><ul><li>Так что понятие «веб-сервис» имеет очень расплывчатое значение на сегодняшний день и включает в себя огромное количество понятий. </li></ul><ul><li>Но разговор будет идти о стандарте описания веб-сервиса – о WSDL … </li></ul>
  3. 3. WSDL <ul><li>WSDL – Web Service Description Language. </li></ul><ul><li>WSDL является XML словарём, который позволяет описать веб-сервис в языке независимом от платформы и от реализации. </li></ul><ul><li>Данная лекция описывает стандарт WSDL 1.1 , который доступен по адресу [TODO]. </li></ul>
  4. 4. Логическая структура WSDL <ul><li><wsdl:definitions ....> </li></ul><ul><li><!– Импорт определений из других источников --> </li></ul><ul><li><wsdl:import ..../> </li></ul><ul><li><!– Определение типов используемых только в этом WSDL --> </li></ul><ul><li><wsdl:types ..../> </li></ul><ul><li><!– Определение сообщений используемых веб-сервисом --> </li></ul><ul><li><wsdl:message .../> </li></ul><ul><li><!– Определение интерфейсов и операций --> </li></ul><ul><li><wsdl:portType .../> </li></ul><ul><li><!– Привязка интерфейсов и операций к конкретному протоколу --> </li></ul><ul><li><wsdl:binding ..../> </li></ul><ul><li><!– Определение сервиса как коллекции интерфейсов и определение адреса сервиса --> </li></ul><ul><li><wsdl:service ..../> </li></ul><ul><li></wsdl:definitions> </li></ul>
  5. 5. Элементы WSDL <ul><li>import – позволяет частям веб-сервиса быть распределёнными между несколькими файлами и быть скомпонованными в различной конфигурации в зависимости от потребностей авторов веб-сервиса. </li></ul><ul><li>Использование данной техники распространено в крупных проектах, многие веб-сервисы имеют общие типы данных и отличаются только в деталях реализации или привязки к протоколу. </li></ul>
  6. 6. Элементы WSDL <ul><li>types – определяет типы используемые веб-сервисами. </li></ul><ul><li><types> </li></ul><ul><li><xs:complexType name=&quot;requestHeaderType&quot;> </li></ul><ul><li><xs:all> </li></ul><ul><li><xs:element name=&quot;sessionId&quot; type=&quot;xs:string&quot;> </li></ul><ul><li></xs:all> </li></ul><ul><li></xs:complexType> </li></ul><ul><li><xs:complexType name=&quot;responseHeaderType&quot;> </li></ul><ul><li><xs:all> </li></ul><ul><li><xs:element name=&quot;sessionId&quot; type=&quot;xs:string&quot;> </li></ul><ul><li></xs:element> </li></ul><ul><li></xs:all> </li></ul><ul><li></xs:complexType> </li></ul><ul><li>… .. </li></ul>
  7. 7. Элементы WSDL <ul><li>types – определяет типы используемые веб-сервисами. </li></ul>
  8. 8. Элементы WSDL <ul><li>message - описывает данные, которые путешествуют между веб-сервисом и клиентом в терминах, описанных в элементе Types . </li></ul><ul><li><message name=&quot;startSessionRequest&quot;> </li></ul><ul><li><part name=&quot;request&quot; element=&quot;tns:startSessionRequest&quot;/> </li></ul><ul><li></message> </li></ul><ul><li><message name=&quot;startSessionResponse&quot;> </li></ul><ul><li><part name=&quot;response&quot; element=&quot;tns:startSessionResponse&quot;/> </li></ul><ul><li></message> </li></ul><ul><li><message name=&quot;getRegionImageRequest&quot;> </li></ul><ul><li><part name=&quot;request&quot; element=&quot;tns:getRegionImageRequest&quot;/> </li></ul><ul><li></message>… </li></ul>
  9. 9. Элементы WSDL <ul><li>portType – определяет опреации, которые веб-сервис обеспечивает. </li></ul><ul><li><portType name=&quot;GPSMonitorScreenProjectionEndpoint&quot;> </li></ul><ul><li><operation name=&quot;startSession&quot;> </li></ul><ul><li><input message=&quot;tns:startSessionRequest&quot;/> </li></ul><ul><li><output message=&quot;tns:startSessionResponse&quot;/> </li></ul><ul><li></operation> </li></ul><ul><li><operation name=&quot;addRoute&quot;> </li></ul><ul><li><input message=&quot;tns:addRouteRequest&quot;/> </li></ul><ul><li><output message=&quot;tns:addRouteResponse&quot;/> </li></ul><ul><li><fault name=&quot;fault&quot; message=&quot;tns:addRouteFault&quot;/> </li></ul><ul><li></operation> </li></ul><ul><li>… </li></ul>
  10. 10. Элементы WSDL <ul><li>binding – определяет, как операции и сообщения, описанные в message и portType , привязываются к конкретному протоколу. </li></ul><ul><li><binding name=&quot;GPSMonitorScreenProjectionEndpointBinding&quot; type=&quot;tns:GPSMonitorScreenProjectionEndpoint&quot;> </li></ul><ul><li><soap:binding style=&quot;document&quot; transport=&quot;http://schemas.xmlsoap.org/soap/http&quot;/> </li></ul><ul><li><operation name=&quot;startSession&quot;> </li></ul><ul><li><soap:operation/> </li></ul><ul><li><input><soap:body use=&quot;literal&quot;/></input> </li></ul><ul><li><output><soap:body use=&quot;literal&quot;/></output> </li></ul><ul><li></operation> </li></ul><ul><li><operation name=&quot;addRoute&quot;><soap:operation/> </li></ul><ul><li>… </li></ul>
  11. 11. Элементы WSDL <ul><li>service – группирует ранее описанные порты и этим определяет сервис. </li></ul><ul><li><service name=&quot;GPSMonitorScreenProjectionService&quot;> </li></ul><ul><li><port name=&quot;GPSMonitorScreenProjectionEndpointPort&quot; binding=&quot;tns:GPSMonitorScreenProjectionEndpointBinding&quot;> </li></ul><ul><li><soap:address location=&quot;http://mg-sv01/&quot;/> </li></ul><ul><li></port> </li></ul><ul><li></service> </li></ul>
  12. 12. Разработка «обычных» веб-сервисов <ul><li>Класс Java: </li></ul><ul><li>@WebService </li></ul><ul><li>public class UsualWS { </li></ul><ul><li>@WebMethod </li></ul><ul><li>public String method01(String data) { </li></ul><ul><li>// парсинг XML </li></ul><ul><li>// работа над данными </li></ul><ul><li>String result = результат работы </li></ul><ul><li>return result ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  13. 13. Разработка «обычных» веб-сервисов <ul><li>Генерация с помощью WSGEN необходимых артефактов и WSDL </li></ul><ul><li>Развёртывание </li></ul><ul><li>И вызов через клиента или другое средство. Например через XMLSpy: </li></ul>
  14. 14. Потери «обычных» веб-сервисов <ul><li>«Обычные» веб-сервисами отличаются от «нормальных» только одним – отсутствием информации о структуре передаваемого XML. </li></ul><ul><li>Информация о том, что передаётся и в каком виде, должна быть у пользователя веб-сервиса ЗАРАНЕЕ. Использовать веб-сервис без этого не предоставляется возможным. </li></ul>
  15. 15. Пример «стандартного» веб-сервиса <ul><li>Загружаем WSDL «нормального» веб-сервиса в XMLSpy и пробуем вызвать. </li></ul>
  16. 16. Преимущества «стандартных» веб-сервисов <ul><li>Доступ к информации о структуре XML на стадии анализа веб-сервиса. </li></ul><ul><li>Чёткое описание веб-сервиса на уровне интерфейсов взаимодействия. </li></ul><ul><li>Возможность генерации клиента другим программистом независимо от автора. </li></ul><ul><li>Совместимость клиента и сервиса (изменении сервиса в рамках допустимого). </li></ul><ul><li>Возможность генерации специальных класса для указанных типов, облегчающих работу с XML . </li></ul><ul><li>Устранение необходимости работы экранирования строк, на наличие служебных символов. </li></ul>
  17. 17. Пример сгенерированного клиента для «стандартного» веб-сервиса <ul><li>@WebMethod </li></ul><ul><li>@WebResult(name = &quot;addRouteResponse&quot;, targetNamespace = &quot;http://gpsmonitor.net.magnetosoft.ru/&quot;, partName = &quot;response&quot;) </li></ul><ul><li>public AddRouteResponseType addRoute(@WebParam(name = &quot;addRouteRequest&quot;, targetNamespace = &quot;http://gpsmonitor.net.magnetosoft.ru/&quot;, partName = &quot;request&quot;) </li></ul><ul><li>AddRouteRequestType request) </li></ul><ul><li>throws AddRouteFault; </li></ul><ul><li>@WebMethod </li></ul><ul><li>@WebResult(name = &quot;getScaleResponse&quot;, targetNamespace = &quot;http://gpsmonitor.net.magnetosoft.ru/&quot;, partName = &quot;response&quot;) </li></ul><ul><li>public ScaleResponseType getScale(@WebParam ( name = &quot;getScaleRequest&quot;, targetNamespace = &quot;http://gpsmonitor.net.magnetosoft.ru/&quot;, partName = &quot;request&quot;) </li></ul><ul><li>GetScaleRequest request) </li></ul><ul><li>throws GetScaleFault; </li></ul>
  18. 18. Пример сгенерированного клиента для «стандартного» веб-сервиса <ul><li>Каждый метод имеет в качестве параметров и возвращаемого результат сгенерированные классы, обрамлённые JAXB аннотациями. </li></ul><ul><li>При вызове метода классы с наполненными данными преобразуются в XML , а результат из XML разбирается в те же сгенерированные классы. </li></ul><ul><li>Как результат - необходимость работы с XML , переносящимся между веб-сервисами, отпадает полностью. </li></ul>
  19. 19. Создание « стандартного » веб-сервиса. Вариант 1. <ul><li>Создание WSDL </li></ul><ul><li>Генерация артефактов с помощью WSIMPORT </li></ul><ul><li>Создание реализации сгенерированного интерфейса сервиса </li></ul><ul><li>P.S.: Данный вариант детально не рассматривается, так как требует детального знания языка описания XML – « XML Schema » . Именно на его основе сделаны модули « Search », « Catalogue » платформы MAGNET . </li></ul>
  20. 20. Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Создание классов носителей-данных для обмена. Классы носители-данных для обмена являются обычными JavaBean’ ами, с аннотациями JAXB , которые определяют в какой XML они превратятся. </li></ul><ul><li>package edu.sefer.home.ws; </li></ul><ul><li>import java.math.BigDecimal; </li></ul><ul><li>import javax.xml.bind.annotation.XmlElement; </li></ul><ul><li>import javax.xml.bind.annotation.XmlRootElement; </li></ul><ul><li>@XmlRootElement </li></ul><ul><li>public class XmlResult { </li></ul><ul><li>@XmlElement </li></ul><ul><li>int result; </li></ul><ul><li>@XmlElement </li></ul><ul><li>BigDecimal resultBD; </li></ul><ul><li>} </li></ul>
  21. 21. Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>package edu.sefer.home.ws; </li></ul><ul><li>import java.util.Date; </li></ul><ul><li>import javax.xml.bind.annotation.XmlElement; </li></ul><ul><li>import javax.xml.bind.annotation.XmlRootElement; </li></ul><ul><li>@XmlRootElement </li></ul><ul><li>public class XmlData { </li></ul><ul><li>@XmlElement </li></ul><ul><li>String inputString; </li></ul><ul><li>@XmlElement </li></ul><ul><li>Date inputDate; </li></ul><ul><li>@XmlElement </li></ul><ul><li>int inputInt; </li></ul><ul><li>} </li></ul>
  22. 22. Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Создания класса веб-сервиса, подобно обычному подходу, но с входящими и выходящими параметрами в виде классов носителей-данных. </li></ul><ul><li>package edu.sefer.home.ws; </li></ul><ul><li>import javax.jws.WebMethod; </li></ul><ul><li>import javax.jws.WebService; </li></ul><ul><li>@WebService </li></ul><ul><li>public class UsualWS { </li></ul><ul><li>@WebMethod </li></ul><ul><li>public XmlResult method01(XmlData data) { </li></ul><ul><li>return null; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  23. 23. Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Генерация артефактов с использованием WSGEN , подобно обычному подходу. </li></ul><ul><li><wsgen verbose=&quot;false&quot; debug=&quot;true&quot; keep=&quot;true&quot; destdir=&quot;${project.build.outputDirectory}&quot; resourcedestdir=&quot;${basedir}/target/wsdl&quot; sourcedestdir=&quot;${project.build.sourceDirectory}&quot; sei=&quot;edu.sefer.home.ws.UsualWS&quot; genwsdl=&quot;true&quot;> </li></ul><ul><li><classpath> </li></ul><ul><li><path refid=&quot;jwdp.classpath&quot;/> </li></ul><ul><li><pathelement location=&quot;${project.build.directory}/classes&quot;/> </li></ul><ul><li></classpath> </li></ul><ul><li></wsgen> </li></ul>
  24. 24. Создание « стандартного » веб-сервиса. Вариант 2. <ul><li>Развёртывание и вызов… </li></ul>
  25. 25. Создание « стандартного » веб-сервиса. Вариант 3. <ul><li>Генерация или создание WSDL схемы вручную. </li></ul><ul><li>Использование интерфейса « javax.xml.ws.Provider » на серверной стороне </li></ul><ul><li>Использование интерфейса « javax.xml.ws.Dispatch » на клиентской стороне </li></ul><ul><li>Использование типа « xsd:anyType » для описания ЛЮБОГО XML, если его структура не зафиксирована. </li></ul><ul><li>P.S.: Данный вариант детально не рассматривается, так как требует детального знания языка описания XML – « XML Schema » и деталей работы соответствующих интерфейсов. Но именно на его основе сделан модуль « EntityManager » платформы MAGNET . </li></ul>
  26. 26. Выводы <ul><li>Варианты 1 и 2 наиболее удобны, если интерфейсы взаимодействия уже оговорены и устоялись. </li></ul><ul><li>Вариант же 3 позволяет передавать динамически компонуемый XML максимально быстро и использовать его максимально эффективно и гибко. </li></ul><ul><li>Хотя надо так же заметить, что при использовании некоторых подходов, передавать динамический XML можно и в вариантах 1 и 2. Но надо заметить, что дополнительная нагрузка (на обработку сообщений на уровне самой библиотеки) при этом возрастает многократно. </li></ul>
  27. 27. Вопросы? <ul><li>? </li></ul>

×