Изучаем Java EE 7 - [251]
>//…
>@GET
>@Path("{id}")
>public Response getBook(@PathParam("id") String id) {
>··Book book = em.find(Book.class, id);
>··if (book == null)
>····throw new NotFoundException();
>··return Response.ok(book). build();
>}
>//…
Аннотация @Path указывает подпуть внутри уже заданного пути на уровне класса. При использовании синтаксиса {id} URL-элемент связывается с параметром метода. Воспользуемся cURL для доступа к книге с идентификатором 601 и получения JSON-представления:
>$ curl — X GET — H "Accept: application/json"
>····http://localhost:8080/chapter15-service-1.0/rs/book/601
>{"description":"Научно-фантастическая книга","id":"1",
>····"illustrations":false,"isbn":"1-84023-742-2","nbOfPage":354,
>····"price":12.5,"title":"H2G2"}
Изменив свойство заголовка Accept, мы сможем в этом же коде вернуть XML-представление книги с идентификатором 601:
>$ curl — X GET — H "Accept: application/xml"
>····http://localhost:8080/chapter15-service-1.0/rs/book/601
>
>····standalone="yes"?>
>····книга
>····
>····
Для получения из базы данных всех книг код из листинга 15.25 использует запрос TypedQuery, результат которого устанавливается в класс Books. Не забывайте, что этот класс расширяет ArrayList
>//…
>@GET
>public Response getBooks() {
>··TypedQuery
>··Books books = new Books(query.getResultList());
>··return Response.ok(books). build();
>}
>//…
Опять же, если вы пожелаете быстро протестировать код с помощью cUrl, откройте командную строку и введите в нее следующие команды, чтобы получить представление списка книг либо в XML, либо в JSON:
>$ curl — X GET — H "Accept: application/json"
>http://localhost:8080/chapter15-service-1.0/rs/book
>$ curl — X GET — H "Accept: application/xml"
>http://localhost:8080/chapter15-service-1.0/rs/book
Метод deleteBook() в листинге 15.26 соответствует формату метода getBook(), так как использует подпуть и ID в качестве параметра. Единственное отличие от метода getBook() заключается в том, что во втором случае применяется HTTP-операция DELETE (а не GET). Если книга не найдена в базе данных, то генерируется исключение NotFoundException, в противном случае книга удаляется и возвращается код состояния 204 — Нет содержимого.
>//…
>@DELETE
>@Path("{id}")
>public Response deleteBook(@PathParam("id") String id) {
>··Book book = em.find(Book.class, id);
>··if (book == null)
>····throw new NotFoundException();
>··em.remove(book);
>··return Response.noContent(). build();
>}
>//…
Если бы мы воспользовались развернутым режимом вывода cURL (с аргументом — v), то увидели бы отправку запроса DELETE. В ответе же присутствует код состояния 204 — Нет содержимого. Он указывает, что ресурс больше не существует:
>$ curl — X DELETE http://localhost:8080/chapter15-service-1.0/rs/book/601 — v > DELETE /chapter15-service-1.0/rs/book/601 HTTP/1.1
>> User-Agent: curl/7.23.1 (x86_64-apple-darwin11.2.0) libcurl/7.23.1
>> Host: localhost:8080
>> Accept: */*
>>
>< HTTP/1.1 204 No Content
>< Server: GlassFish Server Open Source Edition 4.0
Конфигурирование JAX-RS
Перед развертыванием службы BookRestService и сущности Book нам потребуется зарегистрировать в Jersey паттерн url; это делается для перехватывания HTTP-вызовов, идущих к службам. Таким образом, запросы, отсылаемые к пути /rs, будут перехватываться Jersey. Вы можете либо задать этот паттерн url при конфигурировании сервлета Jersey в файле web.xml, либо использовать аннотацию @ApplicationPath (листинг 15.27). Класс ApplicationConfig должен расширять javax.ws.rs.core.Application и определять все веб-службы в стиле REST (здесь — c.add(BookRestService.class)), а также выполнять все прочие необходимые расширения (c.add(MOXyJsonProvider.class)).
>@ApplicationPath("rs")
>public class ApplicationConfig extends Application {
>··private final Set
>··public ApplicationConfig() {
>····HashSet
>····c.add(BookRestService.class);
>····c.add(MOXyJsonProvider.class);
>····classes = Collections.unmodifiableSet(c);
>··}
>··@Override
>··public Set
>····return classes;
>··}
>}
Этот класс должен находиться где-то в вашем проекте (конкретный пакет не имеет значения), и благодаря аннотации @ApplicationPath он будет отображать запросы на URL-шаблон /rs/*. Это означает, что всякий раз, когда очередной URL будет начинаться с /rs/, Jersey будет его обрабатывать. Действительно, во всех тех примерах, которые я использовал в cURL, все URL ресурсов начинались с /rs:
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.