JavaServer Pages (JSP) PFC-INX84 JAVASERVER PAGES (JSP) Introducción JSP es una extensión de la tecnología Java Servlets. Mientras que estos últimos tienen que mantener plantillas de código HTML dentro del programa, JSP contiene estas plantillas dentro de las propias páginas. La tecnología JSP está ideada para facilitar la creación de aplicaciones web gracias a características como [Sun 99]: § § § § Separación entre generación de contenido y presentación. Mediante etiquetas HTML o XML se da formato a la página, y mediante etiquetas JSP, código script o JavaBeans se añade el componente dinámico. De esta forma, encapsulando la lógica, se puede modificar la presentación de la página JSP sin afectar a la generación del contenido. Reutilización de componentes software. La descomposición en componentes que caracteriza a esta tecnología facilita el que objetos de una aplicación vuelvan a utilizarse en dominios diferentes. Por ejemplo, objetos como el analizador léxico o el extractor de raíces definidos para el glosario, pueden ser reutilizados para desarrollar otro tipo de aplicaciones en las que se necesite integrar técnicas de RI. Utilización de etiquetas XML para simplificar el desarrollo de las páginas. Así se ocultan detalles de implementación y se facilita la construcción de páginas que integren código JSP, incluso a desarrolladores web poco acostumbrados a trabajar con lenguajes script. A través del mecanismo de extensibilidad de las librerías de etiquetas, estas pueden personalizarse para las necesidades de cada sistema. Independencia de la plataforma tanto cliente como servidor. Por un lado, la utilización de código Java garantiza la portabilidad de la aplicación para su ejecución en cualquier servidor que contenga una maquina virtual Java. Esta es una ventaja sustancial frente a otras tecnologías similares, como por ejemplo Active Server Pages (ASP) [González et al. 00]. En el caso del cliente, al recibir sólo páginas HTML hace que sea compatible con cualquier navegador. Funcionamiento Cuando se produce una solicitud de una página JSP por parte de un navegador, se comienza comprobando si se trata de la primera solicitud de dicha página. En ese caso se compila a un servlet, que es ejecutado y cuya salida es devuelta al usuario que realizó la petición. Las siguientes solicitudes son más eficientes al no necesitar que dicha página sea de nuevo compilada, ya que sólo se invoca al servlet que se generó en la petición inicial. En este sentido esta tecnología es más ventajosa que otras como ASP, que requieren cada vez una nueva compilación. El proceso de compilación de las páginas consiste en analizar su contenido buscando etiquetas JSP y traduciendo éstas a código Java equivalente. El contenido estático de las páginas (código html) es traducido a cadenas de caracteres en lenguaje Java. Las etiquetas de componentes JavaBeans son traducidas a su correspondiente Carlos Cuervo Martínez 1 JavaServer Pages (JSP) PFC-INX84 objeto, mientras que los elementos script son transferidos tal cual. Todo este código fuente es usado para formar los métodos de servicio del servlet que se va a generar. Componentes de una página JSP A continuación se hace una breve descripción de los componentes más generales de las páginas JSP [Hall 00]. Directivas JSP Son instrucciones que son procesadas por el compilador JSP cuando la página se compila a un Servlet, las directivas son usadas para insertar datos de ficheros externos, especificar librerías definidas por el usuario, etc. Estas directivas de definen dentro de las etiquetas <%@ y %>. Por ejemplo para importar la librería java.util y tener acceso a las clases de esta librería dentro de una página JSP, se pondrá la siguiente línea al principio de la página, puede ir antes o después de la etiqueta <HTML>: <%@ page import=”java.util.*” %> Declaraciones Son similares a las declaraciones de variables en Java, sirven para definir variables para su uso en expresiones o scripts, las declaraciones se definen entre las etiquetas <%! y %>. Por ejemplo se va a definir una variable entera la cual contendrá el valor de la hora del día. <%! int time = Calendar.getInstance().ger(Calendar.AM_PM); %> Expresiones Son variables o constantes que son usadas para insertar valores dentro de la página que devuelve el servidor web, se introducen entre las etiquetas <%= y %>. La expresión que va entre esas dos etiquetas es evaluada y ejecutada por el compilador JSP, sustituyendo las etiquetas y la expresión por el valor que se genera de la ejecución de dicha expresión. Por ejemplo, para obtener la fecha del sistema dentro de una página JSP se podría insertar la siguiente expresión que crea un objeto Date, el cual devuelve la fecha del sistema: <%= new java.util.Date() %> El compilador JSP, evalúa la expresión anterior, la ejecuta y la sustituye por la fecha del sistema . Carlos Cuervo Martínez 2 JavaServer Pages (JSP) PFC-INX84 Para las expresiones JSP puede usarse una sintaxis basada en XML de la siguiente forma: <jsp: expresión > Expresión en lenguaje java </jsp: expresión> Estas etiquetas también pueden tener parámetros, como los usados para asignar valores a los atributos de un Java Bean, a continuación se muestra un ejemplo en el que se supone que tenemos una instancia de un objeto Java Bean con el nombre “fuente” y tiene un atributo llamado “codigo” al cual se le va a asignar el valor “Carlos”: <jsp: setProperty name=”fuente” property=”codigo” value=”Carlos” /> En vez de asignarle al parámetro “value” una constante, se le puede asignar el valor obtenido de la evaluación de una expresión, por el siguiente ejemplo asigna a un objeto llamado “usuario” el valor “Usuario” seguido de un número aleatorio al atributo “id”: <jsp:setProperty name=”usuario” property=”id” value’<%= “Usuario “+ Math.random() %>’ /> Variables predefinidas Dentro de una página JSP se puede acceder a una serie de variables que simplifican el código de las expresiones y scripts JSP. Las más importantes son: § § § § request: Es el objeto HttpServletRequest asociado con la solicitud del cliente, con esta variable se puede acceder a los parámetros recibidos del formulario del cliente, así como a las cabeceras http. response: Es el objeto HttpServletResponse asociado con la respuesta al cliente. session: El objeto HttpSession (sesión) asociado con la solicitud del cliente. out: Es el PrintWriter usado para enviar la salida al cliente. A continuación se muestra un ejemplo, con el cual se puede obtener nombre del ordenador cliente (o la dirección IP): <html> ...... El nombre de su host: <%= request.getRemoteHost() %> </html> Carlos Cuervo Martínez 3 JavaServer Pages (JSP) PFC-INX84 Scripts JSP Los scripts JSP son trozos de código Java que se pueden insertar dentro de las página JSP para realizar cualquier tipo de procesamiento lógico. Para insertar un trozo de código dentro de una página JSP, este irá entre las etiquetas <% y %>. Desde estos scripts se tiene acceso a las variables predefinidas. Ejemplo: <% String queryData = request.getQueryString(); out.println(“La cadena con los parámetros recibidos es: “ + queryData); %> Este script muestra el mensaje “La cadena con los parámetros recibidos es: “ y a continuación se muestra la cadena que se recibe cuando el cliente envia un formulario mediante un método GET. Este script anterior es muy sencillo y podía haberse sustituido por: La cadena con los parámetros recibidos es: <%= request.getQueryString() %> Dentro de los scripts pueden insertarse sentencias condicionales, iterativas,etc., ya que el código utilizado es Java, y de esta forma se tiene toda la funcionalidad del mismo. A continuación se muestra un script que muestra un mensaje distinto en función de un valor aleatorio. <% if (Math.random() < 0.5 ) { %> Hoy salgo de copas!!! <% } else { %> Mier.., Hoy me quedo en casa!!!! <% } %> El script anterior obtiene un número aleatorio entre 0 y 1, si el valor obtenido es inferior a 0.5, entonces se muestra el mensaje “Hoy salgo de copas!!!”, en caso contrario se muestra “Mier.., Hoy me quedo en casa!!!!”. JavaBeans Los JavaBeans son unos objetos que tienen unas características que los diferencian del resto de los objetos Java y deben cumplir las siguientes características: 1 2 3 Una clase bean debe tener un constructor sin argumentos. Una clase bean no debería tener variables de instancia públicas. Los valores persistentes deberían ser accedidos a través de métodos llamados getXxx y setXxx. Por ejemplo si se tiene una clase Coche que almacena el número de pasajeros, deberían definirse los métodos: getNumPasajeros(), que devolvería el número de pasajeros del coche, y setNumPasajeros(int n), que Carlos Cuervo Martínez 4 JavaServer Pages (JSP) PFC-INX84 actualiza el atributo número de pasajeros de la clase coche al valor indicado por n. Otra característica que los diferencia es que implementan la interfaz java.io.Serializable, esta interfaz proporciona a estos objetos la característica de persistencia, por ejemplo, podemos transmitirlos por una red de comunicaciones y recuperar el estado en el que se encontraban cuando fueron enviados. Los JavaBeans tienen otra característica que es la introspección, esta característica permite a los beans guardar y recuperar los valores de sus atributos de forma automática, sin tener que llamar explícitamente a cada método getXxx o setXxx. Para usar un JavaBean en una página JSP lo primero es obtener una instancia del objeto mediante la etiqueta: <jsp:useBean id=”nombre” class=”clase” type=”tipo” scope=”ámbito” /> El parámetro “id”, especifica el nombre de la instancia del bean con el que será conocido dentro del ámbito en el que se define, el ámbito puede ser : . page: es conocido únicamente dentro de la página en el que se define. . sessión: es accesible durante el tiempo que dure la sesión del usuario .aplication: es accesible durante el tiempo que dure la aplicación en la que se usa. El parámetro “class” indica la clase a la que pertenece el bean que se va a instanciar. El parámetro “type” indica el tipo de objeto que se va a instanciar, por ejemplo si el bean va a implementar la interfaz Runnable, se indica type=”Runnable”. Para acceder a las propiedades del bean se usan las siguientes etiquetas: <jsp:getProperty name=”nombreInstancia” property=”propiedad” /> <jsp:setProperty name=”nombreInstancia” property=”propiedad” value=”valor” /> La primera etiqueta se usa para recuperar el valor de la propiedad indicada en el parámetro “property”, para la instancia con el nombre indicado en el parámetro “name”. La segunda etiqueta se usa para establecer el valor de la propiedad indicada a la derecha del parámetro property con el valor del parámetro value para la instancia del bean indicada con el parámetro “name”. Finalmente, como ejemplo, se va a instanciar un bean de la clase FuenteBean, después se va a modificar la propiedad “codigo” de una instancia del bean FuenteBean, asignándole primero un valor al código de la fuente y a continuación se recupera dicho valor: <jsp:useBean id=”fuente” class=”FuenteBean” /> <jsp:setProperty name=”fuente” property=”codigo” value=”YO”/> Carlos Cuervo Martínez 5 JavaServer Pages (JSP) PFC-INX84 <jsp:getProperty name=”fuente” property=”codigo”/> Comparación con otras tecnologías Para desarrollar una aplicación como la que se presenta, se podían haber usado otras tecnologías como Active Server Pages (ASP) o Java Servlets, entre otras. JSP vs. Servlets Como las páginas son automáticamente traducidas a Java Servlets, no hay diferencia entre lo que se puede hacer en una página JSP y un Servlet. Ambas tecnologías son ejecutadas en una máquina virtual de Java (JVM), eliminando la necesidad para el servidor web de crear un nuevo proceso cada vez que llega una petición de una página web, lo que supone una gran ventaja sobre otros mecanismos como los scripts CGI. La principal ventaja de JSP sobre los servlets es que JSP sigue una división más lógica entre la visualización (el HTML generado) y la lógica del lado del servidor, que indica como es rellenada la página. Es fácil modificar la apariencia de una página JSP sin tener que modificar ningún código java ni en la página ni en los JavaBean (si se usan). JSP vs. ASP En lo referente a sus características, JSP y ASP son muy similares. Ambos crean páginas web dinámicamente desde páginas HTML marcadas con unas etiquetas especiales. Ambas soportan la inclusión de código directamente en la página, así como el uso de componentes encapsulados: componentes COM en ASP y JavaBeans en JSP. La mayor diferencia entre las dos tecnologías es la compatibilidad de plataforma. ASP está únicamente disponible para Windows, a través de Microsoft's IIS Web Server. JSP está disponible para cualquier servidor web y cualquier plataforma con soporte para Java Servlets. Además, el motor JSP está escrito completamente en Java. Otra diferencia es que las páginas JSP se compilan la primera vez que son solicitadas mientras que las siguientes solicitudes se cargan más rápidamente debido a que quedan residentes en la memoria del servidor. Por el contrario, en ASP las páginas tienen que ser traducidas por cada solicitud. Esta contrapartida se ve compensada con el hecho de que la mayoría de las máquinas virtuales de Java son todavía más lentas que el código nativo, en el cual está escrito el motor de ASP. Con nuevas y más rápidas máquinas virtuales de Java, JSP podrá ser más rápido que ASP en conjunto. Carlos Cuervo Martínez 6