Баннер мобильный (1) Пройти тест

Сервлет

Глоссарий

26 марта 2023

Поделиться

Скопировано

Содержание

    Сервлет — это специальный интерфейс в языке программирования Java, который нужен для обмена информацией между серверной и клиентской частью программы. Сервлет размещается на сервере, принимает запросы от клиента и отправляет на них ответы. Он управляет общением между разными частями приложения.

    В языке есть Java Servlet API — он описывает работу с запросами и ответами на них. Чтобы части приложения могли обмениваться информацией, разработчик создает сервлет — подпрограмму, которая управляет этим обменом.

    Для чего нужны сервлеты

    Писать простые программы, которые выводят информацию в консоль и не работают с вебом, можно без сервлетов. Но для приложений с клиент-серверной архитектурой они нужны: это основной механизм, по которому в Java общаются клиент и сервер.

    Сервлеты позволяют:

    • создавать динамические страницы — те, на которые контент подгружается «на лету»;
    • запрашивать информацию у базы данных и получать ответ;
    • собирать сведения от пользователей через формы для записей;
    • выводить сообщения в ответ на запрос и делать многое другое.

    В Java есть и другие механизмы для общения между клиентом и сервером, но ими пользуются реже. Сервлеты — более стандартное решение, и любой разработчик на Java должен уметь с ними работать.

    Как работает сервлет

    Типичное веб-приложение состоит из клиентской и серверной части. Клиентская часть — это та, через которую работает пользователь. Серверная — та, где хранится информация и выполняются вычисления. Она скрыта от пользователя: он получает доступ к сведениям оттуда через клиент.

    Чтобы приложение работало как следует, нужно, чтобы клиент и сервер сообщались друг с другом. Обычно для этого используют механику «запрос-ответ»: клиент запрашивает у сервера что-то, тот обрабатывает запрос и выдает на него нужный ответ. Именно эту механику реализуют сервлеты.

    image-5038867
    Как работает сервлет

    Разработчик создает класс сервлета в коде и описывает, что он должен делать при получении того или иного запроса. После этого код сервлета загружается на сервер. Там специальное ПО создает экземпляр сервлета, и тот начинает обрабатывать запросы. Если сервлет перестает быть нужен, это же ПО удаляет работающий экземпляр.

    Что нужно, чтобы сервлеты функционировали

    Сервлет — это просто код, в котором описано, как сервер будет отвечать на запросы. Чтобы он работал, нужно специальное программное обеспечение. Оно называется контейнером сервлетов. Это оно занимается созданием экземпляров и их удалением.

    Контейнер устанавливается на сервере. Он может работать как полноценный веб-сервер или как надстройка к нему — зависит от реализации. Его основная задача — поддерживать работу сервлетов: получать их, запускать, следить за исполнением, а при необходимости уничтожать. Он же помогает сервлету обмениваться данными с клиентом: устанавливает соединение, запускает среду для выполнения кода и делает многое другое.

    image-8406013
    Процесс взаимодействия

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

    Популярный контейнер для работы с сервлетами — Apache Tomcat. Он работает с веб-сервером Apache, одним из самых распространенных в мире. Большинство примеров и туториалов по сервлетам написаны именно под Tomcat.

    Как контейнер работает с сервлетом

    Контейнер получает сервлет и загружает его. Сервлет выглядит как класс: блок кода, который описывает объект, но еще им не является. Класс похож на схему, по которой нужно «собрать» объект. Именно это делает контейнер: после загрузки сервлета он создает его работающий экземпляр.

    Для предварительной настройки, или инициализации, экземпляра контейнер вызывает специальный метод init(). Он стандартный и отвечает за приведение сервлета в рабочее состояние: открытие дополнительных файлов, соединение с нужными сервисами и так далее. Что именно входит в эту настройку, прописывает разработчик в специальном объекте ServletConfig.

    После выполнения метода init() сервлет готов к работе. Теперь если он получит какой-нибудь запрос, то сможет его обработать. Этим экземпляр и занимается все то время, в течение которого работает.

    Если сервлет больше не нужен, контейнер уничтожает работающий экземпляр. Для этого он вызывает специальный метод destroy(). При этом сам класс остается в контейнере — при необходимости он сможет создать новый экземпляр.

    image-4029351
    Как контейнер работает с сервлетом

    Как обрабатываются запросы

    Когда сервлету приходит новый запрос, контейнер вызывает для него специальный метод service(). Внутри этого метода определяется, к какому типу относится запрос, а значит, на какой метод сервлета его нужно перенаправить. Дальше все зависит от того, умеет ли сервлет обрабатывать этот тип.

    • Если у сервлета есть метод для такого запроса, он выполняется — программа делает то, что должна.
    • Если разработчик не прописал метод для этого типа запроса, сервлет пользуется стандартным — тем, который для таких запросов описан в родительском классе. Чаще всего после этого он возвращает ошибку исполнения.

    Сервлеты работают многопоточно. Для каждого запроса создается свой поток — отдельно выполняющаяся последовательность действий. Потоки независимы друг от друга и разделены на уровне системы. Такой подход позволяет серверу работать быстрее и обрабатывать несколько запросов одновременно. Иначе приходилось бы ждать, пока сервер завершит работу с предыдущим запросом, и все бы постоянно «зависало».

    image-1813067
    Как обрабатываются запросы

    Что такое портлеты

    Есть еще одна похожая технология — портлеты. Для них есть свои контейнеры, они тоже размещаются на сервере и выполняют определенные задачи. Более того: портлеты основаны на сервлетах и расширяют их возможности.

    Основное отличие — портлетов на одной странице может быть несколько, и каждый из них отвечает за свою задачу. А сервлет на странице всегда один. Это происходит, потому что сервлет должен работать с веб-документом целиком, а портлет — только с его частью. Поэтому портлеты можно представить как «кирпичики», из которых складывается функциональность страницы.

    Портлеты несколько отличаются от сервлетов по функциональности. Они гибче, поэтому в некоторых задачах предпочитают использовать их — это оказывается удобнее. Но в целом Java-разработчики пользуются обоими инструментами.

    Как создать свой первый сервлет

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

    Установить ПО. Сначала нужно установить на своей рабочей машине нужное ПО, то есть контейнер сервлетов. Самый популярный из них — Tomcat, он есть в свободном доступе, и его можно скачать с официального сайта. Кроме того, вам понадобится сборщик проектов Maven и среда разработки. Стандартно для Java используется Intellij IDEA, но для веб-приложений понадобится ее Ultimate Edition, она платная. Впрочем, есть бесплатная версия в раннем доступе, а также 30-дневная пробная версия стабильного выпуска.

    Создать проект в Maven. Maven — это инструмент, который собирает проекты на Java в единую систему. Без него работать с языком очень сложно. Он помогает автоматически создавать структуру проекта, сам подключает нужные библиотеки и зависимости, делает многое другое. Проект с сервлетами рекомендуют создавать с его помощью.

    Прописать зависимости. Для создания сервлетов нужно подключить к коду компонент, который их описывает, — Java Servlet API. В проектах на Maven это делается в отдельном файле pom.xml. Кроме того, понадобится подключить архивацию WAR — это формат архива для веб-приложений.

    Написать код сервлета. В отдельном файле нужно написать класс, который относится к интерфейсу сервлета. Это только звучит страшно: на самом деле достаточно прописать в качестве «родителя» класса стандартный HttpServlet. Внутри этого класса будет код сервлета.

    Перед классом понадобится прописать аннотацию @WebServlet(), а в скобках указать адрес для сервлета. Например, так: @WebServlet(«/firstservlet») — название может быть любым. Это называется маппингом — с его помощью сервер поймет, по какому адресу обращаться к нужному сервлету.

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

    Вообще-то у стандартного класса HttpServlet уже есть такие методы: к ним сервлет обратится, если разработчик не напишет свой код для обработки. Но мы уже говорили: такое обращение обычно завершается ошибкой и в любом случае не делает ничего полезного. Поэтому, чтобы код выполнял нужные вам действия, методы нужно переопределить.

    Написанный код нужно скомпилировать и поместить в архив WAR. В этом поможет Maven.

    Создать конфигурацию контейнера. Когда сервлет будет готов, понадобится сконфигурировать контейнер. Это можно сделать через среду разработки: в меню есть список доступных компонентов, понадобится выбрать там нужный сервер и создать его экземпляр. Для тестирования сервер можно запустить на собственном компьютере через localhost — так в сетевых технологиях называется локальное устройство.

    Еще при создании конфигурации нужно выбрать сервлет, который будет выполняться на сервере. Для этого нужно собрать файл, где вы писали код, в архив — это можно сделать через Maven, — а потом выбрать его из списка. В Intellij IDEA это делается с помощью кнопки Fix.

    Запустить и протестировать код. Понадобится указать URL, по которому будет доступен сервлет. Обычно он такой: ключевое слово localhost, номер порта для доступа через двоеточие, а затем после слэша / — маппинг, который вы указали при создании сервлета. Пример адреса — http://localhost:8080/firstservlet.

    Затем можно нажать кнопку запуска в среде разработки и посмотреть, выполнится ли код. Если маппинг указан неправильно, браузер покажет ошибку 404, потому что сервер не найдет сервлет по нужному адресу. Но если все хорошо, экземпляр сервлета создастся и запустится.

    Поделиться

    Скопировано

    0 комментариев

    Комментарии