stringtranslate.com

Сервлет Джакарта

Жизнь JSP- файла

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

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

  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 { 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 .

Смотрите также

Цитаты

  1. ^ ab Murach & Urban 2014, стр. 170–171, §2 Основные навыки работы с сервлетами и JSP — Перспектива — Резюме.
  2. ^ "Servlet (спецификация API Java(TM) EE 7)". oracle.com . Получено 25.07.2018 .
  3. ^ Murach & Urban 2014, стр. 128–129, §2 Основные навыки работы с сервлетами и JSP — Как создать и сопоставить сервлет.
  4. ^ ab "Servlet Essentials - Глава 1". novocode.com . Архивировано из оригинала 2017-12-18.
  5. ^ Murach & Urban 2014, стр. 40–42, §1 Начните правильно — сервлет для внутренней обработки.
  6. ^ Murach & Urban 2014, стр. 87, §2 Основные навыки работы с сервлетами и JSP.
  7. ^ Murach & Urban 2014, стр. 74, §1 Начните правильно — Другие навыки работы с веб-приложениями.
  8. ^ abc Murach & Urban 2014, стр. 46–47, §1 Начните правильно — JSP для второй страницы.
  9. Freedman, Matt (26 июня 1996 г.). "Отчет о конференции JavaOne". JavaWorld . Архивировано из оригинала 2018-07-26 . Получено 2018-07-25 .
  10. ^ Диванджи, Павани; Коннелли, Дэйв; Вейгл, Прасад (29 мая 1996 г.). "Java Server and Servlets" (PDF) . Серверы и серверные расширения . JavaOne 1996. Архивировано (PDF) из оригинала 2000-08-16 . Получено 2020-02-01 .
  11. Chang, Phil Inje (1 июля 1997 г.). «Интервью: команда Java Web Server дает вам скудный материал». JavaWorld . Архивировано из оригинала 2018-07-26 . Получено 2018-07-25 .
  12. Chang, Phil Inje (1 июня 1997 г.). «Java Web Server ships!». JavaWorld . Архивировано из оригинала 2018-07-26 . Получено 2018-07-25 .
  13. ^ "История сервлета | community.oracle.com". Weblogs.java.net. 2005-12-10. Архивировано из оригинала 2020-08-15 . Получено 2013-06-14 .
  14. ^ ab Хантер, Джейсон (март 2000 г.). "Хронология сервлетов". Beyond Java Servlet Programming . Конференция O'Reilly по Java. O'Reilly Media .[ постоянная мертвая ссылка ]
  15. ^ "Java Web Server". Javasoft . Sun Microsystems . Архивировано из оригинала 11.01.1998 . Получено 01.02.2020 .
  16. ^ "Java Web Server(tm)". Sun Microsystems . Архивировано из оригинала 2002-02-06 . Получено 2020-02-01 .
  17. ^ "Pavni Diwanji". Институт безопасности семьи в Интернете . Архивировано из оригинала 26 июля 2018 года . Получено 12 ноября 2016 года .
  18. ^ Патент США 5928323, Гослинг, Джеймс А.; Диванджи, Павни и Коннелли, Дэвид У., «Устройство и метод динамической генерации информации с использованием объектов серверного программного обеспечения», опубликовано 27 июля 1999 г., выдано 27 июля 1999 г., передано Sun Microsystems 
  19. ^ "Что нового в Servlet 3.1? - Java EE 7 движется вперед (Арун Гупта, Miles to go ...)". oracle.com . Получено 22 ноября 2016 г. .
  20. ^ Кроуфорд, Уильям; Хантер, Джейсон (ноябрь 1998 г.). «Предисловие». Java Servlet Programming (1-е изд.). O'Reilly Media . стр. 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 Как разработать сервлет — Дополнительные навыки работы с сервлетами.

Ссылки

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