Создание простого веб-сервиса с использованием JBossWS - Создание простого веб-сервиса

ОГЛАВЛЕНИЕ


Создание простого веб-сервиса

Теперь все готово для создания простого веб-сервиса. Есть два способа создания веб-сервисов:

  • Нисходящий. JBossWS используется для создания классов-посредников из существующих файлов WSDL и связанных с ним файлов XSD. Затем реализуется интерфейс порта веб-сервиса.
  • Восходящий. Создается простой веб-сервис с помощью POJO. Затем классы упаковываются для развертывания.

В этом руководстве рассматривается восходящий подход, так как это простейший способ создания веб-сервиса. Исходный код можно найти в разделе загрузок. Шаги будут изложены в следующих подразделах.

Создание простого проекта Java

Данное руководство использует Eclipse IDE и Apache Ant для создания проекта-примера. Создание этого проекта-примера не отличается от создания простого проекта Java HelloWorld («привет мир»). Получив исходный код примера, вы сможете увидеть, что в базовом каталоге "webservice", есть две папки:

  • "bin": Эта папка используется для хранения скомпонованных выходных файлов.
  • "src": Эта папка содержит исходники. Файл исходного кода "Greeting.java" находится в подпапке tutorial/hanbo/webservice.

В базовом каталоге находится несколько текстовых файлов:

  • .classpath: Этот файл автоматически создан Eclipse.
  • .project: Этот файл автоматически создан Eclipse.
  • build.xml: Это файл компоновки Apache Ant.

Сначала посмотрим на файл исходного кода "Greeting.java". Весь исходный код выглядит так:

package tutorial.hanbo.webservice;

import javax.jws.WebService;
import javax.jws.WebMethod;

@WebService
public class Greeting
{
   @WebMethod
   public String greetClient(String userName)
   {
      return "Приветствие " + userName + "! Приятного дня!...";
   }
}


Это весь код Java, который нужно написать для создания простого веб-сервиса. Давайте подробно рассмотрим исходник:
1.    Первая строка объявляет пакет веб-сервиса.
2.    Две следующие строки кода импортируют требуемые классы. Они являются аннотациями, используемыми объявлением класса и объявлением метода.
3.    Объявите класс под названием "Приветствие"; он снабжен комментарием "веб-сервис", что означает, что класс "Приветствие" – это веб-сервис.
4.    Внутри класса "Приветствие" объявите открытый метод с названием "greetClient()". Он снабжен комментарием "веб-метод", что означает, что этот метод – сетевой метод, который может быть вызван дистанционно.

  • Метод "greetClient()" принимает параметр строкового типа под названием "username (имя пользователя)". Его тело создаст новый объект “строка/и”? и выполнит возврат.

Если ссылочные библиотеки не добавлены в этот проект, он не будет компилироваться в Eclipse. Поэтому посмотрите файл .classpath и найдите все нужные ссылочные библиотеки (т.е. файлы jar со ссылками). Эти библиотеки были частью пакета JBoss. Их можно найти в 3 разных папках:

•    C:\jboss-5.0.0.GA\client
•    C:\jboss-5.0.0.GA\lib
•    C:\jboss-5.0.0.GA\lib\endorsed

Добавьте все эти файлы jar в трех папках в проект-пример, после этого ошибки компиляции исчезнут. Но следующие два файла jar нужно удалить:

•    C:\jboss-5.0.0.GA\client\jaxws-rt.jar
•    C:\jboss-5.0.0.GA\client\jaxws-tools.jar

Их нужно удалить из проекта, чтобы избавиться от исключения. Это может быть странная ошибка в JBossWS. Когда я впервые работал над этим примером, столкнулся с исключением в то время, когда пытался развернуть готовый веб-сервис на сервере приложений JBoss. После перебора результатов поиска Google я нашел решение, согласно которому нужно удалить указанные два файла jar из пути классов проекта.

Дескриптор развертывания

Веб-сервис нужно развернуть, чтобы клиенты смогли иметь к нему доступ. В данном руководстве веб-сервис будет упакован как файл war и развернут как сервлет. Файл war содержит дескриптор развертывания, файл с именем "web.xml" задает преобразование URL.сервлет. Когда отправляется запрос к серверу приложений JBoss, JBoss направляет запрос к конкретному сервлету на основании преобразования URL/Servlet, заданного в файлах web.xml.
В базовом каталоге проекта вы найдете файл web.xml в подкаталоге src/resources (ресурсы). Содержимое этого файла выглядит так:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
 PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
 "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
  <servlet>
    <servlet-name>GreetingWebService</servlet-name>
    <servlet-class>tutorial.hanbo.webservice.Greeting</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>GreetingWebService</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

Содержимое данного файла дескриптора понять легко. Все содержимое поделено на две части:
•    Первая часть (от <servlet> до </servlet>) указывает, чем является сервлет. Он имеет имя "GreetingWebService" и преобразуется в класс Java "tutorial.hanbo.webservice.Greeting".
•    Вторая часть (от <servlet-mapping> до </servlet-mapping>) задает URL для преобразования сервлета. Если запрошенный URL указывает на веб-сервис, то запрос будет обработан веб-сервисом.

Следующий раздел описывает, как упаковать файл war.

Упаковка с помощью Apache Ant

