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