
- •Введение
- •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.2 Шаблон проектирования MVC
Компонента JSF проектировалась по шаблону MVC.
На рисунке 2.12 компонента JSF в явном виде представлена как шаблон проектирования MVC, где сам FacesServlet выполняет роль контроллера. Если сравнить этот рисунок с рисунком 2.8 (см. стр. 67), представляющим трехзвенную архитектуру MVC, то мы увидим много общего. Более того, далее (в пункте 2.1.2) было показано, как тестовый пример можно представить в виде шаблона MVC.
Если смотреть еше раньше, то в пункте 1.3.4 главы 1 на рисунке 1.12 (стр. 32) представлена трехуровневая бизнес-парадигма предприятия. Ее также можно представить шаблоном MVC:
а) Контроллер — бизнес-руководители предприятия; б) Представление — уровень бизнес-логики; в) Модель — уровень интерфейсов сервисов.
Рисунок 2.12 — JSF в виде шаблона проектирования MVC [17]
Хотя наша дисциплина не является прямым курсом по проектированию информационных систем, каждый IT-специалист должен владеть шаблоном проектирования MVC, поскольку он дает важную декомпозицию для анализа и обоснования принимаемых решений.
Несмотря на явное подобие назначения контроллеров HttpServlet и FacesServlet, связанных с обработкой HTTP/XHTTP/AJAX-запросов, между ними имеются существенные различия:
68

а) HttpServlet предоставляет браузеру вызывать себя с помощью URI-адре- са, предоставляя программисту несколько методов (обычно doGet(...) и doPost(…)); программист сам решает, когда он обращается к модели, когда — к представлению, а когда формирует ответ браузеру;
б) FacesServlet управляется Web-контейнером и позволяет браузеру с помощью URI-адреса обратиться к некоторому XHTML-ресурсу, который посредством шаблонов Facelets (см. рисунок 2.11) вызывет скрытые от браузера XHTML-ресурсы (компоненты); каждая из Facelets-компонент может представлять статический XHTML-ресурс или быть связанной с одной или несколькими компонентами-подложками.
Учебная цель данного подраздела — более подробное раскрытие общей архитектуры технологии JSF, представленной рисунком 2.11, используя в качестве логической базы шаблон проектирования MVC (рисунок 2.12).
2.2.1 Контроллер FacesServlet и жизненный цикл запроса
Каждый запрос браузера обрабазывается отдельным процессом (потоком) виртуальной машины Java.
Рисунок 2.13 показывает структурную схему обработки запроса.
Рисунок 2.13 — Схема обработки запроса сервлетом [17]
При запуске сервера приложений запускается и приложение построенное на основе компоненты JSF. Соответственно, Web-контейнер создает объект типа javax.faces.webapp.FacesServlet, который для приема запросов от браузеров обслуживается собственным листенером.
69

Отдельный запрос браузера, например, запрос о событии нажатия кнопки, как показано на рисунке 2.13, воспринимается объектом, показанным как FacesServlet, который создает два новых объекта:
1.Объект типа javax.faces.context.FacesContext для представления контекстной информации, связанной с обработкой входящего запроса и пос ледующего создания соответствующего ответа.
2.Объект типа javax.faces.lifecycle.Lifecycle для обработки запроса в последовательности шести этапов, показанных на рисунке 2.14.
Рисунок 2.14 — Жизненный цикл обработки обработки запроса [17]
В процессе этапов жизненного цикла предусмотнены четыре точки обработки событий, способных досрочно завершить обработку запроса, если отсутствует необходимость в работе последующих этапов. В случае обнаружения ошибки, в каждой точке обработки событий предусмотрено аварийное завершение запроса.
Особое внимание следует уделить этапам «Обновление состояния модели» и «Вызов приложения».
Обновление состояния модели — этап, связывающий все проверенные значения компонентов с соответствующими компонентами-подложками.
Вызов приложения — этап, чтобы выполнить бизнес-логику. Здесь любое выбранное действие будет выполнено компонентом-подложкой, а также вступает в действие навигация (переход на другие страницы web-приложения).
70

2.2.2 Контекст состояния запроса FacesContext
Объект типа javax.faces.context.FacesContext создается сервлетом для представления контекстной информации, связанной с обработкой входящих запросов и создания соответствующего ответа.
Напомню, что общая парадигма программной платформы Java EE — максимальная передача всех служебных или рутинных операций контейнеру сервера приложений, в данном случае и компоненту JSF. Тем не менее, если это необходимо, то программист может воспользоваться информацией, сохраняемой объектом контекста в течении всего жизненного цикла обработки запроса.
Объект контекста создается для каждого запроса браузера. Обычно программист обрабатывает контекст запроса в компоненте-подложки с помощью создания объекта в виде:
FacesContext context = FacesContext.getCurrentInstance();
К созданному объекту context можно применить методы, приведенные в таблице 2.1.
Таблица 2.1 — Методы объекта типа FacesContext [17]
Метод |
Описание метода |
addMessage |
Присоединяет сообщение: информационное, предупреждающее, |
|
сообщение об ошибке, либо сообщение о фатальной ошибке. |
getApplication |
Возвращает объект типа Application, связанный с этим web- |
|
приложением. |
getAttributes |
Возвращает объект типа Map, представляющий атрибуты, |
|
связанные с объектом типа FacesContext. |
getCurrentInstance |
Возвращает объект типа FacesContext для запроса, который |
|
обрабатывается в текущем потоке. |
getELContext |
Возвращает объект типа ELContext для текущего объекта типа |
|
FacesContext. |
getMaximumSeverity |
Возвращает максимальную степень тяжести, записанную в |
|
любом FacesMessage, внесенном в очередь. |
getMessages |
Возвращает коллекцию объектов типа FacesMessage. |
getPartialViewContext |
Возвращает объект типа PartialViewContext для заданного |
|
запроса. Он используется для внедрения логики в цикл |
|
управления обработкой/отрисовкой, например, для обработки |
|
запроса AJAX. |
getViewRoot |
Возвращает корневой компонент, связанный с запросом. |
71