3.1 Класс HttpServletResponse

После вызова метода service() твоего сервлета веб-контейнер сформирует ответ клиенту на основе объекта HttpServletResponse. Так что если хочешь как-то повлиять на ответ клиенту, то стоит модифицировать этот объект.

Ответ сервера состоит из трех частей:

  • Строка статуса (например: 200 OK)
  • Заголовки (headers)
  • Тело ответа (response body)

И методы класса HttpServletResponse тоже делятся на 3 группы? Ну почти:

Методы Описание
1 void setStatus(int sc) Устанавливает код статуса ответа.
2 void sendError(int sc) Отправляет клиенту ошибку с указанным кодом.
3 void sendError(int sc, String msg) Отправляет клиенту ошибку с указанным кодом и сообщение.
4 void addHeader(String name, String value) Добавляет заголовок в список заголовков ответа.
5 void setHeader(String name, String value) Меняет заголовок в списке заголовков ответа.
6 boolean containsHeader(String name) Проверяет, есть ли уже такой заголовок.
7 void addCookie(Cookie cookie) Добавляет Cookie к ответу.
8 void sendRedirect(String location) Перенаправляет клиента на другой URL.
9 String encodeRedirectURL(String url) Кодирует указанный URL для его использования в методе sendRedirect.
10 String encodeURL(String url) Кодирует указанный URL, включая в него идентификатор сессии.
11 void setContentType(String type) Устанавливает MimeType результата.
12 void setContentLength(int len) Устанавливает длину тела ответа.
13 void setCharacterEncoding(String charset) Устанавливает набор кодировок ответа.
14 void setBufferSize(int size) Устанавливает размер буфера для тела ответа.
15 boolean isCommitted() Проверяет, записан ли уже буфер в ответ.
16 void flushBuffer() Записывает содержимое буфера в ответ.
17 void reset() Сбрасывает все данные, которые хранятся в буфере, заголовки и коды ответа.
18 void resetBuffer() Очищает буфер ответа.

Методы тут достаточно тривиальны. Но расскажу ниже несколько нюансов.

Буфер. Ответ твоего сервлета пишется в буфер, а не сразу отправляется пользователю. Поэтому на каком-то этапе (если, например произошла ошибка), ты можешь сбросить (стереть) все, что записано в буфер. Можно даже вызвать метод reset() и стереть не только содержимое буфера, но и заголовки с кодом ответа.

3.2 redirect()

Второй важный момент — это редирект. Если твой сервлет примет решение перенаправить клиента на другой URL, то тебе нужно как-то этот URL отправить клиенту. Это можно сделать с помощью метода sendRedirect.

Но есть важный нюанс. URI может содержать более широкий диапазон символов, чем разрешено в response body. Поэтому URL перед вызовом метода sendRedirect() нужно сначала перекодировать в допустимый набор символов. Для этого и есть специальный метод encodeRedirectURL(String url). Воспользуйся им.

Пример редиректа:

public class RedirectServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String newUrl = "http://google.com?q=Учись гуглить!";
        String redirectUrl = response.encodeRedirectURL(newUrl);
        response.sendRedirect(redirectUrl);
    }
}

3.3 Метод getWriter()

А теперь мы научимся писать свой текст в качестве response body. Для этого у класса HttpServletResponse есть специальный метод getWriter(), который возвращает объект PrintStream. Если кто забыл, именно такой тип имеет поле с именем System.out.

Для того, чтобы написать какой-то текст в качестве ответа сервлета, нужно:

  • Получить объект PrintStream, вызвав метод response.getWriter().
  • Записать в объект PrintStream все, что считаешь нужным (все данные запишутся в буфер).
  • Отправить буфер пользователю, вызвав метод close() у PrintStream.

Давай напишем сервлет, который складывает два числа a и b и возвращает пользователю результат:

public class CalculatorServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
         // Получаем параметр “a” и “b” из запроса
        String a = request.getParameter("a");
        String b = request.getParameter("b");

        try {
            // Преобразовываем строки в числа и считаем сумму
            int sum = Integer.parseInt(a) + Integer.parseInt(b);

            // Печатаем HTML в качестве ответа для браузера
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();

            out.println("<html>");
            out.println("<head> <title> CalculatorServlet </title> </head>");
            out.println("<body>");
            out.println("<h1> Sum == " + sum + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}