Las páginas JSP permiten escribir HTML con fragmentos de Java incrustados. Tomcat las compila automáticamente a Servlets la primera vez que se solicitan.
Sintaxis básica de JSP
<%-- Esto es un comentario JSP (no aparece en el HTML generado) --%>
<%-- Directiva de página --%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.List, java.time.LocalDate" %>
<!DOCTYPE html>
<html>
<head><title>Mi JSP</title></head>
<body>
<%-- Expresión: imprime el valor directamente --%>
<p>Fecha: <%= LocalDate.now() %></p>
<%-- Scriptlet: bloque de código Java --%>
<%
String usuario = (String) session.getAttribute("usuario");
if (usuario == null) {
response.sendRedirect("login.jsp");
return;
}
%>
<p>Bienvenido, <%= usuario %></p>
<%-- Declaración: define métodos o variables de instancia del Servlet generado --%>
<%!
private String formatear(String s) { return s.toUpperCase(); }
%>
</body>
</html>
Objetos implícitos de JSP
Dentro de una página JSP tienes disponibles sin declararlos:
request—HttpServletRequestresponse—HttpServletResponsesession—HttpSessionapplication—ServletContextout—JspWriter(el PrintWriter de la respuesta)pageContext— acceso a todos los ámbitosconfig—ServletConfig
JSTL: adiós a los scriptlets
La forma moderna de escribir JSP evita los scriptlets y usa JSTL (Jakarta Standard Tag Library) en su lugar:
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
<c:if test="${not empty usuario}">
<p>Bienvenido, <c:out value="${usuario}"/></p>
</c:if>
<c:choose>
<c:when test="${pedido.estado == 'ENVIADO'}">
<span class="badge green">Enviado</span>
</c:when>
<c:otherwise>
<span class="badge yellow">Pendiente</span>
</c:otherwise>
</c:choose>
<c:forEach items="${productos}" var="p" varStatus="st">
<tr>
<td>${st.index + 1}</td>
<td><c:out value="${p.nombre}"/></td>
<td><fmt:formatNumber value="${p.precio}" type="currency" currencySymbol="€"/></td>
</tr>
</c:forEach>
<c:url value="/productos" var="urlProductos">
<c:param name="pagina" value="${pagActual + 1}"/>
</c:url>
<a href="${urlProductos}">Siguiente →</a>
