Come è strutturato e funziona il ciclo di vita di una Servlet
Ciclo di vita di una Servlet
Il ciclo vitale dei Servlet permette ai servlet container di affrontare i problemi di prestazioni e di risorse posti dai vecchi CGI e le preoccupazioni relative alla sicurezza della programmazione di API del server a basso livello.
Esso è molto flessibile. L’unica regola inderogabile è che un servlet container dev’essere conforme al seguente contratto di ciclo vitale:
- Creare e inizializzare il servlet.
- Gestire zero o più chiamate a servizi da parte del client.
- Distruggere il servlet e poi eseguire un’operazione di garbage collection su quel che ne rimane.
Analizzando nel dettaglio quanto prima esposto, è possibile suddividere il life cycle di un Servlet in tre fasi principali, ciascuna individuata dalla chiamata al relativo metodo definito nell’interfaccia.
La fase di inizializzazione
Tra tutte le fasi di cui si compone il ciclo di vita di un Servlet questa è di sicuro la più ostica.
Essa si scompone in altre tre sotto-fasi:
Prima fase, creazione e inizializzazione. Il servlet engine localizza la classe da attivare all’interno del classpath e la carica in memoria della JVM; in altri termini possiamo dire che la classe viene manipolata tramite il class-loader:
Class c = Class.forName(“HelloWorld”);
Seconda fase, il servlet container crea un’istanza della classe servlet; possiamo ipotizzare che il processo si svolga come segue:
Servlet s = (Servlet) c.newInstance();
Terza fase, il servlet engine attiva il servlet:
s.init(sc);
dove sc è un ipotetico ServletContext creato in precedenza.
Una volta inizializzato, il servlet è in grado di rispondere alle chiamate provenienti dal browser e di soddisfarne le richieste.
La fase di esercizio
Tutte le volte che il browser Web ricerca l’URL corrispondente al servlet, il servlet container invoca il metodo service:
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
.. .. ..
}
L’oggetto di tipo ServletRequest funziona come canale per il flusso di dati in ingresso, dal browser verso il servlet; l’istanza di ServletResponse fornisce invece il canale di uscita, dal servlet verso il browser.
La fase relativa alla distruzione
I servlet engine attualmente presenti sul mercato sono abbastanza evoluti. Essi sono in grado di rilasciare i servlet attivati una volta terminato il loro compito e, ancora, possono decidere a propria discrezione di liberare le risorse allocate allo scadere di un dato tempo di inattività.
In tal caso il servlet engine deve invocare il metodo
public void destroy();
per notificare al servlet la decisione presa.