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();
}
}
}