A implementação da interface Servlet (javax.servlet.Servlet) é usada para todos os servlets, porque é essa interface que encapsula os métodos do ciclo de vida do servlet. Nesse ciclo, existem os métodos init(), service() e destroy(), que estão apresentados abaixo.
O método init()
O Container chama esse método depois que a instância do servlet for criada. Essa ação somente é completada com sucesso depois que o servlet não receber nenhuma solicitação. Esse método consegue sobrecarregar códigos de iniciação que são executados apenas uma vez, antes do tratamento de qualquer solicitação por parte do usuário. Um exemplo são cases que são necessários para carregar driver de banco de dados, ou efetuar alguma inicialização de valores.
Listagem 1: Assinatura do método init
public void init(ServletConfig config) throws ServletException
Comentando sobre a parte prática, o objeto ServletConfig, que foi definido como parâmetro na assinatura do método, contém valores de configuração que são geralmente declarados no arquivo de configuração, o web.xml. Com esse objeto, é permitido informar ações que ajudam a não fazerem “hardcode” no servlet. Essas ações podem ser representadas através de banco de dados ou pesquisa de um dado.
O método service()
Esse método é invocado quando chega a primeira solicitação do cliente, ou seja, depois que o método init permitir ao servlet responder a uma solicitação. O Container inicia uma nova thread ou aloca um thread de pool, onde é ativado o método service.
Listagem 2: Assinatura do método service
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException
Os parâmetros da assinatura desse método são definidos através de um objeto ServletRequest e um objeto ServletResponse. O objeto ServletRequest contém a solicitação do cliente e o objeto ServletResponse contém a resposta do servlet. Esses objetos persistem na determinação de como o servlet servirá a solicitação do cliente. Na prática, esse método determina qual método HTTP (GET ou POST) chamar no servlet.
O método destroy()
Esse método tem como objetivo remover o servlet, sendo invocado quando todas as sequências dentro do método service() forem finalizadas. Geralmente isso ocorre quando o Container é fechado ou a memória está livre, ou seja, esse método limpa qualquer recurso que está ainda ativo.
Exemplo do ciclo de vida de uma servlet
Na Listagem 3 e Figura 1 são mostrados os ciclos de vida do servlet.
Listagem 3: Código de demonstração do ciclo de vida
package br.com.exemplos;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/CicloDeVidaJsp")
public class CicloDeVidaJsp implements Servlet{
public CicloDeVidaJsp() {
super();
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Método init()");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("Método service()");
}
@Override
public void destroy() {
System.out.println("Método destroy()");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
Figura 1: Diagrama do ciclo de vida do Servlet
A Figura 1 mostra como os servlets são controlados pelo Container. Abaixo é citado um exemplo de como funciona esse processo.
- O usuário faz uma solicitação através de um link ou botão do qual o servlet faz parte.
- Então, o Container verifica se a solicitação é para um servlet, se for, cria-se os objetos response (HttpServletResponse) e request (HttpServletRequest).
- Após essa ação, o Container localiza o servlet baseado na solicitação, onde é criada ou alocada uma thread para a solicitação, chamando o método service() do servlet, que passa como argumento os dois objetos request e response.
- O método service() descobre qual método HTTP (GET ou POST) do servlet chamar.
- O servlet usa o objeto response para escrever a resposta para o cliente, geralmente esse retorno já é a página HTML que vai ser exibida.
- Quando invocado o método destroy(), o método service() termina, sendo que a thread morre ou retorna um para um pool de threads gerenciadas pelo Container. As referências dos objetos de solicitação acabam saindo do escopo. Com isso, é executado um processo de limpeza da memória, que são enviadas para o Garbage Collector.
ServletConfig – Recuperando informações de configuração
Em uma aplicação web JSP, pode ser necessário às vezes guardar valores de configuração, como usuário e senha do banco de dados. Esses dados são armazenados no arquivo web.xml. Nesse arquivo, existe a opção de especificar um conjunto de parâmetros inicial, determinado por pares nome/valor, podendo ser recuperado de dentro do servlet.
Listagem 4: Configuração do arquivo web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>ConfiguracaoDemo</servlet-name>
<servlet-class>br.com.exemplos.ConfiguracaoDemoServlet</servlet-class>
<init-param>
<param-name>root</param-name>
<param-value>teste123</param-value>
</init-param>
<init-param>
<param-name>usuario2</param-name>
<param-value>refeea232</param-value>
</init-param>
</servlet>
</web-app>
Para recuperar esses parâmetros é usado o objeto ServletConfig. Esse objeto possui os seguintes métodos para ajudar nessa recuperação:
- getInitParameterNames() - Não possui argumento e retorna um Enumeration, que contém todos os nomes de parâmetro no objeto ServletConfig.
- getInitParameter() – Possui como argumento uma string e retorna uma string.
Listagem 5: Resgata dos parâmetros criados no arquivo web.xml
public void init(ServletConfig config) throws ServletException {
Enumeration parameters = config.getInitParameterNames();
while(parameters.hasMoreElements()){
String parameter = (String)parameters.nextElement();
System.out.println("Nome do parâmetro: "+parameter);
System.out.println("Valor do parâmetro: "+
config.getInitParameter(parameter));
}
}
A Listagem 5 mostra que através do parâmetro que está no método init(), é possível retornar os valores que foram destacados no arquivo web.xml.
Referências:
- http://docs.oracle.com/javase/6/docs/api/java/util/Enumeration.html
- http://www.tutorialspoint.com/jsp/jsp_life_cycle.htm
- http://docs.oracle.com/javaee/5/tutorial/doc/bnahe.html
Espero que tenham gostado e até a próxima.