Explorando HttpServlet: ciclo de vida, métodos HTTP y visualización de peticiones

HttpServlet es la pieza clave para atender peticiones HTTP en una aplicación Java web. El contenedor servlet (p. ej. Tomcat) crea la instancia, inyecta los objetos HttpServletRequest y HttpServletResponse y delega el procesamiento a los métodos que hayamos sobrescrito.

Creando un servlet en cuatro pasos

  1. Extender jakarta.servlet.http.HttpServlet.
  2. Sobrescribir los métodos que correspondan (doGet, doPost, etc.).
  3. Leer la información de la pettición a través del objeto HttpServletRequest.
  4. Generar la respuesta utilizando HttpServletResponse.

Métodos más usados de HttpServlet

Método Propósito Invocado por
init() Inicialización tras la creación del servlet Contenedor
service() Distribuye la petición al método HTTP adecuado Contenedor
doGet() Atiende peticiones GET service()
doPost() Atiende peticiones POST service()
doDelete() Atiende peticiones DELETE service()
destroy() Limipeza antes de la destrucción del servlet Contenedor

Ejemplo: servlet que responde según el verbo HTTP

package demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

import java.io.IOException;

@WebServlet("/verbo")
public class VerboServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest peticion,
                         HttpServletResponse respuesta) throws IOException {
        respuesta.setContentType("text/plain;charset=UTF-8");
        respuesta.getWriter().println("Respuesta GET");
    }

    @Override
    protected void doPost(HttpServletRequest peticion,
                          HttpServletResponse respuesta) throws IOException {
        respuesta.setContentType("text/plain;charset=UTF-8");
        respuesta.getWriter().println("Respuesta POST");
    }

    @Override
    protected void doDelete(HttpServletRequest peticion,
                           HttpServletResponse respuesta) throws IOException {
        respuesta.setContentType("text/plain;charset=UTF-8");
        respuesta.getWriter().println("Respuesta DELETE");
    }
}

Con Postman o cualquier cliente HTTP podemos probar cada verbo:

GET  http://localhost:8080/app/verbo  → Respuesta GET
POST http://localhost:8080/app/verbo  → Respuesta POST
DELETE http://localhost:8080/app/verbo → Respuesta DELETE

Volcado completo de la petición

El siguiente servlet devuelve en HTML todos los datos disponibles en HttpServletRequest:

package demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/dump")
public class DumpRequestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req,
                         HttpServletResponse resp) throws IOException {
        StringBuilder sb = new StringBuilder();
        sb.append("<h3>Información de la petición</h3>");
        sb.append("Protocolo: ").append(req.getProtocol()).append("<br>");
        sb.append("Método: ").append(req.getMethod()).append("<br>");
        sb.append("URI: ").append(req.getRequestURI()).append("<br>");
        sb.append("Contexto: ").append(req.getContextPath()).append("<br>");
        sb.append("Query: ").append(req.getQueryString()).append("<br>");

        sb.append("<h4>Cabeceras</h4>");
        Enumeration<String> nombres = req.getHeaderNames();
        while (nombres.hasMoreElements()) {
            String nombre = nombres.nextElement();
            sb.append(nombre).append(": ")
              .append(req.getHeader(nombre)).append("<br>");
        }

        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write(sb.toString());
    }
}

Al acceder a http://localhost:8080/app/dump?clave=valor se mostrará:


Información de la petición
Protocolo: HTTP/1.1
Método: GET
URI: /app/dump
Contexto: /app
Query: clave=valor
Cabeceras
host: localhost:8080
user-agent: Mozilla/5.0 ...

Etiquetas: HttpServlet Servlet API tomcat HTTP Methods Java Web

Publicado el 9-29 21:01