Эта статья поднимает множество проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалить эти сообщения-шаблоны ) ( Узнайте, как и когда удалить этот шаблон сообщения )
|
Автор (ы) оригинала | Павни Диванджи |
---|---|
Разработчики) | Фонд Затмения |
Первый выпуск | Декабрь 1996 г . |
Стабильный выпуск | 5.0 / 7 сентября 2020 г . |
Репозиторий | |
Написано в | Ява |
Платформа | Jakarta EE 9 |
Размер | 2,56 МБ |
Тип | Программный компонент для веб-API |
Лицензия | Общественная лицензия Eclipse |
Веб-сайт | jakarta |
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 .
Версия API сервлета | Выпущенный | Технические характеристики | Платформа | Важные изменения |
---|---|---|---|---|
Сервлет Джакарта 5.0.0 M1 | 12 июн.2020 г. | 5.0 | Jakarta EE 9 | API перенесен из пакета javax.servlet вjakarta.servlet |
Сервлет Джакарты 4.0.3 | 13 августа 2019 | 4.0 | Джакарта EE 8 | Название переименовано в товарный знак "Java". |
Сервлет Java 4.0 | Сентябрь 2017 | JSR 369 | Java EE 8 | HTTP / 2 |
Сервлет Java 3.1 | Май 2013 | JSR 340 | Java EE 7 | Неблокирующий ввод-вывод, механизм обновления протокола HTTP ( WebSocket ) [14] |
Сервлет Java 3.0 | Декабрь 2009 г. | JSR 315 | Java EE 6, Java SE 6 | Возможность подключения, простота разработки, асинхронный сервлет, безопасность, загрузка файлов |
Сервлет Java 2.5 | Сентябрь 2005 г. | JSR 154 | Java EE 5, Java SE 5 | Требуется Java SE 5, поддерживает аннотации |
Сервлет Java 2.4 | Ноябрь 2003 г. | JSR 154 | J2EE 1.4, J2SE 1.3 | web.xml использует схему XML |
Сервлет Java 2.3 | Август 2001 г. | JSR 53 | J2EE 1.3, J2SE 1.2 | Добавление Filter |
Сервлет Java 2.2 | Август 1999 г. | JSR 902 , JSR 903 | J2EE 1.2, J2SE 1.2 | Становится частью J2EE, представляет независимые веб-приложения в файлах .war. |
Сервлет Java 2.1 | Ноябрь 1998 | 2.1a | Неопределенные | Добавлена первая официальная спецификация RequestDispatcher ,ServletContext |
Сервлет Java 2.0 | Декабрь 1997 г. | N / A | JDK 1.1 | Часть пакета Java Servlet Development Kit 2.0 от апреля 1998 г. [15] |
Сервлет Java 1.0 | Декабрь 1996 г. | N / A | Часть пакета разработки Java Servlet Development Kit (JSDK) 1.0 от июня 1997 г. [9] |
Жизненный цикл сервлета [ править ]
В жизненном цикле сервлета центральное место занимают три метода. Это init()
, service()
и destroy()
. Они реализуются каждым сервлетом и вызываются сервером в определенное время.
- На этапе инициализации жизненного цикла сервлета веб-контейнер инициализирует экземпляр сервлета, вызывая init()метод, передавая объект, реализующий javax.servlet.ServletConfigинтерфейс. Этот объект конфигурации позволяет сервлету получать доступ к параметрам инициализации значения имени из веб-приложения.
- После инициализации экземпляр сервлета может обслуживать клиентские запросы. Каждый запрос обслуживается в отдельном потоке. Веб-контейнер вызывает
service()
метод сервлета для каждого запроса.service()
Метод определяет тип запроса делается и направляет его в соответствующий метод для обработки запроса. Разработчик сервлета должен предоставить реализацию для этих методов. Если запрос сделан для метода, который не реализован сервлетом, вызывается метод родительского класса, что обычно приводит к возврату ошибки запрашивающей стороне. - Наконец, веб-контейнер вызывает
destroy()
метод, который выводит сервлет из строя. Такойdestroy()
методinit()
вызывается только один раз в жизненном цикле сервлета.
Ниже приведен типичный сценарий использования этих методов пользователем.
- Предположим, что пользователь запрашивает посещение URL-адреса .
- Затем браузер генерирует HTTP-запрос для этого URL-адреса.
- Затем этот запрос отправляется на соответствующий сервер.
- HTTP-запрос принимается веб-сервером и пересылается в контейнер сервлета.
- Контейнер отображает этот запрос на конкретный сервлет.
- Сервлет динамически извлекается и загружается в адресное пространство контейнера.
- Контейнер вызывает
init()
метод сервлета.- Этот метод вызывается только при первой загрузке сервлета в память.
- Можно передать сервлету параметры инициализации, чтобы он мог настроить себя.
- Контейнер вызывает
service()
метод сервлета.- Этот метод вызывается для обработки HTTP-запроса.
- Сервлет может читать данные, предоставленные в HTTP-запросе.
- Сервлет также может формировать HTTP-ответ для клиента.
- Сервлет остается в адресном пространстве контейнера и доступен для обработки любых других HTTP-запросов, полученных от клиентов.
service()
Метод вызывается для каждого запроса HTTP.
- В какой-то момент контейнер может решить выгрузить сервлет из своей памяти.
- Алгоритмы, по которым принимается это решение, индивидуальны для каждого контейнера.
- Контейнер вызывает метод сервлета,
destroy()
чтобы освободить любые ресурсы, такие как дескрипторы файлов, которые выделены для сервлета; важные данные могут быть сохранены в постоянном хранилище. - Затем память, выделенная для сервлета и его объектов, может быть удалена сборщиком мусора.
Пример [ править ]
В следующем примере сервлет печатает, сколько раз 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 { private Integer 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 (). журнал ( "Вызывается уничтожить ()" ); } }
Контейнерные серверы [ править ]
Спецификация технологии сервлетов реализована во многих продуктах. См. Список реализаций на странице веб-контейнера .
Ссылки [ править ]
- ^ "Сервлет (API спецификации Java (TM) EE 7)" . oracle.com . Проверено 25 июля 2018 .
- ^ a b «Основы сервлетов - Глава 1» . novocode.com . Архивировано из оригинала на 2017-12-18.
- ^ https://jcp.org/en/jsr/detail?id=369
- ^ Фридмана, Мэтт (26 июня 1996). «Отчет о конференции JavaOne» . JavaWorld .
- ^ Диванджи, Павани; Коннелли, Дэйв; Вагл, Прасад (29 мая 1996 г.). «Сервер Java и сервлеты» (PDF) . Серверы и серверные расширения . JavaOne 1996. Архивировано (PDF) из оригинала 16 августа 2000 года . Проверено 1 февраля 2020 .
- ↑ Чанг, Фил Индже (1 июля 1997 г.). «Интервью: команда Java Web Server дает вам худые результаты» . JavaWorld . Проверено 25 июля 2018 .
- ↑ Чанг, Фил Индже (1 июня 1997 г.). "Java Web Server отгружается!" . JavaWorld . Проверено 25 июля 2018 .
- ^ "История сервлетов | community.oracle.com" . Weblogs.java.net. 2005-12-10 . Проверено 14 июня 2013 .
- ^ a b Хантер, Джейсон (март 2000 г.). «Хронология сервлета» . Помимо программирования сервлетов Java . Конференция О'Рейли по Java. O'Reilly Media .
- ^ "Веб-сервер Java" . Javasoft . Sun Microsystems . Архивировано 11 января 1998 года . Проверено 1 февраля 2020 .
- ^ "Веб-сервер Java (tm)" . Sun Microsystems . Архивировано 6 февраля 2002 года . Проверено 1 февраля 2020 .
- ^ "Павни Диванджи" . Институт семейной онлайн-безопасности . Проверено 12 ноября +2016 .
- ^ Патент США 5928323 , Гослинг, Джеймс А .; Павни Диванджи и Дэвид В. Коннелли, "Устройство и метод для динамического генерирования информации с помощью программных объектов на стороне сервера", опубликовано 27 июля 1999 г., выпущено 27 июля 1999 г., передано Sun Microsystems
- ^ «Что нового в Servlet 3.1? - Java EE 7 движется вперед (Арун Гупта, осталось еще много миль ...)» . oracle.com . Проверено 22 ноября +2016 .
- ^ Кроуфорд, Уильям; Хантер, Джейсон (ноябрь 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