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
- Extender
jakarta.servlet.http.HttpServlet. - Sobrescribir los métodos que correspondan (
doGet,doPost, etc.). - Leer la información de la pettición a través del objeto
HttpServletRequest. - 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 ...