Servlet - Ciclo di vita

Un ciclo di vita di un servlet può essere definito come l'intero processo dalla sua creazione fino alla distruzione. I seguenti sono i percorsi seguiti da un servlet.

  • Il servlet viene inizializzato chiamando il init() metodo.

  • Il servlet chiama service() metodo per elaborare la richiesta di un cliente.

  • Il servlet viene terminato chiamando il destroy() metodo.

  • Infine, servlet è garbage raccolto dal garbage collector della JVM.

Parliamo ora in dettaglio dei metodi del ciclo di vita.

Il metodo init ()

Il metodo init viene chiamato solo una volta. Viene chiamato solo quando viene creato il servlet e non viene richiamato successivamente per alcuna richiesta dell'utente. Quindi, viene utilizzato per inizializzazioni una tantum, proprio come con il metodo init degli applet.

Il servlet viene normalmente creato quando un utente richiama per la prima volta un URL corrispondente al servlet, ma è anche possibile specificare che il servlet venga caricato al primo avvio del server.

Quando un utente richiama un servlet, viene creata una singola istanza di ogni servlet, con ogni richiesta dell'utente che risulta in un nuovo thread che viene passato a doGet o doPost a seconda dei casi. Il metodo init () crea o carica semplicemente alcuni dati che verranno utilizzati per tutta la vita del servlet.

La definizione del metodo init ha questo aspetto:

public void init() throws ServletException {
   // Initialization code...
}

Il metodo service ()

Il metodo service () è il metodo principale per eseguire l'attività effettiva. Il contenitore servlet (cioè il server web) chiama il metodo service () per gestire le richieste provenienti dal client (browser) e per riscrivere la risposta formattata al client.

Ogni volta che il server riceve una richiesta per un servlet, il server genera un nuovo thread e chiama il servizio. Il metodo service () controlla il tipo di richiesta HTTP (GET, POST, PUT, DELETE, ecc.) E chiama i metodi doGet, doPost, doPut, doDelete, ecc. Come appropriato.

Ecco la firma di questo metodo:

public void service(ServletRequest request, ServletResponse response) 
   throws ServletException, IOException {
}

Il metodo service () viene chiamato dal container e il metodo service richiama i metodi doGet, doPost, doPut, doDelete, ecc. Come appropriato. Quindi non hai nulla a che fare con il metodo service () ma sovrascrivi doGet () o doPost () a seconda del tipo di richiesta che ricevi dal client.

DoGet () e doPost () sono i metodi utilizzati più di frequente in ogni richiesta di servizio. Ecco la firma di questi due metodi.

Il metodo doGet ()

Una richiesta GET risulta da una normale richiesta di un URL o da un modulo HTML che non ha alcun METODO specificato e dovrebbe essere gestita dal metodo doGet ().

public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   // Servlet code
}

Il metodo doPost ()

Una richiesta POST risulta da un modulo HTML che elenca specificamente POST come METHOD e dovrebbe essere gestita dal metodo doPost ().

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   // Servlet code
}

Il metodo destroy ()

Il metodo destroy () viene chiamato solo una volta alla fine del ciclo di vita di un servlet. Questo metodo offre al servlet la possibilità di chiudere le connessioni al database, arrestare i thread in background, scrivere elenchi di cookie o conteggi di visite su disco ed eseguire altre attività di pulizia simili.

Dopo che il metodo destroy () è stato chiamato, l'oggetto servlet viene contrassegnato per la garbage collection. La definizione del metodo di distruzione è simile a questa:

public void destroy() {
   // Finalization code...
}

Diagramma di architettura

La figura seguente mostra un tipico scenario del ciclo di vita di un servlet.

  • Per prima cosa le richieste HTTP che arrivano al server vengono delegate al contenitore servlet.

  • Il contenitore servlet carica il servlet prima di richiamare il metodo service ().

  • Quindi il contenitore servlet gestisce più richieste generando più thread, ogni thread esegue il metodo service () di una singola istanza del servlet.