Что означает значение сервлета <загрузка при запуске> - PullRequest
169 голосов
/ 01 мая 2009

Я немного запутался здесь. В нашем приложении мы определили несколько сервлетов. Вот выдержка из web.xml для одного из сервлетов:

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

Насколько я понимаю, значение для <load-on-startup> должно быть положительным целым числом, чтобы оно автоматически загружалось. Я посмотрел в Google, но ответы, с которыми я столкнулся, только добавили моего замешательства.

Ответы [ 11 ]

178 голосов
/ 01 мая 2009

Смола 3.0 документирует это поведение:

load-on-startup может указать (необязательное) целочисленное значение. Если значение равно 0 или больше, указывает порядок загрузки сервлетов, получают сервлеты с большими номерами загружается после сервлетов с меньшими номерами.

Спецификация JSP 3.1 (JSR 340) говорит об этом на стр. 14-160:

Элемент load-on-startup указывает, что этот сервлет должен быть загружен (создан и иметь его init () вызывается при запуске веб-приложения. Содержание элемента этого Элемент должен быть целым числом, указывающим порядок, в котором сервлет должен быть загружен. Если значение является отрицательным целым числом или элемент отсутствует, Контейнер может свободно загружать сервлет в любое время. Если значение является положительным целое число или 0, контейнер должен загрузить и инициализировать сервлет, как приложение развертывается. Контейнер должен гарантировать, что сервлеты помечены нижними целыми числами загружаются перед сервлетами, отмеченными более высокими целыми числами. Контейнер может выбрать порядок загрузки сервлетов с тем же значением load-on-startup.

Возможно, вы хотите проверить не только JSR, но и документацию для вашего веб-контейнера. Там могут быть различия

128 голосов
/ 19 августа 2009

Краткий ответ : значение> = 0 означает, что сервлет загружается при развертывании веб-приложения или при запуске сервера. значение <0: сервлет загружается всякий раз, когда контейнер чувствует себя как. </p>

Длинный ответ (из спецификации):

Элемент загрузки при запуске указывает, что это сервлет должен быть загружен (создан и иметь вызывается его init () при запуске сети приложение. Необязательное содержание этих Элемент должен быть целым числом, указывающим порядок в какой сервлет должен быть загружен. Если значение является отрицательным целым числом, или элемент не В настоящее время контейнер может загрузить сервлет всякий раз, когда он выбирает. Если значение является положительным 128 целое число или 0, контейнер должен загрузить и инициализировать сервлет как приложение развертывается. Контейнер должен гарантировать, что загружаются сервлеты, помеченные нижними целыми числами перед сервлетами отмечены более высокие целые числа. Контейнер может выбрать порядок загрузки сервлеты с одинаковым значением загрузки при запуске.

11 голосов
/ 01 мая 2009

Указывает, что сервлет не будет запущен, пока запрос не попытается получить к нему доступ.

Если загрузка при запуске больше или равна нулю, то при запуске контейнера этот сервлет запустится в порядке возрастания значения загрузки при запуске, которое вы там указали (то есть 0, 1, затем 2, 5, затем 10 и и так далее.

7 голосов
/ 01 мая 2009

Жизненный цикл сервлета

Жизненный цикл сервлета контролируется контейнером, в котором был развернут сервлет. Когда запрос отображается на сервлет, контейнер выполняет следующие шаги.

  1. Если экземпляр сервлета не существует, веб-контейнер:

    a. Загружает класс сервлета

    b. Создает экземпляр класса сервлета

    c. Инициализирует экземпляр сервлета, вызывая метод init (инициализация рассматривается в Создание и инициализация сервлета )

  2. Контейнер вызывает метод service, передавая объекты запроса и ответа. Методы обслуживания обсуждаются в Написание методов обслуживания .

Значение 0 в load-on-startup означает, что точка 1 выполняется, когда запрос поступает к этому сервлету. Другие значения означают, что точка 1 выполняется при запуске контейнера.

1 голос
/ 14 марта 2013
  1. Если значение для двух сервлетов одинаково, они будут загружены в том порядке, в котором они объявлены в файле web.xml.
  2. если равно 0 или отрицательное целое число, чем сервлет будет загружен, когда контейнер захочет их загрузить.
  3. гарантирует загрузку, инициализацию и вызов метода init () сервлета через веб-контейнер.
  4. Если для какого-либо сервлета нет элемента, он будет загружен, когда веб-контейнер решит их загрузить.
1 голос
/ 20 декабря 2011

Как указано в другом ответе, и эта статья загрузки при запуске ноль является приемлемой, и в отсутствие любого другого сервлета это будет иметь приоритет при загрузке и загрузке во время развертывания. Лучше всего использовать статовую загрузку для загрузки сервлетов, для инициализации которых требуется больше времени, прежде чем поступит первый запрос, как сервлеты, которые создают пул соединений или выполняют сетевой вызов или удерживают громоздкие ресурсы, что значительно сократит время ответа на первые несколько запросов.

0 голосов
/ 22 ноября 2012

Это просто, как вы даже не ожидаете.

Если значение положительное, оно загружается при запуске контейнера

Если значение не является положительным, сервлет загружается при выполнении запроса.

0 голосов
/ 10 февраля 2012

-> (Отсутствие загрузки при запуске) Прежде всего, когда сервлет развертывается на сервере, сервер несет ответственность за создание объекта сервлета. Например: предположим, что сервлет развернут на сервере, (объект сервлета недоступен на сервере) клиент отправляет запрос сервлету в первый раз, после чего сервер создает объект сервлета с помощью конструктора по умолчанию и немедленно вызывает init (). Из этого, когда клиент отправляет запрос, будет запущен только сервисный метод, так как объект уже доступен

Если в дескрипторе развертывания используется тег загрузки при запуске: Во время самого развертывания сервер создает объект сервлета для сервлетов на основе положительного значения, предоставленного между тегами. Создание объектов для классов сервлетов будет следовать из 0-128 Сначала будет создан 0-значный номер сервлета, а затем другие номера.

Если мы предоставим одинаковое значение для двух сервлетов в web.xml, то создание объектов будет выполнено на основе положения классов в web.xml, которое также варьируется от сервера к серверу.

Если мы предоставим отрицательное значение между тегом загрузки при запуске, сервер не создаст объект сервлета.

Другие сценарии, когда сервер создает объект для сервлета.

Если мы не используем тег загрузки при запуске в web.xml, то проект развертывается, когда клиент отправляет запрос в первый раз, когда сервер создает объект, а сервер отвечает за вызов его методов жизненного цикла. Затем, если .class был изменен на сервере (tomcat). клиент снова отправляет запрос на модифицированный сервлет, но в случае tomcat новый объект не создается, и сервер использует существующий объект, пока не произойдет перезапуск сервера. Но в классе веб-логики, когда когда-либо .class-файл изменяется на сервере без перезапуска сервера, если он получает запрос, то сервер вызывает метод destroy для существующего сервлета и создает новый объект сервлета и вызывает init () для его инициализации .

0 голосов
/ 30 августа 2011

Если значение <0, сервлет создается при получении запроса, в противном случае> = 0 контейнер будет загружаться в порядке возрастания значений. если 2 или более сервлета имеют одинаковое значение, то порядок сервлетов объявлен в файле web.xml.

0 голосов
/ 01 апреля 2011

Контейнер сервлета загружает сервлет во время запуска или при выполнении первого запроса. Загрузка сервлета зависит от атрибута «загрузка при запуске» в файле «web.xml». Если атрибут имеет положительное целое число (от 0 до 128), то сервлет загружается вместе с загрузкой контейнера, в противном случае он загружается при поступлении первого запроса на обслуживание.

Когда сервлет загружается после получения запроса, он называется «Ленивая загрузка».

...