Що означає значення сервлета <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

Смола 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

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

Довга відповідь (від специфікації):

Елемент "навантаження при запуску" вказує на те, що цей сервлет повинен бути завантажений (інстанціюватись і викликати його init ()) при запуску веб-програми. Необов'язковий вміст цього елемента повинен бути цілим числом, що вказує на порядок завантаження сервлета. Якщо значення - це від'ємне ціле число, або елемент відсутній, контейнер вільний завантажувати сервлет, коли він вибере. Якщо значення дорівнює 128 цілому чи 0, контейнер повинен завантажувати та ініціалізувати сервлет під час розгортання програми. Контейнер повинен гарантувати, що сервлети, позначені нижчими цілими числами, завантажуються перед сервлетами, позначеними більшими цілими числами. Контейнер може вибрати порядок завантаження сервлетів з тим самим значенням навантаження при запуску.


1
І тому ми позначаємо 0 для Inpass DispatcherServlet, щоб завантажити його спочатку при запуску програми ..
Пощастило

11

Це вказує, що сервлет не буде запущений, поки запит не спробує отримати доступ до нього.

Якщо завантаження при запуску більше або дорівнює нулю, тоді, коли контейнер запускається, він запустить цей сервлет у порядку зростання навантаження за значенням запуску, яке ви ставите туди (тобто 0, 1, 2, потім 5, 10 і так далі) .


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

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

9

Життєвий цикл Сервлета

Життєвим циклом сервлета керує контейнер, в якому сервлет розміщений. Коли запит відображається на сервлеті, контейнер виконує наступні дії.

  1. Якщо екземпляр сервлета не існує, веб-контейнер:

    а. Завантажує клас сервлетів

    б. Створює екземпляр класу сервлетів

    c. Ініціалізує екземпляр сервлета шляхом виклику методу init (ініціалізація розглянута у розділі Створення та ініціалізація сервлета )

  2. Контейнер викликає метод обслуговування, передаючи об'єкти запиту та відповіді. Способи обслуговування обговорюються в Написанні методів обслуговування .

Значення 0 load-on-startupозначає, що точка 1 виконується, коли запит надходить до цього сервлета. Інші значення означають, що точка 1 виконується при запуску контейнера.


бездоганна відповідь!
gaurav

1

Як зазначено в іншій відповіді, та ця нульова стаття при запуску є нульовою, і за відсутності будь-якого іншого сервлету це матиме пріоритет при завантаженні та завантаженні під час розгортання. Найкращим використанням статусу завантаження є завантаження сервлетів, що займає більше часу, щоб ініціалізуватися задовго до появи першого запиту, як сервлети, які створюють пул з'єднань або здійснюють мережевий дзвінок або утримують об'ємний ресурс, це значно скоротить час відповіді на перші кілька запитів.


1
  1. Якщо значення для двох сервлетів однакове, вони будуть завантажені в порядку, за яким вони оголошені у файлі web.xml.
  2. якщо 0 або від'ємне ціле число, ніж Servlet буде завантажено, коли контейнер відчуває, що їх завантажує.
  3. гарантує завантаження, ініціалізацію та виклик сервіту методом init () через веб-контейнер.
  4. Якщо для жодного сервлета немає елемента, він буде завантажений, коли веб-контейнер вирішить їх завантажити.

0

так, це може мати однакове значення .... причиною надання чисел для завантаження при запуску є визначення послідовності для сервера для завантаження всіх сервлетів. сервлет зі значенням 0 навантаження при запуску завантажиться першим, а сервлет зі значенням 1 завантажиться після цього.

якщо два сервлети будуть мати однакове значення для завантаження при запуску, ніж воно буде завантажено, як вони оголошені в web.xml зверху вниз. сервлет, який з’явиться першим у web.xml, буде завантажений першим, а другий буде завантажений після цього.


0

-> (Відсутність тегу при завантаженні при запуску) Перш за все коли сервер розгортається на сервері, сервер несе відповідальність за створення об'єкта сервлетів. Напр .: Припустимо, сервлет розгорнуто на сервері (серверний об’єкт недоступний на сервері) клієнт вперше надсилає запит сервлету, потім сервер створює сервлет-об’єкт за допомогою конструктора за замовчуванням і негайно викликає init (). З того часу, коли клієнт коли-небудь надсилає запит, буде виконаний лише метод обслуговування, оскільки об'єкт вже доступний

Якщо тег завантаження при запуску використовується в дескрипторі розгортання: Під час самого розгортання сервер створює сервлет-об’єкт для сервлетів на основі позитивного значення, що міститься між тегами. Створення об'єктів для класів сервлетів буде випливати з 0-128 0 номер сервлета буде створено першим, а за ним інші числа.

Якщо ми надаємо однакове значення для двох сервлетів у web.xml, то створення об’єктів буде здійснюватися на основі положення класів у web.xml також змінюється від сервера до сервера.

Якщо ми надаємо від'ємне значення між тегом завантаження при запуску, то сервер не зможе створити сервлет-об'єкт.

Інші сценарії, де сервер створює об'єкт для сервлета.

Якщо ми не використовуємо навантаження при запуску тегу в web.xml, проект розгортається, коли колись клієнт надсилає запит вперше, коли сервер створює об'єкт, і сервер відповідає за виклик методів його життєвого циклу. Тоді якщо .class буде змінено на сервері (tomcat). знову клієнт надсилає запит на модифікований сервлет, але у випадку tomcat новий об'єкт не буде створений і сервер використовує існуючий об'єкт, якщо не відбудеться перезапуск сервера. Але в класі веб-логіки коли-небудь файл .class змінюється на сервері з перезапуском сервера, якщо він отримує запит, тоді сервер викликає метод знищення на існуючому сервлеті та створює новий об’єкт сервлетів і викликає init () для його ініціалізації .


-1

Якщо значення <0, серлет екземплярується при надходженні запиту, інакше> = 0 контейнер завантажується у порядку зростання значень. якщо 2 або більше сервлетів мають однакове значення, то порядок сервлетів, оголошених у web.xml.


-2

Контейнер сервлетів завантажує сервлет під час запуску або при першому запиті. Завантаження сервлета залежить від атрибута "load-on-startup" у файлі "web.xml". Якщо атрибут має ціле число (0 до 128), сервлет завантажується з завантаженням контейнера, інакше він завантажується, коли перший запит надходить на обслуговування.

Коли сервлет завантажується, коли він отримує запит, він називається "Ледаче завантаження".


-6

Це просто, як ви навіть не очікуєте.

Якщо значення додатне, воно завантажується під час запуску контейнера

Якщо значення не є позитивним, серлет завантажується під час подання запиту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.