Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 410

Ильдар Шаукатович Хабибуллин

Метод service () обрабатывает сведения, содержащиеся в объекте req, и заносит результаты обработки в объект resp. Заполненный объект resp передается контейнеру, который через Web-сервер отправляет ответ клиенту. Все эти действия выполняются методами, описанными в интерфейсах ServletRequest и ServletResponse.

Интерфейс ServletRequest

В интерфейсе ServletRequest, который должен реализовать каждый контейнер сервлетов, описана масса методов getxxx(), возвращающих параметры запроса или null, если параметр неизвестен.

Методы getRemoteAddr(), getRemoteHost() и getRemotePort() возвращают IP-адрес, полное DNS-имя отправителя запроса или proxy-сервера и его номер порта, а методы getServerName () и getServerPort () возвращают имя и номер порта сервера, принявшего запрос.

Методы getLocalAddr (), getLocalName() и getLocalPort() возвращают IP-адрес, полное DNS-имя сетевого интерфейса, с которого получен запрос, и его номер порта.

Метод getScheme ( ) возвращает схему запроса: http:, https:, ftp: и т. д., а метод getProtocol () — имя протокола в виде строки, например "HTTP/1.1".

Методы getContentType () и getCharacterEncoding() возвращают MIME-тип и кодировку запроса, если они указаны в заголовке запроса, а метод getContentLength ( ) — длину тела запроса в байтах, если она известна, или -1, если длина неизвестна.

Метод setCharacterEncoding (String) устанавливает кодировку, если она не определяется методом getCharacterEncoding (), или переписывает кодировку, указанную в запросе. К этому методу часто приходится обращаться для правильного преобразования параметров запроса, пришедших в байтовой кодировке, в строку типа String. Пример такого обращения приведен в листинге 26.5. Этот метод следует применять до разбора параметров запроса.

Имена и значения параметров, пришедших с запросом, можно получить методами

public Enumeration getParameterNames(); public String getParameter(String name); public String[] getParameterValues(String name); public Map getParameterMap();

Если у запроса есть какие-либо атрибуты, то их имена и значения можно получить методами

public Enumeration getAttributeNames(); public Object getAttribute(String name);

Наконец, интерфейс описывает два входных потока для получения тела запроса: байтовый и символьный. Байтовый поток реализуется специально разработанным классом

ServletInputStream.

Класс ServletInputStream — это абстрактный класс, расширяющий класс InputStream. Он добавляет к методам своего суперкласса только один метод

public int readLine(byte[] buf, int offset, int length);

читающий строку тела запроса в заранее определенный буфер buf. Чтение начинается с байта с номером offset и продолжается до достижения символа перевода строки '\n' или до достижения количества прочитанных символов length. Метод возвращает число прочитанных байтов или -1, если входной поток уже исчерпан.