La filosofía de las páginas JSP es la contraria a los servlets: los servlets eran clases Java que generaban o mostraban contenido HTML, y las páginas JSP son páginas HTML con código Java incrustado en diferentes partes de las mismas.
El denominado contenedor JSP (que sería un componente del servidor web) es el encargado de tomar la página, sustituir el código Java que contiene por el resultado de su ejecución, y enviarla al cliente. Así, se pueden diseñar fácilmente páginas con partes fijas y partes variables. El siguiente es un ejemplo muy sencillo de página JSP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Mi primera página JSP</title> </head> <body> <h1> Hoy es: <%= new java.util.Date() %> </h1> </body> </html>
Para ejecutar la página basta con colocarla en una aplicación web (por ejemplo, en Tomcat, dentro de webapps/ROOT). No es necesario que sea en un directorio específico como ocurre con los servlets, sino que puede ir en cualquier directorio en el que se colocaría normalmente un HTML.
Aunque JSP y servlets parecen a primera vista tecnologías distintas, en realidad el servidor web traduce internamente el JSP a un servlet, lo compila y finalmente lo ejecuta cada vez que el cliente solicita la página JSP. Por ello, en principio, JSPs y servlets ofrecen la misma funcionalidad, aunque sus características los hacen apropiados para distinto tipo de tareas. Los JSP son mejores para generar páginas con gran parte de contenido estático. Un servlet que realice la misma función debe incluir gran cantidad de sentencias del tipo out.println() para producir el HTML. Por el contrario, los servlets son mejores en tareas que generen poca salida, datos binarios o páginas con gran parte de contenido variable. En proyectos más complejos, lo recomendable es combinar ambas tecnologías: los servlets para el procesamiento de información y los JSP para presentar los datos al cliente.
Existen tres tipos de elementos JSP que podemos insertar en una página web:
Se pueden poner comentarios en una página JSP entre los símbolos <%-- y --%>. El contenedor JSP ignorará todo lo contenido entre ambos. Dentro de los fragmentos de código Java también se pueden colocar comentarios siguiendo la sintaxis habitual del lenguaje.
Hay tres formas de insertar código Java en una página JSP:
Hoy es <%= new java.util.Date() %>
<% java.util.Calendar ahora = java.util.Calendar.getInstance(); int hora = ahora.get(java.util.Calendar.HOUR_OF_DAY); %> <b> Hola mundo, <i> <% if ((hora>20)||(hora<6)) { %> buenas noches <% } else if ((hora>=6)&&(hora<=12)) { %> buenos días <% } else { %> buenas tardes <% } %> </i> </b>
Permiten definir variables o métodos que se insertarán dentro del cuerpo del servlet generado. Esto da la posibilidad de sobreescribir los métodos jspInit y jspDestroy que son el equivalente en JSP del init y destroy de los servlets. Las variables declaradas conservarán su valor entre sucesivas llamadas a la página, ya que son variables miembro del servlet y no locales al método jspService. Esto nos permite, por ejemplo, crear un contador de accesos a la página:
<%! private int accesos = 0; %> ... <h1> Visitas: <%= ++accesos %> </h1>
Objetos implícitos en JSP
Desde dentro de páginas JSP podemos acceder a objetos que también tienen los servlets, como son por ejemplo la petición (request) y la respuesta (response). De esta forma, desde una página JSP también podemos redirigir a otra página:
<% reponse.sendRedirect("mipagina.jsp"); %>
u obtener un parámetro que nos envíen desde un formulario:
<% String login = request.getParameter("login"); %>
Las directivas influyen en la estructura que tendrá el servlet generado a partir de la página JSP. Hay tres tipos de directivas:
El formato genérico de una directiva es:
<%@ directiva atributo="valor" %>
algunas directivas admiten más de un atributo.
Por ejemplo, podemos utilizar la directiva page para hacer imports de Java con los paquetes que vayamos a utilizar en nuestro código:
<%@ page import="java.io.*" %>
o utilizar la directiva include para incluir directamente el contenido de otra página JSP en la nuestra (antes de compilar)
<%@ include file="config.jsp" %>
En JSP, entre otras muchas cosas, también tenemos disponibles unas acciones, que permiten hacer mediante etiquetas parecidas a las de HTML una serie de operaciones, como por ejemplo, incluir el contenido de otra página en la actual (después de la compilación, a diferencia de la directiva include):
<jsp:include page="otraPagina.jsp"/>
o redirigir a otra página sin forzar una nueva petición:
<jsp:forward page="error.html"/>
Para encontrar información sobre servlets y JSP, son de utilidad las siguientes direcciones: