You are on page 1of 23

Java Server Pages JSP

Guillermo Escobar B.

Las JSP
Son pginas HTML a las que se le inserta cdigo que produce servlets Se usan cuando la parte esttica de la pgina que se debe generar es relativamente importante (la parte que no cambia) Al cargarse una pgina JSP esta se compila, se genera el servlet y se ejecuta Por esto, la primera invocacin a una JSP demora ms que las siguientes

Contenido de una JSP


Una JSP, aparte de cdigo HTML puede contener 3 tipos de construccin :
Elementos de scripting: son los elementos que definen el comportamiento dinmico del servlet, es decir su cdigo directivas: afectan la estructura general del servlet que resulta de la JSP acciones: permiten redirigir el request a otra instancia JSP, servlet o pgina HTML

Elementos de scripting
1. Expresiones de la forma <%= expresin %>, son evaluadas e insertadas en el output del servlet 2. Scriptlets de la forma <% code %>, que son insertadas en el mtodo _jspService el cual es el mtodo llamado cuando se contacta a la pgina jsp 3. Declaraciones de la forma <%! code %>, que son insertadas en el cuerpo de la clase del servlet, fuera de todo mtodo, definiendo as variables de instancia

Variables predefinidas
Para simplificar las expresiones, existen variables predefinidas que se pueden usar. Las ms importantes son:
request, el HttpServletRequest response, el HttpServletResponse session, el HttpSession asociada al request out, el PrintWriter usado para mandar output al cliente

Un Ejemplo (extencion.jsp)
<HTML> <HEAD> <TITLE>JSP Expressions</TITLE> </HEAD> <BODY> <H2>JSP Expressions</H2> <UL> <LI>Current time: <%= new java.util.Date() %> <LI>Your hostname: <%= request.getRemoteHost() %> <LI>Your session ID: <%= session.getId() %> <LI>The <CODE>testParam</CODE> form parameter: <%= request.getParameter("testParam") %> </UL> </BODY> </HTML>

Explicaciones
El servidor crea un servlet, lo compila y llama al
mtodo _jspService que contiene todas las sentencias escritas entre <% y %> El texto HTML es mandado al cliente por va out.print(....) Las expresiones se evalan y se insertan en el texto que se manda, por lo cual la expresin

<LI>Current time: <%= new java.util.Date() %>


equivaldra en un servlet a hacer out.println(<LI>Current time: + new java.util.Date() );

Scriptlets
Si se quiere hacer algo ms complicado que insertar una
simple expresin en el output del servlet se pueden incluir sentencias JAVA en scriptlets que tienen la siguiente estructura:
<%String queryData = request.getQueryString(); out.println("Attached GET data: " + queryData); %>

Los Scriptlets tienene acceso a a las mismas variables definidas automticamente a las que tienen acceso las expresiones En particular, esto tambin se pudo haber logrado con
Attached GET data: <%= request.getQueryString() %>

pero hay cosas que no se pueden hacer con expresiones:


<% response.setContentType("text/plain"); %>

Usando Scriptlets para hacer partes del archivo JSP condicional


Para entender esto hay que tener claro que el contenido de un scriptlet se incluye exactamente como est escrito al mtodo _jspService y las sentencias HTML se traducen como un out.println(...contenido de sentencia HTML...) en el mismo orden en que aparecen en la pgina jsp

Scriptlets para hacer partes del archivo JSP condicional


Por lo tanto, lo siguiente
<% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% } else { %> Have a <B>lousy</B> day! <% } %>

se traduce en
if (Math.random() < 0.5) { out.println(Have a <B>nice</B> day!); } else { out.println(Have a <B>lousy</B> day! ); }

El equivalente en XML
El cdigo equivalente para declarar scriptles pero siguiendo las reglas XML de <% Code %> es <jsp:scriptlet> Code </jsp:scriptlet> Esta forma de incluir sentencias jsp en la pgina HTML es muy recurrente, ms adelante veremos otros
jsp:setProperty: para definir propiedades a un bean jsp:include: para incluir otros archivos jsp:forward: para redirigir el request jsp:param: para definir parmetros a applets

Declaraciones
No generan output, se usan para eclarar variables que ms tarde sern usadas en expresiones o scriptlets Una declaracin tiene la siguiente forma: <%! Java Code %> Un ejemplo (Ejemplo3.jsp) que cuenta cuantas veces ha sido accesada una pgina desde que se carg:
<%! private int accessCount = 0; %> Accesses to page since server reboot: <%= ++accessCount %>

El equivalente en XML
El cdigo equivalente para declaraciones pero siguiendo las reglas XML de <%! Code %> es <jsp:declaration> Code </jsp:declaration>

Directivas
Afectan la estructura general del servlet generado Existen 3 tipos de directivas: page, include y taglib <%@ directiva atributo="valor" %> <%@ directiva atributo1="valor1" atributo2="valor2" ... atributoN="valorN" %>

Directiva page
Permite controlar la estructura del servlet importando clases, afinando la superclase, definiendo el tipo de contenido a enviar, etc. Esto se hace definiendo uno o ms de los siguientes atributos:
import, contentType, isThreadSafe, session, buffer, autoflush, extends, info, errorPage, isErrorPage y language.

