JSP con Scriptlets - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

JSP con Scriptlets

⚠️ 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.


¿Qué son los scriptlets?

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.


Sintaxis básica con scriptlets

1. Directivas JSP

<%@ 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

2. Scriptlets — código Java embebido

<% código java %>

Ejemplo:

<%
String baseURL = request.getContextPath();
String mensaje = (String) request.getAttribute("mensaje");
%>

3. Expresiones JSP — mostrar valores

<%= expresión_java %>

Las expresiones evalúan Java y escriben el resultado directamente en el HTML.

Ejemplos:

<%= baseURL %>
<%= mensaje %>

Objetos implícitos en JSP

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 -->

Patrones comunes con scriptlets

1. Configuración inicial

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.List" %>
<%
String baseURL = request.getContextPath();
%>

2. URLs con baseURL

<link rel="stylesheet" href="<%= baseURL %>/css/styles.css" />
<a href="<%= baseURL %>/productos?action=listar">Ver lista</a>
<form action="<%= baseURL %>/productos" method="post">

3. Mostrar una lista de datos

<%
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>
<%
}
%>

4. Mostrar un valor recuperado del request

<%
String nombre = (String) request.getAttribute("nombre");
%>
<p>Nombre: <%= nombre %></p>

5. Campo de formulario precargado

<input type="text" name="nombre" value="<%= request.getAttribute("nombre") %>" required />

Errores comunes con scriptlets

❌ 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") %>
<% } %>

¿Por qué se dejaron de usar?

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.


📋 Palabras clave

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) →

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