Arquitetura de Servlets e Estratégias de Mapeamento de Rotas

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:

  1. O cliente (navegador) inicia uma requisição HTTP direcionada ao servidor web.
  2. O contêiner web intercepta a requisição e instancia os objetos HttpServletRequest e HttpServletResponse.
  3. Esses objetos são injetados no método service() da interface Servlet.
  4. O contêiner delega a execução para a classe concreta que implementa o Servlet.
  5. Após a lógica de negócio ser processada, a resposta é populada no objeto de response.
  6. 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.

Tags: servlet java Web Container URL Mapping Web.xml

Publicado em 7-2 03:15