Um Servlet é uma aplicação pequena que roda no lado do servidor. Na prática, trata-se de uma interface Java que define as regras para que classes Java possam ser acessadas por navegadores web, sendo reconhecidas pelo container (como o Tomcat).
Os recursos do servidor são classificados em duas categorias: estáticos e dinâmicos. Ambos podem ser requisitados pelos navegadores dos clientes.
Criando seu Primeiro Servlet
Antes de iniciar, certifique-se de ter o JDK instalado e configurado, o Maven disponível no sistema, e um servidor Tomcat devidamente preparado.
Passos iniciais:
- Estabeleça um novo projeto Java EE
- Crie uma classe que implemente a interface
javax.servlet.Servlet - Implemente todos os métodos abstratos da interface
- Registre o Servlet no descriptor de implantação
Configuração no arquivo web.xml:
<!-- Registro do Servlet -->
<servlet>
<servlet-name>meuPrimeiroServlet</servlet-name>
<servlet-class>com.exemplo.web.ServicoPrincipal</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>meuPrimeiroServlet</servlet-name>
<url-pattern>/servico</url-pattern>
</servlet-mapping>
Como Funciona Internamente
O fluxo de execução segue estas etapas:
- O servidor recebe a requisição HTTP do cliente e extrai o caminho da URL
- Realiza uma busca no
web.xmlprocurando uma tag<url-pattern>correspondente ao caminho solicitado - Ao encontrar, recupera o nome completo da classe declarado na tag
<servlet-class> - O container carrega o bytecode da classe na memória e instancia o objeto
- Os métodos do ciclo de vida são invocados conforme necessário
Ciclo de Vida
A interface Servlet define métodos essenciais que governam seu comportamento:
| Método | Descrição | Frequência |
|---|---|---|
init() |
Inicialização do Servlet | Uma única vez, na criação |
service() |
Processamento de requisições | A cada requisição recebida |
destroy() |
Liberação de recursos | Uma única vez, no encerramento |
Além destes, existem getServletConfig() para obter parâmetros de configuração e getServletInfo() para informações descritivas do Servlet.
Detalhamento do Ciclo de Vida
Fase de Criação
O momento de instanciação pode ser controlado através de configuração no descriptor:
<servlet>
<servlet-name>servicoPreCarregado</servlet-name>
<servlet-class>com.exemplo.web.ServicoPrincipal</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Quando o valor de load-on-startup é negativo ou omitido, o Servlet é instanciado somente na primeira requisição. Valores zero ou psoitivos indicam que deve ser criado durante a inicialização do servidor.
Por ser uma instância única em memória (padrão Singleton), problemas de concorrência podem surgir quando múltiplos usuários acessam simultaneamente. A aplicação de sincronização reduz significativamente a performance, portanto a recomnedação é evitar variáveis de instância em Servlets, ou ao menos nunca modificá-las após a inicialização.
Fase de Atendimento
Cada requisição recebida invoca o método service(), que internamente delega para doGet() ou doPost() conforme o método HTTP utilizado.
Fase de Encerramento
O método destroy() é chamado exclusivamente quando o servidor é desligado de forma controlada. Em encerramentos abruptos, este método não é executado.
Uso de Anotações
Para projetos de maior escala, configurar cada Servlet manualmente no web.xml se torna trabalhoso. As anotações oferecem uma alternativa mais prática.
Ao criar um projeto Java EE 7.0 ou superior, selecione a versão desejada do Servlet e opte por não gerar o web.xml.
Exemplo de implementação com anotação:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/servico")
public class ServicoPrincipal extends HttpServlet {
@Override
protected void doGet(HttpServletRequest requisicao, HttpServletResponse resposta) {
// Lógica de processamento
}
}
A sintaxe alternativa aceita apenas a URL como parâmetro direto: @WebServlet("/servico")
Configuração no IntelliJ IDEA com Tomcat
O IDE gera uma estrutura de diretórios exclusiva para cada projeto implantado no Tomcat. Para identificar o caminho base utilizado, verifique a saída do console durante a inicialização do servidor, procurando pela mensagem que indica CATALINA_BASE.
Para realizar depuração com breakpoints, configure o servidor em modo debug dentro do IDE antes de executar a aplicação.