Jakarta Server Pages ( JSP ; anteriormente JavaServer Pages ) 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 , [1] 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 verse como una abstracción de alto nivel de los servlets de Jakarta . Los JSP se traducen a servlets en tiempo de ejecución, por lo tanto, JSP es un servlet; Cada servlet JSP se almacena en caché y se reutiliza hasta que se modifica el JSP original. [2]
Jakarta Server Pages se puede 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 Modelo 2 . [3]
JSP permite intercalar código Java y ciertas acciones predefinidas con contenido de marcado web estático, como HTML. La página resultante se compila y ejecuta en el servidor para entregar un documento. Las páginas compiladas, así como cualquier biblioteca Java dependiente, contienen código de bytes de Java en lugar de código de máquina . Como 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 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. [4]
El contenedor web crea objetos JSP implícitos como solicitud, respuesta, sesión, aplicación, configuración, página, contexto de página, salida y excepción. JSP Engine crea estos objetos durante la fase de traducción.
Los JSP utilizan varios delimitadores para funciones de secuencias de comandos . El más básico es <% ... %>
, que incluye un scriptlet JSP. Un scriptlet es un fragmento de código Java [5] que se ejecuta cuando el usuario solicita la página.
Otros delimitadores comunes incluyen expresiones <%= ... %>
for , donde el scriptlet y los delimitadores se reemplazan con el resultado de evaluar la expresión, y directivas , denotadas con <%@ ... %>
. [5] [6]
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 como resultado prácticas de programación deficientes.
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. Del mismo modo, el contenido dentro de una construcción de bucle puede aparecer varias veces en la salida, dependiendo de cuántas veces se ejecute el cuerpo del bucle.
Lo 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> Bien. </p>
El resultado mostrado 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. [7]
Aunque el uso de la useBean
etiqueta parece similar a una etiqueta HTML, todas las etiquetas JSP para JavaBeans usan sintaxis XML. Por lo tanto, el código que contiene la useBean
etiqueta distingue entre mayúsculas y minúsculas. [8]
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 del bean. Declara scope
el objeto responsable de almacenar el bean. El valor del alcance define la duración durante la cual el bean está disponible para que lo utilice el resto de la aplicación Java. El alcance puede ser uno de los siguientes cuatro valores: [8]
page
alcance implica que el bean está ubicado en el PageContext
objeto definido implícitamente y solo está disponible para la página actual. De forma 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 tienen 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 creado un bean usando la useBean
etiqueta, las etiquetas getProperty
y setProperty
se pueden usar 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 establecer las propiedades de un bean. Para las etiquetas getProperty
y setProperty
, el atributo de nombre se utiliza para especificar el nombre del bean. Por lo tanto, el atributo de nombre debe coincidir con el atributo de identificación proporcionado por la useBean
etiqueta. [9]
La versión 2.0 de la especificación JSP agregó soporte para 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 . [10]
El lenguaje de expresión JSP utiliza una sintaxis compacta que permite al desarrollador obtener atributos y propiedades de JavaBean de un objeto de solicitud determinado. Cuando se utiliza EL, se debe agregar un signo de dólar ("$") al principio del código. El símbolo del 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. [11]
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, denominadas acciones JSP, para invocar la funcionalidad integrada. [6] 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. [12] Una de esas bibliotecas es JSTL . [13]
La biblioteca de etiquetas estándar de Yakarta (JSTL) admite tareas comunes que deben realizarse en JSP. [14] Los ejemplos incluyen iteración y condicionales (el equivalente a las declaraciones "for" y "if" en Java). [13]
De todas las bibliotecas de JSTL, la biblioteca principal JSTL es la más utilizada. Se debe utilizar una directiva taglib para especificar el URI de la biblioteca principal JSTL mediante un prefijo. Aunque hay muchas opciones diferentes para el prefijo, el prefijo "c" se usa comúnmente para esta biblioteca. [15]
Las páginas JSP también se pueden escribir en una sintaxis XML totalmente válida. [16] Estos 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, el 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 generalmente está 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 probar si hay errores. [17]
Algunos contenedores JSP admiten la configuración de la frecuencia con la que el contenedor comprueba las marcas de tiempo del archivo 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 de software y en un intervalo más largo (quizás minutos o incluso nunca) para una aplicación web implementada . [18]
Según Joel Murach y Michael Urban, autores del libro "Murach's Java Servlets and JSP", incorporar código Java en JSP es generalmente una mala práctica. [19] Un mejor enfoque sería migrar la lógica de back-end integrada en JSP al código Java en Servlet
. [19] En este escenario, el Servlet
es responsable del procesamiento y el JSP es responsable de mostrar el HTML, [19] manteniendo una clara separación de preocupaciones .
En 2000, Jason Hunter, autor de "Java Servlet Programming" describió una serie de "problemas" con JavaServer Pages. [20] 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 que no es Java", con lo que se refería a las páginas Active Server de Microsoft . Más tarde, añadió 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 plantilla). [20] 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.