Cosa significa il valore <load-on-startup> del servlet


174

Mi sto confondendo un po 'qui. Nella nostra applicazione abbiamo definito alcuni servlet. Ecco un estratto dal web.xmlper uno dei servlet:

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

Secondo la mia comprensione, il valore per <load-on-startup>deve essere un numero intero positivo affinché possa essere caricato automaticamente. Ho cercato su Google, ma le risposte che ho riscontrato non hanno fatto che aumentare la mia confusione.

Risposte:


186

Resin 3.0 documenta questo comportamento:

load-on-startup può specificare un valore intero (facoltativo). Se il valore è 0 o maggiore, indica un ordine per i servlet da caricare, i servlet con numeri più alti vengono caricati dopo i servlet con numeri più bassi.

Le specifiche JSP 3.1 (JSR 340) lo dicono a pagina 14-160:

L'elemento load-on-startupindica che questo servlet deve essere caricato (istanziato e chiamato init () all'avvio dell'applicazione Web. Il contenuto dell'elemento di questo elemento deve essere un numero intero che indica l'ordine in cui deve essere caricato il servlet. Se il valore è un numero intero negativo o l'elemento non è presente, il contenitore è libero di caricare il servlet ogni volta che lo desidera. Se il valore è un numero intero positivo o 0, il contenitore deve caricare e inizializzare il servlet durante la distribuzione dell'applicazione. Il contenitore deve garantire che i servlet contrassegnati con numeri interi inferiori vengano caricati prima dei servlet contrassegnati con numeri interi più alti. Il contenitore può scegliere l'ordine di caricamento dei servlet con lo stesso load-on-startupvalore.

Probabilmente vuoi controllare non solo JSR, ma anche la documentazione per il tuo contenitore web. Potrebbero esserci delle differenze


Cletus ha torto nella sua risposta. Dovresti considerare di modificare il post.
Alboz,

3
Cosa succede quando il caricamento all'avvio non è specificato?
Nirmal,

1
@Nirmal Il secondo paragrafo specifica che se l'elemento non è presente ha lo stesso comportamento di se fosse negativo, ovvero il contenitore è libero di caricare il servlet ogni volta che lo sceglie.
Finnegan,

129

Risposta breve : valore> = 0 significa che il servlet viene caricato quando viene distribuita l'app Web o all'avvio del server. valore <0: il servlet viene caricato ogni volta che si sente il contenitore.

Risposta lunga (dalle specifiche):

L'elemento load-on-startup indica che questo servlet deve essere caricato (istanziato e deve essere chiamato init () all'avvio dell'applicazione Web. Il contenuto facoltativo di questi elementi deve essere un numero intero che indica l'ordine in cui il servlet deve essere caricato. Se il valore è un numero intero negativo o l'elemento non è presente, il contenitore è libero di caricare il servlet ogni volta che lo desidera. Se il valore è un numero intero 128 positivo o 0, il contenitore deve caricare e inizializzare il servlet quando l'applicazione viene distribuita. Il contenitore deve garantire che i servlet contrassegnati con numeri interi inferiori vengano caricati prima dei servlet contrassegnati con numeri interi più alti. Il contenitore può scegliere l'ordine di caricamento dei servlet con lo stesso valore di caricamento all'avvio.


1
E per questo motivo contrassegniamo 0 per DispatcherServlet inorder per caricarlo prima all'avvio dell'applicazione.
Lucky

11

Indica che il servlet non verrà avviato fino a quando una richiesta non tenta di accedervi.

Se load-on-startup è maggiore o uguale a zero, allora quando il container si avvia, quel servlet avvierà in ordine crescente il valore di caricamento all'avvio che ci hai messo (cioè 0, 1 quindi 2 quindi 5 quindi 10 e così via) .


7
Lo zero causa anche il caricamento. Non vengono garantiti solo valori negativi: "[...] Se il valore è un numero intero positivo o 0, il contenitore deve caricare e inizializzare il servlet quando viene distribuita l'applicazione. [...]"
marabol

1
@cletus Penso che sia meglio modificare maggiore di zero con maggiore o uguale a zero , perché molti utenti leggono la tua risposta come indicato per quello accettato. Grazie in anticipo
Tarik,

9

Ciclo di vita del servlet

Il ciclo di vita di un servlet è controllato dal contenitore in cui è stato distribuito il servlet. Quando una richiesta viene mappata su un servlet, il contenitore esegue i seguenti passaggi.

  1. Se non esiste un'istanza del servlet, il contenitore Web:

    un. Carica la classe servlet

    b. Crea un'istanza della classe servlet

    c. Inizializza l'istanza del servlet chiamando il metodo init (l'inizializzazione è descritta in Creazione e inizializzazione di un servlet )

  2. Il contenitore richiama il metodo di servizio, passando oggetti richiesta e risposta. I metodi di servizio sono discussi in Metodi di servizio di scrittura .

Un valore 0 su load-on-startupindica che il punto 1 viene eseguito quando una richiesta arriva a quel servlet. Altri valori indicano che il punto 1 viene eseguito all'avvio del contenitore.


risposta impeccabile!
gaurav,

1

Come indicato in altre risposte e questo articolo zero all'avvio è accettabile e in assenza di qualsiasi altro servlet questo avrà la priorità sul caricamento e sul caricamento durante la distribuzione. Il miglior uso dello statup del caricamento è caricare servlet che impiegano più tempo a inizializzarsi molto prima che la prima richiesta arrivi come servlet che crea pool di connessioni o effettua chiamate di rete o trattiene risorse ingombranti, ciò ridurrà significativamente i tempi di risposta per le prime richieste.


1
  1. Se il valore è lo stesso per due servlet, verranno caricati in un ordine in cui sono dichiarati nel file web.xml.
  2. se è 0 o un numero intero negativo rispetto a Servlet verrà caricato quando Container sente di caricarli.
  3. garantisce il caricamento, l'inizializzazione e il metodo di servlet call (init) del web container.
  4. Se non è presente alcun elemento per nessun servlet, questi verranno caricati quando il contenitore Web decide di caricarli.

0

sì, può avere lo stesso valore .... il motivo per cui si danno i numeri al caricamento all'avvio è definire una sequenza affinché il server carichi tutto il servlet. il servlet con valore di caricamento all'avvio 0 verrà caricato per primo e il servlet con valore 1 verrà caricato successivamente.

se due servlet avranno lo stesso valore per il caricamento all'avvio di quanto verrà caricato come sono dichiarati nel web.xml dall'alto verso il basso. il servlet che viene prima in web.xml verrà caricato per primo e l'altro verrà caricato successivamente.


0

-> (Assenza di load-on-start-up) tag Prima di tutto quando un servlet viene distribuito nel server, è responsabilità del server creare l'oggetto servlet. Ad esempio: Supponiamo che Servlet sia distribuito nel server, (l'oggetto Servlet non è disponibile nel server) il client invia la richiesta al servlet per la prima volta, quindi il server crea l'oggetto servlet con l'aiuto del costruttore predefinito e chiama immediatamente init (). Da quel momento in cui il client invia la richiesta verrà eseguito solo il metodo di servizio poiché l'oggetto è già disponibile

Se nel descrittore di distribuzione viene utilizzato il tag di caricamento all'avvio: Al momento della distribuzione stessa, il server crea l'oggetto servlet per i servlet in base al valore positivo fornito tra i tag. La creazione di oggetti per le classi servlet seguirà da 0-128 0 prima verrà creata la servlet numero e seguita da altri numeri.

Se forniamo lo stesso valore per due servlet in web.xml, la creazione di oggetti verrà effettuata in base alla posizione delle classi in web.xml, inoltre varia da server a server.

Se forniamo un valore negativo tra il tag di caricamento all'avvio, il server non creerà l'oggetto servlet.

Altri scenari in cui il server crea l'oggetto per servlet.

Se non utilizziamo load on start up tag in web.xml, il progetto viene distribuito ogni volta che il client invia la richiesta per la prima volta che il server crea l'oggetto e il server è responsabile della chiamata dei suoi metodi del ciclo di vita. Quindi se un server .class è stato modificato nel server (tomcat). il client invia nuovamente la richiesta per servlet modificato ma in caso di Tomcat non verrà creato un nuovo oggetto e il server utilizzerà l'oggetto esistente a meno che non avvenga il riavvio del server. Ma nella classe della logica web ogni volta che il file .class viene modificato nel server senza riavviare il server se riceve una richiesta, il server chiama il metodoestro sul servlet esistente e crea un nuovo oggetto servlet e chiama init () per la sua inizializzazione .


-1

Se il valore è <0, il serlet viene istanziato quando arriva la richiesta, altrimenti> = 0 il contenitore verrà caricato nell'ordine crescente dei valori. se 2 o più servlet hanno lo stesso valore, quindi l'ordine dei servlet dichiarato in web.xml.


-2

Il contenitore servlet carica il servlet durante l'avvio o quando viene effettuata la prima richiesta. Il caricamento del servlet dipende dall'attributo "load-on-startup" nel file "web.xml". Se l'attributo ha un numero intero positivo (da 0 a 128), il servlet viene caricato con il caricamento del contenitore, altrimenti viene caricato quando arriva la prima richiesta per il servizio.

Quando il servlet viene caricato una volta ricevuto la richiesta, viene chiamato "Caricamento lento".


-6

È semplice come non ti aspetti nemmeno.

Se il valore è positivo, viene caricato all'avvio del contenitore

Se il valore non è positivo rispetto al caricamento del servelet al momento della richiesta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.