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

<h:commandButton value="Работа №4" action="#{menus31.run('4')}"/> <h:commandButton value="Работа №5" action="#{menus31.run('5')}"/> <h:commandButton value="Работа №6" action="#{menus31.run('6')}"/> <h:commandButton value="Работа №7" action="#{menus31.run('7')}"/> <h:commandButton value="Работа №8" action="#{menus31.run('8')}"/> <h:commandButton value="Работа №9" action="#{menus31.run('9')}"/> <hr/>
</h:panelGrid> </h:form>
</body> </html>
Запуск проекта до авторизации пользователя — на рисунке 2.30.
Рисунок 2.30 — Запуск labs с боковой панелью до авторизации пользователя
Запуск labs после авторизации пользователя показан на рисунке 2.31.
2.4.8 Второй вариант меню лабораторных работ
Отображение боковой панели может быть представлено в другой форме, например, в виде списка лабораторных работ и одной кнопки, формирующей запрос к серверу. Такой подход может оказаться более эстетически обоснованным, хотя реализуется дополнительными инструментами технологии JSF.
Рассмотрим новый вариант боковой панели, показанный на листинге 2.27.
120

Рисунок 2.31 — Запуск labs после авторизации пользователя
Листинг 2.27 — Исходный текст файла menus32.xhtml проекта labs
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Боковая страница</title>
</head>
<body> <h:form>
<h:panelGrid rendered="#{menus32.show}" colums="1" style="background-color:lightgray;width:150px;padding:10px">
121

<f:facet name="header"> <h:outputText value="Список работ"/> </f:facet>
<hr/>
<h:selectOneListbox id="list" align="center" value="#{menus32.work}" valueChangeListener="#{menus32.valueChanged}" onchange="submit()">
<f:selectItems value="#{menus32.data}"/>
</h:selectOneListbox> <hr/>
<h:commandButton action="#{menus32.run}" value="Запустить" /> </h:panelGrid>
</h:form> </body> </html>
Для реализации такого представления необходима новая компонентаподложка, например, Menus32. Кроме того, новой подложке требуется дополнительная функциональная поддержка и представление данных:
а) тег <h:selectOneListbox> требует реализации метода valueChanget(), обслуживающего выбор пунктов меню;
б) тег <f:selectItems> требует доступа к списку объектов, каждый из которых представляет парные строки.
Для реализации функциональности подложки Menus32 создадим дополнительный CDI/ POJO-класс DString, исходный текст которого представлен на листинге 2.28.
Листинг 2.28 — Исходный текст класса DString.java проекта labs
package asu.rsos;
import javax.inject.Named;
@Named
public class DString { /**
* Пара строк для тега <f:selectItems> */
private String name; private String desc;
public DString() {}
public DString(String name, String desc) { this.name = name;
this.desc = desc;
}
122
public String getName() { return name;
}
public void setName(String name) { this.name = name;
}
public String getDesc() { return desc;
}
public void setDesc(String desc) { this.desc = desc;
}
@Override
public String toString() { return this.name;
}
}
Теперь компонента-подложка Menus32, предназначенная для новой боковой панели может быть представлена листингом 2.29, а результат запуска проекта labs с новой боковой панелью показан на рисунке 2.32.
Листинг 2.29 — Исходный текст класса Menus32.java проекта labs
package asu.rsos;
import java.util.ArrayList; import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped; import javax.faces.event.ValueChangeEvent; import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped public
class Menus32 { /**
* Инъекция обекта класса RSOS */
@Inject
private RSOS rsos;
// Имя пользователя
private String user = null;
//Наименование работы private String work = null;
//Содержимое <h:selectOneListbox> private List<DString> data;
/** * Пустой конструктор */
public Menus32()
123
{
data = new ArrayList<>();
data.add(new DString("Работа №1", "1")); data.add(new DString("Работа №2", "2")); data.add(new DString("Работа №3", "3")); data.add(new DString("Работа №4", "4")); data.add(new DString("Работа №5", "5")); data.add(new DString("Работа №6", "6")); data.add(new DString("Работа №7", "7")); data.add(new DString("Работа №8", "8")); data.add(new DString("Работа №9", "9"));
}
// Для демонстрации @PostConstruct private void test() {
System.out.println("Объект класса Menus32 - стартовал...");
}
// Стандартная обработка атрибутов public String getUser()
{
user = rsos.getUser();
if(user == null) return "Не выбран"; return user;
}
public String getWork()
{
work = rsos.getWork();
if(work == null) return "Работа №1"; return work;
}
public void setWork(String work) {this.work = work;}
public List<DString> getData()
{
return data;
}
// Показывать или не показывать компоненту public boolean isShow()
{
user = rsos.getUser();
if(user == null) return false; return true;
}
/** * Метод запуска работ */
public String run()
{
String ss = rsos.getXHTML(); if(ss == null) ss = "default";
System.out.println("Menus32:run() = " + ss); return ss;
}
124

// Обработчик события
public void valueChanged(ValueChangeEvent e)
{
work = (String) e.getNewValue(); System.out.println("Menus32:valueChanged() = "
+ work); rsos.setWork(work);
}
}
Рисунок 2.32 — Запуск labs после авторизации пользователя
125