JavaRush /Курсы /JSP & Servlets /Знакомство с сервлетами

Знакомство с сервлетами

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

1.1 interface Servlet

Сегодня начинаем новую и интересную тему — cервлеты. Именно добавление сервлетов в Java привело к тому, что Java сейчас — де-факто стандарт для больших серверных приложений. 80% всего корпоративного ПО в мире пишется на Java. А в Китае так и все 100%. Так что же такое сервлеты?

Сервлет — это именно то, что превращает Java-программу в веб-сервис и позволяет ей обрабатывать запросы от клиентов. А дело было так…

В 90-е годы, сразу после появления всемирной паутины, появились веб-клиенты (браузеры) и веб-сервера. Веб-сервера обычно просто раздавали через интернет файл, которые у них хранились: html-страницы, скрипты, картинки и т. п.

В какой-то момент все пришли к выводу, что нужно бы сделать обе стороны поумнее. В HTML-страницы добавили JavaScript, а серверам добавили плагины — специальные скрипты, которые вызывались в ответ на определенные запросы и позволяли сделать поведение сервера гибче и умнее.

Так вот сервлет — это такой Java-плагин, который встраивался в Java веб-сервер и позволял ему выполнять Java-код при запросе на определенные страницы. А уже этот Java-код, представленный классом, унаследованным от класса Servlet, делал то, что задумали его разработчики.

И как ты уже знаешь, самый популярный Java веб-сервер — это Tomcat. Названный, кстати, в честь кота Тома из мультфильма “Том и Джери”.

Как же Tomcat взаимодействует с сервлетами? На самом деле этот процесс стандартизирован и называется жизненным циклом сервлета. В нем сервлет — это загружаемый объект, а веб-сервер — это контейнер сервлетов.

Если сервлет еще не загружен, то:

  1. Класс сервлета загружается контейнером.
  2. Контейнер создает экземпляр класса (объект) сервлета.
  3. Контейнер вызывает метод init() у объекта сервлета. Метод вызывается только один раз.

Стандартный цикл работы — обслуживание клиентского запроса:

  • Каждый запрос обрабатывается в отдельном потоке.
  • Контейнер вызывает метод service() у сервлета и передает туда объекты ServletRequest и ServletResponse.
  • Для завершения работы сервлета вызывается метод destroy() у объекта сервлета. Вызывается он всего один раз.

Причин завершения работы сервлета может быть очень много:

  • Программист перезапускает веб-сервер, нужно корректно завершить работу всех сервлетов.
  • Программист загружает новую версию сервлета, старую нужно правильно выгрузить.
  • И так далее.

Запомни главное: веб-сервер и его сервлеты должны без сбоев и перезагрузки работать месяцами, обслуживая тысячи запросов в минуту. Поэтому код и загрузки, и работы, и выгрузки сервлета всегда нужно писать очень качественно.

1.2 Класс HttpServlet

Класс Servlet существует для стандартизации работы сервлета и контейнера. Непосредственно с этим классом программисты не работают. Ну или работают очень редко. Чаще всего используется класс HttpServlet, унаследованный от Servlet’а.

У этого класса есть несколько методов, которые нам пригодятся. Ты будешь часто их использовать:

Метод Описание
1 init() Вызывается один раз при загрузке сервлета
2 destroy() Вызывается один раз при выгрузке сервлета
3 service(HttpRequest, HttpResponse) Вызывается для каждого нового запроса к сервлету
4 doGet(HttpRequest, HttpResponse) Вызывается для каждого нового GET-запроса к сервлету
5 doPost(HttpRequest, HttpResponse) Вызывается для каждого нового POST-запроса к сервлету
6 doHead(HttpRequest, HttpResponse) Вызывается для каждого нового HEAD-запроса к сервлету
7 doDelete(HttpRequest, HttpResponse) Вызывается для каждого нового DELETE-запроса к сервлету
8 doPut(HttpRequest, HttpResponse) Вызывается для каждого нового PUT-запроса к сервлету

Методы init() и destroy() унаследованы от класса Servlet. Поэтому если ты решишь переопределить их в своем сервлете, тебе нужно будет так же вызвать их реализацию из базового класса. Для этого используется команда super.имяМетода().

Пример сервлета:


public class FirstHttpServlet extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // Получаем параметр “secret” из запроса
        String secret = request.getParameter("secret");
 
        // Кладем параметр “secret” в Http-сессию
        HttpSession session = request.getSession(true);
        session.setAttribute("secret", secret);
 
        // Печатаем HTML в качестве ответа для браузера
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Заголовок</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Пример сервлета "+ secret +"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

1.3 Метод service(HttpServletRequest, HttpServletResponse)

Если смотреть на обработку клиентского запроса с точки зрения сервлета, то дела обстоят примерно так.

Для каждого клиентского запроса контейнер (веб-сервер) создает объекты HttpServletRequest и HttpServletResponse, а затем вызывает метод service(HttpServletRequest request, HttpServletResponse response) у соответствующего сервлета. В него передаются эти объекты, чтобы метод мог взять нужные данные из request’а и положить результат работы в response.

У метода service() есть реализация по умолчанию. Если ее не переопределить, то выполняться будет именно она. Вот что он делает.

Метод service() определяет из request’а тип HTTP-метода (GET, POST, …) и вызывает метод соответствующий запросу.

