Сервлет Jakarta , ранее известный как Java Servlet, представляет собой программный компонент Java , расширяющий возможности сервера . Хотя сервлеты могут отвечать на многие типы запросов, чаще всего они реализуют веб-контейнеры для размещения веб-приложений на веб-серверах и, таким образом, квалифицируются как веб-API сервлетов на стороне сервера . Такие веб-сервлеты являются Java- аналогом других технологий динамического веб-контента, таких как PHP и ASP.NET .
Сервлет Jakarta — это класс Java [1] в Jakarta EE , который соответствует API сервлетов Jakarta, [2] стандарту для реализации классов Java, отвечающих на запросы. Сервлеты в принципе могут взаимодействовать по любому протоколу клиент-сервер , но чаще всего они используются с HTTP . В принципе, любые сервлеты могут расширять GenericServlet
класс; однако, если говорить реалистично, все сервлеты расширяют HttpServlet
класс. [3] Таким образом, «сервлет» часто используется как сокращение от «HTTP-сервлет». [4] Таким образом, сервлет можно использовать для добавления динамического контента на веб-сервер с использованием платформы Java . [5] Сгенерированный контент обычно представляет собой HTML , но может представлять собой и другие данные, такие как XML и, чаще, JSON .
API сервлетов Jakarta в некоторой степени был заменен двумя стандартными технологиями Java для веб-сервисов:
A Servlet
— это объект , который получает запрос и генерирует ответ на основе этого запроса. Базовый Servlet
пакет определяет объекты Java для представления запросов и ответов сервлета, а также объекты для отражения параметров конфигурации сервлета и среды выполнения.
API сервлетов , содержащийся в иерархии пакетов Javajavax.servlet
, определяет ожидаемые взаимодействия веб-контейнера и сервлета. [4]
Пакет javax.servlet.http
определяет специфичные для HTTP подклассы GenericServlet
. Этот пакет включает объекты управления сеансами, которые отслеживают многочисленные запросы и ответы между веб-сервером и клиентом.
Сервлеты могут поддерживать состояние переменных сеанса во многих серверных транзакциях с помощью файлов cookie HTTP или сопоставления URL-адресов . Приложение может отслеживать сеансы и файлы cookie, используя сеансы и файлы cookie. [6] Существует несколько способов создания и сопоставления URL-адресов сервлета. До спецификации сервлета 3.0 (Tomcat 7.0) настройка web.xml для сопоставления сервлета с URL-адресом была единственным вариантом. Для приложений, использующих спецификацию сервлета 3.0 или более поздней версии, аннотацию @WebServlet
можно использовать для сопоставления любого сервлета с одним или несколькими шаблонами URL-адресов.
Сервлеты могут быть упакованы в файл WAR как веб-приложение . [7]
Веб -контейнер необходим для развертывания и запуска сервлета. Веб-контейнер (также известный как контейнер сервлетов) по сути является компонентом веб-сервера, который взаимодействует с сервлетами. [1] Веб-контейнер отвечает за управление жизненным циклом сервлетов, сопоставление URL-адреса с конкретным сервлетом и обеспечение того, чтобы инициатор запроса URL-адреса имел правильные права доступа.
Сервлеты могут генерироваться автоматически из Jakarta Server Pages (JSP) компилятором Jakarta Server Pages . Разница между сервлетами и JSP заключается в том, что сервлеты обычно встраивают HTML в код Java, а JSP встраивают код Java в HTML. В общем, при использовании JSP встраивание кода Java в JSP считается плохой практикой. [8] Вместо этого лучшим подходом было бы перенести внутреннюю логику из JSP в код Java в формате Servlet
. [8] Это гарантирует, что JSP Servlet
отвечает только за обработку, а JSP отвечает только за представление HTML, [8] обеспечивая четкое разделение задач и соответствие принципу единой ответственности .
Хотя прямое использование сервлетов для генерации HTML (как показано в примере ниже) стало редким, веб-инфраструктура MVC более высокого уровня в Jakarta EE ( Faces ) по-прежнему явно использует технологию сервлетов для низкоуровневой обработки запросов/ответов через FacesServlet
.
Несколько более старый вариант использования — использование сервлетов в сочетании с JSP в шаблоне под названием « Модель 2 », который является разновидностью модели-представления-контроллера .
API сервлетов Java был впервые публично анонсирован на первой конференции JavaOne в мае 1996 года. [9] [10] Примерно через два месяца после анонсов на конференции первая публичная реализация была размещена на веб-сайте JavaSoft. Это была первая альфа-версия веб-сервера Java (JWS; тогда известного под кодовым названием Jeeves ) [11] , который в конечном итоге был выпущен как продукт 5 июня 1997 года. [12]
В своем блоге на java.net ветеран Sun и руководитель GlassFish Джим Дрисколл подробно описывает историю технологии сервлетов. [13] Джеймс Гослинг впервые подумал о сервлетах на заре Java , но эта концепция не стала продуктом до декабря 1996 года, когда Sun выпустила JWS. [14] [15] [16] Это было до того, как то, что сейчас называется Jakarta EE, было включено в спецификацию.
Спецификация Servlet1 была создана Павни Диванджи [17] [18] , когда она работала в Sun Microsystems , а версия 1.0 была завершена в июне 1997 года. Начиная с версии 2.2, спецификация разрабатывалась в рамках процесса сообщества Java .
Три метода являются центральными в жизненном цикле сервлета. Это init()
, service()
, и destroy()
. Они реализуются каждым сервлетом и вызываются сервером в определенное время.
service()
метод сервлета для каждого запроса. Метод service()
определяет тип отправляемого запроса и отправляет его соответствующему методу для обработки запроса. Разработчик сервлета должен предоставить реализацию этих методов. Если делается запрос на метод, который не реализован сервлетом, вызывается метод родительского класса, что обычно приводит к возврату запрашивающей стороне ошибки.destroy()
метод, который выводит сервлет из эксплуатации. Этот destroy()
метод, как и init()
, вызывается только один раз за жизненный цикл сервлета.Ниже приведен типичный пользовательский сценарий использования этих методов.
init()
метод сервлета.service()
метод сервлета.service()
вызывается для каждого HTTP-запроса.destroy()
чтобы освободить любые ресурсы, такие как дескрипторы файлов, выделенные для сервлета; важные данные могут быть сохранены в постоянном хранилище.Следующий пример сервлета выводит количество вызовов его service()
метода.
Обратите внимание, что HttpServlet
это подкласс GenericServlet
реализации интерфейса Servlet
.
Метод service()
класса HttpServlet
отправляет запросы методам doGet()
, doPost()
, doPut()
, doDelete()
и т. д.; согласно HTTP-запросу. В приведенном ниже примере service()
переопределяется и не различается, какой метод HTTP-запроса он обслуживает.
импортировать java.io.IOException ; импортировать jakarta.servlet.ServletConfig ; импортировать jakarta.servlet.ServletException ; импортировать jakarta.servlet.http.HttpServlet ; импортировать jakarta.servlet.http.HttpServletRequest ; импортировать jakarta.servlet.http.HttpServletResponse ; общественный класс ServletLifeCycleExample расширяет HttpServlet { частное IntegersharedCounter ; @Override public void init ( окончательная конфигурация ServletConfig ) выдает ServletException { super . инициализация ( конфигурация ); getServletContext (). log ( "Вызов init()" ); общийсчетчик = 0 ; } Служба @Override protected void ( окончательный запрос HttpServletRequest , окончательный ответ HttpServletResponse ) выдает ServletException , IOException { getServletContext (). log ( "Вызов службы()" ); int localCounter ; синхронизировано ( sharedCounter ) { sharedCounter ++ ; localCounter = общий счетчик ; } ответ . getWriter (). write ( "Увеличение счетчика до" + localCounter ); // доступ к локальной переменной response . getWriter (). румянец (); // сбрасываем ответ } @Override public void уничтожить () { getServletContext (). log ( "Вызов Destroy()" ); } }
Спецификация технологии сервлетов реализована во многих продуктах. См. список реализаций на странице веб-контейнера .
Существуют также другие типы контейнеров сервлетов, например, для SIP-сервлетов, например SailFin .
Мы рассматриваем версию 2.0 API сервлетов, которая была представлена как часть Java Web Server 1.1 в декабре 1997 года и уточнена выпуском Java Servlet Development Kit 2.0 в апреле 1998 года.