Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top