Que signifie la valeur du servlet <load-on-startup>


174

Je suis un peu confus ici. Dans notre application, nous avons défini quelques servlets. Voici l'extrait du web.xmlpour l'une 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 ce que je comprends, la valeur de l <load-on-startup>doit être un entier positif pour qu'il soit chargé automatiquement. J'ai regardé sur google mais les réponses que j'ai trouvées n'ont fait qu'ajouter à ma confusion.

Réponses:


186

Resin 3.0 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 les servlets avec des nombres inférieurs.

La spécification JSP 3.1 (JSR 340) dit ceci à la page 14-160:

L'élément load-on-startupindique que ce servlet doit être chargé (instancié et avoir son init () appelé) au démarrage de l'application Web. Le contenu de l'élément 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 de même load-on-startupvaleur.

Vous voudrez probablement vérifier non seulement le JSR, mais également la documentation de votre conteneur Web. Il peut y avoir des différences


Cletus a tort dans sa réponse. Vous devriez envisager de modifier le message.
Alboz

3
Que se passe-t-il lorsque la charge au démarrage n'est pas spécifiée?
Nirmal

1
@Nirmal Le deuxième paragraphe précise que si l'élément n'est pas présent, il a le même comportement que s'il était négatif c'est-à-dire que le conteneur est libre de charger la servlet quand il le souhaite.
Finnegan

129

Réponse courte : valeur> = 0 signifie que le servlet est chargé lorsque l'application Web est déployée ou au démarrage du serveur. valeur <0: la servlet est chargée à chaque fois que le conteneur le souhaite.

Réponse longue (de la spécification):

L'élément load-on-startup indique que ce servlet doit être chargé (instancié et avoir son init () appelé) 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 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 de 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 avec la même valeur de chargement au démarrage.


1
Et c'est pourquoi nous marquons 0 pour DispatcherServlet afin de le charger en premier lorsque l'application démarre.
Chanceux

11

Cela indique que le servlet ne sera pas démarré tant qu'une requête ne tentera pas d'y accéder.

Si la charge au démarrage est supérieure ou égale à zéro, alors lorsque le conteneur démarre, il démarrera ce servlet dans l'ordre croissant de la charge au démarrage que vous y mettez (c'est-à-dire 0, 1 puis 2 puis 5 puis 10 et ainsi de suite) .


7
Zéro provoque également un chargement. Seules les valeurs négatives ne sont pas garanties: "[...] Si la valeur est un entier positif ou 0, le conteneur doit charger et initialiser le servlet lors du déploiement de l'application. [...]"
marabol

1
@cletus Je pense qu'il est préférable de modifier supérieur à zéro avec supérieur ou égal à zéro , car de nombreux utilisateurs lisent votre réponse comme indiqué par celle acceptée. Merci d'avance
Tarik

9

Cycle de vie du servlet

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 exécute les étapes suivantes.

  1. Si une instance du servlet n'existe pas, le conteneur Web:

    une. 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 traitée dans Création et initialisation d'un servlet )

  2. Le conteneur appelle la méthode de service, en passant des objets de requête et de réponse. Les méthodes de service sont décrites dans Écriture des méthodes de service .

Une valeur 0 sur load-on-startupsignifie que le point 1 est exécuté lorsqu'une requête arrive à ce servlet. D'autres valeurs signifient que le point 1 est exécuté au démarrage du conteneur.


réponse impeccable!
gaurav

1

Comme indiqué dans une autre réponse et cet article de chargement au démarrage zéro est acceptable et en l'absence de tout autre servlet, cela aura la priorité sur le chargement et le chargement pendant le déploiement. La meilleure utilisation de l'état de charge est de charger des servlets qui prennent plus de temps à s'initialiser bien avant que la première demande ne se produise, comme des servlets qui créent un pool de connexions ou effectuent un appel réseau ou détiennent des ressources volumineuses, cela réduira considérablement le temps de réponse pour les premières requêtes.


1
  1. Si la valeur est la même pour deux servlets, elles seront chargées dans l'ordre dans lequel elles sont déclarées dans le fichier web.xml.
  2. if vaut 0 ou un entier négatif que Servlet sera chargé lorsque Container aura envie de les charger.
  3. garantit le chargement, l'initialisation et l'appel à la méthode init () du servlet par conteneur Web.
  4. S'il n'y a aucun élément pour aucun servlet, ils seront chargés lorsque le conteneur Web décidera de les charger.

0

oui il peut avoir la même valeur .... la raison pour laquelle on donne des nombres au chargement au démarrage est de définir une séquence pour que le serveur charge tous les servlets. Le servlet avec une valeur de chargement au démarrage 0 se chargera en premier et le servlet avec la valeur 1 se chargera ensuite.

si deux servlets auront la même valeur pour le chargement au démarrage, il sera chargé comme ils sont 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 sera chargé ensuite.


0

-> Balise (Absence de chargement au démarrage) Tout d'abord, lorsque le servlet est déployé dans le serveur, il est de la responsabilité du serveur de créer l'objet servlet. Par exemple: supposons que le 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 à l'aide du constructeur par défaut et appelle immédiatement init (). À partir de là, lorsque le client envoie la demande, seule la méthode de service sera exécutée car l'objet est déjà disponible

Si la balise de chargement au démarrage est utilisée dans le descripteur de déploiement: Au moment du déploiement lui-même, 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 à partir de 0-128 0 servlet sera créé en premier et suivi par d'autres nombres.

Si nous fournissons la même valeur pour deux servlets dans web.xml, la création d'objets se fera en fonction de la position des classes dans web.xml qui varie également d'un serveur à l'autre.

Si nous fournissons une valeur négative entre la balise de chargement au démarrage, le serveur ne créera pas l'objet servlet.

Autres scénarios dans lesquels le serveur crée l'objet pour le servlet.

Si nous n'utilisons pas la balise load on start up dans web.xml, alors 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 le serveur est responsable de l'appel de ses méthodes de cycle de vie. Puis si un .class a été modifié dans le serveur (tomcat). à nouveau le client envoie la demande de servlet modifié mais dans le cas de tomcat, le nouvel objet ne sera pas créé et le serveur utilisera l'objet existant à moins que le redémarrage du serveur n'ait lieu. Mais dans la classe de logique web chaque fois que le fichier .class est modifié dans 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 son initialisation .


-1

Si la valeur est <0, le serlet est instancié lorsque la requête arrive, sinon> = 0 le conteneur se chargera dans l'ordre croissant des valeurs. si 2 servlets ou plus ont la même valeur, alors l'ordre des servlets déclarés dans le fichier web.xml.


-2

Le conteneur de servlet charge le servlet lors du démarrage ou lors de la première demande. Le chargement du servlet dépend de l'attribut "load-on-startup" dans le fichier "web.xml". Si l'attribut a un entier positif (0 à 128) alors le servlet est chargé avec le chargement du conteneur sinon il se charge lorsque la première demande vient pour le service.

Lorsque le servlet est chargé une fois qu'il reçoit une requête, il est appelé "chargement paresseux".


-6

C'est simple comme vous ne vous y attendez même pas.

Si la valeur est positive, elle est chargée au démarrage du conteneur

Si la valeur n'est pas positive, le servelet est chargé lors de la demande.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.