Servlets y JSP: tutorial Jakarta EE 10 y Java 21

Un Servlet es una clase Java que hereda de HttpServlet y sobreescribe los métodos que corresponden a los verbos HTTP: doGet(), doPost(), doPut(), doDelete().

Hola Mundo con anotación @WebServlet

package com.ejemplo;

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hola")  // mapeo de URL: http://localhost:8080/mi-app/hola
public class HolaMundoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType("text/html; charset=UTF-8");

        try (PrintWriter out = resp.getWriter()) {
            out.println("<!DOCTYPE html>");
            out.println("<html><body>");
            out.println("<h1>¡Hola desde Jakarta EE 10!</h1>");
            out.println("<p>Java " + System.getProperty("java.version") + "</p>");
            out.println("</body></html>");
        }
    }
}

Ciclo de vida de un Servlet

El contenedor (Tomcat) gestiona el ciclo de vida:

  1. Carga: Tomcat instancia el Servlet (una sola instancia por defecto).
  2. init(): se llama una vez al inicializar. Sobrescríbelo para configuración inicial.
  3. service(): se llama en cada petición, delega a doGet/doPost/etc. Puede ser llamado por múltiples hilos simultáneamente — los Servlets deben ser thread-safe.
  4. destroy(): se llama cuando Tomcat descarga el Servlet (al parar el servidor o redeplegar). Libera recursos.
@WebServlet("/configurado")
public class ConfiguradoServlet extends HttpServlet {

    private String apiKey;

    @Override
    public void init() {
        // Se ejecuta una sola vez al arrancar
        apiKey = getServletContext().getInitParameter("api.key");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        // Múltiples hilos pueden llamar a este método simultáneamente
        // NO usar campos de instancia mutables aquí
        String nombre = req.getParameter("nombre");
        resp.getWriter().println("Hola " + (nombre != null ? nombre : "mundo"));
    }

    @Override
    public void destroy() {
        // Liberar conexiones, cerrar recursos
    }
}

Leer parámetros de la petición

// GET: /buscar?q=java&pagina=2
String query   = req.getParameter("q");        // primer valor
String pagina  = req.getParameter("pagina");
String[] tags  = req.getParameterValues("tag"); // parámetro repetido

// Cabeceras HTTP
String userAgent = req.getHeader("User-Agent");
String accept    = req.getHeader("Accept");

// Información de la petición
String metodo = req.getMethod();      // "GET", "POST"...
String uri    = req.getRequestURI();  // "/mi-app/buscar"
String ip     = req.getRemoteAddr();

Enviar respuestas

// HTML
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().println("<p>Respuesta HTML</p>");

// JSON (sin framework)
resp.setContentType("application/json; charset=UTF-8");
resp.getWriter().println("{\"estado\": \"ok\", \"version\": \"1.0\"}");

// Código de estado HTTP
resp.setStatus(HttpServletResponse.SC_NOT_FOUND); // 404
resp.setStatus(HttpServletResponse.SC_CREATED);   // 201

// Redirección
resp.sendRedirect("/mi-app/inicio");              // 302

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR