Джакартский сервлет
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Оригинальный автор(ы) | Павни Диванджи |
---|---|
Разработчик(и) | Фонд Затмения |
Первоначальный выпуск | декабрь 1996 г |
Стабильная версия | 6.0
/ 31 мая 2022 г |
Репозиторий | |
Написано в | Ява |
Платформа | Джакарта, EE |
Размер | 2,56 МБ |
Тип | Программный компонент для веб-API |
Лицензия | Публичная лицензия Eclipse |
Веб-сайт | Джакарта |
Сервлет Jakarta , ранее известный как Java Servlet, представляет собой Java программный компонент , расширяющий возможности сервера . Хотя сервлеты могут отвечать на многие типы запросов, чаще всего они реализуют веб-контейнеры для размещения веб-приложений на веб-серверах сервлетов на стороне сервера и, таким образом, квалифицируются как веб-API . Такие веб-сервлеты являются Java- аналогом других технологий динамического веб-контента, таких как PHP и ASP.NET .
Введение
[ редактировать ]Джакартский сервлет — это класс Java. [1] в Jakarta EE , который соответствует API сервлетов Jakarta, [2] стандарт реализации классов Java, отвечающих на запросы. Сервлеты в принципе могут взаимодействовать по любому протоколу клиент-сервер , но чаще всего они используются с HTTP . В принципе, любые сервлеты могут расширять GenericServlet
сорт; однако, если говорить реалистично, все сервлеты расширяют возможности HttpServlet
сорт. [3] Таким образом, «сервлет» часто используется как сокращение от «HTTP-сервлет». [4] Таким образом, сервлет можно использовать для добавления динамического контента на веб-сервер с помощью платформы Java . [5] Сгенерированный контент обычно представляет собой HTML , но может представлять собой и другие данные, например XML и, чаще, JSON .
API сервлетов Jakarta в некоторой степени был заменен [ нужна ссылка ] двумя стандартными технологиями Java для веб-сервисов:
- веб -службы Jakarta RESTful (JAX-RS 2.0), полезные для служб AJAX, JSON и REST, и
- Веб-службы Jakarta XML (JAX-WS), полезные для SOAP веб-служб .
А Servlet
— это объект , который получает запрос и генерирует ответ на основе этого запроса. Основной Servlet
Пакет определяет объекты Java для представления запросов и ответов сервлета, а также объекты для отражения параметров конфигурации сервлета и среды выполнения.
сервлетов API , содержащийся в пакетов Java. иерархии javax.servlet
определяет ожидаемое взаимодействие веб-контейнера и сервлета. [4]
Пакет javax.servlet.http
определяет HTTP -специфичные подклассы GenericServlet
. Этот пакет включает объекты управления сеансами, которые отслеживают многочисленные запросы и ответы между веб-сервером и клиентом.
Сервлеты могут поддерживать состояние переменных сеанса во многих серверных транзакциях с помощью файлов cookie HTTP или сопоставления 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 », который является разновидностью модели-представления-контроллера .
История
[ редактировать ]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 .
Версия API сервлета | Выпущенный | Спецификация | Платформа | Важные изменения |
---|---|---|---|---|
Джакартский сервлет 6.0 | 31 мая 2022 г. | 6.0 | Джакарта EE 10 | удалить устаревшие функции и реализовать запрошенные улучшения |
Джакартский сервлет 5.0 | 9 октября 2020 г. | 5.0 | Джакарта ЭЭ 9 | API перенесен из пакета javax.servlet к jakarta.servlet
|
Джакартский сервлет 4.0.3 | 10 сентября 2019 г. | 4.0 | Джакарта EE 8 | Торговая марка переименована из «Java». |
Java-сервлет 4.0 | Сентябрь 2017 г. | ДжСР 369 | Ява ЕЕ 8 | HTTP/2 |
Java-сервлет 3.1 | май 2013 г. | ДжСР 340 | Ява ЕЕ 7 | Неблокирующий ввод-вывод, механизм обновления протокола HTTP ( WebSocket ) [19] |
Java-сервлет 3.0 | декабрь 2009 г. | ДжСР 315 | Ява ЕЕ 6, Ява ЮВ 6 | Возможность подключения, простота разработки, асинхронный сервлет, безопасность, загрузка файлов |
Java-сервлет 2.5 | сентябрь 2005 г. | ДжСР 154 | Java EE 5, Java SE 5 | Требуется Java SE 5, поддерживает аннотации. |
Java-сервлет 2.4 | ноябрь 2003 г. | ДжСР 154 | J2EE 1.4, J2SE 1.3 | web.xml использует схему XML |
Java-сервлет 2.3 | август 2001 г. | ДжСР 53 | J2EE 1.3, J2SE 1.2 | Добавление Filter
|
Java-сервлет 2.2 | август 1999 г. | ДжСР 902 , ДжСР 903 | J2EE 1.2, J2SE 1.2 | Становится частью J2EE, представлены независимые веб-приложения в файлах .war. |
Java-сервлет 2.1 | ноябрь 1998 г. | 2.1а | Не указано | Добавлена первая официальная спецификация RequestDispatcher , ServletContext
|
Java-сервлет 2.0 | декабрь 1997 г. | — | JDK 1.1 | Часть пакета разработки Java Servlet Development Kit 2.0, апрель 1998 г. [20] |
Java-сервлет 1.0 | декабрь 1996 г. | — | Часть пакета разработки Java Servlet Development Kit (JSDK) 1.0, июнь 1997 г. [14] |
Жизненный цикл сервлета
[ редактировать ]Три метода являются центральными в жизненном цикле сервлета. Это init()
, service()
, и destroy()
.
Они реализуются каждым сервлетом и вызываются сервером в определенное время.
- сервлета На этапе инициализации жизненного цикла веб-контейнер инициализирует экземпляр сервлета, вызывая метод
init()
метод, [21] передача объекта, реализующегоjavax.servlet.ServletConfig
интерфейс. Этот объект конфигурации позволяет сервлету получать доступ к параметрам инициализации значения имени из веб-приложения. - После инициализации экземпляр сервлета может обслуживать запросы клиентов. Каждый запрос обслуживается в отдельном потоке. Веб-контейнер вызывает
service()
метод сервлета для каждого запроса.service()
Метод определяет тип отправляемого запроса и отправляет его соответствующему методу для обработки запроса. Разработчик сервлета должен предоставить реализацию этих методов. Если делается запрос на метод, который не реализован сервлетом, вызывается метод родительского класса, что обычно приводит к возврату запрашивающей стороне ошибки. - Наконец, веб-контейнер вызывает метод
destroy()
метод, который выводит сервлет из эксплуатации.destroy()
метод, какinit()
, вызывается только один раз за жизненный цикл сервлета.
Ниже приведен типичный пользовательский сценарий использования этих методов.
- Предположим, что пользователь запрашивает посещение URL-адреса .
- Затем браузер генерирует HTTP-запрос для этого URL-адреса.
- Затем этот запрос отправляется на соответствующий сервер.
- HTTP-запрос принимается веб-сервером и пересылается в контейнер сервлетов.
- Контейнер сопоставляет этот запрос с конкретным сервлетом.
- Сервлет динамически извлекается и загружается в адресное пространство контейнера.
- Контейнер вызывает
init()
метод сервлета.- Этот метод вызывается только тогда, когда сервлет впервые загружается в память.
- Можно передать параметры инициализации сервлету, чтобы он мог настроить себя.
- Контейнер вызывает
service()
метод сервлета.- Этот метод вызывается для обработки HTTP-запроса.
- Сервлет может читать данные, предоставленные в HTTP-запросе.
- Сервлет также может сформулировать HTTP-ответ для клиента.
- Сервлет остается в адресном пространстве контейнера и доступен для обработки любых других HTTP-запросов, полученных от клиентов.
- The
service()
метод вызывается для каждого HTTP-запроса.
- The
- В какой-то момент контейнер может решить выгрузить сервлет из своей памяти.
- Алгоритмы, по которым принимается это решение, специфичны для каждого контейнера.
- Контейнер вызывает сервлет
destroy()
метод освобождения любых ресурсов, таких как дескрипторы файлов, выделенных для сервлета; важные данные могут быть сохранены в постоянном хранилище. - Память, выделенная для сервлета и его объектов, затем может быть очищена от мусора.
Пример
[ редактировать ]Следующий пример сервлета выводит, сколько раз service()
был вызван метод.
Обратите внимание, что HttpServlet
является подклассом GenericServlet
, реализация Servlet
интерфейс.
The service()
метод HttpServlet
класс отправляет запросы методам doGet()
, doPost()
, doPut()
, doDelete()
, и так далее; согласно HTTP-запросу. В примере ниже service()
переопределяется и не различает, какой метод HTTP-запроса он обслуживает.
import java.io.IOException;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class ServletLifeCycleExample extends HttpServlet {
private Integer sharedCounter;
@Override
public void init(final ServletConfig config) throws 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); // accessing a local variable
response.getWriter().flush(); // flush response
}
@Override
public void destroy() {
getServletContext().log("destroy() called");
}
}
Контейнерные серверы
[ редактировать ]Спецификация технологии сервлетов реализована во многих продуктах. См. список реализаций на странице веб-контейнера .
Существуют также другие типы контейнеров сервлетов, например, для SIP-сервлетов, например SailFin .
См. также
[ редактировать ]- Протокол Apache JServ (AJP)
Цитаты
[ редактировать ]- ^ Перейти обратно: а б Murach & Urban 2014 , стр. 170–171, §2 Основные навыки работы с сервлетами и JSP — Перспектива — Резюме.
- ^ «Сервлет (API спецификации Java(TM) EE 7)» . oracle.com . Проверено 25 июля 2018 г.
- ^ Murach & Urban 2014 , стр. 128–129, §2 Основные навыки работы с сервлетами и JSP — Как создать и сопоставить сервлет.
- ^ Перейти обратно: а б «Основы сервлетов — глава 1» . novocode.com . Архивировано из оригинала 18 декабря 2017 г.
- ^ Murach & Urban 2014 , стр. 40–42, §1. Начало работы правильно — сервлет для внутренней обработки.
- ^ Мурач и Урбан 2014 , с. 87, §2 Основные навыки работы с сервлетами и JSP.
- ^ Мурач и Урбан 2014 , с. 74, §1 Начало работы правильно – Другие навыки работы с веб-приложениями.
- ^ Перейти обратно: а б с Murach & Urban 2014 , стр. 46–47, §1. Начните правильно — JSP для второй страницы.
- ^ Фридман, Мэтт (26 июня 1996 г.). «Отчет о конференции JavaOne» . JavaWorld . Архивировано из оригинала 26 июля 2018 г. Проверено 25 июля 2018 г.
- ^ Диванджи, Павани; Коннелли, Дэйв; Вагл, Прасад (29 мая 1996 г.). «Java-сервер и сервлеты» (PDF) . Серверы и серверные расширения . JavaOne 1996. Архивировано (PDF) из оригинала 16 августа 2000 г. Проверено 01 февраля 2020 г.
- ^ Чанг, Фил Индже (1 июля 1997 г.). «Интервью: команда Java Web Server дает вам возможность похудеть» . JavaWorld . Архивировано из оригинала 26 июля 2018 г. Проверено 25 июля 2018 г.
- ^ Чанг, Фил Индже (1 июня 1997 г.). «Веб-сервер Java поставляется!» . JavaWorld . Архивировано из оригинала 26 июля 2018 г. Проверено 25 июля 2018 г.
- ^ «История сервлетов | Community.oracle.com» . Веблоги.java.net. 10 декабря 2005 г. Архивировано из оригинала 15 августа 2020 г. Проверено 14 июня 2013 г.
- ^ Перейти обратно: а б Хантер, Джейсон (март 2000 г.). «Временная шкала сервлетов» . За пределами программирования сервлетов на Java . Конференция О'Рейли по Java. О'Рейли Медиа . [ постоянная мертвая ссылка ]
- ^ «Веб-сервер Java» . Явасофт . Сан Микросистемс . Архивировано из оригинала 11 января 1998 г. Проверено 01 февраля 2020 г.
- ^ «Веб-сервер Java(tm)» . Сан Микросистемс . Архивировано из оригинала 6 февраля 2002 г. Проверено 01 февраля 2020 г.
- ^ «Павни Диванджи» . Институт семейной онлайн-безопасности . Архивировано из оригинала 26 июля 2018 года . Проверено 12 ноября 2016 г.
- ^ патент США 5928323 , Гослинг, Джеймс А .; Диванджи, Павни и Коннелли, Дэвид В., «Устройство и метод для динамического генерирования информации с помощью серверных программных объектов», опубликовано 27 июля 1999 г., выпущено 27 июля 1999 г., передано Sun Microsystems.
- ^ «Что нового в Servlet 3.1? - Развитие Java EE 7 (Арун Гупта, Осталось миль...)» . oracle.com . Проверено 22 ноября 2016 г.
- ^ Кроуфорд, Уильям; Хантер, Джейсон (ноябрь 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 года.
- ^ Murach & Urban 2014 , стр. 160–163, §15 Как разработать сервлет — дополнительные навыки работы с сервлетами.
Ссылки
[ редактировать ]- Мурач, Джоэл; Урбан, Майкл (2014). Java-сервлеты и JSP Мураха . ISBN 978-1-890774-78-3 .