In che ordine sono i metodi Servlet.init() e Filter.init() chiamati nell'applicazione web java? Quale è chiamato prima? Tutti i metodi Servlet.init() chiamati prima di qualsiasi metodo Filter.doFilter?Servlet.init() e Filter.init() sequenza chiamate
risposta
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.
- Per tutti i filtri:
Filter.init()
- Per tutti i servlet con '' in
web.xml
:Servlet.init()
- Per tutti i filtri applicabili per la richiesta:
Filter.doFilter()
- Se servlet applicabile non già inizializzata :
Servlet.init()
- Per servlet applicabile:
Servlet.service()
contraddice la risposta di BalusC, che avrebbe il tuo (4) accadere prima (3). –
(2) è per servlet che hanno il caricamento all'avvio nel web.xml. (4) è per servlet che sono inizializzati alla prima richiesta al servlet. – downeyt
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).
Questo dovrebbe essere un commento. –
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) –
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.
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
Sì, l'ho modificato. Ciò è comunque a prescindere da "caricamento all'avvio". – BalusC
+1 molto utile thx. – kukudas