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).
@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 enweb.xml).
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();response.sendRedirect(request.getContextPath() + "/persona");request.getRequestDispatcher("/WEB-INF/vista/persona-lista.jsp")
.forward(request, response);| 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.
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;
}// 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
}request.setCharacterEncoding("UTF-8");String action = request.getParameter("action");
if (action == null) {
response.sendRedirect(request.getContextPath() + "/persona");
return;
}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) { }- Servlet: solo controla el flujo y coordina
- DAO: se encarga de la persistencia
- JSP: solo se encarga de la presentación
response.sendRedirect(request.getContextPath() + "/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);
- 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
Servlet · HttpServlet · doGet · doPost · @WebServlet · HttpServletRequest · HttpServletResponse · forward · sendRedirect · PRG · CRUD · ciclo de vida · RequestDispatcher · setCharacterEncoding · MVC
