JSP Java Server Pages 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 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 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> 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 o EJB) 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) 6
Despliegue de una página JSP Crear una página JSP que muestre la fecha actual <html> <head> <title>fecha actual con JSP</title> </head> <body> <p> <p>hoy es <%= new java.util.date(); %> </body> </html> 7
Despliegue de una página JSP Crear la estructura básica de directorios ejemplos WEB-INF classes 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) lib. web.xml Las clases compiladas de Java (servlets, JavaBeans, etc.) Cualquier fichero.jar necesario para la aplicación Descriptor de despliegue (cómo llamar a los servlet, seguridad, etc.) 8
Despliegue de una página JSP Lo guardamos como index.jsp en el directorio raíz de la aplicación Debe tener extensión jsp 9
Primer ejemplo Una vez desplegada la aplicación en Tomcat, vamos a probarla Introducir en el navegador el siguiente URL: http://localhost:8080/ejemplos-jsp/index.jspjsp/index.jsp Debería mostrarnos la siguiente página: 10
Resultado de la ejecución Para ver esta película, debe disponer de QuickTime y de un descompresor TIFF (LZW). 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/ejemplos-jspjsp Podemos cambiar esto en el fichero web.xml: <welcome-file-list> list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> list> 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/ejemplos- jsp/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) 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; 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"); 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 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 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 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 19
Elementos de scripting Hay tres tipos de elementos de scripting : Elemento Descripción <%... %> Scriptlet. se usa para meter código Java dentro <%=... %> Expresión. Permite acceder al valor devuelto por una expresión en Java <%!... %> Declaración. Usada para declarar variables y métodos en la clase correspondiente a la página 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 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 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 23
Directivas JSP tiene una serie de directivas que permiten configurar la página Ejemplos: Elemento <% page... %> <%= include... %> <%! taglib... %> Descripción Permite importar clases Java, especificar el tipo de la respuesta ( text/html por omisión), etcétera Permite incluir otros ficheros antes de que la página sea traducida a un servlet Declara una biblioteca de etiquetas con acciones personalizadas para ser utilizadas en la página 24
Acciones Elementos XML que realizan determinadas acciones JSP define las siguientes acciones: Elemento <jsp:usebean> <jsp:getproperty> <jsp:setproperty> <jsp:include> <jsp:forward> <jsp:param> <jsp:plugin> Descripción Permite usar un JavaBean desde la página Obtiene el valor de una propiedad de un componente JavaBean y lo añade a la respuesta Establece el valor de una propiedad de un JavaBean Incluye la respuesta de un servlet o una página JSP Redirige a otro servlet o página JSP Envía un parámetro a la petición redirigida a otro servlet o JSP mediante <jsp:include> o <jsp:forward> Genera el HTML necesario para ejecutar un applet 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 26