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

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

Открыта

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, 18:54
а зачем 2 почти одинаковые таблички с повторяющимися методами? Или я чего-то не понимаю...
Дмитрий
Уровень 117
Expert
8 октября 2023, 05:48
Не правильно указаны типы передаваемых параметров у методов класса HttpServlet. Должны быть HttpServletRequest, HttpServletResponse из пакета jakarta.servlet.http. Классы HttpRequest, HttpResponse находятся в пакете java.net.http и относятся к построению запроса со стороны клиента.
Нейросеть
Уровень 41
20 октября 2023, 15:46
Причём только в таблицах
Дмитрий Саргаевco-founder в formatiqa.comExpert
1 октября 2023, 13:53
При всем моем почтении к javarush, множественное число у слова "сервер" = "серверы", так же, как и у договора = договоры. Аж глаз дергается, когда читаю.
Дмитрий Попов
Уровень 24
27 марта 2024, 09:44
А сплошь и рядом во всех статьях и курсах употребляющееся слово "байт" (множественного числа родительного падежа) глаз не режет?
Олег
Уровень 111
Expert
4 августа 2023, 08:23
Метод 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, 17:10
Любой кто смотрел мультфильмы про Тома и Джерри и находится в здравом уме и твердой памяти назвал бы свой проект JerryMouse, а поскольку это не так, то версия происхождения имени очевидно неверна.
Максим Мамчур
Уровень 110
18 мая 2023, 21:09
Завжди вболівав за Тома. А взагалі подобалось спостерігати, коли вони дружили))
Max Dudin
Уровень 6
Expert
1 июля 2023, 21:57
Так вооот же... И я о том. Grumman F-14 должен был быть JerryMouse'ом
Pixta
Уровень 108
Expert
12 августа 2022, 01:39
По факту названия Tomcat в честь персонажа мультсериала не нашел никакой информации. Однако, исходя официального вики tomcat Как Tomcat получил свое название? Джеймс Дункан Дэвидсон придумал "Tomcat", поскольку животное представляло собой нечто, что могло позаботиться о себе и постоять за себя. Вот так он придумал это имя. В других источниках говорится, что было оказано влияние трудов выпуска O'Reilly, имеющие на своих обложках животных. Он был этим так воодушевлен, что хотел тоже выпустить похожее. wikipedia трактует, что термин "Tomcat" происходит от литературного персонажа XVIII века, кота по имени Том. Поискав в интернете, нашел полное название The Life and Adventures of a Cat (1760)
Nikita Shamrai Backend Developer Expert
18 августа 2022, 16:23
Интересно сделать такой же ресерч на тему почему Сервлет называется Сервлет
Pixta
Уровень 108
Expert
18 августа 2022, 17:20
Так и появляется осмысление слов. Потом еще аплеты, портлеты))
Anonymous #2436575Android Developer в AllPets
6 сентября 2022, 08:47
Вообще tomcat называют толстых, мощных котов, чаще всего уличных, по которому сразу видно что в драках они явно на районе главные. Потому что общее cat нейтрально по полу и не конкретно. По крайней мере так мне объяснял муж-канадец) P.S а домашних ухоженных кошек и котят(реже) называют kittycat)
Владимир
Уровень 108
16 марта 2023, 08:18
server - сервер servlet - мини сервер
Max Dudin
Уровень 6
Expert
1 июля 2023, 22:00
Спасибо/благодарю... теперь таки стало понятно что к чему.