Метод Описание
1 service(HttpRequest, HttpResponse) Вызывается для каждого нового запроса к сервлету
2 doGet(HttpRequest, HttpResponse) Вызывается для каждого нового GET-запроса к сервлету
3 doPost(HttpRequest, HttpResponse) Вызывается для каждого нового POST-запроса к сервлету
4 doHead(HttpRequest, HttpResponse) Вызывается для каждого нового HEAD-запроса к сервлету
5 doDelete(HttpRequest, HttpResponse) Вызывается для каждого нового DELETE-запроса к сервлету
6 doPut(HttpRequest, HttpResponse) Вызывается для каждого нового PUT-запроса к сервлету

В своем классе ты можешь или переопределить один метод service(), или не трогать его, но тогда переопределять методы doGet(), doPost(), … по необходимости.

Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Мая Уровень 82
22 октября 2025
а зачем 2 почти одинаковые таблички с повторяющимися методами? Или я чего-то не понимаю...
Дмитрий Уровень 117 Expert
8 октября 2023
Не правильно указаны типы передаваемых параметров у методов класса HttpServlet. Должны быть HttpServletRequest, HttpServletResponse из пакета jakarta.servlet.http. Классы HttpRequest, HttpResponse находятся в пакете java.net.http и относятся к построению запроса со стороны клиента.
Нейросеть Уровень 41
20 октября 2023
Причём только в таблицах
Дмитрий Саргаев Уровень 76 Expert
1 октября 2023
При всем моем почтении к javarush, множественное число у слова "сервер" = "серверы", так же, как и у договора = договоры. Аж глаз дергается, когда читаю.
Дмитрий Попов Уровень 24
27 марта 2024
А сплошь и рядом во всех статьях и курсах употребляющееся слово "байт" (множественного числа родительного падежа) глаз не режет?
Олег Уровень 111 Expert
4 августа 2023
Метод service(HttpServletRequest request, HttpServletResponse response) является одним из ключевых методов в интерфейсе javax.servlet.Servlet и является центральной точкой входа для всех запросов к сервлету. Основные моменты, связанные с этим методом: Контейнер сервлета вызывает метод service при каждом запросе к сервлету. Это означает, что каждый раз, когда клиент отправляет HTTP-запрос на сервлет, контейнер вызывает этот метод для обработки запроса. Метод получает объекты запроса и ответа - HttpServletRequest и HttpServletResponse. Эти объекты предоставляют доступ к информации о запросе и позволяют формировать ответ, который будет отправлен обратно клиенту. В методе service не прописывается конкретная логика обработки запроса. Вместо этого, он определяет тип запроса (например, GET, POST и т.д.) и вызывает соответствующий метод типа, такой как doGet() или doPost(). Разделение ответственности позволяет отделить обработку типа запроса от более общей логики в методе service(). Таким образом, service() отвечает за определение типа запроса, а конкретная логика реализуется в методах типа, например, doGet(), doPost() и т.д. По умолчанию, в классе HttpServlet, реализация метода service() просто вызывает соответствующий метод типа (например, doGet(), doPost() и т.д.) в зависимости от типа запроса. Переопределяя метод service() в своем сервлете, можно изменить эту логику. Например, можно проводить предварительную обработку запроса перед вызовом конкретного метода типа.
hint1k Уровень 51
2 мая 2023
Любой кто смотрел мультфильмы про Тома и Джерри и находится в здравом уме и твердой памяти назвал бы свой проект JerryMouse, а поскольку это не так, то версия происхождения имени очевидно неверна.
Максим Мамчур Уровень 110
18 мая 2023
Завжди вболівав за Тома. А взагалі подобалось спостерігати, коли вони дружили))
Max Dudin Уровень 6 Expert
1 июля 2023
Так вооот же... И я о том. Grumman F-14 должен был быть JerryMouse'ом
Pixta Уровень 108 Expert
12 августа 2022
По факту названия Tomcat в честь персонажа мультсериала не нашел никакой информации. Однако, исходя официального вики tomcat Как Tomcat получил свое название? Джеймс Дункан Дэвидсон придумал "Tomcat", поскольку животное представляло собой нечто, что могло позаботиться о себе и постоять за себя. Вот так он придумал это имя. В других источниках говорится, что было оказано влияние трудов выпуска O'Reilly, имеющие на своих обложках животных. Он был этим так воодушевлен, что хотел тоже выпустить похожее. wikipedia трактует, что термин "Tomcat" происходит от литературного персонажа XVIII века, кота по имени Том. Поискав в интернете, нашел полное название The Life and Adventures of a Cat (1760)
Nikita Shamrai Уровень 8 Expert
18 августа 2022
Интересно сделать такой же ресерч на тему почему Сервлет называется Сервлет
Pixta Уровень 108 Expert
18 августа 2022
Так и появляется осмысление слов. Потом еще аплеты, портлеты))
Anonymous #2436575 Уровень 29
6 сентября 2022
Вообще tomcat называют толстых, мощных котов, чаще всего уличных, по которому сразу видно что в драках они явно на районе главные. Потому что общее cat нейтрально по полу и не конкретно. По крайней мере так мне объяснял муж-канадец) P.S а домашних ухоженных кошек и котят(реже) называют kittycat)
Владимир Уровень 108
16 марта 2023
server - сервер servlet - мини сервер
Max Dudin Уровень 6 Expert
1 июля 2023
Спасибо/благодарю... теперь таки стало понятно что к чему.