Title: Java Server Pages JSP
1Java Server Pages JSP
- Otra forma de hacer servlets
2Las JSP
- Son páginas HTML a las que se le inserta código
que produce servlets - Se usan cuando la parte estática de la página que
se debe generar es relativamente importante (la
parte que no cambia) - Al cargarse una página JSP esta se compila, se
genera el servlet y se ejecuta - Por esto, la primera invocación a una JSP demora
más que las siguientes
3Contenido de una JSP
- Una JSP, aparte de código HTML puede contener 3
tipos de constructos - Elementos de scripting son los elementos que
definen el comportamiento dinámico del servlet,
es decir su código - directivas afectan la estructira general del
servlet que resulta de la JSP - acciones permiten redirigir el request a otra
instancia JSP, servlet o página HTML
4Elementos de scripting
- 1. Expresiones de la forma lt expresión gt, son
evaluadas e insertadas en el output del servlet - 2. Scriptlets de la forma lt code gt, que son
insertadas en el método _jspService el cual es el
método llamado cuando se contacta a la página
jsp - 3. Declaraciones de la forma lt! code gt, que son
insertadas en el cuerpo de la clase del servlet,
fuera de todo método, definiendo asà variables de
instancia
5Variables predefinidas
- Para simplificar las expresiones, existen
variables predefinidas que se pueden usar. Las
más importantes son - request, el HttpServletRequest
- response, el HttpServletResponse
- session, el HttpSession asociada al request
- out, el PrintWriter usado para mandar output al
cliente
6Un Ejemplo (Ejemplo1.jsp)
ltHTMLgt ltHEADgt ltTITLEgtJSP Expressionslt/TITLEgt lt/HEA
Dgt ltBODYgt ltH2gtJSP Expressionslt/H2gt ltULgt ltLIgtCurren
t time lt new java.util.Date() gt ltLIgtYour
hostname lt request.getRemoteHost() gt ltLIgtYour
session ID lt session.getId() gt ltLIgtThe
ltCODEgttestParamlt/CODEgt form parameter lt
request.getParameter("testParam")
gt lt/ULgt lt/BODYgt lt/HTMLgt
7Explicaciones
- El servidor crea un servlet, lo compila y llama
al método _jspService que contiene todas las
sentencias escritas entre lt y gt - El texto HTML es mandado al cliente por vÃa
out.print(....) - Las expresiones se evalúan y se insertan en el
texto que se manda, por lo cual la expresión - ltLIgtCurrent time lt new java.util.Date() gt
- equivaldrÃa en un servlet a hacer
- out.println(ltLIgtCurrent time new
java.util.Date() )
8Scriptlets
- Si se quiere hacer algo más complicado que
insertar una simple expresión en el output del
servlet se pueden incluir sentencias JAVA en
scriptlets que tienen la siguiente estructura - ltString queryData request.getQueryString()
- out.println("Attached GET data " queryData)
gt - Los Scriptlets tienene acceso a a las mismas
variables definidas automáticamente a las que
tienen acceso las expresiones - En particular, esto también se pudo haber
logrado con - Attached GET data lt request.getQueryString()
gt - pero hay cosas que no se pueden hacer con
expresiones - lt response.setContentType("text/plain") gt
9Algo más serio (Ejemplo2.jsp)
ltHTMLgt ltHEADgt ltTITLEgtColor Testinglt/TITLEgt
lt/HEADgt lt String bgColor request.getParameter(
"bgColor") boolean hasExplicitColor
if (bgColor ! null)
hasExplicitColor true else
hasExplicitColor false bgColor
"WHITE" gt ltBODY BGCOLOR"lt bgColor
gt"gt ltH2 ALIGN"CENTER"gtColor Testinglt/H2gt lt if
(hasExplicitColor) out.println("You
supplied color " bgColor ) else
out.println("Using background color
WHITE..") gt lt/BODYgt lt/HTMLgt
10Usando 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 método _jspService y las
sentencias HTML se traducen como un
out.println(...contenido de sentencia HTML...) en
el mismo orden en que aparecen en la página jsp
11Scriptlets para hacer partes del archivo JSP
condicional
Por lo tanto, lo siguiente lt if (Math.random()
lt 0.5) gt Have a ltBgtnicelt/Bgt day! lt else
gt Have a ltBgtlousylt/Bgt day! lt gt se traduce
en if (Math.random() lt 0.5)
out.println(Have a ltBgtnicelt/Bgt day!) else
out.println(Have a ltBgtlousylt/Bgt day! )
12El equivalente en XML
El código equivalente para declarar scriptles
pero siguiendo las reglas XML de lt Code gt
es ltjspscriptletgt Code lt/jspscriptletgt Esta
forma de incluir sentencias jsp en la página HTML
es muy recurrente, más adelante veremos otros
jspsetProperty para definir propiedades a un
bean jspinclude para incluir otros
archivos jspforward para redirigir el
request jspparam para definir parámetros a
applets
13Deaclaraciones
- No generan output, se usan para eclarar
variables que más tarde serán usadas en
expresiones o scriptlets - Una declaración tiene la siguiente forma
- lt! Java Code gt
- Un ejemplo (Ejemplo3.jsp) que cuenta cuantas
veces ha sido accesada una página desde que se
cargó - lt! private int accessCount 0 gt
- Accesses to page since server reboot
- lt accessCount gt
14El equivalente en XML
El código equivalente para declaraciones pero
siguiendo las reglas XML de lt! Code gt
es ltjspdeclarationgt Code lt/jspdeclarationgt
15Directivas
- Afectan la estructura general del servlet
generado - Existen 3 tipos de directivas page, include y
taglib - lt_at_ directiva atributo"valor" gt
- lt_at_ directiva atributo1"valor1"
- atributo2"valor2"
- ...
- atributoN"valorN" gt
16Directiva 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 más de los
siguientes atributos - import, contentType, isThreadSafe, session,
buffer, autoflush, extends, info, errorPage,
isErrorPage y language. - Veremos import, contentType, errorPage e
isErrorPage
17El atributo import
- Permite importar clases que no se incluyen
automáticamente - 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 están
los servlets (Ejemplo4.jsp con ServletUtilities.ja
va y LongLivedCookie.java) - lt_at_ page importjava.util." gt
- lt_at_ page import"package.class1,...,
- package.classN" gt
18Controlando el tipo de salida
- Se hace a través de la directiva
- lt_at_ page contetTypetext/plain" gt
- 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 página
se compila, traduce y luego se ejecuta en el
orden adecuado de las directivas - ltHTMLgt
- ltBODYgt
- ltH2gtThe contentType Attributelt/H2gt
- lt_at_ page contentType"text/plain" gt
- Esto debe verse como texto plano ltBgtnolt/Bgt como
HTML. - lt/BODYgt
- lt/HTMLgt
19Generando salida para excel
- Se hace a través de la misma directiva pero
cambiando el tipo de salida que se generará
(ejemplo5.jsp) - lt_at_ page contentType"application/vnd.ms-excel"
gt - lt- entre columnas poner tabs, no espacios.-gt
- 1997 1998 1999 2000 2001 (Anticipated)
- 12.3 13.4 14.5 15.6 16.7
- Tambien se puede lograr lo mismo escribiendo
código HTML para generar una tabla pero poner en
la directiva que el contentType es ms-excel
(ejemplo6.jsp) - ltTABLE BORDER1gt
- ltTRgtltTHgtlt/THgtltTHgtApplesltTHgtOranges
- ltTRgtltTHgtFirst QuarterltTDgt2307ltTDgt4706
- ltTRgtltTHgtSecond QuarterltTDgt2982ltTDgt5104
- ltTRgtltTHgtThird QuarterltTDgt3011ltTDgt5220
- ltTRgtltTHgtFourth QuarterltTDgt3055ltTDgt5287
- lt/TABLEgt
20errorPage isErrorPage
- Es posible invocar una determinada página cuando
en otra sucede un error (se lanza una Exception )
- Para ello hay que poner en la página que puede
generar el ellror la directiva - lt_at_ page errorPageuna_URL_relativa" gt
- En la página que debe recibir el control
(una_URL_relativa) debe ponerse lo siguiente - lt_at_ page isErrorPage"true" gt
- (ver generaError.jsp y muestraError.jsp)
21Incluyendo otros archivos
- Es posible hacerlo al momento en que se compila
la página con la directiva - lt_at_ include filenombre del archivo" gt
- 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 página 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
página incluida se vuelva a recargar el contenido
con la siguiente directiva ltjspinclude
pagenombre del archivo" flush"true" /gt - (ver noticias.jsp e item1.html, item2.html,
item3.html)
22Incluyendo 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 jspplugin instruye al server para
que construya un plugin apropiado para
interpretar el objeto. - ltjspplugin type"applet" code"Clock2.class"
codebase"/directorio_relativo" jreversion"1.2"
width"160" height"150" gt - ltjspfallbackgt
- Plugin tag OBJECT or EMBED not supported
by browser. - lt/jspfallbackgt
- lt/jspplugingt
- Ver ejemplo plugin de tomcat
23Java Beans
- Usar Beans es una buena manera de complementar
JSP cuando se requiere de estructuras de datos
(clases) que hagan cosas más complejas, y separar
el código de programación de estas clases de la
JSP - Un Bean es una clase con las siguientes
caracterÃsticas - Tiene un constructor que no tiene parámetros
- No tiene variables públicas
- Para cierto subconjunto de variables privadas
llamadas propiedades, si la variable es de tipo
tipo1 y se llama variable1entonces existe un
método 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
parámetro
24Usando Beans en JSP
- Para poder usar Beans con JSP en Tomcat estos
deben ir en el mismo directorio que los servlets - Creación
- ltjspuseBean idbean1' classNombre_Clase'
scopevalidez/gt - Es lo mismo que haber hecho en un programa Java
- Nombre_Clase bean1 new Nombre_Clase()
- Obtención de valores
- ltjspgetProperty namebean1" propertyvariable1"
/gt - lt book1.getVariable1() gt
- Modificación valores
- ltjspsetProperty namebean1 propertyvariable1
valuevalor1" /gt - lt book1.setVariable1(valor1") gt
25Ejemplos JSP
- Ver Date.jsp usa las sentencias jspgetProperty
- Numberguess.jsp usa los métodos set y get (y
otros) directamente - Carts.jsp implementa un carrito de compras
- forward.jsp muestra como se puede derivar el
request a otra página