Упаковка файла war может быть выполнена с помощью Apache Ant. В build.xml вы найдете несколько целей. Они используются для выполнения действий компоновки. Одна из целей называется "упаковка". Эта цель используется для создания файла war для развертывания, как показано ниже:

<target name="packaging" >
  <war destfile="bin/greeting.war" webxml="src/resources/web.xml">
    <classes dir="bin/classes"/>
  </war>
</target>

В этом разделе целей есть только одно действие для выполнения – компоновка файла war с использованием задачи с именем "war".

Эта задача принимает три параметра:
•    destfile: это первый атрибут тега XML "war", используемый для указания, какое имя имеет файл war и в какую папку он будет помещен.
•    webxml: это второй атрибут тега XML "war", используемый для указания, где находится файл web.xml, который будет упакован как часть файла war.
•    classes (классы): это субтег XML под тегом XML "war", используемый для указания файлов классов, которые будут включены в файл war.

Для запуска этой цели нужно использовать следующую команду в командной строке:

> ant packaging

Вывод команды выглядит так:

Buildfile: build.xml  packaging:
      [war] Building war: %project_base_directry%\bin\greeting.war

BUILD SUCCESSFUL
Total time: 1 second
В каталоге bin внутри базового каталога проекта находится только что созданный файл war. Используя инструмент сжатия/распаковки zip архива, такой как 7-zip, можно открыть данный файл-архив и изучить его внутреннюю структуру. Внутри есть два каталога, один называется "META-INF", который содержит файл "MANIFEST.MF"; другой называется WEB-INF, внутри него есть подкаталог с названием "classes" и файл с именем "web.xml". Greeting.class находится внутри подкаталога "tutorial/hanbo/webservices" в "classes".

Так как файл war был успешно скомпонован, пришло время его развернуть.

Развертывание и свертывание

Перед тем как пытаться развернуть файл war примера в сервере приложений JBoss, сначала нужно запустить сервер приложений JBoss. Так как JBoss используется только как средство тестирования простого веб-сервиса, в руководстве не рассматривается, как запустить JBoss в качестве сервиса. Вместо этого мы откроем еще одну командную строку, потом запустим сервер приложений JBoss в только что открытой командной строке.

Чтобы запустить сервер приложений JBoss, используйте только что открытую командную строку, чтобы перейти в "C:\jboss-5.0.0.GA\bin", затем запустите скрипт "run.bat". После того как сервер приложений JBoss запустится, придется подождать в течение некоторого времени, пока командная строка не покажет следующий вывод:

15:34:41,889 INFO  [ServerImpl] JBoss (Microcontainer)
[5.0.0.GA (build: SVNTag=JBoss_5_0_0_GA date=200812041714)] Started in 5m:3s:150ms

Вышеуказанный вывод означает, что сервер приложений JBoss был успешно запущен.

Чтобы выключить сервер приложений JBoss, запустите командную строку, выполняющую сервер приложений JBoss. Нажмите Ctrl+C, чтобы остановить выполнение, затем закройте командную строку.

Чтобы развернуть файл war, скопируйте файл war (greeting.war), затем вставьте его в "C:\jboss-5.0.0.GA\server\default\deploy". После выполнения этих действий вы заметите, что командная строка, в которой выполняется сервер приложений JBoss, выведет прогресс развертывания в следующем виде:

15:35:21,422 INFO  [DefaultEndpointRegistry] register: jboss.ws:context=greeting,endpoint=GreetingWebService
15:35:22,453 INFO  [TomcatDeployment] deploy, ctxPath=/greeting, vfsUrl=greeting.war
15:35:28,172 INFO  [WSDLFilePublisher] WSDL published to:
file:/C:/jboss-5.0.0.GA/server/default/data/wsdl/greeting.war/GreetingService4604908665079984702.wsdl

Вышеуказанный вывод показывает, что процесс развертывания прошел успешно.

Следующий шаг – протестировать развертывание. Откройте окно браузера, перейдите по адресу "http://localhost:8080/jbossws/services". После того как страница загрузится, вы сможете увидеть раздел "Конечные точки зарегистрированного сервиса", перечисляющий подробную информацию о развертывании веб-сервиса "GreetingWebService". Можно провести еще один тест – просмотреть файл WSDL, созданный динамически JBossWS. Для данного руководства ссылка на созданный WSDL - "http://127.0.0.1:8080/greeting?wsdl". Его можно просмотреть в том же самом окне браузера.

Свернуть веб-сервис можно путем удаления файла war (greeting.war) в "C:\jboss-5.0.0.GA\server\default\deploy". Как только вы сделаете это, командная строка покажет прогресс сворачивания:

16:51:12,229 INFO  [TomcatDeployment] undeploy, ctxPath=/greeting, vfsUrl=greeting.war
16:51:13,307 INFO  [DefaultEndpointRegistry] remove: jboss.ws:context=greeting,endpoint=GreetingWebService

Вышеуказанный вывод показывает, что процесс сворачивания прошел успешно.

В build.xml указаны две цели для развертывания или сворачивания веб-сервиса. Они используют задачи копирования файла и удаления файла Apache Ant для выполнения операций развертывания и сворачивания. Чтобы развернуть веб-сервис, используйте цель "развернуть". Чтобы свернуть веб-сервис, используйте цель "свернуть".