Sobes.tech
Middle

Como é que o processamento de uma requisição HTTP é realizado na classe HttpServlet?

sobes.tech IA

Resposta da IA

O processamento de pedidos HTTP na classe HttpServlet é feito através da sobrescrita de um dos métodos doGet, doPost, doPut, doDelete, doHead, doOptions, doTrace ou service.

Ciclo de vida do processamento do pedido:

  1. O contêiner de servlets (por exemplo, Tomcat) recebe o pedido HTTP.
  2. O contêiner determina o servlet correspondente com base na URL do pedido.
  3. Se o servlet ainda não estiver carregado, o contêiner cria uma instância, chama o método init() (uma única vez durante toda a vida do servlet) e o coloca no pool.
  4. O contêiner cria os objetos HttpServletRequest e HttpServletResponse, que encapsulam os dados do pedido e fornecem métodos para formar a resposta.
  5. O contêiner chama o método service(HttpServletRequest req, HttpServletResponse resp) do servlet.
  6. A implementação padrão de service determina o tipo de método HTTP (GET, POST, etc.) e delega o processamento ao método correspondente do<Method> (doGet, doPost, etc.), passando os objetos de pedido e resposta.
  7. O desenvolvedor sobrescreve o método do<Method> necessário para implementar a lógica específica do processamento do pedido.
  8. O método do<Method> forma a resposta, escrevendo dados em HttpServletResponse.
  9. Após a conclusão do método service, o contêiner envia a resposta formada ao cliente.
  10. Quando o contêiner decide descarregar o servlet (por exemplo, ao parar a aplicação), ele chama o método destroy() para liberar recursos.

Exemplo de sobrescrita de doGet:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Definir o tipo de conteúdo e codificação da resposta
        response.setContentType("text/html;charset=UTF-8");

        // Obter PrintWriter para escrever a resposta
        try (PrintWriter out = response.getWriter()) {
            // Escrever HTML na resposta
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Saudação</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Olá do meu servlet!</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    }
}

Tabela com os métodos principais do<Method> e seu propósito:

Método Propósito
doGet Processamento de requisições GET (obtenção de dados, operações idempotentes).
doPost Processamento de requisições POST (envio de dados para processamento, criação de recursos).
doPut Processamento de requisições PUT (atualização de recursos).
doDelete Processamento de requisições DELETE (remoção de recursos).
doHead Processamento de requisições HEAD (obtenção apenas de cabeçalhos de resposta).
doOptions Processamento de requisições OPTIONS (obter informações sobre métodos disponíveis).
doTrace Processamento de requisições TRACE (depuração, eco da requisição).

Sobrescrever o método service permite redefinir completamente a lógica de roteamento de requisições, mas geralmente sobrescrevem os específicos do<Method>.