Главная » Java, Web, XML » Размещение Web-служб на J2EE-cepeepe

0

У Web-службы, работающей в составе J2EE-cepBepa, есть возможность использовать компоненты EJB. Реализовать эту возможность можно самыми разными способами. Можно отвести компонентам EJВ роль только вспомогательных классов, разгружающих сервлеты и страницы JSP. Схема такой реализации показана на рис. 7.1.

Рис 7.1. Компоненты EJB в составе Web-службы

Другой способ использования компонентов EJB — реализовать ими саму Web-службу, отказавшись от сервлетов, как показано на рис. 7.2.

Между этими двумя крайними схемами лежит множество промежуточных решений, использующих компоненты EJB в качестве адресата Web-службы наряду с сервлетами и страницами JSP.

11 Зак. 748

Рис 7.2. Реализация Web-службы компонентами EJB

Реализуя Web-службу на 12ЕЕ-сервере по той или иной схеме, следует помнить о возможности ее переноса на другой сервер. Ценность созданной вами Web-службы резко возрастет, если она, будучи упакована в EAR-архив, установится на любом J2EE-cepBepe без всяких изменений. Кроме того, следует обеспечить одинаковый доступ клиентам, независимый от способа реализации Web-службы на J2EE-cepBepe.

Для того чтобы обеспечить выполнение этих двух условий, группой ведущих компаний под патронажем фирмы IBM разработана спецификация "Web Services for J2EE". Она доступна по адресу http://www- 106.ibm.com/developerworks/webservices/. Мы будем называть ее сокращенно спецификацией "WS4EE".

Спецификация WS4EE предлагает свою обобщенную схему реализации Web-службы на J2EE-cepeepe, основанную на средствах пакета JAX-RPC. Эта схема показана на рис. 7.3. По этой схеме Web-служба помещается в контейнер, которым может служить Web- или EJB-контейнер. Контейнер создает и регистрирует в системе именования JNDI объект, реализующий интерфейс service из пакета JAX-RPC. Этот объект содержит адрес Web- службы и служит фабрикой классов, реализующих                                                  Web-

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

Такая схема дает одинаковый доступ к Web-службам, построенным самыми разными сочетаниями сервлетов, страниц JSP и компонентов EJB.

Саму Web-службу, называемую в спецификации WS4EE портом (port), предлагается реализовать либо классом-служителем (tie) системы JAX- RPC, следовательно, с помощью сервлета JAXRPCServlet, либо session- компонентом без сохранения состояния. В первом случае Web-служба будет работать под управлением Web-контейнера, во втором — под управлением EJB-контейнера.

Рис. 7.3. Схема, предлагаемая спецификацией "WS for J2EE"

Название "порт" идет от описания WSDL (см. главу 4). Порт включает в себя и SEI-интерфейс, соответствующий WSDL-элементу <wsdi:portType>, и класс-служитель, чьи методы описаны элементом                               и вспо

могательные классы.

У каждого порта есть свой адрес URI, но два порта с разными адресами могут разделять одни и те же классы Web-службы. Адрес порта хранится в объекте-фабрике типа service, который прямо соответствует элементу <wsdl:service>. Такое соответствие не случайно. Спецификация WS4EE исходит из описания WSDL и строит Web-службу как воплощение такого описания.

Реализация порта

Поскольку описание WSDL ничего не говорит о способах реализации порта, спецификация WS4EE предлагает для этого две модели.

?         Модель системы JAX-RPC, описанная в главе 6. Она основана на SEI- интерфейсах, классах-служителях и сервлетах и работает в Web- контейнере.

?         Модель компонентов EJB, основанная на session-компонентах без сохранения состояния, предоставляющих WSEI-интерфейс. Она работает в EJB-контейнере.

Спецификация WS4EE ничего не говорит о других моделях, например, модели, основанной на службе сообщений, системе JAXM и MDB- компонентах. Однако она не ограничивает реализацию Web-службы указанными в ней двумя моделями. Разработчик может выбрать и другую модель.

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

?         Первый компонент — это интерфейс, предоставляемый клиенту, который спецификация называет SEI-интерфейсом так же как в системе JAX-

RPC. Этот интерфейс реализует WSDL-описания порта, сделанные элементами <wsdl:portType> И <wsdl:binding>.

?         Второй компонент — это класс, воплощающий методы SEI-интерфейса. Его адрес указан элементом <wsdl:port> WSDL-описания. Он может быть классом-служителем системы JAX-RPC, session-компонентом или каким-то другим классом. Спецификация WS4EE называет этот класс "Service Implementation Bean". Мы будем называть его порт-компонентом. Этот класс обязан реализовать все методы SEI-интерфейса, хотя не обязан реализовать сам SEI-интерфейс.

У каждого порта есть свой адрес URI, указанный в элементе <wsdl:port>. Несколько портов с разными адресами могут разделять один порт- компонент, но они считаются разными портами Web-службы.

