Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Java Servlet API )
Перейти к навигации Перейти к поиску
Срок службы файла JSP

Jakarta Servlet (ранее Java Servlet) является Java - компонент программного обеспечения , который расширяет возможности на сервере . Хотя сервлеты могут отвечать на многие типы запросов, они чаще всего реализуют веб-контейнеры для размещения веб-приложений на веб-серверах и, таким образом, квалифицируются как веб-API сервлетов на стороне сервера . Такие веб-сервлеты являются эквивалентом Java для других технологий динамического веб-контента, таких как PHP и ASP.NET .

Введение [ править ]

Сервлет Jakarta обрабатывает или сохраняет класс Java в Jakarta EE, который соответствует API сервлета Jakarta [1], стандарту для реализации классов Java, отвечающих на запросы. Сервлеты могут в принципе взаимодействовать по любому протоколу клиент-сервер , но чаще всего они используются с HTTP . Таким образом, «сервлет» часто используется как сокращение для «HTTP-сервлета». [2] Таким образом, разработчик программного обеспечения может использовать сервлет для добавления динамического содержимого на веб-сервер с помощью платформы Java . Сгенерированный контент обычно представляет собой HTML , но может быть и другими данными, такими как XML.и чаще JSON. Сервлеты могут поддерживать состояние в переменных сеанса во многих серверных транзакциях с помощью файлов cookie HTTP или сопоставления URL-адресов .

Jakarta Servlet API в некоторой степени заменен двумя стандартными технологиями Java для веб-сервисов:

  • Jakarta RESTful Web Services (JAX-RS 2.0) полезно для AJAX, JSON и услуг REST, и
  • Jakarta XML Web Services (JAX-WS) полезно для SOAP веб - служб .

Чтобы развернуть и запустить сервлет, необходимо использовать веб-контейнер . Веб-контейнер (также известный как контейнер сервлетов) - это, по сути, компонент веб-сервера, который взаимодействует с сервлетами. Веб-контейнер отвечает за управление жизненным циклом сервлетов, сопоставление URL-адреса с конкретным сервлетом и обеспечение того, чтобы инициатор запроса URL имел правильные права доступа.

Сервлета API - , содержится в пакете Java иерархии javax.servlet, определяет ожидаемые взаимодействия веб - контейнера и сервлета. [2]

A Servlet- это объект, который получает запрос и генерирует ответ на основе этого запроса. Базовый пакет сервлета определяет объекты Java для представления запросов и ответов сервлета, а также объекты для отражения параметров конфигурации сервлета и среды выполнения. Пакет javax.servlet.httpопределяет специфичные для HTTP подклассы общих элементов сервлета, включая объекты управления сеансом, которые отслеживают несколько запросов и ответов между веб-сервером и клиентом. Сервлеты могут быть упакованы в файл WAR как веб-приложение .

Сервлеты могут автоматически создаваться из Jakarta Server Pages (JSP) компилятором Jakarta Server Pages . Разница между сервлетами и JSP заключается в том, что сервлеты обычно встраивают HTML в код Java, а JSP встраивают код Java в HTML. Хотя прямое использование сервлетов для генерации HTML (как показано в приведенном ниже примере) стало редкостью, веб-фреймворк MVC более высокого уровня в Jakarta EE ( JSF ) по-прежнему явно использует технологию сервлетов для обработки запросов / ответов низкого уровня через FacesServlet. Несколько более старое использование - использование сервлетов в сочетании с JSP в шаблоне, называемом « Модель 2 », который является разновидностью контроллера модель – представление – контроллер .

Текущая версия сервлета 4.0. [3]

История [ править ]

Java Servlet API был впервые публично объявлен на первой конференции JavaOne в мае 1996 года. [4] [5] Примерно через два месяца после анонса на конференции первая публичная реализация была размещена на веб-сайте JavaSoft. Это была первая альфа-версия Java Web Server (JWS; тогда известная под кодовым названием Jeeves ) [6], которая в конечном итоге будет выпущена как продукт 5 июня 1997 г. [7]

В своем блоге на java.net , ветеран Sun и руководитель GlassFish Джим Дрисколл подробно рассказывает об истории технологии сервлетов. [8] Джеймс Гослинг впервые подумал о сервлетах на заре Java , но эта концепция не стала продуктом до декабря 1996 года, когда Sun выпустила JWS. [9] [10] [11] Это было до того, как то, что сейчас называется Jakarta EE, было преобразовано в спецификацию.

Спецификация Servlet1 была создана Павни Диванджи [12] [13], когда она работала в Sun Microsystems , а версия 1.0 была завершена в июне 1997 года. Начиная с версии 2.2, спецификация разрабатывалась в рамках процесса сообщества Java .

Жизненный цикл сервлета [ править ]

