Что означает значение <load-on-startup> сервлета


174

Я немного запутался здесь. В нашем приложении мы определили несколько сервлетов. Вот выдержка из 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, но ответы, с которыми я столкнулся, только добавили моего замешательства.

Ответы:


186

Resin 3.0 документирует это поведение:

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

В спецификации JSP 3.1 (JSR 340) это сказано на стр. 14-160:

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

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


Клетус ошибается в своем ответе. Вы должны рассмотреть возможность редактирования поста.
Альбоз

3
Что происходит, когда нагрузка при запуске не указана?
Нирмал

1
@Nirmal Во втором абзаце указано, что если элемент отсутствует, он ведет себя так же, как если бы он был отрицательным, т.е. контейнер может свободно загружать сервлет всякий раз, когда он выбирает.
Финнеган

129

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

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

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


1
И именно поэтому мы помечаем 0 для того, чтобы DispatcherServlet загружал его первым при запуске приложения ..
Счастливчик

11

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

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


7
Ноль также вызывает загрузку. Только отрицательные значения не гарантируются: «[...] Если значение является положительным целым числом или 0, контейнер должен загрузить и инициализировать сервлет при развертывании приложения. [...]"
marabol

1
@cletus Я думаю, что лучше изменить больше нуля с большим или равным нулю , потому что многие пользователи читают ваш ответ, как указано в принятом ответе. Заранее спасибо
Tarik

9

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

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

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

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

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

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

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

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


безупречный ответ!
Гаурав

1

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


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

0

да, он может иметь то же значение .... причина присвоения чисел загрузке при запуске состоит в том, чтобы определить последовательность для загрузки сервером всего сервлета. сервлет с 0 значением загрузки при запуске будет загружаться первым, а сервлет со значением 1 будет загружаться после этого.

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


0

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

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

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

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

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

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


-1

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


-2

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

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


-6

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.