Главная » Java, Web, XML » Работа с Axis

0

Программный продукт Axis (Apache extensible Interaction System) (http://xml.apache.org/axis/), разрабатываемый консорциумом W3C, представляет собой набор классов, большинство из которых реализуют интерфейсы пакетов Sun SAAJ, JAXM, JAX-RPC. Эти интерфейсы мы рассмотрим подробно в главе 6. Кроме того, в состав Axis входит небольшой отладочный SOAP-сервер — класс simpleAxis Server — и классы для преобразования описаний WSDL в объекты Java и обратно.

Установка Axis

Установить Axis в ваш сервер приложений очень легко. Достаточно скопировать каталог axis из каталога           в каталог вашего сервера приложений или в другой каталог, в который устанавливаются сервлеты. После этого надо скопировать в каталог iNF/lib/ архив вашего любимого XML-napcepa, например, xerces.jar, и

можно работать. Axis установлен как одно из Web-приложений, работающих на вашем сервере. Запустите сервер приложений, наберите в браузере, запущенном на сервере, адрес http://localhost:8080/axis/ — и вы увидите начальную страничку Axis.

Для дальнейшей работы с Axis необходимо, чтобы сервер приложений знал, где расположены файлы axis.jar, commons-logging.jar, jaxrpc.jar, log4j-1.2.4.jar, tt-bytecode.jar и xerces.jar. Для этого надо занести полные пути к этим файлам (к файлам, а не к каталогам, в которых они лежат) в переменную CLASSPATH или положить эти файлы в каталоги, известные серверу приложений. Обычно это один из каталогов lib, ext, common или endorsed сервера приложений.

Запросы клиентов при работе с Axis принимает сервлет AxisServlet. Убедиться в его правильной работе можно, набрав в браузере, работающем на сервере, адрес http://locaIhost:8080/axis/servlet/AxisServlet. В окне браузера должна появиться строка "And now Some Services" и список некоторых Web- служб, установленных на сервере.

В стандартную поставку Axis входит много примеров Web-служб. Посмотрите каталог    Вы увидите десяток подкаталогов, в которых лежат файлы с классами примерных Web-служб. Их исходные тексты лежат в каталоге

Создание Web-службы для Axis

Создать Web-службу, которая будет работать под управлением Axis, очень просто. Достаточно написать классы Java, реализующие Web-службу, дать файлу, содержащему исходные тексты этих классов, расширение                   и

положить этот файл в каталог axis сервера приложений.

Создадим Web-службу EchoService, полезную для отладки и проверки правильности передачи кириллицы. Она предоставляет одну Web-услугу getEcho (), просто возвращающую клиенту содержимое SOAP-запроса. Класс EchoService, содержащий метод getEcho о, приведен в листинге 3.14.

Листинг 3.14. Web-служба EchoService

public class EchoService {

public String getEcho (String req){ return req;

}

}

Назовем файл с содержимым листинга 3.14 EchoService.jws и положим его в каталог axis сервера приложений. Все, Web-служба готова. Не нужно компилировать класс EchoService, Axis сделает это сам при первом запросе к Web-службе.

Клиент Axis

Клиентское приложение, обращающееся к Web-службе, выполняющейся под управлением Axis, написать нетрудно. В листинге 3.15 показан клиент Web-службы EchoService листинга 3.14.

ЛистингЗ.15. Клиент Web-службы EchoService

import org. apache. axis. client. Call; import org.apache.axis.client.Service; import

public class EchoServiceClient{

public static void main (String [] args) throws Exception)

if (args. length != 1)(

System.err.println(

"Usage: java EchoServiceClient <request>");

System.exit(1);

}

Service service = new Service ();

Call call = (Call)service.createCall();

String endpoint =

"http://localhost:8080/axis/EchoService.jws";

call.setTargetEndpointAddress(new URL(endpoint)); call.setOperationName("getEcho");

String request = args [ 0 ] ;

String response =

(String)call.invoke(new Object[]{request}) ;

System.out.println("Послано: " + request); System.out.println("Получено: " + response);

}

}

В листинге 3.15 использованы интерфейсы service и пакета Они реализованны классами, входящими в Axis. Мы познакомимся с этими интерфейсами в главе 6. Как видно из листинга 3.15, основную роль в получении Web-услуги играет объект типа call. Он содержит адрес Web-службы endpoint и название Web-услуги getEcho. В него заносятся аргументы Web- услуги в виде массива объектов. В нашем простом примере массив аргументов состоит только из одного элемента — строки request. Наконец, объект call методом invoke о возвращает объект, содержащий результат выполнения Web-услуги.

Использование конфигурационного файла

