Was bedeutet der Servlet-Wert <load-on-startup>?


174

Ich bin hier etwas verwirrt. In unserer Anwendung sind einige Servlets definiert. Hier ist der Auszug aus dem web.xmlfür eines der Servlets:

<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> 

Nach meinem Verständnis muss der Wert für das <load-on-startup>eine positive ganze Zahl sein, damit es automatisch geladen wird. Ich habe bei Google nachgeschlagen, aber die Antworten, auf die ich gestoßen bin, haben nur zu meiner Verwirrung beigetragen.

Antworten:


186

Resin 3.0 dokumentiert dieses Verhalten:

Beim Start kann ein (optionaler) ganzzahliger Wert angegeben werden. Wenn der Wert 0 oder höher ist, gibt dies eine Reihenfolge für das Laden von Servlets an. Servlets mit höheren Nummern werden nach Servlets mit niedrigeren Nummern geladen.

Die JSP 3.1-Spezifikation (JSR 340) sagt dies auf Seite 14-160:

Das Element load-on-startupgibt an, dass dieses Servlet beim Start der Webanwendung geladen (instanziiert und mit init () aufgerufen) werden soll. Der Elementinhalt dieses Elements muss eine Ganzzahl sein, die die Reihenfolge angibt, in der das Servlet geladen werden soll. Wenn der Wert eine negative Ganzzahl ist oder das Element nicht vorhanden ist, kann der Container das Servlet jederzeit laden. Wenn der Wert eine positive Ganzzahl oder 0 ist, muss der Container das Servlet laden und initialisieren, wenn die Anwendung bereitgestellt wird. Der Container muss sicherstellen, dass Servlets mit niedrigeren Ganzzahlen geladen werden, bevor Servlets mit höheren Ganzzahlen markiert werden. Der Container kann die Reihenfolge des Ladens von Servlets mit demselben load-on-startupWert wählen .

Sie möchten wahrscheinlich nicht nur die JSR, sondern auch die Dokumentation für Ihren Webcontainer überprüfen. Es kann Unterschiede geben


Cletus ist in seiner Antwort falsch. Sie sollten in Betracht ziehen, den Beitrag zu bearbeiten.
Alboz

3
Was passiert, wenn beim Laden keine Last angegeben ist?
Nirmal

1
@Nirmal Der zweite Absatz gibt an, dass das Element, wenn es nicht vorhanden ist, dasselbe Verhalten aufweist, als wäre es negativ, dh der Container kann das Servlet jederzeit laden, wenn er dies wünscht.
Finnegan

129

Kurze Antwort : Wert> = 0 bedeutet, dass das Servlet geladen wird, wenn die Web-App bereitgestellt wird oder wenn der Server gestartet wird. Wert <0: Servlet wird geladen, wann immer sich der Container anfühlt.

Lange Antwort (aus der Spezifikation):

Das Element "Beim Start laden" gibt an, dass dieses Servlet beim Start der Webanwendung geladen (instanziiert und mit init () aufgerufen) werden soll. Der optionale Inhalt dieses Elements muss eine Ganzzahl sein, die die Reihenfolge angibt, in der das Servlet geladen werden soll. Wenn der Wert eine negative Ganzzahl ist oder das Element nicht vorhanden ist, kann der Container das Servlet jederzeit laden. Wenn der Wert eine positive 128-Ganzzahl oder 0 ist, muss der Container das Servlet laden und initialisieren, wenn die Anwendung bereitgestellt wird. Der Container muss sicherstellen, dass Servlets mit niedrigeren Ganzzahlen geladen werden, bevor Servlets mit höheren Ganzzahlen markiert werden. Der Container kann die Reihenfolge des Ladens von Servlets mit demselben Startwert beim Laden wählen.


1
Und deshalb markieren wir 0 für DispatcherServlet, um es zuerst zu laden, wenn die Anwendung startet.
Lucky

11

Es zeigt an, dass das Servlet erst gestartet wird, wenn eine Anforderung versucht, darauf zuzugreifen.

Wenn Load-on-Startup größer oder gleich Null ist, startet das Servlet beim Start des Containers in aufsteigender Reihenfolge des dort eingegebenen Load-on-Startup-Werts (dh 0, 1, 2, 5, 10, 10 usw.). .


7
Null bewirkt auch das Laden. Nur negative Werte werden nicht garantiert: "[...] Wenn der Wert eine positive Ganzzahl oder 0 ist, muss der Container das Servlet laden und initialisieren, wenn die Anwendung bereitgestellt wird. [...]"
marabol

1
@cletus Ich denke, es ist besser, größer als Null mit größer oder gleich Null zu ändern , da viele Benutzer Ihre Antwort lesen, wie in der akzeptierten angegeben. Vielen Dank im Voraus
Tarik

9

Servlet-Lebenszyklus

Der Lebenszyklus eines Servlets wird durch den Container gesteuert, in dem das Servlet bereitgestellt wurde. Wenn eine Anforderung einem Servlet zugeordnet wird, führt der Container die folgenden Schritte aus.

  1. Wenn keine Instanz des Servlets vorhanden ist, wird der Webcontainer:

    ein. Lädt die Servlet-Klasse

    b. Erstellt eine Instanz der Servlet-Klasse

    c. Initialisiert die Servlet-Instanz durch Aufrufen der init-Methode (die Initialisierung wird unter Erstellen und Initialisieren eines Servlets behandelt ).

  2. Der Container ruft die Dienstmethode auf und übergibt Anforderungs- und Antwortobjekte. Servicemethoden werden unter Schreiben von Servicemethoden erläutert .