Veremos import, contentType, errorPage e isErrorPage

El atributo import
Permite importar clases que no se incluyen automticamente Por ejemplo, se pueden importar las usuales para java (java.util.*) Para las clases definidas por el programador, estas deben estar en un lugar visible. Este lugar depende del servidor En tomcat es el mismo directorio en donde estn los servlets (Ejemplo4.jsp con ServletUtilities.java y LongLivedCookie.java)
<%@ page import=java.util.*" %> <%@ page import="package.class1,..., package.classN" %>

Controlando el tipo de salida


Se hace a travs de la directiva
<%@ page contetType=text/plain" %>

Se puede usar para determinar cualquier tipo de salida que no sea text/html Puede ir en cualquier parte del archivo, a pesar de que en un servlet esto debe ir antes de mandar cualquier cosa. Esto es porque primero la pgina se compila, traduce y luego se ejecuta en el orden adecuado de las directivas
<HTML> <BODY> <H2>The contentType Attribute</H2> <%@ page contentType="text/plain" %> Esto debe verse como texto plano <B>no</B> como HTML. </BODY> </HTML>

Generando salida para excel


Se hace a travs de la misma directiva pero cambiando el tipo de salida que se generar (ejemplo5.jsp)
<%@ page contentType="application/vnd.ms-excel" %> <%- entre columnas poner tabs, no espacios.-%> 1997 1998 1999 2000 2001 (Anticipated) 12.3 13.4 14.5 15.6 16.7

Tambien se puede lograr lo mismo escribiendo cdigo HTML para generar una tabla pero poner en la directiva que el contentType es ms-excel (ejemplo6.jsp)
<TABLE BORDER=1> <TR><TH></TH><TH>Apples<TH>Oranges <TR><TH>First Quarter<TD>2307<TD>4706 <TR><TH>Second Quarter<TD>2982<TD>5104 <TR><TH>Third Quarter<TD>3011<TD>5220 <TR><TH>Fourth Quarter<TD>3055<TD>5287 </TABLE>

errorPage & isErrorPage


Es posible invocar una determinada pgina cuando en otra sucede un error (se lanza una Exception ) Para ello hay que poner en la pgina que puede generar el ellror la directiva <%@ page errorPage=una_URL_relativa" %> En la pgina que debe recibir el control (una_URL_relativa) debe ponerse lo siguiente <%@ page isErrorPage="true" %>

(ver generaError.jsp y muestraError.jsp)

Incluyendo otros archivos


Es posible hacerlo al momento en que se compila la pgina con la directiva <%@ include file=nombre del archivo" %> Esto implica que se incluir el archivo referenciado como parte del actual antes de compilarlo El problema es que si el archivo referenciado cambia, no cambiar en la pgina que se muestra (a menos que se reinicie el servidor) (ver contacto.jsp y pprincipal.jsp) Se puede hacer que cada vz que se referencie la pgina incluida se vuelva a recargar el contenido con la siguiente directiva <jsp:include page=nombre del archivo" flush="true" /> (ver noticias.jsp e item1.html, item2.html, item3.html)

Incluyendo Applets
Con JSP es posible poner applets en una pagina web pero que son interpretadas por un plugin y no por el browser Esto soluciona muchos problemas de versionamiento, ya que no todos los prowsers son capaces de interpretar applets compilados con una version de Java maor que 1.1.x El elemento jsp:plugin instruye al server para que construya un plugin apropiado para interpretar el objeto.
<jsp:plugin type="applet" code="Clock2.class" codebase="/directorio_relativo" jreversion="1.2" width="160" height="150" > <jsp:fallback> Plugin tag OBJECT or EMBED not supported by browser. </jsp:fallback> </jsp:plugin> Ver ejemplo plugin de tomcat

Java Beans
Usar Beans es una buena manera de complementar JSP cuando se requiere de estructuras de datos (clases) que hagan cosas ms complejas, y separar el cdigo de programacin de estas clases de la JSP Un Bean es una clase con las siguientes caractersticas:
Tiene un constructor que no tiene parmetros No tiene variables pblicas Para cierto subconjunto de variables privadas llamadas propiedades, si la variable es de tipo tipo1 y se llama variable1entonces existe un mtodo programado tipo1 getVariable1() que retorna el valor actual de la propiedad y otro void setVariable1(tipo1 x) que modifica el valor de la variable con el que est dado como parmetro

Usando Beans en JSP


Para poder usar Beans con JSP en Tomcat estos deben ir en el mismo directorio que los servlets Creacin
<jsp:useBean id=bean1' class=Nombre_Clase' scope=validez/>

Es lo mismo que haber hecho en un programa Java


Nombre_Clase bean1 = new Nombre_Clase();

Obtencin de valores
<jsp:getProperty name=bean1" property=variable1" /> <%= book1.getVariable1() %>

Modificacin valores
<jsp:setProperty name=bean1 property=variable1 value=valor1" /> <% book1.setVariable1(valor1"); %>

You might also like