Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Написание сервисных методов

Функциональность, предоставляемая сервлетом, реализована в методе service в GenericServlet, в методах do`Method` (где Method может принимать значение Get, Delete, Options, Post, Put или Trace) из объекта HttpServlet или в любых других специфичных для протокола методах, определённых классом, который реализует интерфейс Servlet. Термин "сервисный метод" используется для любого метода в классе сервлета, который предоставляет сервисы клиенту.

Общий шаблон для сервисного метода состоит в том, чтобы извлечь информацию из запроса, получить доступ к внешним ресурсам, а затем заполнить ответ на основе этой информации. Для HTTP-сервлетов корректная процедура заполнения ответа заключается в следующем:

  1. Получить выходной поток из ответа.

  2. Заполните заголовки ответа.

  3. Запишите содержимое в выходной поток.

Заголовки ответа всегда должны быть установлены до того, как ответ будет зафиксирован. Веб-контейнер будет игнорировать любые попытки установить или добавить заголовки после фиксации ответа. В следующих двух разделах описывается, как получать информацию из запросов и генерировать ответы.

Получение информации из запросов

Запрос содержит данные, передаваемые между клиентом и сервлетом. Все запросы реализуют интерфейс ServletRequest. Этот интерфейс определяет методы для доступа к следующей информации:

  • Параметры, которые обычно используются для передачи информации между клиентами и сервлетами

  • Атрибуты со значениями-объектами, которые обычно используются для передачи информации между веб-контейнером и сервлетом или между взаимодействующими сервлетами.

  • Информация о протоколе, используемом для передачи запроса, а также о клиенте и сервере, участвующих в запросе.

  • Информация, относящаяся к локализации

Вы также можете извлечь входной поток из запроса и вручную проанализировать данные. Чтобы прочитать символьные данные, используйте объект BufferedReader, возвращаемый методом запроса getReader. Чтобы прочитать бинарные данные, используйте ServletInputStream, возвращаемый getInputStream.

HTTP-сервлетам передаётся объект HTTP-запроса, HttpServletRequest, который содержит URL запроса, HTTP-заголовки, строку запроса и т. д. URL HTTP-запроса содержит следующие части:

http://[host]:[port][request-path]?[query-string]

Путь запроса (request path) дополнительно состоит из следующих элементов.

  • Контекстный путь (Context path): конкатенация косой черты (/) с корневым контекстом веб-приложения сервлета.

  • Путь сервлета (Servlet path): часть пути, соответствующей псевдониму компонента, который активировал этот запрос. Этот путь начинается с косой черты (/).

  • Информация о пути (Path info): часть пути запроса, которая не является частью контекстного пути или пути сервлета.

Вы можете использовать методы getContextPath, getServletPath и getPathInfo интерфейса HttpServletRequest для получения этой информации. За исключением различий в кодировке URL между URI запроса и частями пути, URI запроса всегда состоит из контексного пути плюс путь сервлета и информация о пути.

Строки запроса состоят из набора параметров и их значений. Отдельные параметры извлекаются из запроса с использованием метода getParameter. Есть два способа генерации строк запроса.

  • Строка запроса может явно отображаться на веб-странице.

  • Строка запроса добавляется к URL при отправке формы с HTTP-методом GET.

Построение ответов

Ответ содержит данные, передаваемые между сервером и клиентом. Все ответы реализуют интерфейс ServletResponse. Этот интерфейс определяет методы, которые позволяют:

  • Получить выходной поток, чтобы использовать его для отправки данных клиенту. Чтобы отправить символьные данные, используйте PrintWriter, возвращаемый методом ответа getWriter. Чтобы отправить бинарные данные в ответе MIME, используйте ServletOutputStream, возвращаемый getOutputStream. Чтобы сочетать бинарные и текстовые данные, как в многочастном (multipart) ответе, используйте ServletOutputStream и управляйте разделами символов вручную.

  • Укажите тип содержимого (например, text/html), возвращаемый ответом с помощью метода setContentType(String). Этот метод должен быть вызван до фиксации ответа. Реестр типов MIME (content type) доступен по ссылке http://www.iana.org/assignments/media-types/.

  • Укажите, нужно ли буферизовать вывод с помощью метода setBufferSize(int). По умолчанию любой контент, записанный в выходной поток, немедленно отправляется клиенту. Буферизация позволяет записывать содержимое до того, как что-либо отправлено обратно клиенту, что даёт сервлету больше времени для установки соответствующих кодов состояния и заголовков или переадресации на другой веб-ресурс. Метод должен быть вызван до того, как будет написано какое-либо содержимое, или до того, как ответ будет зафиксирован.

  • Установите информацию о локализации, такую ​​как локаль и кодировка символов. Подробности смотрите в главе 22 «Интернационализация и локализация веб-приложений».

Объекты HTTP-ответа, javax.servlet.http.HttpServletResponse, имеют поля, представляющие заголовки HTTP, такие как следующие.

  • Коды состояния, которые используются для указания причины, по которой запрос не удовлетворён или что запрос был перенаправлен.

  • Файлы cookie, которые используются для хранения информации о приложении на клиенте. Иногда файлы cookie используются для поддержания идентификатора для отслеживания сессии пользователя (см. Отслеживание сессии).


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)