JSP Java Server Pages César Acebal cesaracebal.com acebal@uniovi.es ¿Qué es JSP? Una tecnología para crear páginas Web dinámicas Contiene código HTML normal junto elementos especiales de JSP Están construidas sobre servlets Internamente, el servidor de aplicaciones las compilará a un servlet Vienen a resolver el problema de aquéllos (que era el mismo que con CGI), es decir: Que la creación de la página Web se haga generando HTML directamente por código, en un lenguaje de programación Esto dificulta enormemente la separación de tareas en el equipo de desarrollo, entre diseñadores y programadores Introducción a JSP Introducció César Acebal 2 Insertar JSP en páginas HTML JSP (como ASP) aborda el problema a la inversa: En vez de insertar HTML en código de programación, podremos insertar ciertos elementos de código en las páginas HTML Introducción a JSP Introducció César Acebal 3 Ejemplo de página JSP <html> <head> <title>Saludo personalizado con JSP</title> </head> <body> <% java.util.Date hora = new java.util.Date(); %> <% if (hora.getHours() < 12) { %> <h1>¡Buenos días!</h1> <% } else if (hora.getHours() < 21) { %> <h1>¡Buenas tardes!</h1> <% } else { %> <h1>¡Buenas noches!</h1> <% } %> <p>Bienvenido a nuestro sitio Web, abierto las 24 horas del día.</p> </body> </html> Introducción a JSP Introducció César Acebal 4 Para este viaje… ¿hacen falta tantas alforjas? Lo cierto es que incluir mucha lógica de programación en una página Web no es que sea mucho mejor que generar el HTML por programa Pero JSP proporciona los elementos de acción (action elements) que son como etiquetas HTML pero que representan código reutilizable Además, podríamos llamar a otras clases Java del servidor, a componentes (Javabeans (Javabeans o EJB EJB)… )… Introducción a JSP Introducció César Acebal 5 Separación de presentación y lógica En definitiva, lo que permite JSP (bien utilizado) es una mayor separación entre la presentación de la página y la lógica de la aplicación, que iría aparte (Desde la página JSP únicamente llamaríamos, de diferentes formas, a ese código) Introducción a JSP Introducció César Acebal 6 Despliegue de una pá página JSP Crear una pá página JSP que muestre la fecha actual <html> <head> <title>Fecha actual con JSP</title> </head> <body> <p>Hoy es <%= new java.util.Date(); %> <p> </body> </html> Introducción a JSP Introducció César Acebal 7 Despliegue de una pá página JSP Crear la estructura bá básica de directorios ejemplos WEB-INF Y éste (el directorio raíz de la aplicación) iría en el directorio de despliegue del servidor de aplicaciones (Tomcat, en nuestro caso) Introducción a JSP Introducció César Acebal classes lib Las clases compiladas de Java (servlets, JavaBeans, etc.) Cualquier fichero .jar necesario para la aplicación .. . web.xml Descriptor de despliegue (cómo llamar a los servlet, seguridad, etc.) 8 Despliegue de una pá página JSP Lo guardamos como index.jsp en el directorio raí raíz de la aplicació aplicación Debe tener extensión jsp Introducción a JSP Introducció César Acebal 9 Primer ejemplo Una vez desplegada la aplicación en Tomcat, vamos a probarla Introducir en el navegador el siguiente URL: http://localhost:8080/ejemploshttp://localhost:8080/ejemplos -jsp/index.jsp Debería mostrarnos la siguiente página: Introducción a JSP Introducció César Acebal 10 Resultado de la ejecución Para ver esta película, debe disponer de QuickTime™ y de un descompresor TIFF (LZW). Introducción a JSP Introducció César Acebal 11 Establecer la página inicial En el ejemplo anterior era necesario indicar explícitamente cuál era la página predeterminada Aquélla que deberá devolver el servidor cuando sólo se le indique un directorio Por ejemplo, ante: http://localhost:8080/ejemploshttp://localhost:8080/ejemplos -jsp Podemos cambiar esto en el fichero web.xml: <welcome-file<welcomefile-list> <welcome<welcome -file>index.jsp</welcomefile>index.jsp</welcome-file> </welcome</welcome -filefile-list> Introducción a JSP Introducció César Acebal 12 ¿Un servlet? Efectivamente, las páginas JSP no son más que otra interfaz que se le ofrece al programador de la misma tecnología Otra manera de hacer lo mismo De hecho, ya hemos dicho que el servidor de aplicaciones las compilará internamente a un servlet Incluso en este caso, que sólo hay código HTML, debido a la extensión (.jsp) Podemos comprobarlo yendo al directorio work/Catalina/localhost/ejemploswork/Catalina/localhost/ejemplosjsp/org/apache/jsp/ dentro de Tomcat y examinado el fichero generado index_jsp.java Además, nótese cómo la primera vez que pedimos la página tarda un poco (es porque está compilando la página) Introducción a JSP Introducció César Acebal 13 Servlet generado por Tomcat import oracle.jsp.runtime.*; package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static java.util.List _jspx_dependants; public Object getDependants() { return _jspx_dependants; } public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { JspFactory _jspxFactory = null; PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; Introducción a JSP Introducció César Acebal 14 Servlet generado por Tomcat try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"); out.write("\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"); out.write("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"es\" lang=\"es\">\n"); out.write(" <head>\n"); out.write(" <title>Fecha de hoy con JSP</title>\n"); out.write("\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"/>\n"); out.write(" </head>\n"); out.write(" <body>\n"); out.write("\n"); out.write("\t<h1>Fecha con JSP</h1>\n"); out.write("\t\n"); out.write("\t<p>Hoy es "); out.print( new java.util.Date() ); out.write("</p>\n"); out.write("\n"); out.write(" </body>\n"); out.write("</html>\n"); Introducción a JSP Introducció César Acebal 15 Servlet generado por Tomcat } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); } } } import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public class _index extends com.orionserver.http.OrionHttpJspPage { public final String _globalsClassName = null; // ** Begin Declarations // ** End Declarations public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { response.setContentType( "text/html;charset=ISO-8859-1"); /* set up the intrinsic variables using the pageContext goober: ** session = HttpSession ** application = ServletContext Introducción a JSP Introducció César Acebal 16 ¿Un servlet? En la siguiente figura podemos ver los pasos que comprende el procesamiento de una página JSP en el servidor: Primero, una fase de traducción automática de la página JSP a código fuente Java del servlet que la implementa Luego, se compila dicha clase Ante las subsiguientes peticiones, se ejecutará directamente la clase del servlet generado Introducción a JSP Introducció César Acebal 17 Elementos de JSP Tres son los bloques de construcción básicos de JSP: Directivas Acciones Elementos de “scripting scripting” Veamos los distintos elementos, comenzando por estos últimos Introducción a JSP Introducció César Acebal 18 Elementos de “scripting” Permiten añadir pequeños trozos de código directamente en la página JSP, incrustado entre el HTML Por ejemplo, una instrucción if para generar una salida HTML diferente dependiendo de una determinada condición Hay que usarlos con mucho cuidado (o no usarlos en absoluto) – Si no, acabaríamos por tener los mismos problemas de mantenibilidad de la aplicación que con los servlets cuando metíamos en ellos HTML Introducción a JSP Introducció César Acebal 19 Elementos de “scripting” Hay tres tipos de elementos de “scripting” “scripting”:: Elemento Descripción <% ... %> Scriptlet.. se usa para meter código Java dentro Scriptlet <%= ... %> Expresión. Permite acceder al valor devuelto por Expresión. una expresión en Java <%! ... %> Declaración. Usada para declarar variables y Declaración. métodos en la clase correspondiente a la página Introducción a JSP Introducció César Acebal 20 Un ejemplo más “dinámico” Hagamos ahora una página JSP que, en función de la hora, muestre un saludo diferente (buenos días, buenas tardes o buenas noches) Y que muestre también la hora actual Introducción a JSP Introducció César Acebal 21 Objetos predefinidos Las páginas JSP tienen acceso a los mismos objetos predefinidos que tenían los servlets Aquí se llaman como sigue: request response pageContext session application out config page Introducción a JSP Introducció César Acebal Se puede acceder a ellos directamente desde los “scriptlets” 22 Ejercicio: Saludo personalizado Hacer una página JSP que reciba el nombre del usuario y muestre un saludo personalizado Hacer uso de request.getParameter(“Nombre”) Llamar a dicha página saludo.jsp Probar la página con el método GET Pasándole como parámetro el nombre a través del URL – (Como en el ejemplo del servlet) Crear una página index.html que llame a esa JSP Cambiando el atributo action de form para que llame a la página anterior Introducción a JSP Introducció César Acebal 23 Directivas JSP tiene una serie de directivas que permiten configurar la página Ejemplos: Elemento Descripción <% page ... %> Permite importar clases Java, especificar el tipo de la respuesta (“text/html” por omisión), etcétera <%= include ... %> Permite incluir otros ficheros antes de que la página sea traducida a un servlet <%! taglib ... %> Declara una biblioteca de etiquetas con acciones personalizadas para ser utilizadas en la página Introducción a JSP Introducció César Acebal 24 Acciones Elementos XML que realizan determinadas acciones JSP define las siguientes acciones: Elemento Descripción <jsp:useBean> Permite usar un JavaBean desde la página <jsp:getProperty> Obtiene el valor de una propiedad de un componente JavaBean y lo añade a la respuesta <jsp:setProperty> Establece el valor de una propiedad de un JavaBean <jsp:include> Incluye la respuesta de un servlet o una página JSP <jsp:forward> Redirige a otro servlet o página JSP <jsp:param> Envía un parámetro a la petición redirigida a otro servlet o JSP mediante <jsp:include> o <jsp:forward> <jsp:plugin> Genera el HTML necesario para ejecutar un applet Introducción a JSP Introducció César Acebal 25 Acciones personalizadas Aparte de ésas, JSP permite crear nuestros propios elementos de acciones De esa manera, sí que logramos una verdadera separación entre la presentación (HTML) y la lógica de la aplicación (que ahora iría fuera de la JSP, invocada por estos elementos) En el curso usaremos los elementos propios de Struts Introducción a JSP Introducció César Acebal 26