Создание простого веб-сервиса с использованием 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:В каталоге bin внутри базового каталога проекта находится только что созданный файл war. Используя инструмент сжатия/распаковки zip архива, такой как 7-zip, можно открыть данный файл-архив и изучить его внутреннюю структуру. Внутри есть два каталога, один называется "META-INF", который содержит файл "MANIFEST.MF"; другой называется WEB-INF, внутри него есть подкаталог с названием "classes" и файл с именем "web.xml". Greeting.class находится внутри подкаталога "tutorial/hanbo/webservices" в "classes".
[war] Building war: %project_base_directry%\bin\greeting.war
BUILD SUCCESSFUL
Total time: 1 second
Так как файл 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 для выполнения операций развертывания и сворачивания. Чтобы развернуть веб-сервис, используйте цель "развернуть". Чтобы свернуть веб-сервис, используйте цель "свернуть".