В жизненном цикле сервлета центральное место занимают три метода. Это init(), service()и destroy(). Они реализуются каждым сервлетом и вызываются сервером в определенное время.

  • На этапе инициализации жизненного цикла сервлета веб-контейнер инициализирует экземпляр сервлета, вызывая init()метод, передавая объект, реализующий javax.servlet.ServletConfigинтерфейс. Этот объект конфигурации позволяет сервлету получать доступ к параметрам инициализации значения имени из веб-приложения.
  • После инициализации экземпляр сервлета может обслуживать запросы клиентов. Каждый запрос обслуживается в отдельном потоке. Веб-контейнер вызывает service()метод сервлета для каждого запроса. service()Метод определяет тип запроса делается и направляет его в соответствующий метод для обработки запроса. Разработчик сервлета должен предоставить реализацию для этих методов. Если запрос сделан для метода, который не реализован сервлетом, вызывается метод родительского класса, что обычно приводит к возврату ошибки запрашивающей стороне.
  • Наконец, веб-контейнер вызывает destroy()метод, который выводит сервлет из строя. destroy()Метод, как init(), вызывается только один раз в жизненном цикле сервлета.

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

  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-запроса он обслуживает.

import  java.io.IOException ;import  javax.servlet.ServletConfig ; import  javax.servlet.ServletException ; import  javax.servlet.http.HttpServlet ; import  javax.servlet.http.HttpServletRequest ; import  javax.servlet.http.HttpServletResponse ;открытый  класс  ServletLifeCycleExample  расширяет  HttpServlet  { частное  целое число  sharedCounter ; @Override  public  void  init ( окончательная  конфигурация ServletConfig  ) выбрасывает ServletException { super . init ( конфигурация ); getServletContext (). журнал ( "init () вызван" ); sharedCounter = 0 ; }          @Override  защищен  недействительная  служба ( окончательный  HttpServletRequest  запрос ,  окончательный  HttpServletResponse  ответ )  бросает  ServletException ,  IOException  {  getServletContext (). журнал ( "сервис () вызван" );  int  localCounter ; синхронизированный  ( sharedCounter )  {  sharedCounter ++ ;  localCounter  =  sharedCounter ;  } ответ . getWriter (). write ( "  Увеличение счетчика до" +  localCounter );  // доступ к локальной переменной  } @Override  public  void  destroy ()  {  getServletContext (). журнал ( "Вызывается уничтожить ()" );  } }

Контейнерные серверы [ править ]

Спецификация технологии сервлетов реализована во многих продуктах. См. Список реализаций на странице веб-контейнера .

Ссылки [ править ]

  1. ^ "Сервлет (API спецификации Java (TM) EE 7)" . oracle.com . Проверено 25 июля 2018 .
  2. ^ a b «Основы сервлетов - Глава 1» . novocode.com . Архивировано из оригинала на 2017-12-18.
  3. ^ https://jcp.org/en/jsr/detail?id=369
  4. ^ Фридман, Мэтт (26 июня 1996 г.). «Отчет о конференции JavaOne» . JavaWorld .
  5. ^ Диванджи, Павани; Коннелли, Дэйв; Вагл, Прасад (29 мая 1996 г.). «Сервер Java и сервлеты» (PDF) . Серверы и серверные расширения . JavaOne 1996. Архивировано (PDF) из оригинала 16 августа 2000 года . Проверено 1 февраля 2020 .
  6. Чанг, Фил Индж (1 июля 1997 г.). «Интервью: команда Java Web Server дает вам худые результаты» . JavaWorld . Проверено 25 июля 2018 .
  7. Чанг, Фил Индже (1 июня 1997 г.). "Java Web Server поставляется!" . JavaWorld . Проверено 25 июля 2018 .
  8. ^ "История сервлетов | community.oracle.com" . Weblogs.java.net. 2005-12-10 . Проверено 14 июня 2013 .
  9. ^ a b Хантер, Джейсон (март 2000 г.). «Хронология сервлета» . За пределами программирования сервлетов Java . Конференция О'Рейли по Java. O'Reilly Media .
  10. ^ "Веб-сервер Java" . Javasoft . Sun Microsystems . Архивировано 11 января 1998 года . Проверено 1 февраля 2020 .
  11. ^ "Веб-сервер Java (tm)" . Sun Microsystems . Архивировано 6 февраля 2002 года . Проверено 1 февраля 2020 .
  12. ^ "Павни Диванджи" . Институт семейной онлайн-безопасности . Проверено 12 ноября +2016 .
  13. ^ Патент США 5928323 , Гослинг, Джеймс А .; Павни Диванджи и Дэвид В. Коннелли, "Устройство и метод для динамического генерирования информации с помощью программных объектов на стороне сервера", опубликовано 27 июля 1999 г., выпущено 27 июля 1999 г., передано Sun Microsystems 
  14. ^ «Что нового в Servlet 3.1? - Java EE 7 движется вперед (Арун Гупта, осталось еще много миль ...)» . oracle.com . Проверено 22 ноября +2016 .
  15. ^ Кроуфорд, Уильям; Хантер, Джейсон (ноябрь 1998 г.). "Предисловие". Программирование сервлетов Java (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 года.

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Servlets.com