Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распределенные сервис-ориентированные системы..pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
9.2 Mб
Скачать

import javax.xml.bind.annotation.XmlRootElement;

/**

*Корневая аннотация для всего класса, задающая

*имя списка объектов типа Letter.

*/ @XmlRootElement(name="letters")

public class ListLets implements Serializable

{

private static final long serialVersionUID = 1L;

// Приватная переменная класса

private List<Letter> list = new ArrayList<>(); /**

* Конструкторы, геттеры, сеттеры и другие бизнес-методы */

public ListLets() {}

public ListLets(Letter letter) { if(letter != null)

list.add(letter);

}

public ListLets(List<Letter> list) { this.list = list;

}

/**

*Аннотация для публичного метода getList(), задающая имя для

*описания объекта типа Letter и допускающая пустой список. */

@XmlElement(name="letter", nillable = true) public List<Letter> getList() {

return list;

}

}

На этом, подготовительную часть проекта lab9 можно считать законченой и EJB-компоненту Lets9, а также подобные ей, необходимо инкапсулировать в RESTful-сервлет с помощью аннотации @EJB.

6.2.3 Получение списка записей в формате XML

Реальный RESTfull-сервис может инкапсулировать множество различных EJB-компонент.

В нашем учебном примере используется только одна EJB-компонента Lets9, но она должна быть протестирована перед реализацией любого прикладного сервиса. Проведем такое тестирование, инкапсулировав Lets9 в сервлет LetsRestService, и изменив метод testRS(), как это показано на листинге 6.6.

255

Листинг 6.6 — Инъекция EJB-компоненты Lets9 в сервлет LetsRestService

/**

*Аннотации, определяющие сервлет типа RESTful, который

*доступен по адресу: http://localhost:8080/lab9

*/ @Path("/") @Stateless

public class LetsRestService

{

//Инъекция EJB-компоненты @EJB

Lets9 lets;

//Простой тест

/**

*Простейшая демонстрация доступа по методу GET, доступная

*по адресу: http://localhost:8080/lab9/test

*/

@GET @Path("/test")

@Produces(MediaType.TEXT_PLAIN) public String testRS()

{

if(lets == null)

System.out.println("Объект типа Lets9 - не существует!");

else

System.out.println("Объект типа Lets9 - подключен!");

return "Проверка технологии JAX-RS";

}

Теперь, если в проекте lab9 выделить в кладку index.html, запустить сервер и активировать ссылку «Проверка связи с сервером: .../lab9/test», то в консоле среды разработки Eclipse EE получим результат, показанный на рисунке 6.3.

Рисунок 6.3 — Ответ сервлета LetsRestService

Ответ сервера показывает, что EJB-компонента Lest9 успешно инкапсулируется в сервлет LetsRestService.

Теперь, преобразуем метод getLets() сервлета LetsRestService, согласно содержимому листинга 6.7.

256

Листинг 6.7 — Новый метод getLets() сервлета LetsRestService

// Получение списка записей /**

*Доступ по методу GET, читающий весь список записе, при

*обращении по адресу: http://localhost:8080/lab9/letter

*/

@GET @Path("/letter")

public Response getLets()

{

return Response

.ok(new ListLets(lets.getList()), MediaType.APPLICATION_XML)

.build();

}

Если теперь в проекте lab9 можно выделить в кладку index.html, запустить сервер и активировать ссылку «Получение списка записей: .../lab9/letter», то в окне браузера Eclipse EE получим результат, показанный на рисунке 6.4.

Рисунок 6.4 — Список записей объектов Letter в формате XML

257

6.2.4 Получение записи по номеру индентификатора

Стиль программирования REST рекомендует указывать доступ к отдельным объектам сервиса посредством прямой адресации URL.

Следуя требованиям стиля REST (см. пункт 6.1.2), рассмотрим чтение записи типа Letter, например, по адресу: http://localhost:8080/lab9/letter/1.

Семантически, такой адрес указывает на запись таблицы t_letter с ключем id=1, а, в пределах сервлета LetsRestService, это будет интерпретироваться как адрес: http://localhost:8080/lab9/letter с параметром id, который доступен с помощью аннотации @PathParam(...).

Сучебной, да и с прикладной, точек зрения, отдельную запись удобнее представлять как элемент списка, потому что, если запись с заданным идентификатором не существует, то мы в окне браузера увидим пустой список, а не пустой экран.

Сучетом перечисленных условий, для получения отдельной записи из таблицы t_letter, преобразуем метод getLetter(...) сервлета LetsRestService, согласно содержимому листинга 6.8.

Листинг 6.8 — Новый метод getLetter(...) сервлета LetsRestService

// Получение записи по идентификатору id=1 /**

*Доступ по методу GET, читающий только одну запись, при

*обращении по адресу: http://localhost:8080/lab9/letter/1

*Должен использоваться один параметр типа int.

*/

@GET

@Path("/letter/{id : \\d+}")

public Response getLetter(@PathParam("id") int id)

{

return Response

.ok(new ListLets(lets.getLetter(id)), MediaType.APPLICATION_XML)

.build();

}

Обратите особое внимание, каким образом задается шаблон для целого числа в аннотации @Path() и как с помощью аннотации @PathParam() определяется тип аргумента в методе getLetter(...).

Если теперь в проекте lab9 выделить вкладку index.html, запустить сервер и активировать ссылку «Получение новой записи по идентификатору: .../ lab9/letter/1», то в окне браузера Eclipse EE получим результат, показанный на рисунке 6.5, а если обратиться по адресу: http://localhost:8080/lab9/letter/2, то мы получим пустой список, как показано на рисунке 6.6.

258