Anexo Resumen completo Servlets - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

🗒️ Esta página es una chuleta de referencia rápida de sintaxis de Servlets. Las explicaciones a fondo de cada tema están en su página correspondiente (Servlet, CONTROLADOR-PersonaControladorServlet, Patrón PRG).

Estructura básica de un Servlet

@WebServlet("/persona")
public class MiServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Manejar peticiones GET (mostrar datos, formularios, navegación)
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Manejar peticiones POST (crear, actualizar, eliminar)
    }
}
  • @WebServlet("/persona"): define la URL que atiende el servlet (sin esta anotación, hay que configurar la ruta en web.xml).

Objetos fundamentales

HttpServletRequest

String action = request.getParameter("action");
int codigo = Integer.parseInt(request.getParameter("codigo"));

request.setCharacterEncoding("UTF-8");

request.setAttribute("personas", listaPersonas);
Object obj = request.getAttribute("persona");

String contextPath = request.getContextPath();

HttpServletResponse

response.sendRedirect(request.getContextPath() + "/persona");

RequestDispatcher (forward)

request.getRequestDispatcher("/WEB-INF/vista/persona-lista.jsp")
        .forward(request, response);

Forward vs Redirect

Aspecto Forward Redirect
Peticiones HTTP 1 petición 2 peticiones
URL del navegador No cambia Cambia
Atributos del request Se mantienen Se pierden
Velocidad Más rápido Más lento
Alcance Solo dentro de la app Puede ir a cualquier URL
Uso típico Mostrar vistas (GET) Después de procesar (POST)

📌 El motivo detrás de esta elección (por qué redirigir después de un POST) está explicado en Patrón PRG.

Patrones de código extraídos del proyecto

Switch por action

String action = request.getParameter("action");
if (action == null) {
    action = "";
}

switch (action) {
    case "agregar":
        // lógica agregar
        break;
    case "editar":
        // lógica editar
        break;
    case "eliminar":
        // lógica eliminar
        break;
    default:
        // acción por defecto (listar)
        break;
}

Operaciones CRUD (skeleton)

// CREATE — POST: procesar creación
private void agregar(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
    int codigo = Integer.parseInt(request.getParameter("codigo"));
    String nombre = request.getParameter("nombre");
    dao.agregar(new PersonaVO(codigo, nombre));
    response.sendRedirect(request.getContextPath() + "/persona"); // PRG
}

// READ — GET: mostrar lista
private void listar(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    request.setAttribute("personas", dao.getLista());
    request.getRequestDispatcher("/WEB-INF/vista/persona-lista.jsp")
            .forward(request, response);
}

// UPDATE — GET: cargar datos para editar
private void cargarEditar(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    int codigo = Integer.parseInt(request.getParameter("codigo"));
    PersonaVO persona = dao.obtenerXCodigo(codigo);

    if (persona != null) {
        request.setAttribute("persona", persona);
        request.getRequestDispatcher("/WEB-INF/vista/persona-editar.jsp")
                .forward(request, response);
    } else {
        response.sendRedirect(request.getContextPath() + "/persona");
    }
}

// DELETE — POST: procesar eliminación
private void eliminar(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
    int codigo = Integer.parseInt(request.getParameter("codigo"));
    dao.eliminar(codigo);
    response.sendRedirect(request.getContextPath() + "/persona"); // PRG
}

Mejores prácticas aplicadas

1. Manejo de caracteres especiales

request.setCharacterEncoding("UTF-8");

2. Validación de parámetros

String action = request.getParameter("action");
if (action == null) {
    response.sendRedirect(request.getContextPath() + "/persona");
    return;
}

3. Métodos auxiliares privados

private void agregar(HttpServletRequest request, HttpServletResponse response) { }
private void editar(HttpServletRequest request, HttpServletResponse response) { }
private void eliminar(HttpServletRequest request, HttpServletResponse response) { }
private void listar(HttpServletRequest request, HttpServletResponse response) { }

4. Separación de responsabilidades

  • Servlet: solo controla el flujo y coordina
  • DAO: se encarga de la persistencia
  • JSP: solo se encarga de la presentación

5. URLs relativas robustas

response.sendRedirect(request.getContextPath() + "/persona");

Flujo completo en el proyecto MVC

Ejemplo: Usuario hace clic en "Agregar Persona"

Paso 1: Navegador → HTTP Request → Servlet

Usuario hace clic en: <a href="/persona?action=agregar">Agregar Persona</a>
↓
Navegador envía: GET /persona?action=agregar
↓  
Llega al: PersonaControladorServlet.doGet()

Paso 2: Servlet → DAO → Datos

switch (action) {
    case "listar":
        List<PersonaVO> personas = dao.getLista();
        break;
}

Paso 3: Servlet → JSP → HTML Response → Navegador

request.setAttribute("personas", personas);
request.getRequestDispatcher("/WEB-INF/vista/persona-lista.jsp")
        .forward(request, response);

Flujo detallado con ejemplos reales:

Caso 1: Mostrar lista (GET)

Flujo del servlet 1

Caso 2: Agregar persona (POST + PRG)

Flujo del servlet 2

¿Por qué es importante este flujo?

  • Separación clara: cada capa tiene su responsabilidad
  • Reutilización: el mismo DAO sirve para múltiples operaciones
  • Mantenibilidad: cambiar la base de datos solo afecta al DAO
  • Consistencia: siempre termina mostrando una vista actualizada

📋 Palabras clave

Servlet · HttpServlet · doGet · doPost · @WebServlet · HttpServletRequest · HttpServletResponse · forward · sendRedirect · PRG · CRUD · ciclo de vida · RequestDispatcher · setCharacterEncoding · MVC


🧠 Autoevaluación — Servlets


← Instalación en Ubuntu · 🏠 Inicio · Patrón PRG →

⚠️ **GitHub.com Fallback** ⚠️