Возможность создать Web-службу, просто написав JWS-файл — большое достоинство Axis, но часто возникают ситуации, в которых этот способ не годится. Например, надо создать Web-службу из готовых классов Java, исходные тексты которых отсутствуют, или задать какое-то особенное отображение сложных типов данных для передачи их по протоколу SOAP, или создать Web-службу, независимую от Axis. В таких случаях Axis предлагает написать конфигурационный файл — дескриптор установки (Deployment Descriptor), описывающий Web-службу во всех подробностях. Мы будем называть его DD-файлом. Потом, с помощью DD-файла надо выполнить установку Web-службы в Web-контейнер.

Конфигурационный DD-файл — это документ XML с корневым элементом <deployment>. Используемые в DD-файле имена элементов описаны в пространстве имен с идентификатором http://xml.apache.org/axis/wsdd/. В DD-файлах часто записываются имена классов Axis. Эти имена описаны в пространстве имен с идентификатором http://xml.apache.org/axis/wsdd/ Обычно корневой элемент с описанием пространств имен выглядит так:

«deployment

xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

В начале файла необязательным элементом                                           можно

установить начальные параметры работы Web-службы.

Основную роль в описании играют элементы <handler>, атрибут type которых задает класс-обработчик, устанавливаемый в Axis, или ссылку на другой, уже определенный элемент <handler>. Классы-обработчики SOAP- посланий создаются в полном соответствии с правилами JAX-RPC, описанными в главе 6. Для ссылки на элемент <handler> из другого элемента предназначен необязательный атрибут name. Режим работы класса- обработчика и другие параметры можно задать элементами

<option пагое="имя" ^1це="эначение" />, вложенными в элемент <handler>. Например: <option name="namespace"

value="http://tempuri.org/wsdl/2002/12/" />

Другой часто встречающийся элемент — <parameter пате="имя" ^1ие="значение" />

описывает самые разнообразные параметры Web-служб, например, элемент

<parameter                                     />

содержит пароль администратора. Элементы <parameter> чаще всего вкладываются в элемент <service>, описывающий Web-службу. Например, следующий элемент:

<service name="AdminService" provider=" java:MSG">

<parameter name^’metbodName" value= "AdminService" /> <parameter name=мenableRemc>teAdmin,, value="false" /> <parameter name="class№me" value="org.apache.axis.utils.Admin" /> <parameter name="allowedMethods" value="*"/>

</service>

описывает Web-службу AdminService, входящую в состав Axis. Она реализована классом Admin, у которого описан метод AdminService (да-да, имя метода почему-то начинается с заглавной буквы). Второй параметр, с именем запрещает или разрешает удаленное администрирование Web-службы. Это зависит от его значения value. Четвертый параметр, с именем aiiowedMethods, описывает открытые (public) методы класса. Их имена — значение атрибута value — надо перечислять через пробел или запятую. Звездочка означает, что все методы класса открыты.

Атрибут provider элемента <service> определяет класс-обработчик SOAP- посланий. Этот класс должен реализовать интерфейс Handler из пакета JAX-RPC или расширить какой-нибудь из абстрактных классов GenericHandier ИЛИ BasicHandler. Для облегчения 5ЖИ работы В составе

Axis есть расширение Bas icProvider класса BasicHandler. Класс BasicProvider, В СИЮ очередь, расширен классом JavaProvider, а у того есть расширения MsgProvider И RPCProvider.

Атрибут style элемента <service> или некоторые значения атрибута provider определяют стиль Web-службы. Процедурный стиль, а он принимается ПО умолчанию, записывается как provider="java:RPC" или style="RPC". Послания процедурного стиля будет обрабатывать класс RPCProvider. Документный стиль записывается как style="document". Axis вводит разновидность документного стиля, записываемую как style="wrapped". В этом случае при создании метода обработки XML- элемента Axis записывает вложенные в него элементы как аргументы метода. Четвертый стиль Web-службы, записываемый как provider="java:MSG" или   означает, что Axis будет обрабатывать послание непо

средственно в виде XML, не переводя его в объекты Java. Это выполняется С П0МЭ1Щ0 класса MsgProvider.

Web-услуги описываются элементами <operation>. Атрибут name задает имя метода, предоставляющего Web-услугу, атрибут returnType — тип возвращаемого значения. Атрибутом returnQName можно дать имя возвращаемому значению для ссылок внутри DD-файла. Аргументы метода описываются вложенными элементами <parameter>. Например:

<operation name="getEcho"

returnQName="echo" returnType="xsd:string"> <parameter name="req" type="xsd:string" /> </operation>

В элемент <service>, описывающий Web-службу, обрабатывающую запросы, часто вкладываются элементы <requestFlow> и <responseFlow>. Вложенные в них элементы <handier> описывают классы-обработчики, начинающие и заканчивающие обработку запроса. Например:

<service name="test">

<parameter name=="className" value="test. Implementation"/> <parameter name="allowedMethods" value="*"/>

