Web service jax-ws

У цьому пості розглянемо приклад створення веб сервісу специфікації JAX-WS.
Почну з того, що взагалі означає це словосполучення «специфікація JAX-WS». Взагалі це означає, що є якийсь стандарт званий JAX-WS або якщо повністю Java API for XML Web Services який задає якісь правила або контракт, якого треба дотримуватися при його реалізації. Так ось в цій статті ми не будемо його реалізовувати, в сенсі контракт, ми будемо цим контрактом користуватися. А точніше, ми будемо користуватися конкретною реалізацією специфікації JAX-WS. У світі є кілька реалізацій специфікації JAX-WS, ну наприклад Apache Axis2.
Тобто головне що потрібно зрозуміти, що JAX-WS це не бібліотека, що не фреймворк, не додаток, це скоріше така дока, де описані специфікації, які повинні бути реалізовані конкретним фреймворком. У цьому прикладі ми створимо наш веб сервіс абстрагуючись від конкретних фреймворків, тобто будемо покладатися тільки на специфікації. Що це означає? Це означає, що згідно специфікації JAX-WS. щоб інтерфейс призначити веб сервісом, потрібно застосувати до нього анотацію @WebService не замислюючись про те, звідки ця анотація береться. Ми просто знаємо, що анотація @WebService зобов'язана бути, згідно специфікації JAX-WS. А ось потім, коли справа дійде до деплоінга на сервер, тоді ми повинні будемо визначитися з реалізацією специфікації. У нашому випадку, що для glassfish. що для tomcat буде використовуватися реалізація JAX-WS RI. тільки з гласфішом вона вже йде з під коробки, а ось для tomcat нам доведеться докинути реалізацію JAX-WS RI в ручну, джарнікі якої ми завантажимо з оф. сайту jax-ws.java.net і покладемо їх у каталог lib сервлету, який ми будемо деплоіть в контейнер сервлетів tomcat.

Що таке Web Service

Сервісна частина. структура проекту

Напишемо веб сервіс який буде обчислювати площу геометричних фігур, таких як коло або прямокутник. На стороні клієнта буде визначатися, площа якої фігури ми хочемо отримати і потім дані про геометричної фігури будуть передаватися на веб сервіс, а веб сервіс після обробки даних поверне площа фігури.
Додаток веб сервісу буде складатися з шести джава-класів, які будуть в себе включати інтерфейс Figure.java. суті Circle.java і Rectangle.java. фактори геометричних фігур FigureFactory.java. сам веб сервіс PrintFigureService.java і його імпліментації PrintFigureImpl.java:

структура проекту

У першій структурі здається, що джава класи поміщені в дефолтовий пакет, насправді в кожному з них є ключове слово package вказує прінадлженостей кожного класу до свого пакету, тому після компіляції класи будуть розкладені по потрібним каталогами-пакетам.
У Linux (принаймні в Ubuntu / Mint) так робити можна, на сімці немає, тому будьте обережні.


Крім джава класів ще буде два конфігураційних xml файлу, це web.xml для контейнера сервлетів та sun-jaxws.xml де буде інформація про енд поинтах.
Після складання проекту в корені проекту з'явиться каталог build з war-архівом готовим для деплоя на епплікейшн сервер:

Додамо в каталог src java код.

Figure.java

Circle.java

Конфігурація веб сервісу

Додайте два xml файлу в каталог WEB-INF проекту.

sun-jaxws.xml

Компіляція веб сервісу

Традиційно компілювати будемо shell скриптом.

Чому я не користуюся більш зручними інструментами, такими як maven або ant. Щоб зрозуміти все фази збірки проекту, які збирачі приховують, треба все зробити самому руками, а потім можна переходити на збирачі. Тобто в бою можна і потрібно користуватися збирачами, а ось під час навчання треба пройти через всі етапи складання проекту самому.


Додайте в корінь проекту build.sh файл, і додайте в файл такий скрипт:

Після того, як shell скрипт доданий, робимо його виконуваним, командою:

Після цього в корені проекту з'явиться каталог build в якому буде лежати war-архів print-figure-service.war.
Повністю весь проект серверної частини можна скачати за посиланням:

Деплой веб сервісу на glassfish

Деплой веб сервісу на tomcat

Якщо ми деплоім на епплікейшн сервер glassfish то щоб сервіс заробив, крім як власне деплоя, більше нічого робити не треба. А ось щоб сервіс заробив в контейнері сервлетів tomcat (це трошки не те ж саме, що епплікейшн сервер), то потрібно ще докинути деякі бібліотеки, які з томкатом за замовчуванням не йдуть. Це бібліотеки однією з реалізацій веб сервісу JAX-WS. Для цього зробіть ось що:

  1. Перейдіть на сайт jax-ws.java.net
  2. Скачайте бібліотеки JAX-WS RI на свій локальний жорсткий диск (або на свій локальний SSD)
  3. розпакуйте архів
  4. Закиньте вміст каталогу lib. який знайдете в каталозі jaxws-ri або в каталог lib самого Томкет, або в каталог WEB-INF / lib проекту.

Повністю серверну частину придатну для Томкет можна скачати за посиланням:

Тест веб сервісу

Клієнтська частина. структура проекту

Після того як сервіс створений і задеплоін, приступимо до клієнтської частини. Клієнт у нас буде складатися з одного класу, який буде запитувати площа фігури за переданими параметрами.
Структура проекту для клієнта на перший погляд виглядає просто:

Але після запуску скрипта build.sh в структурі каталогів з'явиться крім каталогу build ще каталог webservice:

Що ж це за каталог і що в ньому? Справа в тому, що коли скрипт запускається в ньому виконується команда запуску утиліти wsimport:

За допомогою утиліти wsimport в проект завантажуються класи які дають можливість клієнту взаємодіяти з веб сервісом, так як сам клієнт взаємодіяти з веб сервісом не вміє. У цих класах визначена логіка, яка дозволяє коннектіться до сервісу, викликати віддалені методи, передавати параметри, отримувати відповідь і так далі.

Client.java

Компіляція і запуск клієнта

Додайте в корінь проекту клієнта файл build.sh:

Повністю весь проект клієнтської частини можна скачати за посиланням: