- •Введение
- •1 Тема 1. Предметная область и терминология РСОС
- •1.1 Этапы развития распределенных систем
- •1.1.1 Классификация систем обработки данных
- •1.1.2 Распределенные вычислительные сети
- •1.1.3 Объектные распределенные системы
- •1.2 Становление систем с сервис-ориентированной архитектурой
- •1.2.1 Развитие web-технологий
- •1.2.2 Развитие концепции SOA
- •1.3 Современные парадигмы сервис-ориентированных архитектур
- •1.3.1 Эталонная модель SOA
- •1.3.2 Модель Захмана
- •1.3.3 Концепция среды открытой системы
- •1.3.4 Бизнес-парадигма модели SOA
- •1.4 Программная платформа Java Enterprise Edition
- •1.4.1 Контейнеры и компоненты Java EE
- •1.4.2 Служебные сервисы контейнеров
- •1.4.3 Артефакты контейнеров
- •1.4.4 Аннотации и дескрипторы развертывания
- •1.4.5 Управляемые компоненты платформы Java EE
- •1.5 Инструментальные средства реализации РСОС
- •1.5.1 Сервера приложений
- •1.5.2 Микросервисы
- •1.5.3 Apache Maven — сетевая сборка приложений
- •1.5.4 Eclipse Enterprise Edition
- •1.5.5 Тестовый пример
- •1.6 Заключение по первой главе
- •1.6.1 Итоги теоретических построений первой главы
- •1.6.2 Тематический план последующих глав
- •Вопросы для самопроверки
- •2 Тема 2. Использование компоненты JSF контейнера Web
- •2.1.1 Языки HTML, JavaScript и протокол HTTP
- •2.1.2 Серверные технологии PHP и HttpServlet
- •2.1.3 Технология AJAX и компонента JavaServer Faces
- •2.2 Шаблон проектирования MVC
- •2.2.1 Контроллер FacesServlet и жизненный цикл запроса
- •2.2.2 Контекст состояния запроса FacesContext
- •2.2.3 Модель в виде компонентов-подложек
- •2.2.4 Представление (View) средствами Facelets
- •2.2.5 JSF OmniFaces
- •2.3 Реализация тестового примера средствами JSF
- •2.3.1 Создание Facelets-шаблона изучаемой дисциплины
- •2.3.2 Прямая реализация тестового примера
- •2.4 Реализация уровня интерфейса сервисов
- •2.4.2 Компонента Users с ЖЦ @ApplicationScoped
- •2.4.3 Компонента RSOS с ЖЦ @SessionScoped
- •2.4.4 Компоненты-подложки с ЖЦ @RequestScoped
- •2.4.5 Приложение авторизации пользователя
- •2.4.6 Компонента подзаголовка проекта
- •2.4.7 Компонента меню лабораторных работ
- •2.4.8 Второй вариант меню лабораторных работ
- •Вопросы для самопроверки
- •3 Тема 3. Современные способы доступа к данным
- •3.1 Учебная инфраструктура темы
- •3.1.1 Учебная задача Letters (Письма)
- •3.1.2 Корпоратиные EJB-компоненты
- •3.1.3 Тестовый HttpServlet проекта lab4
- •3.1.4 Инфраструктура сервера TomEE и СУБД Derby
- •3.2 Технология JPA
- •3.2.1 Сущности
- •3.2.2 Объектно-реляционное отображение
- •3.2.3 Манеджер сущностей
- •3.2.4 Пример использования не-JTA-типа транзакций
- •3.3 Транзакции управляемые контейнером
- •3.3.1 Объектно-ориентированные запросы Criteria API
- •3.3.2 Реализация EJB-компонента с JTA-типом транзакций
- •3.3.3 Реализация JPA-сервлета
- •Вопросы для самопроверки
- •4 Тема 4. Обработка документов XML и JSON
- •4.1 Технология JAXB
- •4.1.1 Программное обеспечение технологии JAXB
- •4.1.2 Аннотации для связывания объектов Java
- •4.1.3 Преобразование объекта Java в документ XML
- •4.2 Технология JSON
- •4.2.1 Программное обеспечение технологии JSON
- •4.2.2 Преобразование объекта Java в документ JSON
- •4.2.3 Пример представления JSON на уровне классов
- •4.2.4 Выводы по результатам изучения главы 4
- •Вопросы для самопроверки
- •5 Тема 5. Web-службы SOAP
- •5.1.1 Протоколы и языки Web-служб
- •5.1.2 Краткое описание языка WSDL
- •5.1.3 Краткое описание протокола SOAP
- •5.1.4 Необязательный реестр Web-служб — UDDI
- •5.1.5 Программные пакеты Java EE, обслуживающие SOAP
- •5.2 Создание Web-служб SOAP
- •5.2.1 Подготовка проекта lab7
- •5.2.2 Аннотации поставщика Web-сервиса
- •5.2.3 Обработка исключений поставщика Web-сервиса
- •5.2.4 Обработка контекста Web-сервиса
- •5.3 Создание потребителя Web-службы SOAP
- •5.3.1 Аннотации для потребителей сервиса
- •5.3.2 Использование утилиты wsimport
- •5.3.3 Реализация тестового примера
- •5.3.4 Выводы по результатам изучения главы 5
- •Вопросы для самопроверки
- •6 Тема 6. Web-службы в стиле REST
- •6.1 Основные положения технологии RESTful
- •6.1.1 Ресурсы, URI, представления и адресуемость
- •6.1.2 Протокол HTTP
- •6.1.3 Языки WADL и HAL
- •6.1.4 Технология JAX-RS
- •6.2 Реализация Web-службы в стиле REST
- •6.2.1 Преобразование сущности Letter
- •6.2.2 Реализация EJB-компоненты Lets9
- •6.2.3 Получение списка записей в формате XML
- •6.2.4 Получение записи по номеру индентификатора
- •6.2.5 Добавление новой записи
- •6.3 Вызов Web-служб в стиле REST
- •6.3.1 Инструментальные средства потребителя сервиса
- •6.3.2 Полная реализация RESTfull-сервиса
- •6.3.3 Шаблон реализации потребителя сервиса
- •6.3.4 Клиент, реализующий методы GET и POST
- •6.3.6 Клиент, реализующий методы DELETE и PUT
- •Вопросы для самопроверки
- •Заключение
- •Список использованных источников
- •Алфавитный указатель
5.2 Создание Web-служб SOAP
Web-службы SOAP создаются и обеспечиваются провайдерами сервисов, в общем случае, независимо от потребителей сервисов.
В качестве демонстрационного примера выберем EJB-приложение, которое было реализовано в главе 3 данного пособия, когда изучаласть технология JPA. Напомню, что данное приложение демонстрировало работу с базой данных lab4db, где информация храниться, а также обрабатывается в таблице t_letter (см. сценарий создания базы данных lab4db на рисунке 3.5, стр. 149) с помощью двух классов:
а) класс Letter — класс сущности, выполняющий ORM-отображение переменных объектов класса Letter в поля таблицы t_letter;
б) класс Lets2 — полная реализация EJB-приложения, обеспечивающего выполнение операций чтения списка всех хранящихся в базе данных объектов класса Letter, а также выполнение стандартных операций изменения данных таблицы t_lerrer: добавление, удаление, модификацию и извлечение отдельных объектов.
Чтобы не создавать путаницы с предыдущими и последующими примерами, демонстрация создания Web-службы SOAP проводится в отдельном проекте с именем lab7 и описание процесса реализации этой Web-службы разделено на четыре части по пунктам:
1)пункт 5.2.1 — подготовка проекта lab7, куда переносятся уже готовые части программного обеспечения из проекта lab4;
2)пункт 5.2.2 — описываются общие аннотации, используемые поставщиками сервиса и одновременно реализуется сам пример Web-службы;
3)пункт 5.2.3 — приводится информация по обработке исключений, возникающих в программном обеспечении Web-службы;
4)пункт 5.2.4 — приводится информация по обработке контекста, реализованной Web-службы.
5.2.1 Подготовка проекта lab7
Подготовку проекта проведем в виде прямой последовательности шагов, претендующих на начальный шаблон реализации всех масштабных проектов.
Шаг 1. Создание проекта типа Dynamic Web Project с именем lab7 и подключение к нему сервера приложений Apache TomEE.
Создание проекта проводится стандартными средствами инструментальной среды Eclipse EE, с указанием того, что система должна сформировать
210
дескриптор развертывания web.xml. Новый проект и новое имя проекта нужно для того чтобы разделить уже созданный софт и максимально исключить все зависимости и ньюансы уже созданных приложений.
Шаг 2. В созаданном проекте открываем класс с именем Letter и именем пакета rsos.lab7.
Напомню, что класс Letter представляет полностью функционирующую сущность для работы с таблицей t_letter базы данных lab4db, поэтому будем использовать ее как основу для создания будущего Web-сервиса, а поскольку этот класс уже реализован в проекте lab4, то копируем из него в новый проект lab7 следующие файлы:
1)Letter.java — правим в нем имя пакета на rsos.lab7;
2)derbyclient.jar — драйвер для работы с СУБД Apache Derby;
3)resources.xml — десриптор ресурсов для соединения с СУБД Apache Derby;
4)pesistence.xml — дескриптор описания юнитов технологи JPA для работы с СУБД Apache Derby.
В файле pesistence.xml правим ссылки на класс Letter, как это показано на листинге 5.3.
Листинг 5.3 — Исходный текст файла persistence.xml проекта lab7
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="lab4-unit1" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>lab4DerbyUnmanaged</non-jta-data-source> <class>rsos.lab7.Letter</class>
</persistence-unit>
<persistence-unit name="lab4-unit2" transaction-type="JTA">
<jta-data-source>lab4Derby</jta-data-source> <non-jta-data-source>lab4DerbyUnmanaged</non-jta-data-source>
<class>rsos.lab7.Letter</class>
</persistence-unit> </persistence>
После проведенных изменений, сущность в виде класса Letter полностью готова для использования ее любым EJB-компонентом программной платформы Java EE.
211
Шаг 3. Подготовка EJB-компонента перед реализацией Web-сервиса.
За основу функционала будущего Web-сервиса возьмем EJB-приложение Lets2, реализованное в проекте lab4 на основе описаний двух интерфейсов:
LocalLetter и RemoteLetter.
Чтобы не порождать конфликтов между активными проектами, которые могут возникнуть при работе с классами и интерфейсами, имеющими одинаковые имена, создадим в проекте lab7:
1)интерфейс RemoteLets, описывающий все методы EJB-приложения и показанный на листинге 5.4;
2)класс Lets7, реализующий методы интерфейса RemoteLets, как EJBкомпонент без сохранения состояния, и показанный на листинге 5.5.
Листинг 5.4 — Исходный текст интерфейса RemoteLets.java проекта lab7
package rsos.lab7;
import java.util.List; import javax.ejb.Remote;
@Remote
public interface RemoteLets
{
//Получить список писем List<Letter> getList();
//Получить письмо по идентификатору Letter getLetter(int id);
//Добавить письмо
void addLetter(Letter letter);
//Удалить письмо по идентификатору void deleteLetter(int id);
//Модифицировать письмо
void modLetter(Letter letter);
}
Листинг 5.5 — Исходный текст EJB-компоненты Lets7.java проекта lab7
package rsos.lab7; import java.util.List;
import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.jws.WebService;
import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root;
212
@Stateless
@LocalBean
public class Lets7 implements RemoteLets
{
@PersistenceContext(name = "lab4-unit2") private EntityManager em;
// Получение списка записей таблицы t_letter public List<Letter> getList()
{
//System.out.println("Lets7:getList()...");
//Этап 1. Создаем объект builder CriteriaBuilder builder =
em.getCriteriaBuilder();
//Этап 2. Создаем объект criteria CriteriaQuery<Letter> criteria =
builder.createQuery(Letter.class);
//Этап 3. Создаем объект root
Root<Letter> root = criteria.from(Letter.class);
//Этап 4. Преобразовываем объект criteria,
//включая использование объекта root criteria.select(root);
//Этап 5. Добавляем сортировку
criteria.orderBy(builder.desc(root.get("date")));
//Этап 6. Формируем запрос в виде объекта query TypedQuery<Letter> query = em.createQuery(criteria);
//Этап 7. Получаем результат List<Letter> list =
query.getResultList();
//Этап 8. Обрабатываем результат return list;
}
// Получение объекта по ключу public Letter getLetter(int id) {
Letter l =
em.find(Letter.class, new Integer(id));
return l;
}
//Добавить объект в базу данных public void addLetter(Letter letter) {
em.persist(letter);
}
//Удалить объект из базы данных по ключу public void deleteLetter(int id) {
Letter letter =
213