Slideshare.net (beta)

 
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 1 (more)

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

From fedor.malyshkin, 2 months ago

Технология создания веб-сервисов на more

431 views  |  0 comments  |  0 favorites  |  3 downloads
Embed
options

More Info

This slideshow is Public
Total Views: 431
on Slideshare: 431
from embeds: 0

Slideshow transcript

Slide 1: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru) 9 ноября 2007

Slide 2: Введение  Веб-сервис – это метод коммуникации с использованием огромного количества протоколов и данными в виде структурированного XML.  Название пошло от основного протокола передачи, использовавшегося на заре создания технологии – HTTP.  Сейчас в качестве протоколов передачи кроме HTTP, могут использоваться JMS (протокол передачи сообщений Java), SMTP, TCP…  Даже данные могут передаваться не в виде XML.  Так что понятие «веб-сервис» имеет очень расплывчатое значение на сегодняшний день и включает в себя огромное количество понятий.  Но разговор будет идти о стандарте описания веб-сервиса – о WSDL…

Slide 3: WSDL  WSDL – Web Service Description Language.  WSDL является XML словарём, который позволяет описать веб-сервис в языке независимом от платформы и от реализации.  Данная лекция описывает стандарт WSDL 1.1, который доступен по адресу [TODO].

Slide 4: Логическая структура WSDL <wsdl:definitions ....> <!– Импорт определений из других источников --> <wsdl:import ..../> <!– Определение типов используемых только в этом WSDL --> <wsdl:types ..../> <!– Определение сообщений используемых веб-сервисом --> <wsdl:message .../> <!– Определение интерфейсов и операций --> <wsdl:portType .../> <!– Привязка интерфейсов и операций к конкретному протоколу --> <wsdl:binding ..../> <!– Определение сервиса как коллекции интерфейсов и определение адреса сервиса --> <wsdl:service ..../> </wsdl:definitions>

Slide 5: Элементы WSDL  import – позволяет частям веб-сервиса быть распределёнными между несколькими файлами и быть скомпонованными в различной конфигурации в зависимости от потребностей авторов веб-сервиса. Использование данной техники распространено в крупных проектах, многие веб-сервисы имеют общие типы данных и отличаются только в деталях реализации или привязки к протоколу.

Slide 6: Элементы WSDL  types – определяет типы используемые веб-сервисами. <types> <xs:complexType name="requestHeaderType"> <xs:all> <xs:element name="sessionId" type="xs:string"> </xs:all> </xs:complexType> <xs:complexType name="responseHeaderType"> <xs:all> <xs:element name="sessionId" type="xs:string"> </xs:element> </xs:all> </xs:complexType> …..

Slide 7: Элементы WSDL  types – определяет типы используемые веб-сервисами.

Slide 8: Элементы WSDL  message - описывает данные, которые путешествуют между веб-сервисом и клиентом в терминах, описанных в элементе Types. <message name="startSessionRequest"> <part name="request" element="tns:startSessionRequest"/> </message> <message name="startSessionResponse"> <part name="response" element="tns:startSessionResponse"/> </message> <message name="getRegionImageRequest"> <part name="request" element="tns:getRegionImageRequest"/> </message>…

Slide 9: Элементы WSDL  portType – определяет опреации, которые веб-сервис обеспечивает. <portType name="GPSMonitorScreenProjectionEndpoint"> <operation name="startSession"> <input message="tns:startSessionRequest"/> <output message="tns:startSessionResponse"/> </operation> <operation name="addRoute"> <input message="tns:addRouteRequest"/> <output message="tns:addRouteResponse"/> <fault name="fault" message="tns:addRouteFault"/> </operation> …

Slide 10: Элементы WSDL  binding – определяет, как операции и сообщения, описанные в message и portType, привязываются к конкретному протоколу. <binding name="GPSMonitorScreenProjectionEndpointBinding" type="tns:GPSMonitorScreenProjectionEndpoint"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="startSession"> <soap:operation/> <input><soap:body use="literal"/></input> <output><soap:body use="literal"/></output> </operation> <operation name="addRoute"><soap:operation/> …

Slide 11: Элементы WSDL  service – группирует ранее описанные порты и этим определяет сервис. <service name="GPSMonitorScreenProjectionService"> <port name="GPSMonitorScreenProjectionEndpointPort" binding="tns:GPSMonitorScreenProjectionEndpointBinding"> <soap:address location="http://mg-sv01/"/> </port> </service>

