Aplicaciones Web de Servidor
JavaServer Pages (JSP)
23 y 25 de Abril de 2008
La especificación JSP 1.2 – ¿Qué es una JSP?

Las JavaServer Pages (JSP) nos permiten separar la
parte dinámica de nuestras páginas Web del código
estático. Para ello:


Simplemente escribimos el HTML (o XML) regular de la forma
normal, usando cualquier herramienta de construcción de
paginas Web.
Encerramos el código de las partes dinámicas en unas etiquetas
especiales, la mayoría de las cuales empiezan con “<%” y
terminan con “%>. <HTML>
<HEAD>
<TITLE>Ejemplo Hola mundo en una JSP</TITLE>
</HEAD>
<BODY>
<% out.println(“Hola mundo desde una JSP”); %>
</BODY>
</HTML>
2
La especificación JSP 1.2 – Funcionamiento.
Cliente Ligero
(Navegador
1 Petición
HolaMundo.jsp
Servidor Web
2 Petición
HolaMundo.jsp
7 Se envía la respuesta
al cliente
8 reload
HolaMundo.jsp
9 Petición HolaMundo.jsp
13 Se envía la respuesta
al cliente
Motor de Servlet´s
3 Se mapea la petición a un
fichero JSP y se pasa el
control al motor de JSP´s
6 El servlet HolaMundo
genera una respuesta
Motor de JSP´s
4 Se compila el fichero
HolaMundo.jsp en un
Servlet.
5 Se transfiere el control
al servlet HolaMundo.class
10 Se mapea la petición a un fichero JSP y se pasa
El control al motor de JSP´s
12 El servlet HolaMundo
genera una respuesta
11 Se transfiere el control
al servlet HolaMundo.class
3
Elementos JSP
4
La especificación JSP 1.2 – Elementos de script JSP y su
notación XML.

Los elementos de script nos permiten insertar código Java dentro
del servlet que se generará desde la página JSP actual. Hay tres
formas:
1.
2.
3.
4.
5.
Expresiones de la forma <%= expresión %> que son evaluadas e
insertadas en la salida.
Scriptlets de la forma <% codigo %> que se insertan dentro del
método service() del servlet.
Declaraciones de la forma <%! codigo %> que se insertan en el
cuerpo de la clase del servlet, fuera de cualquier método existente.
Directivas de la forma <%@ directive atributo1="valor1"...
atributoN="valorN" %> que afectan a la estructura general del servlet
generado.
Acciones de la forma <jsp:accion /> que permiten realizar
operaciones como acceso a JavaBeans, inclusión de paginas,...
5
La especificación JSP 1.2 – Expresiones JSP.

Una expresión JSP se usa para insertar valores Java directamente
en la salida. Tiene la siguiente forma:
<%= expresión Java %>
La expresión Java es evaluada, convertida a un string, e insertada
en la página. Esta evaluación se realiza durante la ejecución
(cuando se solicita la página) y así tiene total acceso a la
información sobre la solicitud. Por ejemplo, esto muestra la fecha y
hora, del servidor, en que se solicitó la página:
Current time: <%= new java.util.Date() %>

Notación XML:
<jsp:expression> Expresión Java </jsp:expression>
6
La especificación JSP 1.2 – Ejemplo 1:Expresiones
Fichero Expresiones.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ejemplo1: Expresiones</TITLE>
</HEAD>
<BODY>
<H2>Ejemplos de expresiones JSP</H2>
<UL>
<LI>Hora actual en el servidor: <%= new java.util.Date() %>
<LI>Nombre del host: <%= request.getRemoteHost() %>
<LI>Identificador de sesion: <%= session.getId() %>
<LI>Valor del parametro testParam:
<%= request.getParameter("testParam") %>
</UL>
</BODY>
</HTML>
7
La especificación JSP 1.2 – Scriptlets JSP.

Si queremos hacer algo más complejo que insertar una simple
expresión, los Scriptlets JSP nos permiten insertar código Java
arbitrario dentro del método servlet que será construido al generar
la página. Los Scriptlets tienen la siguiente forma:
<% Código Java %>

El código dentro de un scriplet se insertará exactamente como
está escrito, y cualquier HTML estático anterior o posterior al
scriptlet se convierte en sentencias print(). Por tanto no se
necesita completar la sentencias Java, y los bloques abiertos
pueden afectar al HTML estático fuera de los scriplets.
Notación XML:
<jsp:scriptlet> Código </jsp:scriptlet>
8
La especificación JSP 1.2 – Ejemplo 2: Scriplets JSP.
Fichero BGColor.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Color de Fondo</TITLE>
</HEAD>
<%
String bgColor = request.getParameter("bgColor");
boolean hasExplicitColor;
if (bgColor != null) {
hasExplicitColor = true;
} else {
hasExplicitColor = false;
bgColor = "WHITE";
}
%>
<BODY BGCOLOR="<%= bgColor %>">
<H2 ALIGN="CENTER">Color de Fondo</H2>
9
La especificación JSP 1.2 – Ejemplo 2: Scriplets JSP
(continuación).
Fichero BGColor.jsp
<%
if (hasExplicitColor) {
out.println(“Establecido el color de fondo:” +
bgColor + “.”);
} else {
out.println(“Usando los colores de fondo por defecto.”);
}
%>
</BODY>
</HTML>
10
La especificación JSP 1.2 – Declaraciones JSP.

Una declaración JSP nos permite definir métodos o atributos que
serán insertados dentro del cuerpo principal de la clase servlet
(fuera del método service() que procesa la petición). Tienen la
siguiente forma:
<%! Código Java%>

Como las declaraciones no generan ninguna salida, normalmente
se usan en conjunción con expresiones JSP o Scriptlets.

Notación XML:
<jsp:declaration>Código</jsp:declaration>
11
La especificación JSP 1.2 – Ejemplo 3: Declaraciones
JSP.
Fichero ContadorDeAccesos.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ejemplo3: Declaraciones JSP</TITLE>
</HEAD>
<BODY>
<H1>Declaraciones JSP</H1>
<%! private int accessCount = 0; %>
<H2>Número de accesos al servidor desde que se inició:
<%= ++accessCount %></H2>
</BODY>
</HTML>
12
La especificación JSP 1.2 – Comentarios JSP.

Comentarios ocultos JSP: Estos comentarios no son
visibles en la página generada y tienen la forma:
<%-- texto --%>

Comentarios visibles JSP: Estos comentarios son
visibles en la página generada, incluso se pueden
mezclar con expresiones JSP:
<!–- texto [<%=expresion JSP%>] -->
13
Directivas JSP
14
La especificación JSP 1.2 – Directivas JSP.

Una directiva JSP afecta a la estructura general de la clase servlet
que resulta de la compilación de la JSP. Normalmente tienen la
siguiente forma:
<%@ directive atributo1="valor1" atributo2="valor2" ... atributoN="valorN" %>

NOTACION XML:
<jsp:directive.TIPO_DE_DIRECTIVA atributo1="valor1" atributo2="valor2" ...
atributoN="valorN“ />

Hay tres tipos de directivas:
page, que nos permite hacer cosas como importar clases, personalizar
la superclase del servlet, establecer el tipo de contenido, etc.
2. include, que nos permite insertar un fichero dentro de la clase servlet
en el momento que el fichero JSP es traducido a un servlet.
3. taglib, que nos permite definir etiquetas personalizadas.
1.
15
La especificación JSP 1.2 – Directiva page.


La directiva page dirige al motor Servlet´s sobre la configuración
general de la página.
Nos permite definir uno o mas de los siguientes atributos aplicables
a toda la página:
<%@ page [import=“{paquete.class | paquete.*},…”]
[session=“true|false”]
[contentType=“tipoMime”[;charset=Character-Set]” |
“text/html;charset=ISO-8859-1”]
[pageEncoding="characterSet | ISO-8859-1“]
[errorPage=“URL”]
[isErrorPage=“true|false”]
[isThreadSafe=“true|false”]
[language=“java”]
[extends=“paquete.class”]
[buffer=“none”|8kb|sizekb”]
[autoFlush=“true|false”]
[info=“texto”]
%>
16
La especificación JSP 1.2 – Directiva page. Atributo
import.

El atributo import nos permite especificar los paquetes que
deberían ser importados. Si no se especifica nada en el servlet se
importan los siguientes paquetes por defecto:
java.lang.*
 javax.servlet.*
 javax.servlet.jsp.*
 javax.servlet.http.*


Puede aparecer de una de las siguientes formas:
<%@ page import=“paquete.clase”%>
<%@ page import=“paquete.clase1, ..., paquete.claseN”%>

EL atributo import es el único que puede aparecer más de una vez
dentro de una JSP.
17
La especificación JSP 1.2 – Ejemplo 1: Directiva page.
Fichero AtributoImport.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ejemplo1: Directiva page. Atributo import</TITLE>
</HEAD>
<BODY>
<H2>Ejemplo1: Directiva page. Atributo import </H2>
<%@ page import="java.util.*,servletsyjsps.*" %>
<%-- Declaraciones JSP --%>
<%!
private String randomID() {
int num = (int)(Math.random()*10000000.0);
return("id" + num);
}
private final String NO_VALUE = "<I>No Value</I>";
%>
18
La especificación JSP 1.2 – Ejemplo 1: Directiva page
(continuación).
Fichero AtributoImport.jsp
<%-- Scriptlet JSP --%>
<%
Cookie[] cookies = request.getCookies();
String oldID =
ServletUtilities.getCookieValue(cookies, "userID", NO_VALUE);
String newID;
if (oldID.equals(NO_VALUE)) {
newID = randomID();
} else {
newID = oldID;
}
LongLivedCookie cookie = new LongLivedCookie("userID", newID);
response.addCookie(cookie);
%>
<%-- Expresiones JSP --%>
La última vez que se accedió a esta página fue <%= new Date() %> con un id de
usuario <%= oldID %>.
</BODY>
</HTML>
19
La especificación JSP 1.2 – Directiva page. Atributo
session.


El atributo session indica si la página JSP participa o no
en una sesión HTTP.
El atributo puede tomar los valores:
<[email protected] session=“true|false” %>


Un valor true (valor por defecto) indica que la variable
predefinida session (del tipo HttpSession) debería unirse a la
sesión existente si existe una, y si no existe se debería crear
una nueva sesión para unirla.
Un valor de false indica que no se usarán sesiones.
20
La especificación JSP 1.2 – Directiva page. Atributo
contentType.


El atributo contentType especifica el tipo MIME de la salida. El
valor por defecto es text/html e ISO-8859-1.
Puede aparecer de una de las siguientes formas:
<%page contentType=“tipoMime”[;charset=Character-Set]” %>

Algunos de tipos MIME más comunes son:
Type
Significado
Type
Significado
text/html
Documento HTML
application/msword
Documento Word
text/plain
Texto plano
application/pdf
Documento PDF
text/css
Hoja de estilo
application/x-gzip
Archivo Gzip
image/GIF
Imagen GIF
image/jpeg
Imagen JPEG
application/
x-java-archive
Fichero JAR
video/mpeg
Video clip MPEG
application/zip
Archivo ZIP
video/quicktime
Video clip QuickTime
application/
postscript
Fichero PostScript
21
La especificación JSP 1.2 – Ejemplo 2: Directiva page.
Fichero Excel.jsp
<%@ page
<%-- Hay
1997
12.3
contentType="application/vnd.ms-excel" %>
que poner tabuladores entre los datos no espacios. --%>
1998
1999
2000
2001 (Anticipated)
13.4
14.5
15.6
16.7
22
La especificación JSP 1.2 – Directiva page. Atributo
pageEncoding.

El atributo pageEncoding especifica el juego de
caracteres que usará la página JSP para el response.

El atributo puede aparecer de las formas:
<%@ page pageEncoding="characterSet | ISO-8859-1" %>

El valor por defecto es ISO-8859-1
23
La especificación JSP 1.2 – Directiva page. Atributos
errorPage, isErrorPage.

El atributo errorPage especifica una página JSP que se debería
procesar si se lanzará cualquier Throwable pero no fuera capturado
en la página actual.


Si el path empieza con una "/", el path es relativo al directorio raíz de
documentos de la aplicación JSP y es resuelto por el servidor Web. Si
no, el path es relativo al fichero JSP actual.
El atributo isErrorPage indica si la página actual actúa o no como
página de error de otra página JSP.
El a tributo puede tomar los valores:
<[email protected] isErrorPage=“true|false” %>
• Si es true, podemos usar el objeto exception, que contiene una referencia
a la excepción lanzada, en el fichero JSP.
• Si es false (valor por defecto), significa que no podemos usar el objeto
exception en el fichero JSP.
24
La especificación JSP 1.2 – Ejemplo 3: Directiva page.
Fichero Velocidad.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ejemplo 3: Directiva page</TITLE>
</HEAD>
<BODY>
<%@ page errorPage=“VelocidadError.jsp" %>
<%!
// Observa que se lanzará un excepcion NumberFormatException si el valor es nulo o
// esta mal formateado
private double toDouble(String value) {
return(Double.valueOf(value).doubleValue());
}
%>
<%
double espacio = toDouble(request.getParameter(“espacio”));
double tiempo = toDouble(request.getParameter(“tiempo”));
double speed = espacio/tiempo;
%>
25
La especificación JSP 1.2 – Ejemplo 3: Directiva page
(continuación).
Fichero Velocidad.jsp
<UL>
<LI>Espacio: <%= espacio %>.
<LI>Tiempo: <%= tiempo %>.
<LI>Velocidad: <%= speed %>.
</UL>
</BODY>
</HTML>
26
La especificación JSP 1.2 – Ejemplo 3: Directiva page
(continuación).
Fichero VelocidadError.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Página de error</TITLE>
</HEAD>
<BODY>
<%@ page isErrorPage="true" %>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Error al calcular la velocidad</TABLE>
<P>
Hay un error en la página Velocidad.jsp:
<I><%= exception %></I>.
<PRE><% exception.printStackTrace(new java.io.PrintWriter(out)); %></PRE>
</BODY>
</HTML>
27
La especificación JSP 1.2 – Directiva page. Atributo
extends.

El atributo extends indica el nombre, totalmente
cualificado, de la superclase del servlet que resulta de
compilar la página JSP.
<%@ page extends=“paquete.class” %>

Sun recomienda que usemos este atributo con cautela,
ya puede limitar la habilidad del motor del JSP.
28
La especificación JSP 1.2 – Directiva include.

La directiva include nos permite incluir ficheros en el
momento en que la página JSP es compilada a un
servlet. La directiva include tiene la forma:
<%@ include file=“relativeURL” %>
Observar que la directiva include incluye el fichero en
el momento de la compilación. Por tanto, si la página
incluida cambia después de la compilación, los cambios
no se verán reflejados en la página actual hasta que se
vuelva a compilar.
29
La especificación JSP 1.2 – Ejemplo 1: Directiva include.
Fichero Velocidad.jsp
<html>
<head>
<title>Ejemplo de un include</title>
</head>
<body bgcolor="white">
<font color="blue">
Fecha y hora actual: <%@ include file=“Date.jsp" %>
</font>
</body>
</html>
Fichero Date.jsp
<%@ page import="java.util.*" %>
<%= (new Date() ).toLocaleString() %>
30
La especificación JSP 1.2 – Directiva taglib.



Gracias a la directiva taglib podemos definir nuestros
propios tags JSP.
A un conjunto de tags JSP lo llamaremos librería de
tags.
Para definir un tag necesitamos definir 4 componentes:




Una clase que defina el comportamiento del tag.
Un fichero TLD (Tag library descriptor) para hacer visible la clase
en el servidor.
Un fichero web.xml para hacer visible el tag en el servidor.
Un fichero JSP que use el tag
31
Objetos Implícitos
32
La especificación JSP 1.2 – Objetos implícitos en una
JSP.

Para simplificar el código en las expresiones y scriplets
JSP, tenemos 9 variables definidas automáticamente:
1. request.
2. response.
3. out.
4. session.
5. application.
6. config.
7. pageContext.
8. page.
9. exception

Estas variables reciben el nombre de Objetos
implícitos en una JSP.
33
La especificación JSP 1.2 – Objetos implícitos en una
JSP.
1.
request:
Este es el objeto de la clase HttpServletRequest asociado con la
petición, y nos permite mirar los parámetros de la petición (mediante
el método getParameter), el tipo de petición (GET, POST, HEAD,
etc.), y las cabeceras HTTP entrantes (cookies, referer, etc.).
Estrictamente hablando, se permite que la petición sea una subclase
de ServletRequest distinta de HttpServletRequest, si el protocolo
de la petición es distinto del HTTP, aunque esto casi nunca se lleva a la
práctica.
2.
response:
Este es el objeto de la clase HttpServletResponse asociado con la
respuesta al cliente. Observa que, como el stream de salida (ver out
más abajo) tiene un buffer, es legal seleccionar los códigos de estado y
cabeceras de respuesta, aunque no está permitido en los Servlets
normales una vez que la salida ha sido enviada al cliente.
34
La especificación JSP 1.2 – Objetos implícitos en una
JSP.
3.
out:
Este es el PrintWriter usado para envíar la salida al cliente. Sin
embargo, para poder hacer útil el objeto response (ver punto
anterior), esta es una versión con buffer de PrintWriter llamada
JspWriter. Podemos ajustar el tamaño del buffer, o incluso
desactivar el buffer, usando el atributo buffer de la directiva page.
out se usa casi exclusivamente en scriptlets ya que las expresiones
JSP obtienen un lugar en el stream de salida, y por eso raramente se
refieren explícitamente a out.
4.
session:
Este es el objeto de la clase HttpSession asociado con la petición. Las
sesiones se crean automáticamente. Por esto esta variable se une
incluso si no hubiera una sesión de referencia entrante. Como
veremos, la única excepción es usar el atributo session de la directiva
page para desactivar las sesiones, en cuyo caso los intentos de
referenciar la variable session causarán un error en el momento de
traducir la página JSP a un servlet.
35
La especificación JSP 1.2 – Objetos implícitos en una
JSP.
5.
application:
Es el objeto de la clase ServletContext obtenido mediante:
getServletConfig().getContext()
6.
config:
Es el objeto de la clase ServletConfig para la página actual.
7.
pageContext:
Es el objeto de la clase PageContext. Este objeto es usado por el motor
de Servlet´s para administrar características como páginas de error y
los parámetros para hacer include o forward de páginas.
8.
exception:
Es un objeto de la clase Throwable. Solo se crea en el caso en el que
usemos la directiva:
<[email protected] ErrorPage=“true”%>
36
JavaBeans y JSP
37
La especificación JSP 1.2 – JavaBeans y JSP´s.

Las acciones que restan hacen referencia a la
reutilización de componentes JavaBeans.

Características de un JavaBean:
1.
2.
3.
Una clase Bean deber ser serializable, y por lo tanto, debe
tener un constructor vacío. Este constructor es el que será
llamado cuando una JSP cree el Bean.
Una clase Bean no debería tener variables de instancia
públicas.
En la clase Bean tienen que aparecer métodos getXxx/setXxx
para establecer u obtener los valores de sus propiedades.
38
La especificación JSP 1.2 – Acción useBean.

La acción <jsp:useBean> nos permite localizar o instanciar un
JavaBean en la página JSP. La sintaxis más simple para especificar
que se debería usar un Bean es:
<jsp:useBean id="nombre" class="paquete.clase" />
Con esto conseguimos localizar o instanciar un objeto, de la clase
especificada por “class”, y enlazarlo con una variable, con el
nombre especificado en “id”.
También se puede especificar un atributo “scope” que hace que el
bean se asocie con más de una página. En este caso, es útil
obtener referencias a los beans existentes, y la acción jsp:useBean
especifica que se instanciará un nuevo objeto si no existe uno con
el mismo nombre y ámbito.
39
La especificación JSP 1.2 – Acción useBean.

La sintaxis completa de la acción <jsp:useBean> es:
<jsp:useBean id=“nombreDeInstanciaDelBean"
scope="page|request|session|application"
{
class="paquete.clase" [ type="paquete.clase" ] |
beanName="{paquete.clase | %= expression %}"
type="paquete.clase" |
type="paquete.clase"
}
{ /> | > otros elementos
</jsp:useBean> }
40
La especificación JSP 1.2 – Acción useBean. Atributos.


El atributo id es el nombre de la variable que identifica
al bean en un determinado ámbito (page, request,
session, application).
El atributo scope="page|request|session|application"
determina el ámbito en el que el bean existe.
 page: El bean solo esta disponible para la página actual (valor
por defecto).
 request: El bean solo esta disponible para la petición actual del
cliente.
 session: El bean esta disponible para todas las páginas durante
el tiempo de vida de la sesión.
 application: El bean esta disponible para todas las páginas que
comparten el mismo ServletContext.
41
La especificación JSP 1.2 – Acción useBean. Atributos.

El atributo class nos dice el nombre de la clase del bean que se instancia.
La clase no debe ser abstracta y debe tener un constructor vacío.

El atributo type hace que se instancie el bean con un tipo diferente al que
se crea. El valor de type debe ser el nombre de una superclase del bean o
el nombre de un interface que implemente la clase del bean.
Si usamos Type sin class o beanName el bean no se instancia

El atributo beanName da el nombre del bean, como lo suministraríamos
en el método instantiate de Beans. Esta permitido suministrar un type y
un beanName, y omitir el atributo class.
42
La especificación JSP 1.2 – Acción setProperty.

Usamos jsp:setProperty para establecer los valores de las
propiedades de los beans que se han referenciado anteriormente
con la acción jsp:useBean. Además valor de id en jsp:useBean
debe coincidir con el valor de name en jsp:setProperty.
La sintaxis completa de la acción es:
<jsp:setProperty name="nombreDeInstanciaDelBean "
{
property="*" |
property=“nombrePropiedad”[param=“nombreParametro"]|
property=“nombrePropiedad”
value="{stringLiteral | %= expresion %}"
} />
43
La especificación JSP 1.2 – Acción setProperty.
Atributos.


El atributo name designa el bean cuya propiedad va a
ser establecida. El elemento jsp:useBean debe
aparecer antes del elemento jsp:setProperty.
El atributo property=“*” almacena todos los valores
de los parámetros de la petición en propiedades del
bean. Para ello, los nombre de las propiedades del bean
deben coincidir con los nombre de los parámetros de la
petición.
• Si un parámetro de la request es null o esta vacío, la propiedad
equivalente no se establece a ningún valor.
• Si el bean tiene una propiedad que no corresponde con ninguno
parámetro de la petición, la propiedad no se establece a ningún
valor.
44
La especificación JSP 1.2 – Acción setProperty.
Atributos.

property=“nombrePropiedad” [param=“nombreParametro"]
Con estos atributos podemos establecer una propiedad del bean
con uno de los parámetros de la request.
Si los valores de property y param coinciden, podemos omitir el
atributo param.
 Si el parámetro de la request tiene un valor vacío o null, el valor de la
propiedad del bean equivalente no se establece.


property=“nombrePropiedad”
value="{stringLiteral | %= expresion %}"
Con este atributo podemos establecer la propiedad de un bean con
un valor específico.
Si el valor es de tipo String, se convertirá al tipo de la propiedad del
bean siguiendo las normal de la tabla mostrada abajo.
 Si el valor es una expresión, el tipo de la expresión debe coincidir el
tipo de la propiedad del bean.

45
La especificación JSP 1.2 – Acción getProperty.

La acción jsp:getProperty obtiene el valor de una
propiedad de un bean, usando el método getter del
bean, e inserta su valor en la respuesta.
Antes de usar esta acción debe aparecer una acción
jsp:useBean para instanciar o localizar el bean.
La sintaxis completa de la acción es:
<jsp:getProperty name=" nombreDeInstanciaDelBean"
property=" nombrePropiedad " />
46
La especificación JSP 1.2 – Acción getProperty.
Atributos.

El atributo name designa el bean cuya propiedad va a
ser seleccionada. El elemento jsp:useBean debe
aparecer antes del elemento jsp:setProperty y el valor
de id en jsp:useBean debe coincidir con el valor de
name en jsp:setProperty.

El atributo property indica el nombre de la propiedad
del bean que queremos obtener.

Si al obtener el valor de la propiedad resulta que es null, se
lanza una excepción de tipo NullPointerException.
47
La especificación JSP 1.2 – Ejemplo 1: StringBean.
Fichero StringBean.java
package servletsyjsps;
public class StringBean {
private String mensaje = “Mensaje vacio";
public String getMensaje() {
return(mensaje);
}
public void setMensaje(String mensaje) {
this.mensaje = mensaje;
}
}
48
La especificación JSP 1.2 – Ejemplo 1: StringBean.
Fichero StringBean.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ejemplo 1: StringBean</TITLE>
</HEAD>
<BODY>
<jsp:useBean id="stringBean" class=“servletsyjsps.StringBean" />
<OL>
<LI>Valor inicial (getProperty):
<I><jsp:getProperty name="stringBean" property="mensaje" /></I>
<LI>Valor inicial (Expresion JSP):
<I><%= stringBean.getMensaje() %></I>
<LI><jsp:setProperty name=“stringBean”
property=“mensaje”
value=“Valor actualizado con setProperty” />
Valor después de establecer la propiedad con setProperty:
<I><jsp:getProperty name="stringBean" property="mensaje" /></I>
</OL>
</BODY>
</HTML>
49
La especificación JSP 1.2 – Ejemplo 2: SaleEntry.
Fichero SaleEntry.java
package servletsyjsps;
public class SaleEntry {
private String itemID = “desconocido";
private double discountCode = 1.0;
private int numItems = 0;
public String getItemID() {return(itemID);}
public void setItemID(String itemID) {
if (itemID != null) {
this.itemID = itemID;
} else {
this.itemID = “desconocido”;
}
}
public double getDiscountCode() {return(discountCode);}
public void setDiscountCode(double discountCode){this.discountCode =discountCode;}
50
La especificación JSP 1.2 – Ejemplo 2: SaleEntry.
Fichero SaleEntry.java
public int getNumItems() {return(numItems);}
public void setNumItems(int numItems) {this.numItems = numItems;}
//reemplazarlo por una busque real en BD.
public double getItemCost() {
double cost;
if (itemID.equals("a1234")) {
cost = 12.99*getDiscountCode();
} else {
cost = -9999;
}
return(roundToPennies(cost));
}
private double roundToPennies(double cost) {return(Math.floor(cost*100)/100.0);}
public double getTotalCost() {return(getItemCost() * getNumItems());}
}
51
La especificación JSP 1.2 – Ejemplo 2: SaleEntry1.
Fichero SaleEntry1.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ejemplo 2: SaleEntry2</TITLE>
</HEAD>
<jsp:useBean id=“entry” class=“servletsyjsps.SaleEntry” />
<jsp:setProperty name=“entry” property=“itemID”
value='<%=request.getParameter(“itemID”) %>' />
<%
int numItemsOrdered = 1;
try {
numItemsOrdered =
Integer.parseInt(request.getParameter(“numItems”));
} catch(NumberFormatException nfe) {}
%>
<jsp:setProperty name=“entry” property=“numItems”
value=“<%= numItemsOrdered %>” />
52
La especificación JSP 1.2 – Ejemplo 2: SaleEntry1
(continuación).
Fichero SaleEntry1.jsp
<%
double discountCode = 1.0;
try {
String discountString = request.getParameter(“discountCode”);
discountCode = Double.valueOf(discountString).doubleValue();
} catch(NumberFormatException nfe) {}
%>
<jsp:setProperty name=“entry” property=“discountCode” value=“<%= discountCode %>” />
<BR>
<TABLE ALIGN="CENTER" BORDER=1>
<TR CLASS="COLORED">
<TH>Item ID<TH>Unit Price<TH>Number Ordered<TH>Total Price
<TR ALIGN="RIGHT">
<TD><jsp:getProperty name="entry" property="itemID"/>
<TD>$<jsp:getProperty name="entry" property="itemCost" />
<TD><jsp:getProperty name="entry" property="numItems" />
<TD>$<jsp:getProperty name="entry" property="totalCost" />
</TABLE>
53
La especificación JSP 1.2 – Ejemplo 2: SaleEntry2.
Fichero SaleEntry2.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ejemplo2: SaleEntry2</TITLE>
</HEAD>
<BODY>
<jsp:useBean id="entry" class="servletsyjsps.SaleEntry" />
<jsp:setProperty name="entry" property="*" />
<BR>
<TABLE ALIGN="CENTER" BORDER=1>
<TR CLASS="COLORED">
<TH>Item ID<TH>Unit Price<TH>Number Ordered<TH>Total Price
<TR ALIGN="RIGHT">
<TD><jsp:getProperty name="entry" property="itemID" />
<TD>$<jsp:getProperty name="entry" property="itemCost" />
<TD><jsp:getProperty name="entry" property="numItems" />
<TD>$<jsp:getProperty name="entry" property="totalCost" />
</TABLE>
</BODY>
</HTML>
54
Librería de etiquetas: Taglibs
55
La especificación JSP 1.2 – Directiva taglib.



Gracias a la directiva taglib podemos definir nuestros
propios tags JSP.
A un conjunto de tags JSP lo llamaremos librería de
tags.
Para definir un tag necesitamos definir 4 componentes:




Una clase que defina el comportamiento del tag.
Un fichero TLD (Tag library descriptor) para hacer visible la
clase en el servidor.
Un fichero web.xml para hacer visible el tag en el servidor.
Un fichero JSP que use el tag
56
La especificación JSP 1.2 – Directiva taglib. Sintaxis.

La sintaxis completa de la directiva taglib es:
<%@ taglib uri="URIForLibrary" prefix="tagPrefix" %>

El atributo uri define donde se localiza el fichero TLD, y puede
ser un URL, un URN o un PATH absoluto o relativo.
• Si la URI es una URL, entonces el TLD es localizado por medio del
mapping definido dentro del fichero web.xml.
• Si la URI es un path, entonces es interpretado como un acceso
relativo a la raíz de la aplicación y debería resolverse en un fichero
TLD directamente, o un fichero .jar que contiene el fichero TLD.
57
La especificación JSP 1.2 – Ejemplo Hola Mundo.
Fichero Hola.jsp
<HTML>
<HEAD>
<%@ taglib uri=“Hola.tld” prefix=“test” %>
<TITLE><test:HolaMundo /></TITLE>
<BODY>
<H1> <test:HolaMundo /></H1>
</BODY>
</HTML>
58
La especificación JSP 1.2 – Ejemplo Hola Mundo.
Fichero Hola.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
“http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd">
<taglib>
<jspversion>1.1</jspversion>
<tlibversion>1.0</tlibversion>
<shortname>simplehola</shortname>
<urn></urn>
<info>Mi primera librería de tags</info>
<tag>
<name>HolaMundo</name>
<tagclass>Hola</tagclass>
<body-content>empty</body-content>
<info>Mi Hola Mundo Tag</info>
</tag>
</taglib>
59
La especificación JSP 1.2 – Ejemplo Hola Mundo.
Fichero web.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
“http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<display-name> Aplicación Hola Mundo </ display-name>
<description> Librerías de tags de la aplicación </description>
<taglib>
<taglib-uri>/Hola.tld </taglib-uri>
<taglib-location>/WEB-INF/Hola.tld </taglib-location>
</taglib>
</web-app>
60
La especificación JSP 1.2 – Ejemplo Hola Mundo.
Fichero Hola.java
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class Hola extends TagSupport {
public int doStartTag() {
try {
JspWriter out = pageContext.getOut();
out.print(“Hola Mundo”);
} catch (IOException ioe) {
System.out.println(“Error en Hola Mundo”);
}
return (SKIP_BODY);
}
}
61
Descargar

JSP