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

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

Для заголовков с целочисленными значениями то же самое делается методами

public void setIntHeader(String name, int value); public void addIntHeader(String name, int value);

Заголовок с датой записывается методами

public void setDateHeader(String name, long date); public void addIntHeader(String name, int value);

Код ответа (status code) устанавливается методом

public void setStatus(int sc);

Как и все заголовки, этот метод записывается перед получением потока класса PrintWriter. Аргумент метода sc — это одна из множества констант, например константа sc_ok, соответствующая коду ответа 200 — успешная обработка запроса, sc_bad_request — код ответа 400 и т. д. Около сорока таких статических констант приведено в документации к интерфейсу HttpServletRequest. Метод setstatus () применяется для сообщений об успешной обработке с кодами 200—299.

Сообщения об ошибке посылаются методом

public void sendError(int sc, String message);

Обычно код ответа заносится в сообщение об ошибке message. Если надо послать стандартное сообщение об ошибке, например "404 Not Found", то применяется второй метод:

public void sendError(int sc);

Этот метод использован в листинге 26.6.

Сообщение методом sendError () посылается вместо результатов обработки запроса. Если попытаться послать после него ответ, то система выбросит исключение класса

IllegalStateException.

Наконец, к запросу можно добавить cookie методом

public void addCookie(Cookie cookie);

В пакете javax.servlet.http есть прямая реализация интерфейса HttpServletResponse — класс HttpServletResponseWrapper, расширяющий класс ServletResponseWrapper. Объект этого класса создается конструктором

public HttpServletResponseWrapper(HttpServletResponse resp);

и обладает всеми методами интерфейса HttpServletResponse. Разработчики, желающие расширить возможности объекта, содержащего запрос, могут расширить класс

HttpServletResponseWrapper.

Класс HttpServlet

Для использования особенностей протокола HTTP класс GenericServlet расширен абстрактным классом HttpServlet. Главная особенность этого класса заключается в том, что, расширяя его, не надо переопределять метод service (). Он уже определен, причем реализован так, что служит диспетчером, вызывающим методы doGet(), doPost() и другие методы, обрабатывающие HTTP-запросы с конкретными методами передачи данных GET, POST и др.

Вначале метод

public void service(ServletRequest req, ServletResponse resp);

анализирует типы аргументов req и resp. Эти типы должны быть на самом деле HttpServletRequest и HttpServletResponse. Если это не так, то метод выбрасывает исключение класса servletException и завершается.

Если аргументы req и resp подходящего типа, то методом getMethod () определяется HTTP-метод передачи данных и вызывается метод, соответствующий этому HTTP-методу, а именно один из методов

protected void doXxx(HttpServletRequest req, HttpServletResponse resp);

где Xxx означает Get, Post, Head, Delete, Options, Put или Trace.

Вот эти-то методы и надо переопределять, расширяя класс HttpServlet. Методы doHead (), doOptions () и doTrace () уже реализованы в соответствии с рекомендацией RFC 2616, их редко приходится переопределять. Остальные методы "реализованы" таким образом, что просто посылают сообщение о том, что они не реализованы. Чаще всего приходится переопределять методы doGet ( ) и doPost ( ).