Jakarta Servlet , ранее Java Servlet, — это программный компонент Java , расширяющий возможности сервера . Хотя сервлеты могут отвечать на многие типы запросов, чаще всего они реализуют веб-контейнеры для размещения веб-приложений на веб-серверах и, таким образом, квалифицируются как серверный сервлет веб-API . Такие веб-сервлеты являются аналогом Java для других динамических технологий веб-контента, таких как PHP и ASP.NET .
Jakarta Servlet — это класс Java [1] в Jakarta EE , который соответствует API сервлетов Jakarta, [2] стандарту для реализации классов Java, которые отвечают на запросы. Сервлеты в принципе могут взаимодействовать по любому клиент-серверному протоколу, но чаще всего они используются с HTTP . В принципе, любой сервлет может расширять GenericServlet
класс; однако, говоря реалистично, все сервлеты расширяют класс HttpServlet
. [3] Таким образом, «сервлет» часто используется как сокращение для «HTTP-сервлета». [4] Таким образом, сервлет может использоваться для добавления динамического содержимого на веб-сервер с помощью платформы Java . [5] Сгенерированное содержимое обычно представляет собой HTML , но может быть и другими данными, такими как XML и, что более распространено, JSON .
API Jakarta Servlet в некоторой степени был заменен [ требуется ссылка ] двумя стандартными технологиями Java для веб-сервисов:
A Servlet
— это объект , который получает запрос и генерирует ответ на основе этого запроса. Базовый Servlet
пакет определяет объекты Java для представления запросов и ответов сервлета, а также объекты для отражения параметров конфигурации сервлета и среды выполнения.
API сервлета , содержащийся в иерархии пакетов Javajavax.servlet
, определяет ожидаемые взаимодействия веб-контейнера и сервлета. [4]
Пакет javax.servlet.http
определяет HTTP -специфичные подклассы GenericServlet
. Этот пакет включает объекты управления сеансами, которые отслеживают множественные запросы и ответы между веб-сервером и клиентом.
Сервлеты могут поддерживать состояние в переменных сеанса во многих транзакциях сервера с помощью HTTP-cookie или URL-сопоставления . [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] Это гарантирует, что Servlet
отвечает только за обработку, а JSP отвечает только за представление HTML, [8] обеспечивая четкое разделение задач и соответствие принципу единой ответственности .
Хотя прямое использование сервлетов для генерации HTML (как показано в примере ниже) стало редкостью, веб-фреймворк MVC более высокого уровня в Jakarta EE ( Faces ) по-прежнему явно использует технологию сервлетов для низкоуровневой обработки запросов/ответов через FacesServlet
.
Несколько более старым вариантом использования является использование сервлетов в сочетании с JSP в шаблоне, называемом « Модель 2 », который является разновидностью модели–представления–контроллера .
Java Servlet API был впервые публично анонсирован на первой конференции JavaOne в мае 1996 года. [9] [10] Примерно через два месяца после анонсов на конференции первая публичная реализация была размещена на веб-сайте JavaSoft. Это была первая альфа Java Web Server (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 Community Process .
Три метода являются центральными в жизненном цикле сервлета. Это 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 { private Integer sharedCounter ; @Override public void init ( final ServletConfig config ) выдает ServletException { super . init ( config ); getServletContext (). log ( "init() called" ); sharedCounter = 0 ; } @Override protected void service ( final HttpServletRequest request , final HttpServletResponse response ) throws ServletException , IOException { getServletContext (). log ( "service() called" ); int localCounter ; synchronized ( sharedCounter ) { sharedCounter ++ ; localCounter = sharedCounter ; } response .getWriter (). write ( " Incrementing the count to " + localCounter ); // доступ к локальной переменной response .getWriter (). flush (); // flush response } @Override public void destroy () { getServletContext (). log ( "destroy() вызван" ); } }
Спецификация для технологии Servlet реализована во многих продуктах. Список реализаций см. на странице веб-контейнера .
Существуют также другие типы контейнеров сервлетов, например, для SIP-сервлетов, например, SailFin .
Мы рассматриваем версию 2.0 API сервлетов, которая была представлена как часть Java Web Server 1.1 в декабре 1997 года и уточнена выпуском Java Servlet Development Kit 2.0 в апреле 1998 года.