stringtranslate.com

Джакартский сервлет

Жизнь файла JSP

Сервлет 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(). Они реализуются каждым сервлетом и вызываются сервером в определенное время.

Ниже приведен типичный пользовательский сценарий использования этих методов.

  1. Предположим, что пользователь запрашивает посещение URL-адреса .
    • Затем браузер генерирует HTTP-запрос для этого URL-адреса.
    • Затем этот запрос отправляется на соответствующий сервер.
  2. HTTP-запрос принимается веб-сервером и пересылается в контейнер сервлетов.
    • Контейнер сопоставляет этот запрос с конкретным сервлетом.
    • Сервлет динамически извлекается и загружается в адресное пространство контейнера.
  3. Контейнер вызывает init()метод сервлета.
    • Этот метод вызывается только тогда, когда сервлет впервые загружается в память.
    • Можно передать параметры инициализации сервлету, чтобы он мог настроить себя.
  4. Контейнер вызывает service()метод сервлета.
    • Этот метод вызывается для обработки HTTP-запроса.
    • Сервлет может читать данные, предоставленные в HTTP-запросе.
    • Сервлет также может сформулировать HTTP-ответ для клиента.
  5. Сервлет остается в адресном пространстве контейнера и доступен для обработки любых других HTTP-запросов, полученных от клиентов.
    • Метод service()вызывается для каждого HTTP-запроса.
  6. В какой-то момент контейнер может решить выгрузить сервлет из своей памяти.
    • Алгоритмы, по которым принимается это решение, специфичны для каждого контейнера.
  7. Контейнер вызывает метод сервлета, destroy()чтобы освободить любые ресурсы, такие как дескрипторы файлов, выделенные для сервлета; важные данные могут быть сохранены в постоянном хранилище.
  8. Память, выделенная для сервлета и его объектов, затем может быть очищена от мусора.

Пример

Следующий пример сервлета выводит количество вызовов его 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 .

Цитаты

  1. ^ ab Murach & Urban 2014, стр. 170–171, §2 Основные навыки работы с сервлетами и JSP — Перспектива — Резюме.
  2. ^ «Сервлет (API спецификации Java (TM) EE 7)» . oracle.com . Проверено 25 июля 2018 г.
  3. ^ Murach & Urban 2014, стр. 128–129, §2 Основные навыки работы с сервлетами и JSP — Как создать и сопоставить сервлет.
  4. ^ ab «Основы сервлетов — глава 1». novocode.com . Архивировано из оригинала 18 декабря 2017 г.
  5. ^ Murach & Urban 2014, стр. 40–42, §1. Начните правильно — сервлет для внутренней обработки.
  6. ^ Мурач и Урбан 2014, с. 87, §2 Основные навыки работы с сервлетами и JSP.
  7. ^ Мурач и Урбан 2014, с. 74, §1 Начало работы правильно – Другие навыки работы с веб-приложениями.
  8. ^ abc Murach & Urban 2014, стр. 46–47, §1. Начните правильно — JSP для второй страницы.
  9. Фридман, Мэтт (26 июня 1996 г.). «Отчет о конференции JavaOne». JavaWorld .
  10. ^ Диванджи, Павани; Коннелли, Дэйв; Вагл, Прасад (29 мая 1996 г.). «Java-сервер и сервлеты» (PDF) . Серверы и серверные расширения . JavaOne 1996. Архивировано (PDF) из оригинала 16 августа 2000 г. Проверено 01 февраля 2020 г.
  11. Чанг, Фил Индже (1 июля 1997 г.). «Интервью: команда Java Web Server дает вам возможность похудеть». JavaWorld . Проверено 25 июля 2018 г.
  12. Чанг, Фил Индже (1 июня 1997 г.). «Веб-сервер Java поставляется!». JavaWorld . Проверено 25 июля 2018 г.
  13. ^ "История сервлетов | Community.oracle.com" . Веблоги.java.net. 10 декабря 2005 г. Архивировано из оригинала 15 августа 2020 г. Проверено 14 июня 2013 г.
  14. ^ Аб Хантер, Джейсон (март 2000 г.). «Временная шкала сервлетов». За пределами программирования сервлетов на Java . Конференция О'Рейли по Java. О'Рейли Медиа .
  15. ^ "Веб-сервер Java" . Явасофт . Сан Микросистемс . Архивировано из оригинала 11 января 1998 г. Проверено 01 февраля 2020 г.
  16. ^ «Веб-сервер Java (тм)» . Сан Микросистемс . Архивировано из оригинала 6 февраля 2002 г. Проверено 01 февраля 2020 г.
  17. ^ "Павни Диванджи". Институт семейной онлайн-безопасности . Архивировано из оригинала 26 июля 2018 года . Проверено 12 ноября 2016 г.
  18. ^ Патент США 5928323, Гослинг, Джеймс А .; Диванджи, Павни и Коннелли, Дэвид В., «Устройство и метод для динамического генерирования информации с помощью серверных программных объектов», опубликовано 27 июля 1999 г., выпущено 27 июля 1999 г., передано Sun Microsystems. 
  19. ^ «Что нового в Servlet 3.1? - Развитие Java EE 7 (Арун Гупта, Осталось миль ...)» . oracle.com . Проверено 22 ноября 2016 г.
  20. ^ Кроуфорд, Уильям; Хантер, Джейсон (ноябрь 1998 г.). "Предисловие". Программирование сервлетов на Java (1-е изд.). О'Рейли Медиа . п. ix–x. ISBN 978-1-56592-391-1. Мы рассматриваем версию 2.0 API сервлетов, которая была представлена ​​как часть Java Web Server 1.1 в декабре 1997 года и уточнена выпуском Java Servlet Development Kit 2.0 в апреле 1998 года.
  21. ^ Murach & Urban 2014, стр. 160–163, §15 Как разработать сервлет — дополнительные навыки работы с сервлетами.

Рекомендации

Внешние ссылки