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() і стерти не лише вміст буфера, а й заголовки з кодом відповіді.
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. Метод 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();
}
}
}