<nawespace>http://testservice/</nawespace>

< reque s t Flow>

<handler type=" j ava:MyHandlerClass" />

chandler type="somethingIDefinedPreviously"/> </requestF1ow> </service>

Элемент <transport> описывает протокол пересылки SOAP-послания. Название протокола указывается атрибутом name. У элемента <transport>, описывающего клиента Axis, есть еще один атрибут pivot, задающий класс- отправитель SOAP-послания, например, класс HTTPSender, входящий в состав Axis. Протокол отправки послания может быть описан так:

<transport name="SimpleHTTP" pivot="HTTPSender">

<requestFlow>

<handler name="HTTPActionHandler" type="j ava:org.apache.axis.handlers,http.HTTPActionHandler"/>

</requestFlow>

</transport>

Два элемента описывают правила сериализации и десериализации сложных типов данных. Элемент

<typeMapping qname="xml-HMH" classname="MMa класса"

serializer="HMH класса" deserializer="Mivw класса" />

описывает атрибутом classname сложный тип данных — класс Java. Атрибуты serializer и deserializer задают имена классов, содержащих методы сериализации и десериализации. Например:

<typeMapping

xmlns:ns="http://soapinterop.org/" qname="ns:ArrayOf_apachesoap_Map" type="j ava:j ava.uti1.HashMap[]"

serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />

Элемент

<beanMapping languageSpecificType="HMH класса" /> описывает тип данных, описываемый классом Java, оформленным как JavaBean. У такого класса есть методы getxxx () и setxxx {), используемые для сери^изации сложных типов Java в XML стандартными классами Axis, реализующими интерфейсы Serializer И Deserializer, а именно, BeanSerializer и BeanDeserializer. Компоненту JavaBean не нужны специальные классы для сериализации. Например:

<beanMappingqname="reg: Service"

languageSpecificType="java:samples.bidbuy.Service"/>

В листинге 3.16 приведено полное описание Web-службы администратора AdminService, входящей в состав Axis.

i ЛистингЗ. 16. Конфигурационный файл Web-службы администратора

<deployment

xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<globalConfiguration>

<parameter name="adminPassword" value="admin" /> <parameter name="sendXsiTypes" value="true" /> <parameter name="sendMultiRefs" value="true" /> <parameter name="sendXMLDeclaration" value="true" />

<requestFlow>

<handler type="java:org.apache.axis.handlers.JWSHandler" /> </requestFlow>

</globalConfiguration>

<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

<handler name="LocalResponder" type="java:org.apache.axis.transport.local,LocalResponder"/>

<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>

•chandler name="MsgDispatcher"

type="j ava:org.apache.axi s.providers.j ava.MsgProvider"/>

chandler name= "RPCDi spa t che r " typeF^’j ava:org.apache.axis.providers.j ava.RPCProvider"/>

<service raП?="Achir?fer?vice" provider="java:MSG">

<paraOTetern^e="methodN^e" value="AdminService" /> <parameter name="enableRemoteAdmin" value="false" /> <parameter name="className" value="org.apache, axis.utils.Admin" />

</serviC?>

<service name="ciwsprocessor" prcvicerF "Handler" > <parameter rame="bamdle:clalss"

value="org.apache.axis.handlers.JWSProcessor" />

</serviC?>

<transport name="http">

cx?questFlcw> <harndler type="URL№pper" /> chancler

type="j ava:org.apache.axis.handlers.http.HTTPAuthHandler" /> </requestFlow>

^transpo^

<tranepDrt name=" local" > <responseFlow>

<handler

type="j ava:org.apache.axis.transport.local.LocalResponder" /> </reEp)Cri??FlCw> </trcin?p)ort> </deplcyTrcnit>

Конфигурационный DD-файл запоминается обычно под именем deploy.wsdd. После его создания надо перейти в каталог с этим файлом и выполнить команду

$ java org.apache.axis.client.http.AdminClient deploy.wsdd

Класс AdminClient установит описанную Web-службу в Axis. На консоли появятся сообщения

Processing file deploy.wsdd <Admin>Done processing</Admin>

После этого клиент может обратиться к Web-службе, воспользовавшись ее адресом URL, например, http://locaIhost:8080/axis/services/EchoService.

С помощью утилиты AdminClient можно просмотреть описания всех Web- служб, установленных на данной машине. Для этого надо набрать команду $java org.apache.axis.client.http.AdminClient list

Для удаления Web-службы из Web-контейнера создается файл undeploy.wsdd. Он похож на DD-файл, но его корневым элементом служит элемент <undeployment>.

Кроме установки Web-службы в Web-контейнер, утилита AdminClient создает все необходимые для ее работы файлы, в том числе клиентские заглушки. Пример клиента, использующего их, приведен в листинге 3.18.

Литература:

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

По теме:

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