Primer formulario con Servlet - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

📦 Proyecto: primer-formulario-servlet — ⬇️ Descargar · ☁️ Abrir en Codespace


Antes de encarar el Mini-CRUD completo, vamos a hacer el ejemplo más simple posible: un formulario que recibe un nombre y lo muestra de vuelta en pantalla.

Este ejemplo usa solo 2 archivos y no necesita base de datos.


Estructura del proyecto

src/
└── main/
    ├── java/com/escuela/
    │   └── HolaMundoServlet.java
    └── webapp/
        ├── formulario.jsp      ← el formulario
        └── saludo.jsp          ← la respuesta

Paso 1 — El formulario (formulario.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Mi primer formulario</title>
</head>
<body>
  <h1>¿Cuál es tu nombre?</h1>

  <form action="saludo" method="post">
    <label>Nombre:
      <input type="text" name="nombre" required>
    </label>
    <button type="submit">Saludar</button>
  </form>
</body>
</html>

📌 action="saludo" indica qué URL maneja el formulario.
📌 method="post" porque estamos enviando datos.


Paso 2 — El Servlet (HolaMundoServlet.java)

package com.escuela;

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

@WebServlet("/saludo")          // ← responde a la URL /saludo
public class HolaMundoServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        // 1. Obtener el dato que envió el formulario
        String nombre = req.getParameter("nombre");

        // 2. Guardarlo como atributo para que el JSP lo use
        req.setAttribute("nombre", nombre);

        // 3. Pasar el control al JSP que muestra el saludo
        req.getRequestDispatcher("/saludo.jsp")
           .forward(req, resp);
    }
}

📌 @WebServlet("/saludo") registra el Servlet en la URL /saludo.
📌 req.getParameter("nombre") lee el campo del formulario cuyo name es "nombre".
📌 req.setAttribute(...) es como poner un dato "en un cajón" para que el JSP lo lea.


Paso 3 — La respuesta (saludo.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="fn" uri="jakarta.tags.functions" %>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Saludo</title>
</head>
<body>
  <h1>¡Hola, ${nombre}!</h1>
  <p>Tu nombre tiene ${fn:length(nombre)} letras.</p>

  <a href="formulario.jsp">← Volver</a>
</body>
</html>

📌 ${nombre} lee el atributo que el Servlet guardó con setAttribute. Esto es Expression Language (EL) — una forma simple de mostrar datos en JSP sin escribir código Java.

📌 La línea <%@ taglib prefix="fn" uri="jakarta.tags.functions" %> habilita las funciones JSTL como fn:length(...) — sin ella, esa expresión no funciona.


¿Qué aprendemos de este ejemplo?

[formulario.jsp]  →  POST /saludo  →  [HolaMundoServlet]  →  forward  →  [saludo.jsp]
  HTML puro          HTTP Request      Java: lee param,         →         HTML con dato
                                       guarda atributo
Concepto Dónde aparece
<form action method> formulario.jsp
@WebServlet HolaMundoServlet.java
doPost() HolaMundoServlet.java
getParameter() HolaMundoServlet.java
setAttribute() HolaMundoServlet.java
forward() HolaMundoServlet.java
${variable} (EL) saludo.jsp

Todos estos conceptos van a volver a aparecer en el Mini-CRUD, pero aplicados a personas y con base de datos.


Ejercicio para practicar

Modifica el ejemplo para que el formulario pida también la edad y el JSP muestre:

"Hola Ana, tienes 20 años. En 10 años vas a tener 30."


📋 Palabras clave

formulario · Servlet · doPost · getParameter · setAttribute · forward · @WebServlet · Expression Language · method POST · action · JSP · request · response


🧠 Autoevaluación — Servlets


← ¿Qué es un Servlet? · 🏠 Inicio · HTTP Sessions →

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