Почему веб-контейнер может управлять сервлетом?
Добрый день.
Почему жизненным циклом HTTP-сервлета может управлять WEB-контейнер?
WEB-сервер (например, Apache Tomcat) может захватывать HTTP-запрос от клиента, обрабатывать и отвечать HTTP-ответом; сервлету нужен веб-контейнер (например, снова Apache Tomcat), потому что он не имеет основного, поэтому мы можем рассматривать механизм сервлета как "главный", который инициализирует сервлет (в двух словах).
Хорошо! Теперь я не понимаю, почему это возможно. Когда клиент отправляет HTTP-запрос, если это первый вызов этого сервлета, веб-контейнер вызывает init(). Затем он позволяет вызывать doGet, doPost(и другие методы). Наконец сервлет уничтожается [destroy()]. Но как веб-контейнер сделать это? Что происходит внутри двигателя сервлета?
****************************************EDIT*******************************************
Мой вопрос говорит о причине, по которой механизм сервлета может управлять циклом сервлета. Ответ действительно прост. Механизм сервлета может управлять циклом сервлета (поэтому он может автоматически вызывать методы create(), service() и destroy ()), поскольку сервлет имеет открытый интерфейс javax.Servlet.servlet. Этот интерфейс объявляет методы, которые имеют семантическое, точное значение:
create() is used just to create servlet
service() is used to handle HTTP methods
destroy() is used to delete the servlet
Программисты могут переопределить эти методы, но они должны уважать семантику метода.
2 ответа
Стандарт Java 2 EE описывает, как различные части веб-приложения играют вместе. В двух словах:
- Ваш проект скомпилирован в WAR-файлы с определенной разметкой. Этот архив содержит код вашего приложения и все зависимости.
- Сервлеты должны зарегистрироваться в файле
web.xml
которая является частью архива WAR - Сервлет - это класс Java, который реализует
HttpServlet
API. - Когда контейнер загружает WAR, он создает специальный загрузчик классов, который может загружать все содержащиеся в нем классы.
- Когда клиент запрашивает конкретный URL, контейнер просматривает
web.xml
найти сервлет, который может обработать запрос. - Когда сервлет найден, контейнер использует загрузчик классов и параметры из
web.xml
загрузить класс и создать экземпляр. - Когда экземпляр существует, он вызывает метод, соответствующий запросу.
- Затем метод подготовит результат.
- Если что-то пойдет не так, контейнер подготовит ответ об ошибке.
Контейнер сервлета:
- сохраните список всех развернутых сервлетов в войне (класс сервлетов должен быть объявлен в специальном файле с именем web.xml в войне. Обратите внимание, что, поскольку в отличие от web.xml, можно использовать аннотацию сервлета 3.0).
- следите за правилами отображения URL-адресов (URL-адрес должен обрабатываться Servlet abc,...). Эти сопоставления также определены в web.xml.
- может создать новый экземпляр сервлета: он использует динамический вызов для создания экземпляра, а затем вызывает для него метод init().
Когда приходит HTTP-запрос:
- контейнер сервлетов создает объекты HttpServletRequest (на основе полученного HTTP-запроса) и HttpServletResponse.
- контейнер сервлетов посмотрите на URL, чтобы увидеть, какой сервлет с ним справится. (Если сервлет никогда не вызывался ранее, он создается и инициализируется). Когда сервлет готов (после возврата вызова init()): контейнер вызывает
doGet(...)
или жеdoPost(...)
или... сервлета. (аргументы - только что созданные HttpServletRequest и HttpServletResponse)
Примечание: это действительно обзор системы. Многие детали опущены, такие как servletFilters, управление пулом потоков, проблемы загрузчика классов,...