Почему веб-контейнер может управлять сервлетом?

Добрый день.
Почему жизненным циклом 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, управление пулом потоков, проблемы загрузчика классов,...

Другие вопросы по тегам