Slide 12: Разработка «обычных» веб-сервисов  Класс Java: @WebService public class UsualWS { @WebMethod public String method01(String data) { // парсинг XML // работа над данными String result = результат работы return result; } }

Slide 13: Разработка «обычных» веб-сервисов  Генерация с помощью WSGEN необходимых артефактов и WSDL  Развёртывание  И вызов через клиента или другое средство. Например через XMLSpy:

Slide 14: Потери «обычных» веб-сервисов  «Обычные» веб-сервисами отличаются от «нормальных» только одним – отсутствием информации о структуре передаваемого XML.  Информация о том, что передаётся и в каком виде, должна быть у пользователя веб-сервиса ЗАРАНЕЕ. Использовать веб-сервис без этого не предоставляется возможным.

Slide 15: Пример «стандартного» веб-сервиса  Загружаем WSDL «нормального» веб-сервиса в XMLSpy и пробуем вызвать.

Slide 16: Преимущества «стандартных» веб-сервисов  Доступ к информации о структуре XML на стадии анализа веб-сервиса.  Чёткое описание веб-сервиса на уровне интерфейсов взаимодействия.  Возможность генерации клиента другим программистом независимо от автора.  Совместимость клиента и сервиса (изменении сервиса в рамках допустимого).  Возможность генерации специальных класса для указанных типов, облегчающих работу с XML.  Устранение необходимости работы экранирования строк, на наличие служебных символов.

Slide 17: Пример сгенерированного клиента для «стандартного» веб-сервиса @WebMethod @WebResult(name = "addRouteResponse", targetNamespace = "http://gpsmonitor.net.magnetosoft.ru/", partName = "response") public AddRouteResponseType addRoute(@WebParam(name = "addRouteRequest", targetNamespace = "http://gpsmonitor.net.magnetosoft.ru/", partName = "request") AddRouteRequestType request) throws AddRouteFault; @WebMethod @WebResult(name = "getScaleResponse", targetNamespace = "http://gpsmonitor.net.magnetosoft.ru/", partName = "response") public ScaleResponseType getScale(@WebParam ( name = "getScaleRequest", targetNamespace = "http://gpsmonitor.net.magnetosoft.ru/", partName = "request") GetScaleRequest request) throws GetScaleFault;

Slide 18: Пример сгенерированного клиента для «стандартного» веб-сервиса  Каждый метод имеет в качестве параметров и возвращаемого результат сгенерированные классы, обрамлённые JAXB аннотациями.  При вызове метода классы с наполненными данными преобразуются в XML, а результат из XML разбирается в те же сгенерированные классы.  Как результат - необходимость работы с XML, переносящимся между веб-сервисами, отпадает полностью.

Slide 19: Создание «стандартного» веб- сервиса. Вариант 1.  Создание WSDL  Генерация артефактов с помощью WSIMPORT  Создание реализации сгенерированного интерфейса сервиса P.S.: Данный вариант детально не рассматривается, так как требует детального знания языка описания XML – «XML Schema». Именно на его основе сделаны модули «Search», «Catalogue» платформы MAGNET.

Slide 20: Создание «стандартного» веб- сервиса. Вариант 2.  Создание классов носителей-данных для обмена. Классы носители-данных для обмена являются обычными JavaBean’ами, с аннотациями JAXB, которые определяют в какой XML они превратятся. package edu.sefer.home.ws; import java.math.BigDecimal; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class XmlResult { @XmlElement int result; @XmlElement BigDecimal resultBD; }

Slide 21: Создание «стандартного» веб- сервиса. Вариант 2. package edu.sefer.home.ws; import java.util.Date; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class XmlData { @XmlElement String inputString; @XmlElement Date inputDate; @XmlElement int inputInt; }

Slide 22: Создание «стандартного» веб- сервиса. Вариант 2.  Создания класса веб-сервиса, подобно обычному подходу, но с входящими и выходящими параметрами в виде классов носителей-данных. package edu.sefer.home.ws; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class UsualWS { @WebMethod public XmlResult method01(XmlData data) { return null; } }

Slide 23: Создание «стандартного» веб- сервиса. Вариант 2.  Генерация артефактов с использованием WSGEN, подобно обычному подходу. <wsgen verbose="false" debug="true" keep="true" destdir="${project.build.outputDirectory}" resourcedestdir="${basedir}/target/wsdl" sourcedestdir="${project.build.sourceDirectory}" sei="edu.sefer.home.ws.UsualWS" genwsdl="true"> <classpath> <path refid="jwdp.classpath"/> <pathelement location="${project.build.directory}/classes"/> </classpath> </wsgen>

Slide 24: Создание «стандартного» веб- сервиса. Вариант 2.  Развёртывание и вызов…

Slide 25: Создание «стандартного» веб- сервиса. Вариант 3.  Генерация или создание WSDL схемы вручную.  Использование интерфейса «javax.xml.ws.Provider» на серверной стороне  Использование интерфейса «javax.xml.ws.Dispatch» на клиентской стороне  Использование типа «xsd:anyType» для описания ЛЮБОГО XML, если его структура не зафиксирована. P.S.: Данный вариант детально не рассматривается, так как требует детального знания языка описания XML – «XML Schema» и деталей работы соответствующих интерфейсов. Но именно на его основе сделан модуль «EntityManager» платформы MAGNET.

Slide 26: Выводы  Варианты 1 и 2 наиболее удобны, если интерфейсы взаимодействия уже оговорены и устоялись.  Вариант же 3 позволяет передавать динамически компонуемый XML максимально быстро и использовать его максимально эффективно и гибко.  Хотя надо так же заметить, что при использовании некоторых подходов, передавать динамический XML можно и в вариантах 1 и 2. Но надо заметить, что дополнительная нагрузка (на обработку сообщений на уровне самой библиотеки) при этом возрастает многократно.

Slide 27: Вопросы? ?