Adiós, código espagueti: cómo eliminar Java de JSP de una vez por todas
\n\nSi alguna vez ha abierto un archivo JSP antiguo y ha visto una mezcla de HTML, <% %> scriptlets y lógica en Java, conoce esa sensación. La mezcla de presentación y lógica de negocio convierte el mantenimiento del proyecto en un infierno. La pregunta "How can I avoid Java code in JSP files, using JSP 2?" en Stack Overflow ha acumulado miles de visitas, y con razón.
La buena noticia: JSP 2 (Java Server Pages versión 2) nos dio las herramientas para olvidarnos para siempre de los scriptlets. En este artículo mostraré tres enfoques reales que convertirán sus JSP en plantillas limpias y legibles. Sin rodeos, solo código y práctica.
\n\n¿Por qué los scriptlets son malos? La mirada del desarrollador
\n\nLos scriptlets (esos <% ... %>) violan el principio principal de MVC: separación de lógica y presentación. Aquí hay tres razones por las que debe deshacerse de ellos:
- \n
- Dificultad de mantenimiento. Cuando hay consultas SQL y operadores condicionales en el JSP, el diseñador no puede modificar el maquetado de forma segura. \n
- Pruebas difíciles. La lógica dentro del JSP no se puede probar con unit tests. \n
- Mala legibilidad. El código se convierte en "espagueti", donde Java se mezcla con HTML. \n
JSP 2 ofrece alternativas elegantes. Analicémoslas con un ejemplo real: mostrar una lista de usuarios desde la base de datos.
\n\nEnfoque 1: Expression Language (EL) — su nuevo amigo
\n\nExpression Language (EL) permite acceder a objetos Java directamente en JSP sin una sola línea de código Java. La sintaxis ${...} es intuitiva.
Antes (con código Java):
\n\n<% \n User user = (User) request.getAttribute("user"); \n out.println("Hola, " + user.getName());\n%>\n\nDespués (con EL):
\n\n<p>Hola, ${user.name}</p>\n\nEL llama automáticamente a los getters. Si user.getName() devuelve una cadena, se insertará en el HTML. Si el objeto es null, EL simplemente no mostrará nada (sin NullPointerException).
Dónde usarlo: para mostrar datos del ámbito request, session, application o parámetros de solicitud.
\n\nEnfoque 2: JSTL (JSP Standard Tag Library) — bucles y condiciones sin Java
\n\nJSTL es un conjunto de tags listos para usar que cubren el 90% de las tareas típicas: bucles, condiciones, formato, trabajo con URL. Para usarlo, solo necesita agregar la dependencia en pom.xml (Maven) o descargar el JAR.
Ejemplo: mostrar una lista de usuarios en una tabla.
\n\nAntes (scriptlets):
\n\n<table>\n <%\n List<User> users = (List<User>) request.getAttribute("users");\n for (User u : users) {\n %>\n <tr><td><%= u.getName() %></td><td><%= u.getEmail() %></td></tr>\n <%\n }\n %>\n</table>\n\nDespués (JSTL + EL):
\n\n<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>\n<table>\n <c:forEach var="u" items="${users}">\n <tr>\n <td>${u.name}</td>\n <td>${u.email}</td>\n </tr>\n </c:forEach>\n</table>\n\nObserve: ¡ni una sola línea de Java! El tag <c:forEach> funciona como un bucle foreach, y ${u.name} es una expresión EL. El código se ha vuelto legible y seguro.
Otros tags útiles de JSTL:
\n- \n
<c:if test="${condition}">— salida condicional \n <c:choose>— análogo a switch \n <c:set var="x" value="..." />— creación de variables \n <fmt:formatDate>— formato de fechas \n