Desenvolvimento Web com Java Servlets

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:

  1. Estabeleça um novo projeto Java EE
  2. Crie uma classe que implemente a interface javax.servlet.Servlet
  3. Implemente todos os métodos abstratos da interface
  4. 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:

  1. O servidor recebe a requisição HTTP do cliente e extrai o caminho da URL
  2. Realiza uma busca no web.xml procurando uma tag <url-pattern> correspondente ao caminho solicitado
  3. Ao encontrar, recupera o nome completo da classe declarado na tag <servlet-class>
  4. O container carrega o bytecode da classe na memória e instancia o objeto
  5. 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.

Tags: Java Servlet tomcat Java EE Web.xml Annotation WebServlet

Publicado em 6-18 01:31