Поскольку WSDL-файла недостаточно для точного описания реализации порта, а конфигурационные файлы Web-приложения web.xml и EJB- приложения                описывают только отдельные сервлеты и отдельные

компоненты EJB, необходим дополнительный конфигурационный файл порта. Спецификация WS4EE предлагает написать целых три конфигурационных файла.

?           Первый файл с именем webservices.xml описывает Web-службу.

?         Второй файл с именем webservicesclient.xml содержит ссылки на другие Web-службы. Он предназначен клиенту Web-службы.

?         Третий файл, имя которого не фиксировано, описывает соответствие типов Java и WSDL по правилам системы JAX-RPC. Будем называть его условно JAX-RPC-файлом.

Рассмотрим подробнее каждый из трех конфигурационных файлов.

Конфигурационный файл Web-службы

Для каждого Web- или EJB-контейнера записывается один конфигурационный файл, описывающий все Web-службы, установленные в этом контейнере. Это XML-файл webservices.xml с корневым элементом <webservices>. В Web-контейнере этот файл хранится вместе с файлом web.xml в каталоге WEB-INF, в EJB-контейнере — вместе с файлом ear-jar.xml в каталоге МЕТА-INF.

В корневой элемент <webservices> вкладывается один или несколько элементов <webservice-description>, описывающих каждую Web-службу. При описании в элементе                                                      обязательно задается

имя Web-службы, применяемое внутри описания, в элементе <wsdi-file> — записывается полный путь к WSDL-файлу, начинающийся от корневого

каталога Web- или EJB-модуля. Элементом <jaxrpc-mapping-file> указывается полный путь к JAX-RPC-файлу.

Один или несколько элементов <port-component>, вложенных в элемент

описывают каждый порт-компонент Web- службы. При описании порт-компоненту дается имя в элементе <port- component-name>. Оно не связано с именем порта в WSDL-файле, и должно быть уникально в пределах модуля. В элементе <wsdl-port> двумя вложенными элементами        и                                                      записывается префикс и имя (QName) XML-элемента, описывающего порт в WSDL-файле. Элемент <service-endpoint-interface> показывает полное имя SEI-интерфейса, а элемент — полное имя порт-компонента.

Имя порт-компонента указывается в одном из двух элементов, вложенных в элемент       И мя сервлета записывается во вложенном

элементе <servlet-link>. Оно должно соответствовать имени, записанном в элементе <servlet-ciass> файла web.xrnl. Имя session-компонента записывается во вложенном элементе <ejb-link> и должно соответствовать логическому имени компонента, записанному в элементе         файла ear-jar.xml.

Кроме этого, в необязательных элементах                     следует описать клас

сы-обработчики системы JAX-RPC, если они есть в составе Web-службы, указав при этом их логическое имя, полное имя класса, начальные параметры и блоки заголовка SOAP-послания, которые они обрабатывают.

В листинге 7.8 приведена полная схема файла webservices.xml. Значки в квадратных скобках не входят в файл, они, как и в предыдущих главах, отмечают обязательность и повторяемость элемента. Атрибут id во всех элементах необязателен, он применяется для ссылки на элемент из другого файла.

]Листинг7.8. Структура конфигурационного файла:Web-службы

<webservices id="">

<description id=""> [?] <display-name id=""> [?] <small-icon id=""> [?]

<large-icon id=""> [?]

<webservlce-description> [+]

description id=""> [?]

<display-name id==""> [?] <small-icon id=""> [?] <large-icon icl=""> [?]

<webservice-description-name id=""> <wsdl-file id="">

<jaxrpc-mapping-file id="">

<port-component id=""> [+]

<clescription id=""> [?] <clisplay-nams id=""> [?] <srnll-icon icl=" "> [?] <large-icon id=""> [?]

<port-component-name id="">

<wsdl-port id="">

<namsspaceURI icl=""> <localpart ic=""> </wsdl-port>

<service-endpoint-interface id="">

<service-inpl-bean id="">

<ejb-iink ic=""> | <servlet-link id=""> </service-impl-bean>

<handler icl="">*

<clescription id=""> [?] <display-name id=""> [?] <srnll-icon ic=""> [?] <large-icon ic=""> [?]

<handler-name icl=""> <hancller-class icl="">

<init-param icl=""> [*]

<param-name id-""> <param-value id-""> <descr.iption id-" "> [?] </init-param>

<soap-header id-""> [*]

<namespaceURI id—"">

<lGcalpart id-""> </soap>-beader>

<soap-role id=""> [*]

</handler>

</port-component>

</webservice-description>

</webservices>

В листинге 7.9 приведен конфигурационный файл Web-службы "HelloService", построенной в листингах 7.3, 7.4, 7.7.

* Листинг 7.9. Конфигурационный файл Web-службы "HelloService"

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

<!DOCTYPE webservices public

"-//IBM CGrporation, Inc.//DTD J2EE Web services 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_l_0.dtd">

<webservices>

<webservice-descriptiGn>

<webservice-descriptiGn-nane>

