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

}
}
Запуск сервлета показывает одинаковую и правильную реакцию на вызов каждого EJB-компонента, как это показано на рисунке 3.2.
Рисунок 3.2 — Тестовый вызов трех EJB-компонентов
3.1.3 Тестовый HttpServlet проекта lab4
Для демонстрации учебного материала данной главы нам потребуется полноценная реализация сервлета JpaServlet, который бы:
а) обеспечивал обращение ко всем методам EJB-компоненты Letters; б) отображал список объектов Letter;
в) выводил нужную форму для взаимодействия с сервером приложений.
Для удовлетворения указанных требований, преобразуем класс Letters к первоначальному тестовому виду, показанному на листинге 3.7.
Листинг 3.7 — Тестовый вариант класса Letters.java проекта lab4
package rsos.lab4;
import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.ejb.LocalBean; import javax.ejb.Stateless;
@Stateless
@LocalBean
public class Letters implements LocalLetter, RemoteLetter
{
public List<Letter> getList()
{
List<Letter> list = new ArrayList<>();
136
Letter
letter = new Letter(new Date(), "upk", "Сообщение 1"); letter.setId(1);
list.add(letter);
letter = new Letter(new Date(), "upk", "Сообщение 2"); letter.setId(2);
list.add(letter);
letter = new Letter(new Date(), "upk", "Сообщение 3"); letter.setId(3);
list.add(letter);
return list;
}
public Letter getLetter(int id) { return null;
}
public void addLetter(Letter letter) {} public void deleteLetter(int id) {}
public void modLetter(Letter letter) {}
}
Обратите внимание, что аннотация @LocalBean обязательно должна присутствовать, иначе не будет возможен локальный доступ к классу Letters.
Теперь создадим JSP-страницу jpa_test.jsp, которая будет выводить результаты работы сервера и содержать форму для диалога. Также учтем, что сервлет должен передавать в JSP-страницу следующие атрибуты:
а) "action" — действие выбранное пользователем; б) "id" — номер сообщения;
в) "user" — имя пользователя;
г) "text" — содержимое сообщения;
д) "state" — состояние, которое установил сервлет.
Листинг 3.8 — JSP-страница jpa_test.jsp проекта lab4
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <jsp:useBean id="letter" class="rsos.lab4.Letter" scope="page" />
<html>
137
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>lab4</title>
</head> <body>
<hr>
<b>Тестовая страница проекта lab4</b>
<hr>
<table id="table1" cellspacing="5" cellpadding="10" border="0" > <thead><tr>
<th>№</th> <th>Дата</th> <th>Польз.</th> <th>Сообщение</th>
</tr></thead> <tbody>
<c:forEach items="${letters}" var="letter"> <tr>
<td><c:out value="${letter.id}" default="*" /></td> <td><c:out value="${letter.dateString}" default="Нет даты" /></td> <td><c:out value="${letter.user}" default="Нет пользователя"/></td> <td><c:out value="${letter.text}" default="Нет текста..." /></td> </tr>
</c:forEach> </tbody>
</table> <hr>
<form action="JpaServlet" method="post" accept-charset="UTF-8"> <table id="table2">
<tr>
<td>Номер сообщения: </td>
<td><input type="text" size="6" name="id" value="${id}" /></td>
</tr> <tr>
<td>Имя пользователя: </td>
<td><input type="text" size="40" name="user" value="${user}" /></td>
</tr> <tr>
<td>Новый текст: </td>
<td><textarea rows="5" cols="40" name="text">
<%= request.getAttribute("text") %> </textarea></td>
</tr> </table>
<hr>
Состояние запроса (<%= request.getAttribute("action") %>): <%= request.getAttribute("state") %>
<hr>
<table id="table2"> <tr>
<td>
<input type="radio" name="action" value="list" checked="checked"> Обновить
</td>
138
<td><input type="submit" value="Отправить запрос" /> </td>
</tr> <tr>
<td>
<input type="radio" name="action" value="add"> Добавить<br>
<input type="radio" name="action" value="get"> Прочитать по номеру<br>
<input type="radio" name="action" value="delete"> Удалить по номеру<br>
<input type="radio" name="action" value="mod"> Модифицировать по номеру<br>
</td> </tr> </table>
</form> <hr>
</body> </html>
Наконец, сам сервлет JpaServlet представлен на листинге 3.9, а результат его запуска — на рисунке 3.3.
Листинг 3.9 — Исходный текст сервлета JpaServlet.java проекта lab4
package rsos.lab4;
import java.io.IOException; import javax.ejb.EJB;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class JpaServlet */
@WebServlet("/JpaServlet")
public class JpaServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
@EJB |
|
|
private LocalLetter |
local; |
// Интерфейс |
@EJB |
|
|
private RemoteLetter |
remote; |
// Интерфейс |
@EJB |
|
|
private Letters |
letters; |
// EJB-компонент |
/** |
|
|
* Конструктор |
|
|
*/ |
|
|
139
public JpaServlet() { super(); }
/**
* Метод doGet(...) */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// Переходим к методу doPost() doPost(request, response);
}
/**
* Метод doPost(...) */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
/**
*Явная установка кодировок объектов запроса и ответа.
*Стандартная установка контекста ответа.
*/ response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); request.setCharacterEncoding("UTF-8");
// Начальные значения |
||
String[] |
state |
= {"<b>Нормально...</b>", "<b>Ошибка...</b>"}; |
String |
action |
= request.getParameter("action"); |
String |
id |
= request.getParameter("id"); |
String |
user |
= request.getParameter("user"); |
String |
text |
= request.getParameter("text"); |
if(action |
== null) |
action |
= |
"list"; |
if(id |
== null) id |
= ""; |
||
if(user |
== null) user |
= "asu"; |
||
if(user.length() == 0) user = |
"asu"; |
|||
if(text |
== null) text |
= |
""; |
// Читаем список и передаем в JSP-страницу request.setAttribute("letters", letters.getList()); request.setAttribute("state", state[0]);
// Действия if("add".equals(action)) {
request.setAttribute("state", state[1]);
}
if("get".equals(action)) { request.setAttribute("state", state[1]);
}
if("delete".equals(action)) { request.setAttribute("state", state[1]);
}
140

if("mod".equals(action)) { request.setAttribute("state", state[1]);
}
// Установка атрибутов request.setAttribute("action", action); request.setAttribute("id", id); request.setAttribute("user", user); request.setAttribute("text", text.trim());
/**
* Стандартное подключение ресурса JSP-страницы */
request.getRequestDispatcher("/WEB-INF/jpa_test.jsp")
.forward(request, response);
}
}
Рисунок 3.3 — Результат запуска сервлета JpaServlet
Теперь мы готовы для демонстрации учебных примеров данной главы.
141