JSP con Scriptlets - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki
⚠️ Nota sobre este enfoque: Los scriptlets son la forma original de escribir JSP — mezclar código Java directamente en el HTML. Hoy están en desuso porque dificultan la lectura y el mantenimiento. En este curso se trabaja con EL y JSTL (ver ¿Qué es un archivo JSP?), que es el enfoque moderno y recomendado. Esta página existe para que se pueda reconocer y entender código legado o ejemplos encontrados en internet.
Un scriptlet es un bloque de código Java embebido directamente en un archivo JSP. La sintaxis básica es:
<% código java %>Esto permitía escribir cualquier instrucción Java dentro del HTML de la vista. La idea era conveniente en un principio, pero resultó problemática a medida que las aplicaciones crecían.
<%@ directiva atributo="valor" %>Ejemplos:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.List" %>¿Para qué sirven?
-
contentType: Define el tipo de contenido y codificación -
import: Importa clases Java necesarias en el JSP
<% código java %>Ejemplo:
<%
String baseURL = request.getContextPath();
String mensaje = (String) request.getAttribute("mensaje");
%><%= expresión_java %>Las expresiones evalúan Java y escriben el resultado directamente en el HTML.
Ejemplos:
<%= baseURL %>
<%= mensaje %>Los archivos JSP tienen acceso a ciertos objetos sin necesidad de declararlos:
| Objeto | Uso habitual |
|---|---|
request |
Acceder a parámetros y atributos del request |
response |
Manipular la respuesta HTTP |
session |
Datos de sesión del usuario |
out |
Escribir directamente en la salida HTML |
Ejemplo con request:
<%= request.getContextPath() %> <!-- Obtiene la ruta base de la app -->
<%= request.getAttribute("mensaje") %> <!-- Obtiene atributo del request --><%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.List" %>
<%
String baseURL = request.getContextPath();
%><link rel="stylesheet" href="<%= baseURL %>/css/styles.css" />
<a href="<%= baseURL %>/productos?action=listar">Ver lista</a>
<form action="<%= baseURL %>/productos" method="post"><%
List<String> lista = (List<String>) request.getAttribute("nombres");
if (lista != null && !lista.isEmpty()) {
for (String nombre : lista) {
%>
<tr>
<td><%= nombre %></td>
</tr>
<%
}
} else {
%>
<tr><td>No hay datos</td></tr>
<%
}
%><%
String nombre = (String) request.getAttribute("nombre");
%>
<p>Nombre: <%= nombre %></p><input type="text" name="nombre" value="<%= request.getAttribute("nombre") %>" required />❌ Olvidar el casting al recuperar atributos:
List lista = request.getAttribute("nombres"); // Error de compilación✅ Casting correcto:
List<String> lista = (List<String>) request.getAttribute("nombres");❌ URLs hardcodeadas:
<form action="/productos" method="post"> <!-- Puede romperse según el contexto de la app -->✅ URLs con baseURL:
<form action="<%= baseURL %>/productos" method="post">❌ No validar nulos antes de usar el objeto:
<%= request.getAttribute("nombre").toString() %> <!-- NullPointerException si es null -->✅ Validar antes de usar:
<% if (request.getAttribute("nombre") != null) { %>
<%= request.getAttribute("nombre") %>
<% } %>El principal problema de los scriptlets es que mezclan Java con HTML en el mismo archivo. Esto tiene varias consecuencias:
- El archivo se vuelve difícil de leer cuando la lógica crece
- El código Java del JSP no se puede probar de forma independiente
- El diseñador de la vista necesita entender Java para modificar la página
- Cualquier error en el código Java rompe la presentación completa Por eso la comunidad Java adoptó Expression Language (EL) y JSTL, que logran lo mismo sin escribir una sola línea de Java en el JSP. Para ver esa forma, continuar con la siguiente página.
💡 Cuando lleguen al proyecto del curso, van a reconocer estos patrones aplicados con las clases del modelo (VO y DAO). La lógica es exactamente la misma, solo cambia el tipo de dato que se recupera del request.
JSP · JavaServer Pages · scriptlet · <% %> · <%= %> · expresión JSP · directiva · objetos implícitos · request.getAttribute · baseURL · getContextPath · código legado
← Ciclo de una petición web · 🏠 Inicio · ¿Qué es un archivo JSP? (EL/JSTL) →