HelloService </webservice-description-name>

<wsdl-file>META-INF/hello.wsdl</wsdl-file> <jaxrpc-mapping-file>

META-INF/HelloMapping.xml </j axrpc-mapping-file>

<port-component>

<port-component-name>

Hello Po rtComponent </port-component-name>

<wsdl-port>

<namespaceURI></namespaceURI> <localpart>HelloPortComponent</localpart>

</wsdl-port>

<service-endpoint- interface> hello.HelloPort

</service-endpoint-interface>

<service-impl-tean>

<ejb-link>HelloEnB</ejb-link> </service-impl-fcean>

</port-component>

</webservice-description>

</webservices>

Конфигурационный файл клиента

Второй конфигурационный файл с именем webservicesclient.xml — это XML- файл с корневым элементом <webservicesclient>. В него заносятся ссылки на другие Web-службы, чьими услугами пользуется данная Web-служба. В этой ситуации данная Web-служба является клиентом тех Web-служб, на которые делается ссылка. Отсюда происходит название файла и корневого элемента.

Каждая ссылка описывается внутри элемента <service-ref>. Если данная ссылка    находиться в области действия компонента, описанного в

файле ear-jar.xml или в файле web.xml, то элемент <service-ref> помещается внутрь элемента       в котором элементом

отмечается имя компонента.

Все остальные элементы вложены в элемент <service-ref>.

В элементе <service-ref-name> дается имя ссылке. Это имя используется клиентом при поиске Web-службы методом lookup () в системе именования JNDI. Рекомендуется начинать имя со строки "service/".

В элементе <service-interface> указывается полное имя фабрики классов, обычно это интерфейс j avax. xml. rpc. Service или его расширение.

Остальные элементы, вложенные в элемент <service-ref>, необязательны.

Элементы                    и                                         указывают расположение

WSDL-файла и JAX-RPC-файла в модуле.

Элемент <service-qname> содержит расширенное имя (QName) XML- элемента WSDL-файла, описывающего Web-службу. Он записывается только в том случае, когда в файле есть элемент <wsdl-file>, а соответствующий WSDL-файл содержит несколько элементов <wsdi: service>.

Элемент                                     связывает полное имя                                  с

именем                               определенным в элементе

name> файла                          Эта связка используется затем контейнером

при обращении клиента к методу getPort о для получения заглушки.

Наконец, элементы <handier> описывают классы-обработчики SOAP- послания. Порт, к которому приписан обработчик, указывается вложенным элементом <port-name>. Если порт не указан, то обработчик приписывается ко всем портам.

В листинге 7.10 приведена полная схема конфигурационного файла webservicesclient.xml.

i ЛистингТ.Ю,, Структура конфигурационного файла клиента                            ;

<webservicesclient id-"">

<component-scoped-refs id=""> [+] I <service-ref id=""> [+]

<cGnpGnent-nane id-"">

<service-ref id-""> [+]

<descriptiGn id-""> [?] <display-name id-""> [?]

<small-icon id=""> [?] clarge-icon id=""> [?]

<service-ref-name id=""> <service-interface icl=""> <wsdl-file icl="">? <jaxrpc-napping-file icl=""> [?]

cservice-qnams id=""> [?]

<namespaceURI icl="">

<localpart id=""> </service-qname>

<port-component-ref id=""> [*]

<service-endpoint-interface ic=""> <port-component-link id=""> [?] </port-component-ref>

<hancller id=""> [*]

<description id=""> [?] <display-name icl=""> [?] <small-icon id=""> [?]

<large-icon ic=""> [?]

<handler-name icl=""> chandler-class icl="">

<init-param ic=""> [*] <param-name ic=""> <param-value ic=""> <clescription ic=""> [?] </init-param>

<soap-heacler icl=""> [*] <naraespaceURI id=""> <localpart ic^=""> </soap-header>

<soap-role id=""> [*] <port-name id=""> [*]

</handler>

</service-ref>

</component-scoped-re fs >

</webservicesclient>

В листинге 7.11 приведен пример простого конфигурационного файла клиента Web-службы "HelloService", описанной в конфигурационном файле листинга 7.9.

‘ Листинг 7.11. Конфигурационный файл клиента Web-службы "HelloService"

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

c’DOCTYPE webservicesclient PUBLIC

"-//IBM Corporation, Inc.//DTD J2EE Web services client 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_client_l_0.dtd">

<webservicesclient>

<service-ref>

<service-ref-name>service/HelloService</service-ref-name> <service-interface>j avax.xml.rpc.Service</service-interface> <wsdl-file>META-INF/hello.wsdl</wsdl-file>

<jaxrpc-mapping-file>

META-INF/He1loMapping. xml

</jaxrpc-mapping-file>

<port-component-ref>

<service-endpoint-interface> hello.HelloPort

</service-endpoint-interface>

<port-component-link> HelloPortComponent

</port-component-link>

</port-component-ref>

</service-ref> </webservicesclient>

Литература:

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

По теме:

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