
- •Введение
- •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
- •Вопросы для самопроверки
- •Заключение
- •Список использованных источников
- •Алфавитный указатель

Таблица 2.1 — (продолжение)
Метод |
Описание метода |
release |
Высвобождает любые ресурсы, связанные с объектом типа |
|
FacesContext. |
renderResponse |
Сигнализирует реализации JSF о том, что текущая фаза |
|
обрабатывающего запросы жизненного цикла была закончена, |
|
управление должно быть передано фазе «Отрисовать ответ», |
|
минуя любые фазы, которые еще не были выполнены. |
responseComplete |
Сигнализирует реализации JSF о том, что HTTP-ответ для этого |
|
запроса уже был сгенерирован, например, переадресация НТТР, а |
|
также о том, что жизненный цикл обработки запросов должен |
|
прекратить свою работу, как только завершится текущая фаза. |
2.2.3 Модель в виде компонентов-подложек
Компонент-подложка — это объект аннотированного, в соотвествии с требованиями CDI, JavaBeans-класса (POJO-класса), реализующий бизнес-модель запроса.
Прежде всего заметим, что термин компонент в данной главе и далее понимается в различных семантических значениях:
а) термин компонет JSF — обозначение программного модуля, понимаемого в масштабе платформы Java EE (см. подраздел 1.4 первой главы), или как конкретная прикладная библиотека (см. далее пункт 2.2.5);
б) термин компонет-подложка — обозначает отдельный JAVA-класс, где обозначение POJO — «Plain Old Java Object» или «Простой Java-объект в старом стиле»;
в) термин компонет Facelets (см. рисунок 2.11 и пункт 2.2.4) — обозначает XHTML-файл с тегами специального формата.
Каждый компонент-подложка имеет свою область действия.
Область действия — это время жизненного цикла объекта в масштабе функционирования приложения, использующего JSF.
Жизненый цикл компонентов подложек, в общем случае, не совпадает с жизненным циклом запросов, которые они обслуживают.
В таблице 2.2 представлены наиболее значимые области действия компо- нентов-подложек и соотвествующие ис аннотации.
72

Таблица 2.2 — Области действия компонентов-подложек [17]
Область действия/ |
Описание |
Аннотация |
|
Приложение |
Наименее ограничительный вариант с самой большой |
@ApplicationScoped |
продолжительностью жизни. Созданные объекты доступны во всех |
|
циклах запросов/ответов для всех клиентов, использующих веб- |
|
приложение, до тех пор, пока приложение активно. Эти объекты |
|
можно вызывать одновременно из нескольких источников, они |
|
должны быть потокобезопасными. Объекты с такой областью |
|
действия могут использовать другие объекты либо без области |
|
действия, либо с такой же областью действия. |
Сессия |
Объекты доступны для любых циклов запросов/ответов, которые |
@SessionScoped |
принадлежат сессии клиента. Эти объекты имеют состояние, |
|
которое сохраняется между запросами и хранится до тех пор, пока |
|
сессия не будет завершена. Объекты с такой областью действия |
|
могут использовать и другие объекты либо без области действия, |
|
либо с такой же областью действия, либо с областью действия на |
|
уровне приложения. |
Представление |
Объекты доступны в пределах заданного представления, пока оно |
@ViewScoped |
не изменится, и их состояние сохраняется до тех пор, пока |
|
пользователь не перейдет к новому представлению (в этот момент |
|
состояние стирается). Объекты с такой областью действия могут |
|
использовать и другие объекты либо без области действия, либо с |
|
такой же областью действия, либо с областью действия на уровне |
|
приложения или сеанса. |
Запрос |
Объект доступен в начале запроса и до тех пор, пока клиенту не был |
@RequestScoped |
отправлен ответ. Клиент может выполнять несколько запросов, но |
|
остаться на одном и том же представлении. Поэтому |
|
продолжительность @ViewScoped больше, чем @RequestScoped. |
|
Объекты с такой областью действия могут использовать и другие |
|
объекты либо без области действия, либо с такой же областью |
|
действия, либо с областью действия на уровне приложения или |
|
сеанса. |
Поток |
Объекты в этой области действия создаются, когда пользователь |
@FlowScoped |
входит в указанный поток, и освобождаются, когда он выходит из |
|
потока. |
Чтобы быть управляемым компонентом CDI, компонент-подложка должен иметь аннотацию @Named.
Жизненный цикл компонента-подложки можно контролировать с помощью аннотаций
@PostConstruct и @PreDestroy.
73

На рисунке 2.15 показана схема жизненного цикла любого компонентаподложки, который может быть аннотирован следующим образом:
а) если перед методом компонента поставить аннотацию @PostContruct, то метод будет вызван, когда объект компонента будет создан и готов к использованию;
б) если перед методом компонента поставить аннотацию @PreDestroy, то метод будет вызван, перед тем как объект компонента будет уничтоженконтейнером.
Рисунок 2.15 — Схема жизненного цикла компонента-подложки [17]
Для демонстрации примера компоненты-подложки обратимся к бизнесмодели тестового примера:
1)создадим в Eclipse новый проект типа Dynamic Web Project с именем labs;
2)в этом проекте создадим JAVA-класс asu.rsos.TestTomee.java, содержимое которого показано на листинге 2.1.
Листинг 2.1 — Компонента-подложка TestTomee.java проекта labs
package asu.rsos;
import java.util.Date;
import javax.enterprise.context.ApplicationScoped; import javax.inject.Named;
@Named
@ApplicationScoped public class TestTomee
74
{
// Разделяемый ресурс
private List<String> msgs = new ArrayList<>();
// Строка ввода нового сообщения private String text = "";
/** * Пустой конструктор */
public TestTomee() {}
/**
*Стандартный набор методов Java Beans
*с особыми правилами именования методов */
public String getMsgs() { return msgs; }
/**
* Список msgs - nолько для чтения public void setMsgs(List<String> msgs)
{
this.msgs = msgs;
}
*/
/** * Методы чтения и установки текста */
public String getText() {return "";}
public void setText(String text) {this.text = text;}
/**
*Метод добавления нового сообщения.
*Возвращает:
*- адрес нового ресурса;
*- любое слово, при использовании faces-config.xml;
*- null, если страница не изменяется.
*/
public String addMessage()
{
Date dt = new Date();
String s = dt.toLocaleString() + " " + text; msgs.add(s);
return null;
}
}
В целом, TestTomee.java в таком написании соответствует структуре POJO-класса, в котором методы get*() и set*(...) предназначены для работы с приватными данными. В дальнейшем, такое описание будет автоматически обрабатываться компонентой JSF. В частности, приватная переменная msgs будет доступна «только для чтения».
75