JavaRush /Курсы /JSP & Servlets /Обслуживание запросов в сервлете

Обслуживание запросов в сервлете

JSP & Servlets
12 уровень , 1 лекция
Открыта

2.1 Класс HttpServletRequest

Большую часть работы твой сервлет должен сделать на основе информации, полученной из запроса. За него отвечает объект HttpServletRequest, который контейнер передаст в твой сервлет (в метод service или методы doGet(), doPost() и т. д.)

У этого объекта довольно много методов, так как он просто хранит данные запроса, а через него можно взаимодействовать с контейнером.

Методы можно разделить на 2 большие группы:

  • Методы, связанные с авторизацией пользователя
  • Методы по работе с данными запроса

Методы по авторизации пользователя я приведу в виде таблицы, но разбирать их мы не будем. Дело в том, что их очень редко используют для авторизации пользователя. Все популярные фреймворки используют свои, гораздо более продвинутые подходы к авторизации.

Я должен привести их список, но опять-таки, я не видел, чтобы кто-то их использовал.

Метод Описание
1 authenticate(HttpServletResponse) Выполняет аутентификацию response’а
2 changeSessionId() Принудительно меняет ID сессии
3 getAuthType() Возвращает тип аутентификации, который используется: ASIC_AUTH, FORM_AUTH, CLIENT_CERT_AUTH, DIGEST_AUTH
4 getRemoteUser() Возвращает login пользователя
5 getRequestedSessionId() Возвращает SessionID клиента
6 getSession() Возвращает объект HttpSession
7 getUserPrincipal() Возвращает объект java.security.Principal
8 login(username, password) Выполняет логин пользователя
9 logout() Разлогинивает сессию пользователя

2.2 Данные запроса

Вторая группа методов гораздо интереснее. Что за данные у нас есть в запросе?

  • http-метод
  • URI
  • Параметры
  • Заголовки

Посмотрим, какие методы есть для работы с ними:

Метод Описание
1 getMethod() Возвращает HTTP-метод: GET, POST, DELETE, …
2 getRequestURI() Возвращает URI запроса: http://javarush.com/my/data
3 getRequestURL() Возвращает URL запроса: http://javarush.com/my/data
4 getQueryString() Возвращает Query, то есть все, что идет после знака ?
5 getParameterMap() Возвращает список параметров запроса
6 getParameter(String name) Возвращает значение параметра по его имени
7 getContentType() Возвращает MimeType request body
8 getReader() Reader, чтобы прочитать request body как текст
9 getInputStream() InputStream, чтобы прочитать request body как byte[]
10 getSession() Возвращает объект HttpSession
11 getCookies() Возвращает массив объектов Cookie[]
12 getHeaderNames() Возвращает список заголовков, только имена
13 getHeader(String name) Возвращает значение заголовка по имени
14 getServletPath() Возвращает часть URL, которая относится к сервлету
15 getContextPath() Возвращает часть URI, которая задает контента запроса

И это даже не все методы…

Хотя после того, как мы изучили протокол HTTP и научились работать с HttpClient’ом, тут уже все более-менее знакомо, не так ли?

Давай напишем сервлет, в который можно передать текст и цвет, а он будет возвращать HTML-страницу с этим текстом, написанным указанным цветом. Как тебе идея?

Начнем с написания своего сервлета:


public class ColorTextServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
          //напишите тут ваш код
    }
}

Теперь нам нужно получить текст и цвет, переданные у URI пользователем:


public class ColorTextServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {

        // Получаем параметр “text” и “color” из запроса
        String text= request.getParameter("text");
        String color = request.getParameter("color");
 
    }
}

И наконец нужно вывести текст в виде HTML. Мы разберем это в следующей лекции, но тут я немного подскажу:


public class ColorTextServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {

        // Получаем параметр “text” и “color” из запроса
        String text = request.getParameter("text");
        String color = request.getParameter("color");


        // Печатаем HTML в качестве ответа для браузера
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out =  response.getWriter();
        try {
            out.println("<html>");
            out.println("<head> <title> ColorTextServlet </title> </head>");
            out.println("<body>");
            out.println("<h1 style="color:"+color+">"+text+"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}



Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Александр Уровень 66
16 января 2025
Подскажите, пожалуйста, где глянуть информацию о том как устанавливать параметры запроса? Тут получают параметры "текст" и "цвет", вот как их установить в запрос изначально?)
Руслан Никитин Уровень 109
10 февраля 2025
на стороне клиента, например так

<form method='POST' action='/test'>
    <input type='text' id='name' name='name' required>
    <button type='submit'>Button</button>
</form>
Yaroslav Уровень 109 Expert
30 мая 2024
Развеивает споры о URL и URI https://youtu.be/AdaXK48broc P.S. В примере всё правильно написано
Vadym Уровень 38
19 января 2024
как правильно считать запрос /?timezone=GMT+2? Получаю вместо "GMT+2" вот это "GMT 2"
Андрей Уровень 109
6 мая 2024
плюс ставится вместо пробела как я понял. я думаю надо экранировать плюс
Алексей Уровень 111 Expert
22 октября 2023
для тех, кто пытается запустить на tomcat 10 и ловит 404, замените везде контекст javax.* на jakarta.*

        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
Дмитрий Саргаев Уровень 76 Expert
1 октября 2023
Так работать код из примера не будет.

out.println("<h1 style="color:"+color+">"+text+"</h1>");
Так будет

out.println("<h1 style=\"color: " + color + "\">" + text + "</h1>");
Rolik Уровень 41
19 августа 2023
HttpServletRequest - интерфейс.
Сергей Филиппов Уровень 2 Expert
27 сентября 2022
Запятая лишняя, вот так работает: out.println("<h1 style=color:" + color + ">" + text + "</h1>");
MineJavaAcc Уровень 42
8 февраля 2023
Наверное, кавычка а не запятая? После style= ?
Vladislav Shamshurin Уровень 1
19 августа 2022
getRequestURI() - Возвращает URI запроса: http://javarush.ru/my/data Должен возвращаться /my/data
Nikita Shamrai Уровень 8 Expert
19 августа 2022
Не уверен, скорее в urL должен возвращаться просто http://javarush.ru
Сергей Уровень 111 Expert
26 октября 2022
Method: GET requestURI: /hello-servlet requestURL: http://localhost:8080/hello-servlet queryString: name=Maxim&userId=123 parameter: Maxim Из такого url: http://localhost:8080/hello-servlet?name=Maxim&userId=123
Anonymous #3322801 Уровень 2 Expert
23 августа 2023
Исходя из вот этой статьи, я думаю правильнее было бы так: requestURI: http://localhost:8080/hello-servlet requestURL: http://localhost:8080/
Aslancheek Уровень 15
10 октября 2023

String uri = request.getRequestURI();
String url = request.getRequestURL().toString();
String query = request.getQueryString();
out.println("<div>URI: " + uri + "</div>");
out.println("<div>URL: " + url + "</div>");
out.println("<div>Query: " + query + "</div>");