1. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
Jaaaaaaaaaaaa
Desarrollo de Aplicaciones Web con J2EE
2. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
TEMA Nº 3: ELEMENTOS DE JSP
PROCESAMIENTO DE JSP
Con JSP podemos crear aplicaciones web que se ejecuten en variados servidores web,
de múltiples plataformas, ya que Java es en esencia un lenguaje multiplataforma. Las
páginas JSP están compuestas de código HTML/XML mezclado con etiquetas
especiales para programar scripts de servidor en sintaxis Java. Por tanto, las JSP
podremos escribirlas con nuestro editor HTML/XML habitual.
MOTORJSP
El motor de las páginas JSP está basado en los servlets de Java -programas en Java
destinados a ejecutarse en el servidor-, aunque el número de desarrolladores que
pueden afrontar la programación de JSP es mucho mayor, dado que resulta mucho
más sencillo aprender que los servlets.
En JSP creamos páginas de manera parecida a como se crean en ASP o PHP -otras
dos tecnologías de servidor-. Generamos archivos con extensión .jsp que incluyen,
dentro de la estructura de etiquetas HTML, las sentencias Java a ejecutar en el
servidor. Antes de que sean funcionales los archivos, el motor JSP lleva a cabo una
fase de traducción de esa página en un servlet, implementado en un archivo class
(Byte codes de Java). Esta fase de traducción se lleva a cabo habitualmente cuando se
recibe la primera solicitud de la página .jsp, aunque existe la opción de precompilar
en código para evitar ese tiempo de espera la primera vez que un cliente solicita la
página. Ejemplo de página JSP
En la imagen siguiente se puede ver un ejemplo extremadamente simple de una
página JSP y el esquema de conversión de esa página en un servlet.
3. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
REREQUISITOS
Para aprender JSP, aparte de conocer HTML, será necesario comprender y tener algo
de experiencia en la programación en Java, que es un lenguaje de programación
Orientado a Objetos por completo. Una vez conocida la programación en Java se
puede estudiar por encima el sistema de Servlets, lo que nos dará una mejor idea del
funcionamiento interno del motor JSP.
Para aprender Java podemos consultar algunos enlaces del correspondiente
directorio de nuestro buscador de enlaces. Además, necesitaremos descargar e
instalar Tomcat, el contenedor de servlets usado en la referencia oficial de
implementación de JSP. Podemos acceder a un ejercicio para aprender a realizar esta
instalación, disponible también en la referencia de aprendizaje de la página de Java.
ReferenciasJSP
Hemos creado una nueva sección en nuestro directorio dedicada por completo a las
páginas JSP, que será muy interesante para todo aquel que desee profundizar en el
tema.
DIRECTIVAS JSP
Esta figura muestra lo que quizás sea la aplicación JSP más sencilla que uno podría
escribir.
Duke Dice Hello
El Banner de Duke (dukebanner.html)
<table border="0" width="400" cellspacing="0"
cellpadding="0">
<tr>
<td height="150" width="150"> </td>
<td width="250"> </td>
</tr>
4. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
<tr>
<td width="150"> </td>
<td align="right" width="250"><br>
<imgsrc="duke.waving.gif"></td>
</tr>
</table>
<br>
La página JSP (helloworld.jsp)
<%@ page info="a hello world example" %>
<html>
<head><title>Hello, World</title></head>
<body bgcolor="#ffffff" background="background.gif">
<%@ include file="dukebanner.html" %>
<table>
<tr>
<td width=150> </td>
<td width=250 align=right><h1>Hello, World!</h1></td>
</tr>
</table>
</body>
5. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
</html>
La Directiva Page
La directiva Page es una etiqueta JSP que usaremos encaso todos los ficheros fuente
JSP que escribamos. En helloworld.jsp, es la línea que se parece a esto:
<%@ page info="a hello world example" %>
Esta directiva da instrucciones al motor JSO que aplica a todo el fichero fuente JSP. En
este ejemplo, está directiva especifica un comentario informativo que formará parte
del fichero JSP compilado. En otros casos, podría específicar el lenguaje de script
usado en el fichero fuente JSP, los paquetes de ficheros fuentes que serán
importados, o la página de error que se llamará si ocurren errores o excepciones.
Podemos usar la directiva page en cualquier lugar del fichero JSP, pero es un buen
estilo de codificación situarlo en la parte superior del fichero. como es una etiqueta
JSP, podemos situarla antes de la etiqueta de apertura <html>tag.
La Directiva Include
La directiva include inserta el contenido de otro fichero en el fichero principal JSP,
donde está situada la directiva. Es útil para incluir informacióndecopuright, ficheros
de lenguaje de script, p cualquier cosa que podríamos querer reutilizar en otras
aplicaciones. En este ejemplo, el fichero incluido es una tabla que crea un banner
gráfico.
Podemos ver el contenido del fichero incluido viendo la página fuente del fichero
principal JSP mientras estamos ejecutando Hello, World. El fichero incluido no
contiene etiquetas <html> o <body>, porque podrían generar conflictos con las
mismas etiquetas del fichero JSP llamante.
Una Nota sobre las Etiquetas JSP
Cuando uses los ejemplos de este capítulo, recuerda que las etiquetas JSP son
sensibles a las mayúscula. Si, por ejemplo, tecleamos <jsp:usebean> en lugar de <jsp:
useBean>, nuestra etiqueta no será reconocida, y la implementación de referencia
JSP 1.0 lanzará una excepción. Algunos de los atributos de las etiquetas toman
nombres de clases, nombres de paquetes, pathnameso otros valores también
sensibles a las mayúsculas.
¿Cómo ejecutar la aplicación de ejemplo
Las instrucciones dadas aquí usan una pathname del estilo UNIX. Si estamos
trabajando en Windows, usamo el mismo pathname pero con el separador de
directorios apropiado
Creamos el directorio (o carpeta) ../jswdk-.0/examples/jsp/tutorial/helloworld.
6. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
Situamos los siguientes ficheros en el directorio ../tutorial/hello: background.gif,
duke.waving.gif, dukebanner.html, y helloworld.jsp.
Desde la línea de comandos, arrancamos la implementación de referencia JSP de
Sun:cd../jswdk-1.0 startserver
Abrimos un navegador Web y vamos a http://yourMachineName:8080/examples/jsp/
tutorial/helloworld/helloworld.jsp
ACCIONES
reación de acciones JSP personalizadas
Para todo aquel que haya utilizado alguna vez JSP, sabe que con la librería core de
JSLT tendremos en la mayoría de las ocasiones las herramientas necesarias para
nuestras aplicaciones, pero puede haber casos que no sean suficientes o que nos
interese crear nuestras propias etiquetas para nuestras aplicaciones. Veremos ahora
paso a paso como crearlas.
Esta acción requiere de dos pasos fundamentales:
Implementación de la clase manejadora. Por cada tag que queramos crear,
deberemos de definir su clase manejadora que implemente las operaciones a realizar
por la aplicación.
Creación del archivo de libería, que contiene la información necesaria para que el
contenedor web pueda interpretar esa información.
IMPLEMENTACIÓN DE LA CLASE MANEJADORA
La interfaz javax.servlet.jsp.tagext.Tag es la que nos proporciona el soporte para
poder crear esta clase manejadora con los elementos mínimos necesarios. También
podríamos heredar de la clase javax.servlet.jsp.tagext.TagSupport que ya nos
proporciona una implementación de Tag por defecto.
Los métodos que se ejecutan en una durante la ejecución de la acción son:
voidsetPageContext(PageContext pc): Es el primer método invocado por el
contenedor y permite establecer el contexto de la página actual.
voidsetParent (Tagparent): Es el segundo método que se ejecuta en al acción y al que
se le pasa el objeto Tag o en su defecto Null.
7. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
intdoStartTag(): Se ejecuta una vez que el contenedor detecta la etiqueta de
comienzo de la acción. Nos devolverá un número que indicará al contenedor como
tratar con el cuerpo de la acción. Los posibles valores son: Tag.EVAL_BODY_INCLUDE,
si queremos que se evalue el body de la acción o Tag.SKIP_BODY, si no queremos que
evalue el cuerpo.
intdoEndTag(): Se invoca cuando detecta la etiqueta de cierre de la acción. Devolverá
un valor que indica al contenedor como tiene que actuar. Los posibles valores
son:Tag.EVAL_PAGE, que indica que tienen que evaluar el resto de la página o el
valorTag.SKIP_PAGE, con la que no se evaluará el resto de la página.
Para poder mostrar los resultados de la etiqueta en la página, tenemos que hacer uso
de la clase JspWriter, y en concreto haciendo uso de su método getOut(). Por
mediopageContext podremos tener acceso al objeto JspWriter.
package ejemplo;
importjavax.servlet.jsp.*;
importjavax.servlet.jsp.tagext.*;
public class Saludo extends TagSupport{
publicintdoStartTag() throws JspException{
try{
JspWriter out=pageContext.getOut();
out.println("HolaMundo");
} catch(Exception e){
e.printStackTrace();
}
return SKIP_BODY;
}
publicintdoEndTag(){
return EVAL_PAGE;
}
}
8. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
ARCHIVO LIBRERÍA
Este archivo consiste en un archivo XML con extensión .tld, donde indicaremos el
conjunto de acciones que queremos que pertenezcan a la libería.
Lo primero que deberemos de indicar es el standar que se utilizará en el documento.
En nuestro caso:
<!DOCTYPEtaglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
Luego indicaremos el elemento raiz taglig, y dentro indicaremos todas las etiquetas
del documento. Las mas importantes son:
tlib-version: Número de la versión de la librería.
jsp-version: Versión de la especificación JSP utilizada por la librería, en nuestro caso
2.0.
short-name: posible valor elegido para ser utilizado como prefijo.
uri: es la url asociada a la librería.
description: Texto descriptivo de la libería.
tag: definición de una librería. Contendrá los siguientes subelementos:
name: Nombre de la acción.
tag-class: Nombre de la clase que define la acción.
body-content: Información utilizada para determinar como se va a evaluar el cuerpo
de la acción.
description: Descripcion de la acción.
attribute: define los atributos de la acción. Los posibles elementos serán:
name. Nombre del atributo
required. Indica si el atributo es o no obligatorio
rtexprvalue. Indica si el atributo puede o no ser calculado
dinámicamente utilizando una expresión.
type. Tipo de dato del atributo (nombre cualificado de la clase). Para literales es
siempre String.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPEtaglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/webjsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
9. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
<short-name>ejemplo</short-
name><uri>http://www.milibreria.tld</uri><description>Ejemplo de
librería</description>
<tag>
<name>saludo</name>
<tag-class>ejemplo.Saludo</tag-class><body-content>empty</body-
content><description>tag de ejemplo</description></tag>
</taglib>
UTLIZACION EN LA APLICACION
A la hora de distribuir las clases manejadoras podemos optar por tratar con los .class
o, preferiblemente, generar un archivo .jar en el que se incluyan todas estas clases.
Tanto en un caso como en otro, las clases tendrán que ser accesibles desde la
aplicación Web para lo cual debemos proceder de la siguiente manera según la forma
en que se distribuyan las clases:
Si las clases se distribuyen como .class, todos estos archivos deberán ser incluidos en
algún paquete dentro del directorio WEB-INFclasses de la aplicación.
Si se distribuyen como un archivo .jar, este deberá ser incluido en el directorio
WEBINFlib de la aplicación
En cuanto al archivo de librería .tld, lo más práctico es incluirlo en el .jar junto con las
clases manejadoras, aunque podemos situarlo en cualquier subdirectorio de la
aplicación (normalmente, dentro de WEB-INF).
Una vez realizadas las operaciones anteriores, para poder usar las acciones de la
librería en cualquier página JSP de la aplicación simplemente tendremos que incluir
una referencia a la librería a través de la directiva taglib. Por ejemplo para utilizar una
libería ya creada, al principio del archivo JSP deberíamos de poner la siguiente línea,
sustituyendo el uri, por el que nosotros hayamos indicado.
<%@ tagliburi=“http://www.ejemplolibreria.tld” prefix= “ejemplo”%>
Si el .tld estuviera en el archivo .jar no habría que hacer ninguna otra operación, pero
si estuviera situado, por ejemplo, en la ubicación WEB-
10. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
INFlibreriasejemplolibreria.tld, sería necesario incluir la siguiente entrada en el
archivo web.xml
<web-app>
<!--otros elementos-->
<taglib>
<taglib-uri>
http://www.milibreria.tld
</taglib-uri>
<taglib-location>
/WEB-INF/librerias/ejemplolibreria.tld
</taglib-location>
</taglib>
Su uso en un archivo jsp quedaría de la siguiente forma que os indicamos:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ tagliburi=“http://www.milibreria.tld” prefix=“ejemplo”%>
EXPRESIONES
En JSP se utilizan las expresiones para insertar valores, obtenidos con Java,
directamente a la salida que se envía al cliente o solicitante.
Tiene dos sintaxis:
<%=expresiónJava%>
(Note el signo igual (=) que acompaña justo detrás del inicio de código JSP y
asegúrese que dicho signo acompaña al de porcentaje (%)).
Existe otra sintaxis que es la siguiente
Cualquiera de las dos sintaxis se corresponde con una expresión en JSP. ¿Cómo
funcionan las expresiones?. Pues muy sencillo, la expresión es evaluada en el Motor
de JSP, se obtiene un valor de la expresión y éste se sustituye justo donde se utiliza.
Veamos un ejemplo sencillo, abrimos una nueva sesión de NetBeans 6.9, hacemos
Nuevo Proyecto, Java Web, Web Application y le damos nombre expresiones1,
11. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
cuando NetBeans 6.9 nos muestre la plantilla del archivo index.jsp lo cambiamos por
este otro código.
En el código anterior, en la línea 19 tenemos una expresión. Esta expresión
básicamente consiste en crear una nueva instancia de la clase Date, con lo cual la
expresión new java.util.Date() producirá una llamada a la fecha del sistema por parte
del Motor JSP desde el servidor, y esa fecha obtenida se sustituirá por todo lo que
hay entre las etiquetas de comienzo y fin del lenguaje JSP.
DECLARACIONES
Las declaraciones de variables o métodos se hacen en JSP en la forma
<%! declaración de variable o método; %>
Note el signo (!) de admiración que acompaña justo detrás del signo porcentaje (%),
allí donde comienza del código JSP.
Estas variables o métodos así definidos serán globales y por tanto accesibles desde
cualquier lugar de la página JSP. Hay que tener en cuenta que el servidor a través del
motor JSP transforma la página JSP en un servlet, y éste es usado por múltiples
peticiones, lo que provoca que este tipo de variables conserven su valor entre
sucesivas llamadas o ejecuciones. Las declaraciones se ejecutan una única vez, en la
primera llamada al servlet equivalente.
En el caso de una declación múltiple,
<%! variable1; [variable2;] … %>
También puede inicializarse las variables en el momento de la declaración, como por
ejemplo:
<%!int contador = 0; %>
Los ocho tipos de datos primitivos incluidos en el lenguaje de programación Java que
pueden declararse para una variable son: byte, short, int, long, float, double,
boolean y char.
(Ver http://www.codexion.com/tutorialesjava/java/nutsandbolts/datatypes.html ).
También puede usarse esta otra sintaxis
Ejemplo1:
Queremos declarar y asignar valores a tres variables numéricas a través de
declaraciones JSP para calcular finalmente el valor medio.
12. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
Iniciamos una nueva sesión con Netbeans IDE, abrimos un proyecto nuevo del tipo
“Java Web” – “Web Application”, le damos por nombre declaraciones1 y sustituimos
el archivo index.jsp por el siguiente código:
En el ejemplo anterior, puede verse la declaración de las variables en la línea 17, la
declaración del método media en la línea 21, la utilización de las variables en la línea
20 y finalmente la utilización de la media en la línea 22. En los dos últimos casos y
para mostrar los valores tanto de las variables como de la media se han utilizado
expresiones JSP. Ver Tutorial JSP(3) – Expresiones.
Si ahora ejecuta el programa (Ejecutar en el menú principal o F6) aparecerá en el
navegador:
<%--
Document : index
Created on : 09-dic-2007, 20:16:33
Author : jtagua
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ejemplo Declaraciones1</title>
</head>
<body>
<%! double num1=2.2, num2=4.4, num3=6.0;%>
<h2>
<center>
Los números a promediar son: <%=num1%>, <%=num2%> y <%=num3%><br><hr>
<%! public double media(double n1,double n2,double n3){ return (n1+n2+n3)/3; } %>
Media = <%=media(num1,num2,num3)%>
</center>
</h2>
</body>
</html>
13. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
OPERADORES LOGICOS
Operadores lógicos se utilizan para realizar comparaciones entre valores, numéricos o
no, dando como resultado un valor booleanos (true, false). La operación lógica
negación invierte el operando, si es true lo hace false y viceversa. Si se comparan
números con cadenas, JavaScript intenta convertir internamente los datos. En los
operadores relacionales (>, <, >=, <=) intenta convertir los datos en tipo número. Para
los operadores de igualdad (== !=) intenta convertir los tipos de datos a cadena,
número y booleano. Los operadores de identidad (===, !==) no realizan conversión de
tipo.
Mayor que >
Compara dos valores y devuelve true si el primero es mayor que el segundo. Compara
tanto números como cadenas.
var hoy = 4; ayer = 10, comp;
comp = hoy > ayer /*
comp adquiere el valor false*/
Menor qué <
Compara dos valores y devuelve true si el primero es mayor que el segundo. Compara
tanto números como cadenas.
var hoy = 4; ayer = 10, comp;
comp = hoy < ayer /*
comp adquiere el valor false*/
Mayor o igual >=
Compara dos valores y devuelve true si el primero es mayor o es igual que el
segundo. Compara tanto números como cadenas.
14. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
var hoy = 4; ayer = 4, comp;
comp = hoy >= ayer /*
comp adquiere el valor true*/
Menor o igual <=
Compara dos valores y devuelve true si el primero es menor o es igual que el
segundo. Compara tanto números como cadenas.
var hoy = 4; ayer = 4, comp;
comp = hoy <= ayer /*
comp adquiere el valor true*/
Iguales ==
Compara dos valores y devuelve true si ambos son iguales. Compara tanto números
como cadenas.
var hoy = 4; ayer = 4, comp;
comp = hoy == ayer /*
comp adquiere el valor true*/
Idénticos ===
Similar a == pero también compara el tipo de datos de los opeandos.
Compara dos valores y devuelve true si el primero es mayor o es igual que el
segundo. Compara tanto números como cadenas.
var hoy = 4; ayer = '4', comp;
comp = hoy == ayer; /*
comp adquiere el valor true*/
comp = hoy === ayer /* comp
adquiere el valor false*/
No iguales!=
No idénticos !==
Invierten el sentido de las comparaciones iguales == e idénticos === respectivamente.
AND lógico &&
Este operador se utiliza para concatenar comparaciones, es decir, para comprobar
varias condiciones. El resultado sólo será true si todas las comparaciones lo son.
var op1 = 2, op2 = 50, op3 = 25, comp;
comp = (op1 > op2) && (op1 < op3); /*comp
15. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
Adquiere el valor false */
comp es false por que op1 no es mayor que op2 aunque sea mayor que op3
OR lógico ||
Como el anterior, sirve apra realizar comparaciones compuestas y sólo devolverá
false cuando todas las comparaciones los sean. Es decir basta que una comparación
sea true para que devuelva el valor true.
var op1 = 2, op2 = 50, op3 = 25, comp;
comp = (op1 > op2) && (op1 < op3); /*comp
toma el valor true */
comp es true por que op1 es menor que op3, (op1 < op3 es por tanto true)
COMENTARIOS JSP
Cuando hablamos de comentarios en JSP tenemos que considerar básicamente dos
circunstancias, a saber:
1) Comentarios que aparecen como etiquetas HTML en un archivo jsp y que SÍ recibe
el cliente o peticionario de la página, esto es:
<!– Comentario HTML (Este comentario sí se pasa al cliente) –>
esta instrucción al ser una etiqueta/marca HTML se transmitirá directamente a la
página HTML de salida generada por el servlet asociado al JSP para enviarla al cliente
solicitante. Esta instrucción es transparente para el Motor JSP.
2) Comentarios escritos en Java entre los identificadores <% y %> que NO se enviarán
al cliente solicitante de la página, sólo aparecen en la propia página JSP y en su servlet
asociado.
<% // Comentario en Java de una sola línea %>
o este otro
<% /* Comentario en Java de una línea y
otra línea,
y otra línea, o muchas líneas */%>
16. Desarrollo de Aplicaciones Web con J2EE
Ing. Pablo Cesar Ttito C.
InfomixUnitek@gmail.com
OBJETOS IMPLÍCITOS JSP
Son una serie de objetos internos asociados a las APIs de servlets y jsps suministrados
por el contenedor jsp, que pueden ser usados en cualquier scriptlet y expresión, para
aumentar su funcionalidad. Muchos de ellos, apenas serán utilizados por el