Ein Wert von 0 load-on-startupbedeutet, dass Punkt 1 ausgeführt wird, wenn eine Anforderung an dieses Servlet eingeht. Andere Werte bedeuten, dass Punkt 1 beim Start des Containers ausgeführt wird.


makellose Antwort!
Gaurav

1

Wie in der anderen Antwort und in diesem Artikel zum Laden beim Start angegeben, ist Null akzeptabel. Wenn kein anderes Servlet vorhanden ist, hat dies beim Laden Vorrang und wird während der Bereitstellung geladen. Die beste Verwendung von Load-On-Statup ist das Laden von Servlets, deren Initialisierung länger dauert, bevor die erste Anforderung eingeht, wie Servlets, die einen Verbindungspool erstellen oder einen Netzwerkanruf tätigen oder sperrige Ressourcen halten. Dadurch wird die Antwortzeit für die ersten paar Anforderungen erheblich verkürzt.


1
  1. Wenn der Wert für zwei Servlets gleich ist, werden sie in einer Reihenfolge geladen, in der sie in der Datei web.xml deklariert sind.
  2. Wenn 0 oder eine negative Ganzzahl als Servlet ist, wird geladen, wenn Container das Gefühl hat, sie zu laden.
  3. garantiert das Laden, Initialisieren und Aufrufen der Servlet-Methode init () durch den Webcontainer.
  4. Wenn für ein Servlet kein Element vorhanden ist, werden diese geladen, wenn der Webcontainer beschließt, sie zu laden.

0

Ja, es kann denselben Wert haben. Der Grund für die Angabe von Zahlen beim Laden beim Start besteht darin, eine Sequenz zu definieren, in der der Server das gesamte Servlet lädt. Servlet mit 0 Load-On-Startup-Wert wird zuerst geladen und Servlet mit Wert 1 wird danach geladen.

Wenn zwei Servlets beim Laden beim Start denselben Wert haben, wird geladen, wie sie in der Datei web.xml von oben nach unten deklariert sind. Das Servlet, das zuerst in der Datei web.xml steht, wird zuerst geladen und das andere wird danach geladen.


0

-> (Keine Last beim Start) Tag Wenn ein Servlet auf dem Server bereitgestellt wird, liegt es in der Verantwortung des Servers, das Servlet-Objekt zu erstellen. Beispiel: Angenommen, Servlet wird auf dem Server bereitgestellt. (Servlet-Objekt ist auf dem Server nicht verfügbar.) Der Client sendet die Anforderung zum ersten Mal an das Servlet. Anschließend erstellt der Server das Servlet-Objekt mithilfe des Standardkonstruktors und ruft sofort init () auf. Wenn der Client die Anforderung sendet, wird nur die Servicemethode ausgeführt, da das Objekt bereits verfügbar ist

Wenn im Bereitstellungsdeskriptor das Tag zum Laden beim Start verwendet wird: Zum Zeitpunkt der Bereitstellung selbst erstellt der Server das Servlet-Objekt für die Servlets auf der Grundlage des positiven Werts zwischen den Tags. Die Erstellung von Objekten für die Servlet-Klassen erfolgt von 0 bis 128. Das Servlet mit der Nummer 0 wird zuerst erstellt, gefolgt von anderen Nummern.

Wenn wir für zwei Servlets in web.xml den gleichen Wert angeben, werden Objekte basierend auf der Position der Klassen in web.xml erstellt, die auch von Server zu Server unterschiedlich sind.

Wenn zwischen dem Laden beim Start ein negativer Wert angegeben wird, erstellt der Server das Servlet-Objekt nicht.

Andere Szenarien, in denen der Server das Objekt für das Servlet erstellt.

Wenn in web.xml kein Lade-Start-Tag verwendet wird, wird das Projekt immer dann bereitgestellt, wenn der Client die Anforderung zum ersten Mal sendet, wenn der Server das Objekt erstellt, und der Server für den Aufruf seiner Lebenszyklusmethoden verantwortlich ist. Dann, wenn eine .class auf dem Server (Tomcat) geändert wurde. Der Client sendet erneut die Anforderung für ein geändertes Servlet. Im Falle von Tomcat wird jedoch kein neues Objekt erstellt und der Server verwendet das vorhandene Objekt, es sei denn, der Server wird neu gestartet. Wenn jedoch in der Klasse der Weblogik die .class-Datei auf dem Server geändert wird, ohne den Server neu zu starten, wenn er eine Anforderung empfängt, ruft der Server die destroy-Methode für ein vorhandenes Servlet auf, erstellt ein neues Servlet-Objekt und ruft init () für dessen Initilisierung auf .


-1

Wenn der Wert <0 ist, wird das Serlet bei der Anforderung instanziiert, andernfalls> = 0 wird der Container in aufsteigender Reihenfolge der Werte geladen. Wenn zwei oder mehr Servlets denselben Wert haben, wird die Reihenfolge der Servlets in der Datei web.xml deklariert.


-2

Der Servlet-Container lädt das Servlet beim Start oder bei der ersten Anforderung. Das Laden des Servlets hängt vom Attribut "load-on-startup" in der Datei "web.xml" ab. Wenn das Attribut eine positive Ganzzahl (0 bis 128) hat, wird das Servlet mit dem Laden des Containers geladen, andernfalls wird es geladen, wenn die erste Anforderung zum Service kommt.

Wenn das Servlet geladen wird, sobald es eine Anforderung erhält, wird es als "Lazy Loading" bezeichnet.


-6

Es ist einfach, wie Sie nicht einmal erwarten.

Wenn der Wert positiv ist, wird er beim Start des Containers geladen

Wenn der Wert nicht positiv ist, wird das Servelet geladen, wenn die Anforderung gestellt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.