Главная » Java, Web, XML » Создание клиента JAX-RPC

0

Система JAX-RPC позволяет создавать клиентские приложения трех типов. Проще всего использовать в приложении заранее созданные заглушки (generated stubs). Их создает старый компилятор хгрсс с флагом -client, например, так:

$ хгрсс -client -d bookclient config.xml

или новый компилятор wscompile, работающий из командной строки примерно следующим образом:

$ wscompile -gen:client -d bookclient config.xml

Оба компилятора читают предварительно написанный конфигурационный файл config.xml и записывают создаваемые файлы в каталог, указанный параметром -d, в примере это каталог с именем bookclient. Кроме того, компилятор хгрсс использует SEI-интерфейс Web-службы, а компилятор wscompile — описание WSDL, причем компилятор смотрит это описание через Web-службу по адресу, например, http://localhost:8080/ services/bookinfo?WSDL. Поэтому Web-служба уже должна быть установлена в Web-контейнер, а контейнер должен работать.

Итак, перед созданием заглушек надо написать конфигурационный файл config.xml. Рассмотрим его структуру.

Конфигурационный файл компилятора config.xml

Корневой элемент конфигурационного файла <configuration> и вложенные в него элементы определены в пространстве имен с идентификатором http://java.sun.com/xml/ns/jax^c/ri/config . В корневой элемент вкладывается один из трех элементов:

? элемент <service>, если Web-служба строится по SEI-интерфейсу;

?    элемент <wsdl>, если Web-служба строится по WSDL-описанию;

?    элемент <modelfile>, если описание находится в другом файле. У элемента <service> четыре обязательных атрибута.

?    Атрибут name задает название создаваемой Web-службы.

?    Атрибут packageName определяет имя пакета, в котором будут расположены создаваемые классы.

?    Атрибут targetNamespace содержит идентификатор пространства имен создаваемого описания WSDL.

?    Атрибут typeNamespace содержит идентификатор пространства имен типов, определяемых в создаваемом описании WSDL.

В элемент < service > вкладываются нуль или несколько элементов <interface>, описывающих SEI-интерфейсы Web-службы. Полное имя SEI- интерфейса записывается обязательным атрибутом name, полное имя реализующего его класса-служителя — атрибутом servantName. Необязательные атрибуты soAPAction и soAPActionBase задают одноименные поля MIME- заголовка.

У элемента <wsdl> два обязательных атрибута. Атрибут location содержит строку URI с адресом описания WSDL, атрибут packageName — имя пакета с классами Web-службы.

Остальные элементы конфигурационного файла необязательны. Они показаны на следующей схеме, показывающей структуру конфигурационного файла.

<?xml version="1.0" encoding="UTF-8"?>

<configuration

xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">

<service name="xsd:string"

packageName="xsd:xtring" targetNamespace="xsd:anyURI" typeNamespace="xsd:anyURI">

cinterface name="xsd:string" servantName="xsd:string"

< ! — Оставшиеся атрибуты и элементы необязательны —>

soapAction="xsd:string"

soapActionBase="xsd:string">

<handlerChains>

< ! — Цепочка классов-обработчиков —> </handlerChains>

</interface>

<typeMappingRegistry>

< ! — Правила сериализации нестандартных типов —> </typeMappingRegistry>

<handle rCha ins >

<! — Цепочка классов-обработчиков —> </handlerChains>

<name spa ceMappingRegi s t ry>

< ! — Соответствие пространств имен и пакетов Java —> </namespaceMappingRegistry>

</service>

</configuration>

В листинге 6.11 приведен конфигурационный файл нашей примерной Web- службы Bookinfo для создания Web-службы по ее SEI-интерфейсу.

Листинг 6.11. Конфигурационный файл компилятора SEl-интерфейса

<?xml version="1.0" encoding="UTF-8"?>

<configuration

xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">

<service name="BookInfo"

packageName="book" targetNamespace="http://book.org" typeNamespace="http://book.org/types">

<interface name="BookInfoPort"

servantName="BookInfoImpl"> </interface>

</service>

</configuration>

Кроме заглушки BookInfoPort_Stub.class, имя которой составлено из имени SEI-интерфейса и сопутствующих классов, компилятор хгрсс создает WSDL-описание Web-службы, в нашем примере это файл Booklnfo.wsdl, и файл свойств Web-службы, в примере это файл BookInfo_Config.properties. Имена этих файлов содержат В’ себе название Web-службы, заданное атрибутом name элемента <service> конфигурационного файла config.xml.

Конфигурационный файл config.xml для компилятора                    создающе

го Web-службу Bookinfо по ее описанию WSDL, написан в листинге 6.12.

Листинг 6.12. Конфигурационный файл компилятора WSDL-описания

<?xml version="1.0" encoding="UTF-8"?>

configuration

xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">

<wsdl location="http://localhost:8080/services/bookinfo?WSDL" packageName="bookinfo"/>

</configuration>

Клиент, использующий заранее созданные заглушки

Методы использования заглушки описаны в интерфейсе stub пакета javax.xml. грс. Они задают и читают свойства заглушки. Это методы

public void _setProperty(string name, Object value); public Object _getProperty (string name); public Iterator

В интерфейсе описаны четыре стандартных свойства заглушки:

?   username_property — строка типа string с именем пользователя Web- службы;

?   endpoint_address_property — строка типа string с URI-адресом Web- службы;

•         session_maintain_property — объект ТИПа Boolean, указывающий, Создавать сеанс связи с Web-службой или нет. По умолчанию сеанс не создается.

Поскольку заглушка — в нашем примере это класс Bookinfo_stub — уже создана, можно создать ее экземпляр как объект обычного класса и обращаться к методам этого объекта. Например:

Stub stub = new BookInfo_Stub () ; BooklnfoPort info = (BooklnfoPort)stub; Book book = info.getlnfo("5-94157-041-4");

Однако удобнее использовать вспомогательный класс                         создан

ный вместе с заглушкой. Метод этого класса getxxxPort (), где Ххх — название Web-службы, взятое из атрибута name элемента <service> конфигурационного файла config.xml, выполняет необходимые проверки и обработку исключений и возвращает заглушку. С использованием этого класса клиентскую программу можно написать так, как это сделано в листинге 6.13.

Листинг 6.13. Клиент, использующий существующую заглушку

}catch(Exception e){ System.err.println(e);

}

}

}

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

  • Комментарии