Ciclo de vida de um Servlet – Servlet Life Cycle

Comentárei um pouco sobre o ciclo e vida de um Servlet, desde a sua instanciação, passando por inicialização ate destruição.

De forma simplificada

- Container carrega e instancia uma classe servlet.
- O servlet passa para o status de CARREGADO.
- O container inicializa a instancia do servlet
- O servlet passa para o status de INICIALIZADO.
- O container pode invocar o método service() para receber as requisições dos clientes.
- O container pode invocar o método destroy() para colocar o status do servlet como DESTRUIDO.
- O container descarrega a instância do servlet, deixando o status como TRANSITORIO.

De forma detalhada.

Carregando e Instanciando

 O container servlet ao ser carregado verifica o descritor de implantação (web.xml) em busca das entrada para cada servlet, descritas por nome e classe que implementa esta entrada. O container cria uma instancia para cada entrada utilizando Class.forName(className).newInstance(), onde className é o nome completo da classe, exemplo: br.com.yross.servlets.YRossServlet.

Inicializando um Servlet

O Container chama o metodo init(ServletConfig)  para criar a instância. O objeto ServletConfig contém todos os parametros especificados no descritor de implantação(web.xml). O servlet é iniciado depois que o método init(ServletConfig) retorna.
 
 A utilização deste paramentros de inicialização é muito importante quando necessitamos criar obejto reusáveis, por exemplo, quando precisamos criar uma conexão com banco de dados, podemos definir os parametros da conexão(URL, usuário e senha) dentro do descritor de implantação, desta forma o servlet ao ser criado pode utilizar este paramentros para criar a conexão, dando a possibilidade de modifica apenas o webxml quando as informações de conexão mudarem.

Pre-inicializando um servlet

Geralmente, ao iniciar, o container servlet não inicializa os servlets, inicializando apenas quando a primeira requisição ao servlet for feita por um cliente. Este processo é conhecido como lazy loading (carergamento preguiçoso).

 A especificação servlet define uma a tag(elemento xml) <load-on-startup> que é definido dentro do descritor de implantação para fazer com que o container servlet carregue e inicialize o servlet ao ser iniciado. Os valores permitidos para esta tag são 0 (zero) e 1 (um), onde 0 representa false e 1 true. Este processo é chamado de preloading ou preinitializing;

Exemplo:

<servlet>
   <servlet-name>YRoss Servlet</servlet-name>
   <servlet-class>br.com.yross.YRossServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
   <servlet-name>YRoss Servlet</servlet-name>
   <url-pattern>*.yross</url-pattern>
</servlet-mapping>

Servindo requisições dos Clientes

Depois de criado e inicializado o servlet esta pronto para atender as requisições dos clientes. Quando o container recebe requisições para o servlet, ele chama o método Servlet.service(ServletRequest, ServletResponse) na instância do Servlet.

Destruindo o Servlet

Quando o container servlet decidi que não é mais necessário a instância do servlet, ele chama o método destroy() na instância do servlet para destruir.

Este método deve ser utilizado para liberar recursos adquiridos na inicialização (chamada método init()), como conexões com banco de dados.

Uma vez que o método destroy() é chamado o container servlet não poderá mais chamar o método service da instancia do servlet destruido. O container não pode mais reutilizar esta instância. Se alguma Thread estiver executando o método service naquele momento o container aguarda a execução.

 O container servlet pode destruir um servlet se nenhuma requisição foi feita para ele durante um logo tempo.

Descarregando um Servlet

Uma vez destruido, a instância do servlet esta apta para o Garbage Collector, quando o servlet estará descarregado. Quando o container servlet estiver sendo desligado as instâncias também serão descarregadas.

 

Não ha comentários

Leave a reply