Loading...
Flash Player 9 (or above) is needed to view slideshows. We have detected that you do not have it on your computer.To install it, go here
Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB
Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB
719 views | comments | 0 favorites | 7 downloads | 0 embeds (Stats)
More Info
This slideshow is Public
Total Views: 719 on Slideshare: 719 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: Вопросы?
?