Jakarta Server Pages ( JSP ; anteriormente JavaServer Pages ) [1] es una colección de tecnologías que ayuda a los desarrolladores de software a crear páginas web generadas dinámicamente basadas en HTML , XML , SOAP u otros tipos de documentos. Lanzado en 1999 por Sun Microsystems , [2] JSP es similar a PHP y ASP , pero utiliza el lenguaje de programación Java .
Para implementar y ejecutar Jakarta Server Pages, se requiere un servidor web compatible con un contenedor de servlets , como Apache Tomcat o Jetty .
Desde el punto de vista arquitectónico, JSP puede considerarse una abstracción de alto nivel de los servlets de Jakarta . Los JSP se traducen en servlets en tiempo de ejecución, por lo que JSP es un servlet; cada servlet de JSP se almacena en caché y se reutiliza hasta que se modifica el JSP original. [3]
Las páginas de servidor de Jakarta se pueden utilizar de forma independiente o como componente de vista de un diseño de modelo-vista-controlador del lado del servidor, normalmente con JavaBeans como modelo y servlets Java (o un marco como Apache Struts ) como controlador. Este es un tipo de arquitectura del Modelo 2. [4]
JSP permite que el código Java y ciertas acciones predefinidas se intercalen con contenido de marcado web estático, como HTML. La página resultante se compila y se ejecuta en el servidor para entregar un documento. Las páginas compiladas, así como las bibliotecas Java dependientes, contienen código de bytes de Java en lugar de código de máquina . Al igual que cualquier otro programa .jar o Java, el código debe ejecutarse dentro de una máquina virtual Java (JVM) que interactúa con el sistema operativo host del servidor para proporcionar un entorno abstracto y neutral en cuanto a la plataforma.
Los JSP se utilizan normalmente para entregar documentos HTML y XML, pero mediante el uso de OutputStream, también pueden entregar otros tipos de datos. [5]
El contenedor web crea objetos implícitos JSP como solicitud, respuesta, sesión, aplicación, configuración, página, pageContext, salida y excepción. JSP Engine crea estos objetos durante la fase de traducción.
Los JSP utilizan varios delimitadores para las funciones de scripting . El más básico es <% ... %>
, que encierra un scriptlet de JSP. Un scriptlet es un fragmento de código Java [6] que se ejecuta cuando el usuario solicita la página.
Otros delimitadores comunes incluyen <%= ... %>
expresiones , donde el scriptlet y los delimitadores se reemplazan con el resultado de evaluar la expresión, y directivas , denotadas con <%@ ... %>
. [6] [7]
No es necesario que el código Java esté completo o sea autónomo dentro de un único bloque de scriptlet. Puede abarcar contenido de marcado, siempre que la página en su conjunto sea sintácticamente correcta. Por ejemplo, cualquier bloque if/for/while de Java abierto en un scriptlet debe cerrarse correctamente en un scriptlet posterior para que la página se compile correctamente. Esto permite que el código se entremezcle y puede dar lugar a malas prácticas de programación.
El contenido que se encuentra dentro de un bloque dividido de código Java (que abarca varios scriptlets) está sujeto a ese código. El contenido dentro de un bloque if solo aparecerá en la salida cuando la condición if se evalúe como verdadera. De la misma manera, el contenido dentro de una construcción de bucle puede aparecer varias veces en la salida, según la cantidad de veces que se ejecute el cuerpo del bucle.
El siguiente sería un bucle for válido en una página JSP:
<p> Contando hasta tres: </p> <% for ( int i = 1 ; i < 4 ; i ++ ) { %> <p> Este número es <%= i %> . </p> <% } %> <p> OK. </p>
La salida mostrada en el navegador web del usuario sería:
Contando hasta tres:Este número es 1.Este número es 2.Este número es 3.DE ACUERDO.
La etiqueta JSP useBean
permite al desarrollador acceder y crear un Javabean. [8]
Aunque el uso de la useBean
etiqueta parece similar al de una etiqueta HTML, todas las etiquetas JSP para JavaBeans utilizan sintaxis XML. Por lo tanto, el código que contiene la useBean
etiqueta distingue entre mayúsculas y minúsculas. [9]
La useBean
etiqueta contiene varios atributos. El id
atributo declara el nombre que se utiliza para obtener acceso al bean. El class
atributo declara el paquete y la clase para el bean. El scope
declara el objeto responsable de almacenar el bean. El valor del ámbito define la duración durante la cual el bean está disponible para que lo utilice el resto de la aplicación Java. El ámbito puede ser uno de los cuatro valores siguientes: [9]
page
alcance implica que el bean se encuentra en el PageContext
objeto definido implícitamente y solo está disponible para la página actual. De manera predeterminada, todos los beans tienen un alcance de page
.request
alcance implica que el bean se puede encontrar en el HttpServletRequest
objeto. Todos los demás JSP y servlets que tengan acceso al objeto de solicitud actual pueden acceder a este bean.session
alcance implica que el bean se puede encontrar en el HttpSession
objeto. Todos los demás JSP y servlets que tengan acceso al HttpSession
objeto especificado pueden acceder a este bean.application
alcance implica que el bean se puede encontrar en el ServletContext
objeto. Todos los demás JSP y servlets que tengan acceso al ServletContext
objeto especificado pueden acceder a este bean.Una vez que se ha creado un bean utilizando la useBean
etiqueta, las etiquetas getProperty
y setProperty
se pueden utilizar para obtener y configurar las propiedades del bean. El JSP getProperty
se utiliza para obtener la propiedad del bean creado. La setProperty
etiqueta JSP se utiliza para configurar las propiedades de un bean. Para las etiquetas getProperty
y setProperty
, el atributo name se utiliza para especificar el nombre del bean. Por lo tanto, el atributo name debe coincidir con el atributo id proporcionado por la useBean
etiqueta. [10]
La versión 2.0 de la especificación JSP agregó compatibilidad con el lenguaje de expresión (EL), utilizado para acceder a datos y funciones en objetos Java. En JSP 2.1, se incorporó al lenguaje de expresión unificado , que también se utiliza en JavaServer Faces . [11]
El lenguaje de expresión JSP utiliza una sintaxis compacta que permite al desarrollador obtener atributos y propiedades JavaBean de un objeto de solicitud determinado. Cuando se utiliza EL, se debe agregar un signo de dólar ("$") al comienzo del código. El símbolo de dólar va seguido de una llave de apertura ("{"), así como de una llave de cierre ("}"). Luego, el código se escribe entre las llaves de apertura y cierre. [12]
El siguiente es un ejemplo de sintaxis EL :
El valor de variable
en el objeto javabean
es ${javabean.variable}
.
La sintaxis JSP agrega etiquetas adicionales, llamadas acciones JSP, para invocar la funcionalidad incorporada. [7] Además, la tecnología permite la creación de bibliotecas de etiquetas JSP personalizadas que actúan como extensiones de la sintaxis JSP estándar. [13] Una de estas bibliotecas es JSTL . [14]
La biblioteca de etiquetas estándar de Jakarta (JSTL) admite tareas comunes que deben realizarse en JSP. [15] Los ejemplos incluyen iteración y condicionales (el equivalente de las declaraciones "for" y "if" en Java). [14]
De todas las bibliotecas de JSTL, la biblioteca principal de JSTL es la más utilizada. Se debe utilizar una directiva taglib para especificar la URI de la biblioteca principal de JSTL mediante un prefijo. Aunque existen muchas opciones diferentes para el prefijo, el prefijo "c" es el que se utiliza habitualmente para esta biblioteca. [16]
Las páginas JSP también pueden escribirse en sintaxis XML totalmente válida. [17] Dichos archivos JSP suelen utilizar la .jspx
extensión de archivo alternativa, que normalmente hace que el servidor de aplicaciones valide la sintaxis XML.
Dado que la sintaxis JSP habitual <% ... %>
no es válida en XML, un desarrollador debe utilizar etiquetas alternativas proporcionadas por JSP. Por ejemplo, la <%@ page .. %>
directiva común puede escribirse como una <jsp:directive.page .. />
etiqueta y las bibliotecas de etiquetas se importan utilizando espacios de nombres XML , en lugar de la etiqueta habitual <%@ taglib .. %>
.
Un compilador de JavaServer Pages es un programa que analiza JSP y los transforma en Servlets Java ejecutables . Un programa de este tipo suele estar integrado en el servidor de aplicaciones y se ejecuta automáticamente la primera vez que se accede a un JSP, pero las páginas también pueden precompilarse para un mejor rendimiento o compilarse como parte del proceso de compilación para comprobar si hay errores. [18]
Algunos contenedores JSP permiten configurar la frecuencia con la que el contenedor comprueba las marcas de tiempo de los archivos JSP para ver si la página ha cambiado. Normalmente, esta marca de tiempo se establecería en un intervalo corto (quizás segundos) durante el desarrollo del software y en un intervalo más largo (quizás minutos o incluso nunca) para una aplicación web implementada . [19]
Según Joel Murach y Michael Urban, autores del libro "Murach's Java Servlets and JSP", incrustar código Java en JSP es generalmente una mala práctica. [20] Un mejor enfoque sería migrar la lógica de back-end incrustada en JSP al código Java en el Servlet
. [20] En este escenario, el Servlet
es responsable del procesamiento, y el JSP es responsable de mostrar el HTML, [20] manteniendo una clara separación de preocupaciones .
En 2000, Jason Hunter, autor de "Java Servlet Programming", describió una serie de "problemas" con JavaServer Pages. [21] Sin embargo, escribió que si bien JSP puede no ser la "mejor solución para la plataforma Java", era la "solución Java que más se parece a la solución no Java", con lo que se refería a Active Server Pages de Microsoft . Más tarde, agregó una nota a su sitio diciendo que JSP había mejorado desde 2000, pero también citó a sus competidores, Apache Velocity y Tea (lenguaje de plantillas). [21] Hoy en día, varias alternativas y una serie de páginas orientadas a JSP en aplicaciones web más grandes se consideran deuda técnica.