2010-05-25 14 views

risposta

25

I filtri vengono sempre inizializzati durante l'avvio di Webapp nell'ordine in cui sono definiti nello web.xml.

I servlet vengono inizializzati di default durante la prima richiesta HTTP solo sul proprio modello di URL. Ma puoi anche configurarli per inizializzarli durante l'avvio di webapp usando le voci <load-on-startup> in cui puoi specificare la loro priorità. Saranno quindi caricati nell'ordine prioritario.
E.g.

<servlet> 
    <servlet-name>myServlet</servlet-name> 
    <servlet-class>mypackage.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Se vi sono più servlet con lo stesso ordine di priorità, allora l'ordine di caricamento per i servlet è specificato e possono essere arbitraria. Le servlet sono comunque inizializzate in qualsiasi modo dopo l' l'inizializzazione dei filtri, ma prima del invocazione dei filtri.

+1

Se ho impostato load-on-startup in web.xml, posso essere certo che questo servlet init() sia chiamato prima di doFilter di qualsiasi filtro? – martsraits

+0

Sì, l'ho modificato. Ciò è comunque a prescindere da "caricamento all'avvio". – BalusC

+0

+1 molto utile thx. – kukudas

6
  1. Per tutti i filtri: Filter.init()
  2. Per tutti i servlet con '' in web.xml: Servlet.init()
  3. Per tutti i filtri applicabili per la richiesta: Filter.doFilter()
  4. Se servlet applicabile non già inizializzata : Servlet.init()
  5. Per servlet applicabile: Servlet.service()
+1

contraddice la risposta di BalusC, che avrebbe il tuo (4) accadere prima (3). –

+0

(2) è per servlet che hanno il caricamento all'avvio nel web.xml. (4) è per servlet che sono inizializzati alla prima richiesta al servlet. – downeyt

6

Solo una nota a margine - ho sperimentato su Tomcat (7.0.30) che i metodi Filter.init() vengono eseguiti in ordine casuale (iterazione su HashMap).

+0

Questo dovrebbe essere un commento. –

+0

Sì, lo so, ma non posso commentare perché non ho abbastanza reputazione. Ma ho pensato che vale la pena ricordare che la risposta accettata sembra essere sbagliata in questo aspetto (che è l'ordine di chiamare il metodo Filter.init() è generalmente indefinito) –

-1

Attenzione. Ho assistito all'invocazione simultanea di Filter.init() e Filter.doFilter() sulla stessa istanza. Sono ancora scioccato e non posso recuperare. Il suo nome è Jetty.

Problemi correlati