Je suis un peu confus ici. Dans notre application, nous définissons quelques servlets. Voici l'extrait du web.xml
pour l'un des 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>
Selon ma compréhension, la valeur de <load-on-startup>
doit être un entier positif pour pouvoir être chargée automatiquement. J'ai levé les yeux sur Google mais les réponses que j'ai trouvées ne faisaient qu'ajouter à ma confusion.
Resin 3. documente ce comportement:
load-on-startup peut spécifier une valeur entière (facultative). Si la valeur est égale ou supérieure à 0, cela indique un ordre de chargement des servlets. Les servlets avec des nombres plus élevés sont chargés après des servlets avec des nombres plus faibles.
Le spéc. JSP 3.1 (JSR 340) indique ceci à la page 14-160:
L'élément
load-on-startup
indique que ce servlet doit être chargé (instancié et son init () appelé) au démarrage de l'application Web. Le contenu de cet élément doit être un entier indiquant l'ordre dans lequel le servlet doit être chargé. Si la valeur est un entier négatif ou si l'élément n'est pas présent, le conteneur est libre de charger le servlet quand il le souhaite. Si la valeur est un entier positif ou 0, le conteneur doit charger et initialiser le servlet lors du déploiement de l'application. Le conteneur doit garantir que les servlets marqués avec des entiers inférieurs sont chargés avant les servlets marqués avec des entiers plus élevés. Le conteneur peut choisir l'ordre de chargement des servlets avec la même valeurload-on-startup
.
Vous souhaitez probablement vérifier non seulement le fichier JSR, mais également la documentation de votre conteneur Web. Il peut y avoir des différences
Réponse courte: valeur> = 0 signifie que le servlet est chargé lors du déploiement de l'application Web ou au démarrage du serveur. valeur <0: le servlet est chargé chaque fois que le conteneur se présente.
Réponse longue (de la spécification):
L'élément load-on-startup indique que cette servlet doit être chargée (instanciée et appelée init ()) au démarrage de l'application Web. Le contenu facultatif de ces éléments doit être un entier indiquant l'ordre dans lequel le servlet doit être chargé. Si la valeur est un entier négatif ou que l'élément n'est pas présent, le conteneur est libre de charger le servlet à sa guise. Si la valeur est un entier positif 128 ou 0, le conteneur doit charger et initialiser le servlet lors du déploiement de l'application. Le conteneur doit garantir que les servlets marqués avec des entiers inférieurs sont chargés avant les servlets marqués avec des entiers plus élevés. Le conteneur peut choisir l'ordre de chargement des servlets ayant la même valeur de chargement au démarrage.
Cela indique que le servlet ne sera pas démarré avant qu'une requête ne tente d'y accéder.
Si la charge au démarrage est supérieure ou égale à zéro, au démarrage du conteneur, cette servlet démarrera dans l'ordre croissant de la valeur de charge au démarrage que vous y avez définie (c'est-à-dire 0, 1, 2, 5, 10, etc.). .
Le cycle de vie d'un servlet est contrôlé par le conteneur dans lequel le servlet a été déployé. Lorsqu'une demande est mappée à un servlet, le conteneur effectue les étapes suivantes.
Si une instance du servlet n'existe pas, le conteneur Web:
a. Charge la classe de servlet
b. Crée une instance de la classe servlet
c. Initialise l'instance de servlet en appelant la méthode init (l'initialisation est décrite dans Création et initialisation d'un servlet )
Le conteneur appelle la méthode de service en transmettant les objets requête et réponse. Les méthodes de service sont décrites dans Rédaction de méthodes de service .
Une valeur 0 sur load-on-startup
signifie que le point 1 est exécuté lorsqu'une demande parvient à ce servlet. Autres valeurs signifie que le point 1 est exécuté au démarrage du conteneur.
Comme indiqué dans une autre réponse et ceci article de chargement au démarrage , zéro est acceptable et, en l'absence de tout autre servlet, cela aura priorité sur le chargement et sera chargé pendant le déploiement. La meilleure utilisation de stat-on load est de charger les servlets dont l'initialisation prend plus de temps avant que la première requête ne vienne comme des servlets qui créent un pool de connexions, établissent un appel réseau ou maintiennent une ressource volumineuse. Cela réduira considérablement le temps de réponse des premières requêtes.
-> Balise (Absence de charge au démarrage) Tout d'abord, lorsqu'un servlet est déployé sur le serveur, il incombe au serveur de créer l'objet servlet. Exemple: supposons que Servlet soit déployé sur le serveur (l'objet Servlet n'est pas disponible sur le serveur). Le client envoie la demande au servlet pour la première fois, puis le serveur crée l'objet servlet avec l'aide du constructeur par défaut et appelle immédiatement init (). À partir de ce moment, chaque fois que le client enverra la requête, seule la méthode de service sera exécutée car l'objet est déjà disponible.
Si la balise load-on-start-up est utilisée dans le descripteur de déploiement: Au moment du déploiement, le serveur crée l'objet servlet pour les servlets en fonction de la valeur positive fournie entre les balises. La création d'objets pour les classes de servlet suivra de 0 à 128 0 servlet de numéro sera créé en premier et suivi d'autres nombres.
Si nous fournissons la même valeur pour deux servlets dans le fichier web.xml, la création d'objets se fera en fonction de la position des classes dans le fichier web.xml, qui varie également d'un serveur à l'autre.
Si nous fournissons une valeur négative entre les balises de chargement et de démarrage, le serveur ne créera pas l'objet servlet.
Si nous n'utilisons pas load on start up dans le fichier web.xml, le projet est déployé chaque fois que le client envoie la demande pour la première fois que le serveur crée l'objet et que le serveur est responsable de l'appel de ses méthodes de cycle de vie. Ensuite, si une classe est modifiée sur le serveur (Tomcat). de nouveau le client envoie la demande pour le servlet modifié, mais dans le cas de Tomcat, le nouvel objet ne sera pas créé et le serveur utilisera l'objet existant, sauf si le redémarrage du serveur a lieu. Mais en classe de web-logic chaque fois que le fichier .class est modifié sur le serveur sans redémarrer le serveur s'il reçoit une requête, le serveur appelle la méthode destroy sur le servlet existant et crée un nouvel objet servlet et appelle init () pour l'initier. .
oui, il peut avoir la même valeur .... la raison pour laquelle la charge doit être donnée au démarrage est de définir une séquence permettant au serveur de charger tout le servlet. servlet avec 0 valeur de chargement au démarrage se chargera en premier et servlet de valeur 1 après.
si deux servlets auront la même valeur pour la charge au démarrage, ils seront déclarés dans le fichier web.xml de haut en bas. le servlet qui vient en premier dans le fichier web.xml sera chargé en premier et l'autre ensuite.