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:
- Carga: Tomcat instancia el Servlet (una sola instancia por defecto).
- init(): se llama una vez al inicializar. Sobrescríbelo para configuración inicial.
- 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.
- 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
