Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guía de Estudiante
Libro 2: Java
Empresarial
Esta publicación ha sido producida usando Microsoft Word 2000 y Microsoft PowerPoint
2000 para Windows.
Marcas Registradas
DB2 Informix
No elimine páginas en blanco que puedan aparecer al final de cada unidad o entre
unidades. Estas páginas fueron insertadas intencionalmente.
.
Guía de Estudiante Java Empresarial I
Contenido
Volumen 3: Introducción a la Computación Empresarial y JavaBeans ........ 1
Unidad 1: Introducción a JSP............................................................................ 3
Objetivos de Aprendizaje 3
1. Visión General del JSP 4
2. Tecnología JSP 5
3. Arquitectura JSP 13
4. Acerca del Contenedor para el Servlet Generado 14
5. Ciclo de Vida JSP 16
6. Beneficios del JSP 17
7. Comparación entre JSP y ASP 18
Resumen 20
Unidad 1: Examen de Autoevaluación 21
Respuestas a la Unidad 1: Examen de Autoevaluación 23
Unidad 2: Laboratorio Introducción a JSP..................................................... 25
Objetivos de Aprendizaje 25
Ejercicios de Laboratorio 26
Unidad 3: Etiquetas JSP .................................................................................. 27
Objetivos de Aprendizaje 27
1. Tipos de Elementos JSP 28
2. Objetos Implícitos 28
3. Reglas a Seguirse Cuando se Escriben JSPs 30
4. Contenido de Plantilla 31
5. Directivas JSP 33
6. Elemento de Script 41
7. Comentarios en JSP 52
8. Resumen de la Sintaxis del Elemento JSP 53
Resumen 54
Unidad 3: Examen de Autoevaluación 55
Respuestas a la Unidad 3: Examen de Autoevaluación 57
Unidad 4: Laboratorio de Etiquetas JSP ........................................................ 59
Objetivos de Aprendizaje 59
Ejercicios de Laboratorio 60
Unidad 5: Etiquetas de Acción Estándar en JSP........................................... 61
i
© Copyright IBM Corp. 2008
Los materiales del curso no pueden ser reproducidos en su
totalidad o parcialmente sin el permiso escrito previo de IBM.
Java Empresarial I Guía de Estudiante
Objetivos de Aprendizaje 61
1. Etiquetas de Acción Estándar 62
2. Usar JavaBeans en JSP 62
3. Acciones que Controlan la Inclusión y el Reenvío en Tiempo de Ejecución75
Resumen 84
Unidad 5: Examen de Autoevaluación 85
Respuestas a la Unidad 5: Examen de Autoevaluación 87
Unidad 6: Lab. Etiquetas de Acción Estándar en JSP .................................. 89
Objetivos de Aprendizaje 89
Ejercicios de Laboratorio 90
Ejercicios de Laboratorio 90
Unidad 7: Escribir Etiquetas Personalizadas en JSP................................... 91
Objetivos de Aprendizaje 91
1. Vista Previa de Etiquetas Personalizadas y Librerías de Etiquetas 92
2. Componentes de una Etiqueta Personalizada 94
3. Construir una Etiqueta Personalizada Simple 94
4. Interfaz Tag y la Clase TagSupport 102
5. Asignar Atributos y Contenido de Cuerpo a las Etiquetas Personalizadas105
6. Manipular el Contenido del Cuerpo 112
Resumen 120
Unidad 7: Examen de Autoevaluación 121
Respuestas a la Unidad 7: Examen de Autoevaluación 123
Unidad 8: Lab. Escribir Etiquetas JSPs Personalizadas............................. 125
Objetivos de Aprendizaje 125
Ejercicios de Laboratorio 126
ii
© Copyright IBM Corp. 2008
Los materiales del curso no pueden ser reproducidos en su
totalidad o parcialmente sin el permiso escrito previo de IBM.
Guía de Estudiante Java Empresarial I
Volumen 3: Introducción a la
Computación Empresarial y JavaBeans
En un típico sitio Web, las páginas entregadas al cliente están compuestas tanto de
contenido dinámico como de contenido estático. La Figura 1.1 es una página Web que
muestra el reporte de las ventas semanales de la compañía Soluciones ABC.
Contenido
Estático
Contenido
Dinámico
El contenido estático de una página Web se puede generar fácilmente con las diferentes
herramientas disponibles de diseño de páginas HTML. Los Java Servlets pueden usarse
para generar el contenido dinámico. Dado que los Servlets son programas Java, es
esencial el conocimiento del lenguaje Java para escribirlos. Siempre que algún
contenido dinámico tenga que ser generado, es conveniente para un diseñador de
páginas Web que algunas de las etiquetas especiales puedan ser embebidas dentro de
las páginas HTML. Esto puede hacerse con el soporte a los scripts en el servidor, el
cual puede ejecutar los scripts marcados con etiquetas especiales. Las tecnologías de
script del lado del servidor surgen para lograr este requerimiento.
En los script del lado del servidor, algunas etiquetas especiales pueden ser embebidas
dentro de las páginas HTML. Un traductor en el lado del servidor procesa el contenido
encerrado dentro de las etiquetas especiales y genera la salida. La salida será
2. Tecnología JSP
La tecnología JSP es parte de la plataforma de solución integrada de Java para la
programación del lado del servidor y proporciona una alternativa portable a otras
tecnologías del lado del servidor, tales como CGI.
Los JSP tienen la capacidad de procesar solicitudes HTTP y generar como respuesta
contenido dinámico. Sin embargo, esto también puede ser hecho por los Servlets. La
única diferencia entre los JSPs y los Servlets es que los Servlets son escritos como
programas Java, mientras que los JSPs son documentos basados en texto que incluyen
una combinación de HTML, etiquetas JSP y código Java.
Como consecuencia, surge la pregunta ¿Por qué los JSPs son requeridos cuando
pueden usarse los Servlets para el mismo propósito?
Aunque los JSPs y los Servlets pueden usarse para resolver un problema, cada uno ha
sido designado para cumplir tareas específicas. Se ha visto que los Servlets aceptan
solicitudes del cliente, recuperan los datos requeridos interactuando con bases de datos
o JavaBeans, ejecutan la lógica de la aplicación en los datos y le dan el formato a los
Existen algunas desventajas descritas a continuación, por el hecho de que los Servlets
incluyen etiquetas HTML usando sentencias de impresión, estas son:
• No se podrá obtener una vista previa de la página Web antes de la ejecución
del programa, cuando las etiquetas HTML estáticas están embebidas en el
Servlet.
• Debido a que los datos no están separados de la presentación, si hay algún
cambio en alguno de ellos, es difícil localizar las áreas donde los cambios deben
ser reflejados.
• Por cada cambio en el contenido, el Servlet tiene que ser recompilado y
recargado en el servidor Web.
• El programador de Servlet debe tener destreza en programación para desarrollar
páginas Web que generen contenido dinámico.
Los JSPs ayudan a resolver este problema de la siguiente forma:
• Debido a que los JSPs están basados en texto, un diseñador Web podrá diseñar
páginas utilizando herramientas de diseño gráfico, de esta forma podrá obtener
la apariencia de las páginas antes del momento de ejecución.
• En JSPs, las etiquetas claramente demarcan el contenido dinámico del
contenido HTML estático. De esta forma se puede localizar fácilmente el lugar
donde se ha incorporado un cambio.
• Cuando un diseñador cambia el código JSP, la página es automáticamente
recompilada por el entorno del JSP y recargada en el servidor Web.
La tecnología JSP no es un sustituto para los Servlets. Se trata de combinar HTML con
Java Servlet y tecnología JavaBean para crear un entorno altamente productivo para
desarrollar y desplegar sitios Web confiables, interactivo, de alto rendimiento e
independientes de la plataforma.
Los Java Servlets y las tecnologías JSP son alternativas atractivas para otros tipos de
programación o script de Web dinámica. Debido a que ambas tecnologías tienen
características en común, su uso debe ser claramente definido para evitar confusiones
en el momento de elegir uno de ellos.
En la arquitectura MVC:
• El Modelo representa los datos de la aplicación junto con las reglas del negocio
que gobiernan el acceso y la modificación de los datos
• La Vista suministra el contenido del modelo. Accede a los datos desde el modelo
y especifica la forma en que los datos deben ser presentados. Cuando el modelo
cambia, es responsabilidad de la Vista mantener la consistencia en su
presentación.
• El Controlador define el comportamiento de la aplicación, interpreta las entradas
del usuario y los hace corresponder a acciones a ser realizadas por el modelo.
En aplicaciones Web, la entrada puede ser una solicitud HTTP GET o POST
desde un cliente. La acción realizada por el modelo incluye activar procesos del
negocio o cambiar el estado del modelo. El Controlador selecciona la Vista,
basándose en las acciones o solicitudes del usuario y los resultados de los
comandos del modelo, que serán presentados como parte de la respuesta a la
solicitud del usuario.
El JavaBean actúa como el modelo, dado que interactúa directamente con el Sistema
de información Empresariales (EIS). Representa los datos y las reglas del negocio
asociados con la aplicación.
El Servlet actúa como un controlador e interpreta la solicitud HTTP del cliente, a su vez
Interactúa con el JavaBean para el procesamiento. El Servlet, entonces reenvía la
solicitud al JSP. Si no debe hacerse ningún procesamiento, el Servlet reenvía la
solicitud directamente al JSP.
EL JSP actúa como la vista. Accede el dato procesado desde el modelo (JavaBean), lo
formatea y lo presenta al cliente.
A pesar de que los roles de los Servlets y JSPs están claramente definidos, existen
ciertas tareas, tales como procesar un requerimiento e interceptar solicitudes de los
usuarios donde los Servlets y los JSPs se pueden usar de forma intercambiable.
Naturalmente, esto conduce a confusiones entre los programadores. Para evitar esta
confusión, J2EE Blueprint de Sun ofrece unas cuantas guías.
De acuerdo al J2EE Blueprint, los Servlets deben usarse estrictamente como una
tecnología de extensión del servidor Web. Esto puede incluir la implementación de
componentes de controlador especializados que ofrecen servicios, tales como
autenticación y validación en la base de datos. Se deben utilizar los Servlets para la
comunicación con los Java Applets y aplicaciones dado que los JSP solamente trabajan
con datos textuales. Por lo tanto, se deben utilizar Servlets para:
• Determinar el procesamiento necesario para satisfacer la solicitud.
• Validar la entrada.
• Trabajar con objetos de negocio para acceder a los datos y realizar el
procesamiento necesario para satisfacer la solicitud.
• Controlar el flujo a través de la aplicación Web.
Sin embargo, el J2EE Blueprint recomienda utilizar los JSPs para mostrar el contenido
generado por la aplicación Web.
Ejemplo 1.1
9. <BODY>
10. <H4>Ejemplo Sencillo de JSP para mostrar Fecha
actual</H4>
11. <% java.text.DateFormat fechaCompleta =
12. java.text.DateFormat.getDateInstance(
13. java.text.DateFormat.LONG);
14. %>
15. En el Servidor la Fecha actual es:
<%=fechaCompleta.format(new java.util.Date())%>
16. </BODY>
17. </HTML>
El código JSP finaliza aquí.
En este ejemplo simple se observa que un archivo JSP se parece mucho a un archivo
HTML, con pocas etiquetas de script embebidas. Estas etiquetas contienen código Java
embebidos dentro de ellos, los cuales son responsables de generar el contenido
dinámico. Las etiquetas y el código Java incluido en este ejemplo aparecen en negrita,
con la finalidad de distinguirlos del contenido HTML estático del archivo.
3. Arquitectura JSP
Todos los servidores Web que soportan tecnología JSP deben proporcionar una
implementación JSP que este conforme con las especificaciones JSP de Sun
Microsystems. Esta implementación se denomina motor de JSP o el contenedor JSP.
Cuando la primera solicitud llega para un JSP, el JSP es trasladado a un Java Servlet.
Este Servlet resultante se invoca para manejar todas las subsiguientes solicitudes para
la página. Esto se muestra en la Figura 1.7.
La mayoría del los motores JSP toman un enfoque directo cuando traducen. Cuando
una solicitud se hace para un JSP, el motor JSP recibe una solicitud del servidor Web.
Luego el motor JSP carga el JSP del sistema de archivos y traduce el código fuente del
JSP a un Java Servlet y compila el código fuente del Servlet resultante en Java
bytecode. De allí en adelante, siempre y cuando el código fuente JSP no se modifique,
este Servlet compilado procesa cualquier solicitud del navegador para ese JSP. Si el
código fuente del JSP es modificado, automáticamente el motor JSP traduce el JSP a
un código Servlet, recompila el Servlet traducido y lo recarga para la próxima vez que
se solicite la página. Por lo tanto, el tiempo de respuesta para un JSP será alto después
de la primera invocación, es decir cuando ya ha sido traducido con relación a la primera
solicitud del cliente. La Figura 1.8 resume el proceso explicado.
Este método es similar al método service() en los Servlets y es invocado para servir
las solicitudes del cliente. El contenedor proporciona la implementación de este método
y el autor del JSP no debe implementar este método. El método _jspService() es
generado durante la traducción de la página. Cualquier expresión, scriptlets y acción
que se escriba en el JSP afecta la implementación generada del método
_jspService() de la página. Cualquier declaración JSP afecta la definición de la
clase Servlet generada.
del Servlet HttpJspBase es implementado de una forma que hace una llamada al
jspInit(). El método service() hace una llamada al _jspService() y el método
destroy() hace una llamada al método jspDestroy(). El Servlet MostrarFecha_jsp
se extiende de la clase HttpJspBase. Como el MostrarFecha.jsp no provee ninguna
implementación para los métodos jspInit() y jspDestroy(), estos dos métodos no
son implementados en el Servlet generado MostrarFecha_jsp. El método
_jspService() es implementado para generar la respuesta al cliente.
Cuando un contenedor Web recibe una solicitud para un JSP, transfiere la solicitud al
motor JSP. Si es la primera vez que el JSP ha sido requerido o si la copia compilada del
JSP no se encuentra, el motor JSP genera y compila un archivo fuente Java para el
JSP. Por defecto, la sintaxis JSP en un JSP se convierte a código Java y luego se
adiciona al método _jspService() del archivo de clase generada. Una vez que el
archivo de clase Servlet es generado, el contenedor Web crea una instancia del Servlet.
5.1.1 Inicializar
Una vez que la instancia Servlet es creada, el contenedor Web llama al método init()
del Servlet, el cual a su vez invoca al método jspInit (). Por lo tanto, el autor del
JSP debe proporcionar el código de inicialización implementando el método
jspInit(). Cuando un Servlet lanza una excepción durante la inicialización, el
contenedor debe liberar la instancia Servlet y enviarlo al recolector de basura.
5.1.3 Finalizar
Cuando el contenedor Web no necesita del Servlet o una nueva instancia del Servlet
está siendo nuevamente cargada, el contenedor Web invoca al método destroy().
Este a su vez invoca al método jspDestroy(). El contenedor Web puede también
llamar al método destroy() si el motor necesita conservar los recursos o una llamada
pendiente al método service() excede el intervalo de tiempo de espera (timeout). El
JVM ejecuta al recolector de basura después de la ejecución del método destroy() .
A partir de la discusión anterior, es claro que el uso de JSPs es más beneficioso que el
uso de ASPs, tanto para desarrolladores como para las organizaciones.
Resumen
Ahora que ha completado esta unidad, Ud. debe ser capaz de:
• Explicar la tecnología JSP y sus usos en aplicaciones empresariales basadas en
Web.
• Describir el rol de los JSPs en la arquitectura MVC.
• Discutir el uso de los JSPs y los Servlets en la construcción de aplicaciones
Web.
• Describir la arquitectura JSP.
• Explicar la jerarquía del Servlet generado.
• Explicar el ciclo de vida del JPS.
• Discutir los beneficios que proporciona el uso de la tecnología JSP.
• Discutir las diferencia entre los JSPs y los ASPs.
3) ¿En qué se traduce la página JSP, cuando llega una solicitud por primera vez para
un JSP?
a) JavaBean
b) Session Bean
c) Servlet
d) Entity Bean
8) ¿La especificación JSP es una extensión estándar definida por encima de cuál de
las siguientes APIs?
a) Interfaz de nombres y de directorio Java JNDI
b) JDBC API
c) JavaBeans API
d) Servlet API
Ejercicios de Laboratorio
1) Crear un proyecto Web que acepte como entrada de datos la fecha y mes de
nacimiento del usuario y los muestre asociado a su signo zodiacal usando páginas JSP.
2) Modifique el ejercicio anterior para que una vez que el usuario ingrese su fecha y
mes de nacimiento la página le indique su edad.
• Contenido de Plantillas: Todo lo que está en un archivo fuente del JSP que no
es un elemento JSP es clasificado como contenido plantilla. Esto incluye todos
los contenidos estáticos.
Nota: Técnicamente, las especificaciones JSP permiten que otros lenguajes diferentes
a Java se usen como un lenguaje script. Sin embargo, actualmente el lenguaje de script
debe ser Java. En el futuro también se podrán soportar otros lenguajes.
2. Objetos Implícitos
Los objetos implícitos permiten acceder al ambiente en tiempo de ejecución y están
disponibles automáticamente para su uso dentro del JSP. Muchos de los objetos
implícitos son componentes Servlet API estándar. Esta sección proporciona una visión
general de los objetos predefinidos en un JSP.
El objeto out: Es el objeto que se escribe dentro de un flujo de salida del cliente. Es
una instancia de javax.servlet.jsp.JspWriter. La clase JspWriter es la versión
‘buffered’ de la clase java.io.PrintWriter. Los métodos usuales de la clase
java.io.PrintWriter están disponibles. La única modificación es que los métodos de
la clase JspWriter lanzan java.io.IOException . El objeto out es pocas veces
referenciado directamente por un autor del JSP. El uso más común del objeto out está
dentro de un scriptlet o es pasado como un parámetro a otro método.
Objeto request: Es un objeto Servlet estándar que encapsula la solicitud del cliente
para el JSP. El objeto es una instancia de un protocolo y una subclase especifica de
implementación de la interfaz javax.servlet.ServletRequest (Para solicitudes HTTP
es javax.servlet.http.HttpServletRequest). El objeto request proporciona el
acceso a los parámetros de la solicitud, el tipo de solicitud (GET, POST, HEAD, etc.) y
las cabeceras HTTP entrantes (cookies). Este objeto tiene el alcance de la solicitud, es
decir, el objeto está disponible a lo largo de la solicitud y está disponible para páginas
incluidas o reenviadas.
Los objetos implícitos son locales al método _jspService() generado. Los Scriptlets y
expresiones que serán parte del método _jspService() tienen acceso a los objetos
implícitos. Sin embargo, las declaraciones no serán parte del método _jspService() y
no tendrán acceso a estos. Los objetos implícitos discutidos anteriormente se listan en
la siguiente tabla para una referencia rápida.
Objeto Clase
out javax.servlet.jsp.JspWriter
request javax.servlet.ServletRequest
response javax.servlet.ServletResponse
session javax.servlet.http.HttpSession
pageContext javax.servlet.jsp.PageContext
config javax.servlet.ServletConfig
page java.lang.Object
application javax.servlet.ServletContext
exception java.lang.Throwable
4. Contenido de Plantilla
Realmente el contenido de plantillas no es un elemento específico de la página JSP,
sino que representa todo contenido de la página que no sea un elemento JSP real.
Considere el código para el siguiente ejemplo HolaMundo.jsp:
Ejemplo 3.1
Ejemplo 3.2
5. Directivas JSP
Las directivas JSP se usan para enviar mensajes al motor JSP. Por ejemplo, son
empleadas para importar paquetes Java y ser usadas dentro de la página, para incluir
los archivos y acceder a las librerías de etiqueta personalizadas. El alcance de las
directivas se extiende a los archivos JSP completos y no producen ninguna salida al
cliente.
La siguiente tabla muestra las tres principales directivas que pueden ser usadas en
JSPs:
Directiva Propósito
page Controla las propiedades del JSP
o
<jsp:directive.page [attributo="valor"*] />
La siguiente tabla presenta una lista de los atributos de la directiva page y el valor por
defecto para cada atributo:
Nombre del
Atributo Descripción Valor por defecto
Ejemplo 3.3
En este ejemplo se mostrará el uso de la directiva page y el código generado para las
directivas page, durante la traducción de JSP a Servlet.
Ejemplo 3.4
Es importante notar que el motor JSP analiza el contenido del archivo Cabecera.jsp
incluido durante la traducción de Cabecera.jsp. Si el archivo Cabecera.jsp es
cambiado después de la traducción de Cabecera.jsp, los cambios no serán reflejados
cuando el Cabecera.jsp se ejecuta. El Cabecera.jsp tiene que ser recompilado
para que los cambios hechos en Cabecera.jsp se reflejen. Por consiguiente, no es
aconsejable incluir archivos cuyo contenido cambia con el tiempo, usando la directiva
include.
6. Elemento de Script
Los elementos JSP de script permiten las declaraciones de variables o métodos,
scriptlets (Código Java arbitrario) y expresiones Java a ser incluidos dentro de los JSPs.
Los tres tipos de elementos de script son:
Declaraciones JSP.
Expresiones JSP.
Scriptlets JSP.
Los siguientes ejemplos ilustran la forma de definir nuevos métodos y variables de clase
usando declaraciones JSP.
Ejemplo 3.5
En este ejemplo, se emplean las declaraciones JSP para declarar una variable y un
método de clase. Se tiene un JSP llamado MostrarFechaHora.jsp, el cual posee
métodos para obtener la fecha y hora actual y la fecha y hora cuando el JSP fue
cargado.
En el código anterior se resalta la declaración JSP. Se sabe que cada JSP es compilado
dentro de una clase Java Servlet. Las declaraciones JSP permiten declarar nuevos
miembros para la clase. En el ejemplo se declararon dos nuevas variables de clase
llamadas formateo y fechaHora, también fueron declarados tres métodos class
obtenerFechaHora(), obtenerFechaHoraActual() y aFormatoGMT(). Luego, en el
cuerpo del JSP, se referencian las nuevas funciones. A continuación, en la Figura 3.3 se
Cuando el JSP se invoca por primera vez, las variables ya llegan inicializadas. El
método obtenerFechaHora() se invoca en el cuerpo del JSP, y retorna el valor
almacenado en la variable fechaHora. Como consecuencia, para todas las solicitudes
para este JSP, se mostrará en el cliente la fecha y hora que primero fue cargado el JSP.
Este JSP también muestra la fecha y hora actual, esto se muestra en la Figura 3.2.
Ejemplo 3.6
Las expresiones en código Java son sentencias que resultan en un valor. Una expresión
JSP es una expresión Java que se evalúa en el momento de la solicitud (request-time),
convertida a un String y escrita en el flujo de salida. La sintaxis para una expresión
JSP es:
<%= expresión-java %>
o
<jsp:expression> expresión-java </jsp:expression>
Nota: La sintaxis de la expresión no termina con un punto y coma.
Ejemplo 3.7
6.4 Scriptlet
Los scriptlets, como su nombre indica, son un conjunto de sentencias escritas en Java.
Múltiples scriptlets son combinadas y colocadas en el método _jspService() del
Servlet generado. El orden en el que son colocados en el método _jspService() será
el mismo que en el JSP. Como ellos forman parte del método _jspService(), los
scriplets son procesados para cada solicitud hecha por el JSP.
Ejemplo 3.8
47. <TH>Operacion</TH>
48. <TD><%=oper%></TD>
49. </TR>
50. <TR>
51. <TH>Resultado...</TH>
52. <TD><%=resultado%></TD>
53. </TR></TABLE>
54. </BODY>
55. </HTML>
El código JSP finaliza aquí.
En esta unidad, se estudiaron las directivas JSP y elementos de script en JSPs. Antes
de concluir esta unidad, se explicará cómo incluir comentarios en JSPs.
Nota: Se deben utilizar los scriptlets con moderación. Es muy fácil extralimitarse
escribiéndolos, debe recordar que a pesar de que los scriptlets permiten escribir casi
cualquier código Java dentro de un JSP, esto no se considera un buen diseño JSP. El
objetivo principal del JSP es mantener la lógica de programación separada de la
presentación. Los JSPs pueden ser, más adelante, mantenidos por los diseñadores de
páginas web que no son programadores de Java. Puede ser confuso tener muchos
scriptlets embebidos en las páginas web. Por consiguiente, se debe concentrar el
código Java en JavaBeans y etiquetas personalizadas JSP y limitar la cantidad de
código que se escribe dentro de los scriptlets.
7. Comentarios en JSP
Se pueden colocar dos tipos de comentarios dentro de los JSPs. Estos son:
Comentarios HTML.
Comentarios JSP.
Este comentario forma una parte del contenido de la plantilla al igual que cualquier otro
contenido HTML, el motor JSP lo trata como otra pieza del contenido de la plantilla y lo
pasa inalterado al flujo de salida. El navegador reconoce los comentarios de HTML y no
muestra al cliente el contenido encerrado dentro del comentario.
El motor JSP reconoce el comentario JSP y los ignora durante la traducción. Por lo
tanto, estos comentarios no aparecen en los Servlets generados. El usuario nunca verá
el comentario, ni sabrá de su existencia.
Resumen
Ahora que ha completado esta unidad, Ud. debe ser capaz de:
• Describir los diferentes tipos de elementos JSP.
• Discutir los distintos objetos implícitos definidos en JSP.
• Discutir las reglas que son aplicables a todos los JSPs.
• Explicar el contenido de las plantillas.
• Discutir la directiva page.
• Explicar cómo incluir otros archivos dentro de los JSPs utilizando la directiva
include.
• Discutir cómo declarar variables y funciones en JSPs.
• Describir el proceso de escribir expresiones JSP y scriptlets.
• Explicar cómo usar comentarios dentro de los JSPs.
2) La especificación JSP permite que otros lenguajes diferentes a Java se usen como
lenguaje de script para JSP.
a) Verdadero
b) Falso
3) ¿Cuáles son las funciones para las que se utilizan las declaraciones en JSP?
a) Para definir variables de clase
b) Para cambiar flujo de salida
c) Para sobrescribir los métodos de la clase base
d) Para escribir nuevos métodos
10) ¿Cuáles de las siguientes sentencias son verdaderas con respecto a los comentarios
JSP?
a) El motor JSP reconoce los comentarios JSP y los ignora durante la traducción.
b) Son parte del contenido plantilla
c) No aparecen en los Servlets generados
d) Son llamados comentarios invisibles
Ejercicios de Laboratorio
1) Crear una aplicación web que le permita al usuario ingresar a la aplicación y le
muestre un mensaje de bienvenida.
2) Crear una aplicación web que genere un número aleatorio en el rango del 1 al 100 e
invite al usuario a adivinar el número generado.
2) Crear una aplicación web que permita al usuario ingresar (login) y le muestre una
predicción interesante.
La especificación JSP enumera algunas etiquetas de acción estándar, que todos los
motores JSP deben soportar independientemente de la implementación. Las etiquetas
de acción estándar son etiquetas basadas en XML, que los autores de páginas pueden
usar para incluir archivos, reutilizar los componentes JavaBean y reenviar las solicitudes
a otros componentes web. Estas etiquetas no tienen una sintaxis equivalente a <%.
Cuando el motor JSP encuentra una etiqueta de acción estándar durante la traducción
de un JSP en un Servlet, lo reemplaza con código Java que proporciona la
implementación de la funcionalidad soportada por la etiqueta. Por lo tanto, las etiquetas
de acción estándar afectan el comportamiento en tiempo de ejecución del JSP, así
como también la respuesta enviada al cliente.
La siguiente tabla muestra una lista de etiquetas de acción estándar asociadas con los
JavaBeans que trabajan conjuntamente para lograr esto:
Etiquetas de Acción
Descripción
Estándar
<jsp:useBean>
Prepara un bean para ser usado dentro del
JSP
<jsp:getProperty>
Muestra la salida del valor de la propiedad
bean como un string.
La etiqueta de acción estándar <jsp:useBean> se puede usar para crear una nueva
instancia bean y asignarlo a una variable. También puede usarse para localizar la
instancia bean que ya se ha creado. Cuando la etiqueta se usa en el código, primero
intenta localizar si la instancia bean existe, si no lo encuentra, entonces crea una nueva
instancia bean y le asigna una variable a éste.
La Tabla 5.2 muestra una lista de todos los atributos válidos del <jsp:useBean> junto
con sus descripciones.
Atributo Descripción
id
Nombre de la variable que contendrá la instancia del
bean.
scope
El alcance de disponibilidad de la instancia del
bean.Indica el contexto en el que el bean debería estar
disponible. Hay cuatro posibles valores: page (por
defecto), request, session y application. Especificación
del Bean
class
Nombre de la clase bean (debería ser un nombre de clase
completamente calificado).
beanName
El nombre del bean debe ser especificado en el formato
que debe pasarse al método instantiate () de la clase
java.beans.Beans. El beanName puede ser un una
expresión JSP, cuyo valor es calculado al momento de la
solicitud (request time).
type
El tipo usado por el bean dentro de la página. El tipo debe
ser uno de los siguientes:
La clase bean.
El alcance dentro del cual la instancia bean debe estar disponible es definido usando el
atributo scope (alcance). Una vez que el bean se ha instanciado, se encontrará
disponible en el alcance definido y asociado con el id especificado.
scope Duración
page
El objeto estará disponible sólo dentro de la definición
de la página JSP y será creado nuevamente para
cada nueva solicitud. Es un valor por defecto para el
atributo scope.
request
El objeto estará disponible a través de una solicitud
particular y está disponible para páginas incluidas o
reenviadas.
session
El objeto será asociado con la sesión responsable de
su creación y estará disponible por el ciclo de vida de
la sesión.
application
El objeto, es común para todas las sesiones, está
disponible hasta que la aplicación Web finalice.
2.1.1 Semántica
Cuando el motor JSP encuentra una etiqueta <jsp:useBean> durante la traducción de
un JSP, éste reemplaza la etiqueta con el correspondiente código Java. La Figura 5.1
muestra un flujograma que describe la lógica del código reemplazado.
Figura 5.1: Flujograma que Describe la Semántica del Código Generado por
<jsp:useBean>
En el caso que el contenedor no haya podido localizar la instancia bean, intenta crear
una instancia bean. Primero verifica si la clase atributo está especificada. Si es así,
entonces se crea una instancia del bean, en caso contrario, verifica si el tipo está
especificado y convierte la instancia (cast) a ese tipo y lo asigna a la variable creada.
Atributo Descripción
name
El nombre de la instancia bean cuya propiedad tiene que ser
establecida (Este nombreBean debe estar ya definido por una
etiqueta <jsp:useBean>)
property
Nombre de la propiedad bean cuyo valor tiene que ser establecida
param
Nombre del parámetro de la solicitud cuyo valor tiene que ser
asignado a una propiedad bean deficiente.
value
Valor que tiene que ser asignado a la propiedad bean.
propertyExpression Descripción
property=" * "
Establece las propiedades del bean, para el cual
existen parámetros de la solicitud HTTP con el
mismo nombre. Esto es probablemente la forma
más usada de <jsp:setProperty> y se usa en
conjunción con una forma HTTP.
property="nombrePropiedad"
Establece la propiedad del bean, con el valor del
parámetro de la solicitud http, el cual tiene el
mismo nombre que la propiedad.
property="nombrePropiedad"
param="nombreParametro" Establece la propiedad especificada al valor del
parámetro de la solicitud especificado.
property="nombrePropiedad”
value="valorPropiedad" Establece la propiedad especificada al valor del
string especificado. El valor puede ser una
expresión JSP, la cual se calcula al momento de
la solicitud. Tal expresión debe usar la sintaxis
<%.
Cuando las propiedades son asignadas desde una constante de string o valores de
parámetro de solicitudes, se aplican métodos de conversión Java estándar. Por
ejemplo, si la propiedad del bean es del tipo integer y el valor asignado es un String, se
usa el método java.lang.Integer.valueOf(String) para realizar la conversión.
Para propiedades indexadas, el valor asignado debe ser un arreglo.
Atributo Descripción
name
El nombre de la instancia bean, cuya propiedad tiene que ser accedida
(El nombre bean debe estar ya definido por la etiqueta <jsp:useBean> )
property Nombre de la propiedad del bean cuyo valor tiene que ser accedido
Tabla 5.6: Atributos de la Etiqueta <jsp:getProperty>
Ejemplo 5.1
El siguiente ejemplo se usa para ilustrar el uso de las etiquetas de Acción estándar
<jsp:useBean>, <jsp:setProperty> y <jsp:getProperty> en JSP.
En la Unidad 3 - Etiquetas JSP, se analizó el ejemplo de una simple calculadora binaria.
La lógica para realizar el cálculo estaba concentrada en Resultado.jsp usando scriptlets.
Sin embargo, como uno de los principales objetivos de JSP es separar la lógica de la
presentación, se debe asegurar que el JSP no esté concentrado con código Java. En
esta sección, se reconstruirá la misma calculadora usando un CalculadorBean para la
lógica del negocio. Por lo tanto, la lógica del negocio será movida del JSP al JavaBean.
A continuación se muestra el código fuente para el Calculador.html.
6. public CalculadorBean() {
7. super();
8. }
9. public String getSol() {
10. int op1 = 0;
11. int op2 = 0;
12. int solucion = 0;
13. if ((getOpe1() != null) &&
14. (getOpe1().trim().length() != 0))
15. op1 = Integer.parseInt(getOpe1());
16. if ((getOpe2() != null) &&
17. (getOpe2().trim().length() != 0))
18. op2 = Integer.parseInt(getOpe2());
19. if (getOperacion().equals("Adicion")) {
20. solucion = op1 + op2;
21. } else if
(getOperacion().equals("Sustracción")) {
22. solucion = op1 - op2;
23. } else if
(getOperacion().equals("Multiplicacion")) {
24. solucion = op1 * op2;
25. } else if
(getOperacion().equals("Division")) {
26. solucion = op1 / op2;
27. } else if (getOperacion().equals("Modulo"))
{
28. solucion = op1 % op2;
29. }
30. return new Integer(solucion).toString();
31. }
32. public String getOpe1() {
33. return ope1;
34. }
35. public String getOpe2() {
36. return ope2;
37. }
38. public String getOperacion() {
39. return operacion;
40. }
41. public void setOpe1(String string) {
42. ope1 = string;
43. }
44. public void setOpe2(String string) {
45. ope2 = string;
46. }
47. public void setOperacion(String string) {
48. operacion = string;
49. }
50. public void setSol(String string) {
51. sol = string;
52. }
53. }
El código Java finaliza aquí
Tabla 5.7: Etiquetas de Acción Estándar Usadas para la Inclusión y Reenvío en Tiempo de
Ejecución
Una página incluida tiene acceso al objeto JspWriter (objeto de salida implícita), pero
no puede establecer cookies ni cabeceras. Si se intenta algo de esto se lanzará una
excepción.
Atributo Descripción
page URL del recurso a ser incluido
Ejemplo 5.2
Nota: La directiva include se debe usar si el recurso que se incluye cambiará con poca
frecuencia, de no ser así, se debe utilizar la etiqueta de acción estándar
<jsp:include>.
Ejemplo 5.3
Resumen
Ahora que ha completado esta unidad, Ud. debe ser capaz de:
• Explicar las etiquetas de acción estándar y sus tipos.
• Describir cómo las etiquetas de acción estándar <jsp:useBean>,
<jsp:setProperty> y <jsp:getProperty> trabajan con los JavaBeans.
• Explicar cómo los componentes web se pueden incluir y reenviar usando
etiquetas de acción estándar <jsp:include> y <jsp:forward>.
• Describir cómo pasar los parámetros al recurso referenciado <jsp:include> y
<jsp:forward> usando las etiquetas de Acción estándar <jsp:param>.
2) ¿Cuáles de las siguientes alternativas son valores válidos que pueden ser asignados
al atributo scope de la etiqueta de acción estándar <jsp:useBean>?
a) page
b) session
c) response
d) request
Ejercicios de Laboratorio
1) Crear una aplicación web, que acepte del usuario los detalles de un estudiante y
establezca las propiedades correspondientes del EstudianteBean. Las propiedades
establecidas en el EstudianteBean se deben recuperar y mostrar al usuario en un
formato tabular.
2) Crear los componentes web que se requieren para procesar las validaciones del
usuario.
2) Crear los componentes web que se requieran para verificar si un determinado libro
está disponible en la librería o no.
Para entender cómo las etiquetas personalizadas logran hacer esto, primero se
explicará cómo las etiquetas de acción estándar han mejorado la funcionalidad del JSP.
Considere la etiqueta de acción estándar <jsp:useBean>, que está definida por la
especificación JSP, cuando el motor del JSP encuentra una etiqueta <jsp:useBean>, lo
reemplaza con el código Java correspondiente a la etiqueta, lo cual ocurre durante la
traducción del JSP. Considere los siguientes ejemplos:
<jsp:useBean id="calculadora" scope="page" class="CalculadorBean">
</jsp:useBean>
pageContext.getAttribute("calculadora",PageContext.PAGE_SC
OPE);
if (calculadora == null) {
_jspx_specialcalculadora = true;
try {
calculadora = (volumen3.unidad5.ejemplo1.CalculadorBean)
java.beans.Beans.instantiate(this.getClass().getClassLoade
r(), "volumen3.unidad5.ejemplo1.CalculadorBean");
} catch (ClassNotFoundException exc) {
throw new
InstantiationException(exc.getMessage());
Ejemplo 7.1
3.1 Crear una etiqueta JSP que utiliza la Etiqueta Estilo <simple:saludo>
El siguiente código muestra el código fuente de Simple.jsp
El código JSP comienza aquí…
1. <%@ page import="java.util.*"%>
2. <%@ taglib uri="/CustomTags" prefix="simple" %>
3. <HTML>
4. <HEAD><TITLE>Ejemplo de un Simple Custom
Tag</TITLE></HEAD>
5. <BODY>
6. <%Calendar calendario = Calendar.getInstance();
7. int hr = calendario.get(Calendar.HOUR_OF_DAY);
8. int min=calendario.get(Calendar.MINUTE);
9. int seg=calendario.get(Calendar.SECOND);
10. %>
11. <FONT size="5" color="#0065CE">
12. <simple:saludo/>
13. La Hora es: <%=hr%>:<%=min%>:<%=seg%>
14. </FONT>
15. </BODY>
16. </HTML>
El código JSP finaliza aquí.
Una vez usada una etiqueta personalizada en el JSP, se le indica al motor del JSP que
debe hacer si encuentra una <simple:saludo> durante la traducción de
Simple.jsp. Por lo tanto, el siguiente paso es escribir la etiqueta de clase handler,
cuyos métodos serán invocados por el motor del JSP cuando encuentre
<simple:saludo>. Esta clase debe implementar la interfaz
javax.servlet.jsp.tagext.Tag. Se puede lograr esto extendiendo la clase
javax.servlet.jsp.tagext.TagSupport, la cual a su vez implementa la interfaz
javax.servlet.jsp.tagext.Tag. A continuación se muestra el código fuente para
la etiqueta de clase handler SaludoTagHandler.java
1. package volumen3.unidad7.ejemplo1;
2. import javax.servlet.jsp.*;
3. import java.util.*;
4. import java.io.*;
5. import javax.servlet.jsp.tagext.TagSupport;
6.
7. public class SaludoTagHandler extends TagSupport {
8. public int doStartTag() throws JspTagException {
9. return EVAL_BODY_INCLUDE;
10. }
11. public int doEndTag() throws JspTagException {
12. Calendar calendario =
Calendar.getInstance();
13. int hr =
calendario.get(Calendar.HOUR_OF_DAY);
14. try {
15. if (hr < 12)
16. pageContext.getOut().write("Buenos Dias.");
17. else
18. if (hr < 19)
19. pageContext.getOut().write("Buenas
Tardes.");
20. else
21. pageContext.getOut().write("Buenas
Noches.");
22. } catch (IOException ex) {
23. throw new JspTagException("Fatal
error:Etiqueta saludo no puede ser escrita en bufer de
salida");
24. }
25. return EVAL_PAGE;
26. }
27. }
El código Java finaliza aquí.
<!ELEMENT
taglib(tlibversion,jspversion?,shortname,uri?,info?,tag+)>
La siguiente tabla explica cada elemento del DTD presentado anteriormente:
teiclass: Este elemento define información extra de la clase usada por la etiqueta. La
clase extra info debe ser una subclase de la clase
javax.servlet.jsp.tagext.TagExtraInfo. Este es un elemento opcional y no es
aplicable para el ejemplo dado.
bodycontent: El texto del elemento especificado para este elemento puede ser
tagdependent, JSP o empty. Si el texto es tagdependent, implica que la etiqueta
handler se encargará de éste. Si el texto es JSP, el motor de JSP evaluará el contenido
en tiempo de ejecución. En el ejemplo anterior, no se requiere que ningún bodycontent
sea especificado para la etiqueta. De este modo, se ha especificado el texto como
empty. Este elemento es opcional y el texto del elemento por defecto para este es JSP.
info: Es un elemento opcional, es una cadena que describe que la etiqueta se pasa
como texto del elemento para este elemento.
attributes: Una etiqueta elemento puede tener cualquier número de atributos. Este
elemento tiene un número de sub-elementos y se considera opcional, por eso, no es
relevante para el ejemplo. Se explicará más a detalle acerca de este elemento en las
siguientes secciones de esta unidad.
2. <web-app id="WebApp">
3. <display-name>CustomTags</display-name>
4. …
5. <taglib>
6. <taglib-uri>/CustomTags</taglib-uri>
7. <taglib-location>/WEB-
INF/tlds/saludo.tld</taglib-
8. location>
9. </taglib>
10. </web-app>
El código XML finaliza aquí.
volumen3/
unidad7/
ejemplo1/
SaludoTagHandler.class
tlds/
saludo.tld
El comando que se muestra a continuación, dado en la línea de comando en cualquier
ambiente de desarrollo Java, puede crear el archivo WAR. Una vez creado, se puede
importar el archivo WAR dentro de cualquier servidor web, que tenga un JSP 1.1 y
cumpla con el motor JSP. De esta manera, la aplicación estará lista para ejecutarla.
jar –cvf saludo.war WEB-INF/classes/volumen3/unidad7/ejemplo1/
SaludoTagHandler.class WEB-INF/tlds/saludo.tld WEB-INF/web.xml
Simple.jsp
Nota: En RAD, un proyecto web tiene que ser creado y agregado al Simple.jsp en la
carpeta webApplication. El archivo de la clase Java SaludoTagHandler.java tiene
que ser adicionado en la carpeta fuente. Se tiene que crear una carpeta tlds bajo la
carpeta WEB-INF y se tiene que añadir el saludo.tld a la carpeta tlds. Por otra parte,
es necesario modificar el archivo web.xml para agregar al elemento<taglib> como
se muestra en el código de la sección Actualizar el web.xml Ahora el código está listo
para su ejecución.
Figura 7.3: Jerarquía de Interfaces y Clases en la Especificación JSP 1.2 para Tag
Handler
Durante la traducción del JSP, cuando el motor del JSP encuentra una etiqueta
personalizada, ubica al archivo TLD para localizar la clase manejadora de la etiqueta
(tag handler) e interactúa con él utilizando el método callback definido en la interfaz Tag.
Existen dos métodos principales dentro de la interfaz Tag: doStartTag() y doEndTag(),
Una vez que todas las propiedades de una etiqueta personalizada han sido inicializadas
(pageContent, parent y atributos) los métodos pueden ser invocados en la clase
manejadora.
La siguiente figura proporciona una ilustración de las semánticas del código generado.
También ilustrará la secuencia en la cual los métodos callback de la interfaz son
invocados (implementada por la clase tag handler).
Una vez que el motor del JSP encuentra una etiqueta personalizada, intenta obtener
una instancia del tag handler (La mayoría de los motores del JSP no instanciarán un
nuevo handler cada vez que se encuentre una etiqueta, en lugar de eso mantendrá un
grupo (pool) de instancias handler). Después que el motor JSP obtiene una instancia del
la clase tag handler, lo inicializará llamando al método setPageContext(PageContext)
y establecerá la propiedad pageContext en el tag handler. El pageContext del JSP
actual estará entonces disponible para la clase handler de la etiqueta.
El motor JSP invocará al método setParent() para establecer la propiedad parent del
tag handler. Si una etiqueta no contiene ninguna sub-etiqueta, entonces la propiedad
parent se establecerá como null.
Aparte de retornar el valor del método doEndTag(), el motor del JSP invocará al método
release(), antes de liberar la instancia handler. Cualquier recurso adquirido por el
handler puede ser liberado en este método. En la Figura 7.5 se muestra los valores que
pueden retornar los métodos callback doStartTag() y doEndTag().
Ejemplo 7.2
Este código JSP es similar al Simple.jsp que se construyó anteriormente, excepto que
usa una etiqueta personalizada <simple:saludoAtributo> la cual toma un atributo
nombre y muestra el saludo de bienvenida con el usuario. Este contenido del cuerpo de
la etiqueta personalizada será mostrado por el motor del JSP como cualquier otro
contenido JSP.
Cuando se escribe el tag handler para la etiqueta personalizada con atributo, se tendrá
que incluir una propiedad para cada atributo que se planee utilizar en la etiqueta
personalizada y proporcionar getter y setter para las propiedades. El nombre de la
propiedad debe coincidir exactamente con el nombre del atributo usado en la etiqueta
personalizada. En este ejemplo, la etiqueta personalizada
<simple:saludoAtributo> toma solamente un nombre de atributo. Por lo tanto, se
tiene que incluir una propiedad en la clase tag handler. El código fuente para el tag
handler se muestra a continuación:
28. </attribute>
29. </tag>
30. </taglib>
El código XML finaliza aquí
<!ELEMENT attribute(name,required?,rtexprvalue?)>
rtexprvalue: Si se quiere que el valor para el atributo sea dado como resultado de
una expresión JSP, el elemento texto especificado para este elemento debe ser
verdadero. Por ejemplo, es posible dar expresiones como valor para atributos como se
planteó en el AtributoSimple.jsp <simple:saludoAtributo nombre=
"<%=usuario%>"/>. Permitir que los atributos tomen valores de expresiones puede ser
útil como en el caso del ejemplo anterior, donde el nombre del usuario tiene que ser
pasado dinámicamente en tiempo de ejecución para la clase tag handler. Si se requiere
permitir solamente cadenas fijas como valor para el atributo, entonces el texto del
elemento especificado para este elemento debe ser falso. Este elemento es un
elemento opcional y el texto del elemento por defecto es falso.
Para cada atributo que se defina en la etiqueta personalizada, tiene una entrada
correspondiente en el TLD. La etiqueta <attribute> está anidada dentro del elemento
de la etiqueta. Debido a que la etiqueta <simple:saludoAtributo> toma un contenido
del cuerpo la misma, y se necesita que sea mostrada en forma automática por el motor
del JSP, como cualquier contenido JSP, se especifica el elemento texto JSP para el
elemento <bodycontent> como se observó en el código anterior.
En el ejemplo anterior, el nombre del atributo es definido para que sea de tipo String
en la clase handler. Sin embargo, se pueden tener atributos, los cuales se hacen
corresponder con propiedades de otros tipos diferentes a String en la clase handler.
Por ejemplo, en la etiquetas personalizadas <simple:format font=”Arial”
size=”11” />, el atributo size en la clase handler puede ser definido como tipo int .
En tales situaciones, el motor JSP intentará convertir el valor del atributo para el tipo de
propiedad correspondiente en la clase handler, antes de que invoque al correspondiente
método setter. En este caso, el String “11” será convertido a int. Si la conversión
falla, una excepción será lanzada y el JSP que contiene la etiqueta la manejará.
La interfaz BodyTag define el método callback extra para trabajar con el contenido del
cuerpo. Los métodos importantes de la interfaz BodyTag son:
public void setBodyContent(BodyContent b)
Este método asigna la propiedad bodyContent. Este método es invocado al menos una
vez y antes del método doInitBody() cuando el método doStartTag() retorna
BodyTag.EVAL_BODY_BUFFERED. Mientras que, no será invocado para etiquetas vacías
o para etiquetas “no vacías” que en el método doStartTag() retorna Tag.SKIP_BODY o
Tag.EVAL_BODY_INCLUDE.
public void doInitBody()throws JspException
Este método prepara la evaluación del cuerpo de la etiqueta, este es invocado después
de los métodos doStartTag() y setBodyContent() y antes de que el cuerpo sea
evaluado por primera vez. Además este método no será invocado para etiquetas vacías
o para etiquetas “no vacías” que en el método doStartTag() retorna Tag.SKIP_BODY o
Tag.EVAL_BODY_INCLUDE. En este método puede ser incluido el código para que
cualquier inicialización que deba hacerse antes de que el contenido del cuerpo de la
etiqueta sea evaluado, efectivamente se haga.
está también disponible para los desarrolladores quienes extienden sus clases desde
esta super clase.
Ejemplo 7.3
4. <HEAD>
5. <TITLE>Ejemplo simple Custom Tag</TITLE>
6. </HEAD>
7. <BODY>
8. <%Calendar calendario = Calendar.getInstance();
9. int hr =
calendario.get(Calendar.HOUR_OF_DAY);
10. int min = calendario.get(Calendar.MINUTE);
11. int seg = calendario.get(Calendar.SECOND);
12. %>
13. <FONT size="5" color="#0065CE">
14. <simple:saludoBodyTag>
15. <%=hr%>:<%=min%>:<%=seg%>
16. </simple:saludoBodyTag>
17. </FONT>
18. </BODY>
19. </HTML>
El código JSP finaliza aquí.
13. try {
14. if (bc != null) {
15. System.out.println("tamaño del buffer
"+ bc.getBufferSize());
16. String out = bc.getString();
17. System.out.println("String del body:
"+
18. out.toString());
19. StringTokenizer st = new
20. StringTokenizer(out, ":");
21. int hr =
Integer.parseInt(st.nextToken().trim());
22. int min = Integer.parseInt(
23. st.nextToken().trim());
24. int seg = Integer.parseInt(
25. st.nextToken().trim());
26. DateFormat df =
DateFormat.getTimeInstance(3);
27. if (hr < 12)
28.
bc.getEnclosingWriter().write("Buenos Dias,
29. es "+ df.format(new GregorianCalendar(
30. 2002, 9, 9, hr, min, seg).getTime()));
31. else if (hr < 19)
32.
bc.getEnclosingWriter().write("Buenas Tardes
33. es " + df.format(new
GregorianCalendar(2002, 9, 9, hr, min,
34. seg).getTime()));
35. else
36. bc.getEnclosingWriter().write("Buenas Noches, es"+
df.format(new GregorianCalendar( 2002, 9,
37. 9, hr, min, seg).getTime()));
38. }
39. } catch (IOException ex) {
40. throw new JspTagException("Fatal
error:La etiqueta saludo no puede escribiren el fujo de
salida");
41. }
12. <tagclass>
13. volumen3.unidad7.ejemplo1.SaludoTagHandler
14. </tagclass>
15. <bodycontent>empty</bodycontent>
16. <info>Etiqueta simple que despliega
saludos</info>
17. </tag>
18. <tag>
19. <name>saludoAtributo</name>
20. <tagclass>
21. volumen3.unidad7.ejemplo2.
22. SaludoAtributoTagHandler
23. </tagclass>
24. <bodycontent>JSP</bodycontent>
25. <info>Etiquetas Simples con atributos</info>
26. <attribute>
27. <name>nombre</name>
28. <required>true</required>
29. <rtexprvalue>true</rtexprvalue>
30. </attribute>
31. </tag>
32. <tag>
33. <name>saludoBodyTag</name>
34. <tagclass>
35.
volumen3.unidad7.ejemplo3.SaludoBodyTagHandler
36. </tagclass>
37. <bodycontent>JSP</bodycontent>
38. <info>Etiquetas simples con atributos</info>
39. </tag>
40. </taglib>
EL código XML finaliza aquí.
Resumen
Ahora que ha completado esta unidad, Ud. debe ser capaz de:
• Explicar la necesidad de las etiquetas personalizadas.
• Discutir acerca de los componentes de una etiqueta personalizada.
• Explicar cómo escribir etiquetas personalizadas simples y etiquetas
personalizadas que toman atributos.
• Describir cómo manipular el contenido del cuerpo de etiquetas personalizadas.
Libro 2: Java Empresarial Unidad 8: Lab. Escribir Etiquetas JSPs Personalizadas 125
Ejercicios de Laboratorio
1) Crear una librería de etiquetas, la cual proporcionará etiquetas personalizadas para
obtener una conexión a la base de datos, insertar y eliminar registros de una tabla y
mostrar el contenido de la misma.
Nombre Formato
Unidad 8: Lab. Escribir Etiquetas JSPs Personalizadas Libro 2: Java Empresarial 126