Ciclo de Vida e Processamento de Requisições
O funcionamento de um Servlet dentro de um contêiner web segue um fluxo estrito de processamento de requisições HTTP:
- O cliente (navegador) inicia uma requisição HTTP direcionada ao servidor web.
- O contêiner web intercepta a requisição e instancia os objetos
HttpServletRequesteHttpServletResponse. - Esses objetos são injetados no método
service()da interface Servlet. - O contêiner delega a execução para a classe concreta que implementa o Servlet.
- Após a lógica de negócio ser processada, a resposta é populada no objeto de response.
- O contêiner web serializa a resposta e a transmite de volta ao cliente.
Configuração de Mapeamento de URLs
O arquivo de implantação (web.xml) permite definir como as URLs são roteadas para os Servlets específicos. Abaixo estão os principais padrões de configuração:
1. Mapeamento Exato (Rota Única)
Associa um Servlet a um endpoint específico. Acessar /api/users acionará o controlador correspondente.
<!-- Configuração de rota única -->
<servlet>
<servlet-name>UserManager</servlet-name>
<servlet-class>com.enterprise.app.controller.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserManager</servlet-name>
<url-pattern>/api/users</url-pattern>
</servlet-mapping>
2. Múltiplos Endpoints para um Único Servlet
É possível vincular diversas rotas distintas à mesma classe de processamento, útil para agrupar funcionalidades relacionadas sob um mesmo controlador.
<servlet>
<servlet-name>ReportGenerator</servlet-name>
<servlet-class>com.enterprise.app.controller.ReportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ReportGenerator</servlet-name>
<url-pattern>/reports/daily</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ReportGenerator</servlet-name>
<url-pattern>/reports/monthly</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ReportGenerator</servlet-name>
<url-pattern>/reports/annual</url-pattern>
</servlet-mapping>
3. Mapeamento de Diretório (Coringa de Caminho)
Utiliza o caractere coringa para capturar qualquer subcaminho dentro de uma estrutura de diretórios específica, ideal para servir recursos estáticos ou APIs aninhadas.
<servlet>
<servlet-name>StaticAssets</servlet-name>
<servlet-class>com.enterprise.app.controller.AssetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StaticAssets</servlet-name>
<url-pattern>/assets/*</url-pattern>
</servlet-mapping>
4. Rota Padrão (Fallback Global)
Captura todas as requisições que não correspondem a nenhum outro mapeamento. Atenção: isso substituirá a página de índice padrão do servidor (como index.html).
<servlet>
<servlet-name>GlobalFallback</servlet-name>
<servlet-class>com.enterprise.app.controller.FallbackServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GlobalFallback</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5. Mapeamento por Extensão
Roteia requisições baseadas na extensão do arquivo solicitado, ignorando o nome base da URL. Muito utilizado em frameworks legados para identificar ações.
<servlet>
<servlet-name>ActionDispatcher</servlet-name>
<servlet-class>com.enterprise.app.controller.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ActionDispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Hierarquia de Resolução de Rotas
O contêiner web avalia os padrões de URL em uma ordem estrita de precedência. Mapeamentos exatos têm a prioridade máxima. Se nenhuma correspondência exata for encontrada, o contêiner tenta correspondências de caminho (diretório), seguidas por correspondências de extensão. Por fim, se nenhuma regra for atendida, a requisição é delegada ao mapeamento padrão.