Introduccion A La Programacion Web Con Java
Introduccion A La Programacion Web Con Java
Introducción
Introducción a la
a laaprogramación
Programación Web con
la Programación
Java: JSP y Servlets,
WebWeb
JavaServer Faces
Java:
con
JSPJava:
Dra. María del Carmen Gómez Fuentes
y Servlets,
Rocío Abascal... Dr. Jorge Cervantes Ojeda
JSP y JavaServer
Servlets, JavaServer
Faces Dra.Faces
Ma. del Dra.
Carmen
María
Gómez
del Carmen
Fuentes
yyDr.
Dr.Jorge
JorgeCervantes
Cervantes
Esta obra fue dictaminada positivamente por pares académicos mediante el sistema doble ciego
y evaluada para su publicación por el Consejo Editorial de la UAM Unidad Cuajimalpa.
ISBN: 978-607-28-1069-3
Ninguna parte de esta obra puede ser reproducida o transmitida mediante ningún sistema
o método electrónico o mecánico sin el consentimiento por escrito de los titulares de los
derechos.
Introducción a la
Programación Web
con Java:
JSP y Servlets,
JavaServer Faces
UNIVERSIDAD AUTÓNOMA METROPOLITANA
INTRODUCCIÓN 11
OBJETIVOS 17
2. INTRODUCCIÓN AL HTML 29
2.1 Objetivos 29
2.2 Estructura de una página HTML 29
2.3 Desplegando una página HTML 30
2.4 Principales Tags de HTML 31
2.4.1 Tags para campos de texto 32
2.4.2 Tags para hacer una tabla 33
2.4.3 Tags para incluir una imagen 35
2.5 Formularios 36
2.5.1 Tags del formulario 37
2.5.2 El tag <input> dentro de un formulario 37
2.5.3 Los controles del formulario 38
2.6 Prácticas 46
2.6.1 Práctica 46
2.6.2 Práctica 46
2.6.3 Solución 47
BIBLIOGRAFÍA 246
Introducción
Construir una primera aplicación web con acceso a base de datos, requiere de un gran esfuer-
zo por parte del estudiante, ya que debe poner en práctica varios conocimientos, y también
adquirir otros más. Tomando en cuenta que las aplicaciones web se pueden construir con
diversos lenguajes y tecnologías, es difícil para un principiante elegir el libro o la secuencia
de libros que debe usar para iniciar su aprendizaje. En este material hemos seleccionado el
lenguaje Java, y la justificación de esta elección se expone en una de las siguientes secciones.
Elegimos también las tecnologías JSP-Servlets y JavaServer Faces, que, en nuestra opinión,
facilitan el proceso de enseñanza aprendizaje. Además, JavaServer Faces es uno de los fra-
meworks más utilizados actualmente en la industria del software. La primera parte de este
curso abarca la implementación del patrón de diseño Modelo-Vista-Controlador con JSPs,
Servlets y clases Java; y en la segunda parte se estudia la elaboración de aplicaciones Web
usando el Framework JavaServer Faces.
Experimentar con la aplicación le permite darse cuenta de cómo es que algo funciona o puede
fallar, lo cual ayuda a una mejor comprensión de los nuevos conceptos adquiridos.
Gómez M. C., Custodio I., Cervantes J. Sistema de Enseñanza de Aplicaciones Web (SEAWeb). XXVIII Congreso
1
Nacional y XIV Congreso Internacional de Informática y Computación del ANIEI (CNCIIC-ANIEI 2015), 28 al 30
de Octubre 2015 Puerto Vallarta Jalisco, pp. 332-239.
12 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Incluimos dentro del código de este libro cajas con aclaraciones. Éstas contienen explicaciones
adicionales en los lugares clave, las cuales ayudan a enfatizar los nuevos conocimientos que ya
han sido expuestos en forma de texto.
Hemos observado que los tutoriales disponibles en Internet abarcan desde la introducción
a la programación web, hasta los temas más avanzados. La buena voluntad de los autores de
proporcionar la mayor cantidad de información posible en un solo documento, hace que se
vea mermada la profundidad con la que se abordan los temas, de tal forma que quedan varios
cabos sueltos. Hay temas sencillos que mientras para un experto son triviales, a un princi-
piante le puede llevar varias horas encontrar en internet. Existen foros para programadores,
“Stack overflow”, por ejemplo, es uno de los más importantes. Sin embargo, no siempre es fácil
encontrar las respuestas. Es necesario preguntar, en inglés, una y otra vez, de diferentes ma-
neras, hasta encontrar por fín la información requerida. En este curso tratamos de minimizar
la cantidad de cabos sueltos. En los ejemplos se explica paso a paso, como se construye una
aplicación, sin dar por hecho que ya se sabe algo que no se ha dicho, como sucede en la gran
mayoría de tutoriales disponibles en internet. Y como una ayuda adicional para el principian-
te, mencionamos e ilustramos algunos de los errores más comunes.
SEAWeb 1: http://148.206.168.124:8080/seaweb/
SEAWeb 2: http://148.206.168.124:8080/Sea_Web_2/
Nuestro objetivo es que este libro de texto y su complemento, el sistema de enseñanza SEAWeb,
sean útiles no sólo para alumnos y profesores de la UAM-C, sino para todos aquellos que de-
seen aprender los principios de la programación web con Java.
ÍNDICE
Las aplicaciones web son muy útiles en la vida moderna. Se utilizan constantemente en las
computadoras y en los dispositivos móviles para llevar a cabo diversos tipos de negocios y
para acceder a una gran variedad de servicios. Es por esto que la industria del software nece-
sita desarrolladores web y ofrece empleos relativamente bien remunerados. Por lo tanto, hay
un gran interés entre los que eligieron profesiones relacionadas con la informática, por apren-
der a elaborar y mantener aplicaciones web. Sin embargo, el aprendizaje de este tema es un
proceso complejo, porque el estudiante debe integrar y poner en práctica los conocimientos
adquiridos recientemente en su carrera y además adquirir otros más.
Los conocimientos y habilidades necesarios para construir una aplicación web son muy varia-
dos, por ejemplo, se requiere: programación orientada a objetos, lenguaje HTML, páginas JSP,
Servlets, JavaBeans, JavaScript, EL, JSTL, bases de datos, nociones de sistemas concurrentes,
etc. Algunos de estos temas son muy extensos, y hay cursos para estudiar cada uno de ellos
por separado. Este libro integra los conceptos básicos necesarios para construir una aplica-
ción web con lenguaje Java. Los temas se exponen a un nivel introductorio, pero de manera
detallada, y se promueve la adquisición de las habilidades requeridas mediante las prácticas
propuestas. El alumno puede operar la práctica antes de resolverla y entender mejor su fun-
cionamiento mediante el sistema de enseñanza SEAWeb.
ÍNDICE
Los proyectos terminales que tienen como objetivo el desarrollo de aplicaciones Web con Java,
brindan a los alumnos la oportunidad de aprender, por su cuenta, esta importante tecnología.
Sin embargo, la cantidad de información en librerías, bibliotecas e internet es abrumadora-
mente grande. Para tener una idea, si usamos como clave de búsqueda en Google: “learn Java
web application development”, se despliegan cerca de tres millones de resultados de material
en inglés, y con “how to develop Java web application” 109 millones. Del material en español,
16 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
tenemos que con la clave “como desarrollar aplicaciones web con java” aparecen 780 mil resul-
tados. Tal cantidad de información suele desorientar aún más al principiante, ya que no hay
un criterio que permita elegir cuál es el material más apropiado para comenzar, ni la calidad
del mismo. Además, muchos de estos materiales no son gratuitos. Por todo lo anterior, es difí-
cil para un principiante elegir el libro, la secuencia de libros o sitios de internet que debe con-
sultar para iniciar su aprendizaje. Este libro de texto junto con el Sistema SEAWeb, integran la
teoría con la práctica para la creación de aplicaciones web con Servlets, JSP y JavaServer Faces,
proporcionando una guía efectiva para el autoaprendizaje.
Agradecemos a los alumnos: Josué Alan Aguilar Ramírez, Fiordalizo Michel Lira Gómez
(2016-I, 2016-O), Irvin Osvaldo Custodio Sánchez (2014-I, 2014-P, 2014-O), Iván Rosales So-
riano y Javier Martínez Hernández (2014-P, 2014-O, 2015-I), quienes demostraron con su
dedicación la efectividad del autoaprendizaje con SEAWeb.
ÍNDICE
Objetivos
Objetivo General:
Objetivos Específicos:
Conocimientos previos:
Para poder comprender este curso, es necesario que el lector tenga conocimientos básicos de
programación orientada a objetos, de Java y de bases de datos.
ÍNDICE
1.1 Objetivo
El término Web proviene del inglés, y significa red o malla, este término ha sido adoptado
para referirse al internet. Una aplicación Web es un conjunto de páginas que funcionan en
internet, estas páginas son las que el usuario ve a través de un navegador de internet (Inter-
net Explorer de Microsoft, Chrome, Mozilla Firefox, etc.) y están codificadas en un lenguaje
especial. Existen varios tipos de páginas Web: HTML, JSPs, XML… En la primera parte de
este curso trabajaremos con las JavaServer Pages (JSPs). Las páginas JSP se ejecutan en una
máquina virtual de Java, el resultado de la ejecución es código HTML listo para correr en el
navegador. Las JSP constituyen la interfaz de la aplicación con el usuario.
Las aplicaciones Web se almacenan en un servidor, el cual es una computadora que se en-
carga de que éstas sean accesibles a través de internet. Como se ilustra en la Figura I-1, una
aplicación Web corre en un servidor bajo el control de un software especial, al cual se le llama
también servidor. Para evitar confusiones es importante aclarar que el software servidor corre
en una computadora servidor.
Figura I-1. Una aplicación web funciona con una computadora-servidor y una
o varias computadoras-cliente conectadas a través de internet
20 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Uno de los software servidores más ampliamente utilizados es el Apache Tomcat, y es el que
usaremos en este curso, es de distribución libre. GlassFish es otro software servidor que tam-
bién es muy utilizado.
Es muy común que las aplicaciones Web hagan uso de una base de datos ubicada en la com-
putadora-servidor, los manejadores de bases de datos más populares son Oracle y MySQL. En
este curso utilizaremos MySQL, porque es gratuito. El manejador de base de datos permite
que varios clientes compartan la información, éste es uno de los aspectos más útiles de las
aplicaciones web, ya que permite el comercio en línea (tiendas virtuales, reservaciones de ho-
teles, vuelos, etc.) y facilita la organización en las instituciones (solicitudes en línea, sistemas
de inscripción, control de préstamos bibliotecarios, etc.), como se ilustra en la Figura I-2.
Finalmente, al “cerebro” de la aplicación web, se le conoce como la lógica del negocio y ésta
se le puede codificar de diversas formas (C#, PHP, .NET, JavaScript,…) en el presente curso
utilizaremos Java para hacer Servlets y clases Java. Dos de los ambientes de desarrollo integra-
do más utilizados para el desarrollo de aplicaciones web son NetBeans y Eclipse, ya que son
gratuitos. En el curso utilizaremos NetBeans.
1. ¿QUÉ SE NECESITA PARA HACER UNA APLICACIÓN QUE FUNCIONA EN LA RED? ÍNDICE 21
El software servidor y el navegador del cliente se comunican por medio de un protocolo lla-
mado HiperText Transfer Protocol (HTTP). El navegador hace la petición de una página Web
al servidor enviándole un mensaje conocido como petición HTTP (request), la cual incluye el
nombre de un archivo *.html, y el servidor contesta a esta petición con un mensaje conocido
como respuesta HTTP (response).
En el caso de las páginas Web estáticas, el servidor proporciona en la respuesta HTTP el do-
cumento *.html que el navegador solicitó. El usuario que visualiza una página Web estática,
no puede hacer modificaciones en ésta. Cuando el usuario da clic en la liga a otra página, se
envía otra petición HTTP pero ahora con el nombre del archivo de la otra página que se de-
sea visualizar. Otra manera de pedir una página diferente es escribiendo directamente en el
navegador su dirección Web.
En el caso de las páginas web dinámicas, el servidor pasa la petición HTTP generada por el
navegador a una aplicación Web, la cual procesa la información que contiene la petición. La
respuesta que genera la aplicación se envía al servidor, quien contesta al navegador con una
respuesta HTTP, como se ilustra en la Figura I-3. La respuesta que recibe el usuario no es
siempre la misma, sino que depende de la información que éste proporciona, por eso se dice
que la página es dinámica.
Figura I3. El servidor web turna el procesamiento de las páginas web dinámicas a una aplicación web
22 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Una página JSP (JavaServer Page) es una página HTML a la que se le incrusta código Java. En
el capítulo II se da una introducción al código HTML para los lectores que no están familia-
rizados con éste. El código Java se incrusta entre los siguientes indicadores <% y %>. En el
capítulo III trabajaremos con las JSP.
Un servlet es una clase Java (hija de la clase HttpServlet) y corre en el servidor. Su nombre
se deriva de la palabra applet. Anteriormente se utilizaban los applets, que eran pequeños
programas, escritos en Java, que corrían en el contexto del navegador del cliente, sin embargo,
desde que Microsoft Explorer suspendió su mantenimiento, los servlets substituyeron a los
applets, sólo que los servlets no tienen una interfaz gráfica. Un servlet da servicio a las peti-
ciones de un navegador Web, es decir, recibe la petición, la procesa y devuelve la respuesta
al navegador. Un servlet es una clase Java en la que se puede incrustar código HTML. Como
los servlets están escritos en Java, son tan portables como cualquier aplicación Java, es decir,
pueden funcionar sin necesidad de cambios en diferentes servidores.
A manera de ejemplo, presentamos el código de un servlet muy sencillo, el cual genera como
respuesta una página HTML que despliega un breve mensaje.
El objeto request se usa para leer los datos que están en los formularios que envía el
navegador. El objeto response se usa para especificar códigos y contenidos de la respuesta.
PrintWriter out;
String title = "Ejemplo de un servlet";
out = response.getWriter();
PrintWriter out;
1. ¿QUÉString
SE NECESITA PARA=HACER
title UNA APLICACIÓN
"Ejemplo QUE FUNCIONA EN LA RED?
de un servlet"; ÍNDICE 23
out = response.getWriter();
Un servlet puede generar su resultado consultando a una base de datos, invocando a otra
aplicación o computando directamente la respuesta. También puede dar formato al resultado
generando una página HTML, y enviar al cliente un código ejecutable.
- La vista.- Son los módulos SW involucrados en la interfaz con el usuario, por ejem-
plo, las páginas de internet que se despliegan en la computadora del usuario.
- El controlador.- Es el software que procesa las peticiones del usuario. Decide qué
modulo tendrá el control para que ejecute la siguiente tarea.
- El modelo.- Contiene el núcleo de la funcionalidad, es decir, ejecuta la “lógica del
negocio”. Se le llama lógica del negocio a la forma en la que se procesa la información
2 para generar los resultados esperados. El modelo se conecta a la base de datos para
guardar y recuperar información.
-
El patrón MVC convierte la aplicación en un sistema modular, lo que facilita su desarrollo y
mantenimiento. En la Figura I-4 se ilustran las tres partes del modelo MCV.
24 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
En las aplicaciones Web más sencillas de este curso, sólo separamos la vista (con páginas JSP)
y el procesamiento de los datos (con servlets). Sin embargo, para aplicaciones Web un poco
más avanzadas utilizamos el patrón MVC. La vista la implementaremos con páginas JSP, el
controlador con servlets y el modelo con clases Java(ver capítulo V).
Al diseñar y codificar los módulos MVC, es importante que se haga una buena división de las
tareas. Por ejemplo, las páginas JSP no deben incluir tareas de procesamiento de datos y los
servlets no deben contener código para la presentación de las páginas. La división de tareas
entre el controlador y el modelo es la más difícil. Mantener una total independencia entre los
módulos es a veces imposible, sin embargo es el objetivo ideal.
1.7 Frameworks
Podemos ver a un framework como una estructura de software que tiene componentes perso-
nalizables e intercambiables y constituye una aplicación genérica incompleta y configurable, a
la que se le añaden las últimas piezas para construir una aplicación concreta.
La mayoría de los frameworks para desarrollo Web implementan el patrón MVC con algunas
variantes. Entre los frameworks más conocidos están:
- JavaServer Faces
- Struts
- Spring Web MVC
En la segunda parte de este libro aprenderemos a hacer aplicaciones Web con JavaServer Faces.
Apache Tomcat es un software que actúa como contenedor de servlets, es decir, recibe las peti-
ciones de las páginas Web y redirecciona estas peticiones a un objeto de clase servlet.
https://netBeans.org/downloads/index.html
Para poder instalar NetBeans es necesario tener previamente instalado el JDK (JavaDevelop-
ment Kit), ya que éste es la plataforma en la que se ejecuta NetBeans.
26 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
En el capítulo III se explica cómo crear una aplicación Web con NetBeans.
1. ¿QUÉ SE NECESITA PARA HACER UNA APLICACIÓN QUE FUNCIONA EN LA RED? ÍNDICE 27
Para iniciar una aplicación Web se selecciona File →New Project→JavaWeb, como se ilustra en
la Figura I-7.
Es muy importante seleccionar correctamente el servidor que tenemos instalado, en este caso
Tomcat, como se ilustra en la Figura I-8.
Para una aplicación Web sencilla no es necesario seleccionar un framework. Cuando se selec-
ciona el botón “Terminar”, NetBeans crea automáticamente la estructura de un proyecto Web.
Esta estructura se muestra en la Figura I-9.
El archivo index.jsp contiene código HTML. Por default la página index.jsp sólo contiene el
saludo “Hello World!”. En el siguiente capítulo aprenderemos a trabajar con código HTML y
a visualizar las páginas en el navegador.
ÍNDICE
2. Introducción al HTML
2.1 Objetivos
HTML es el acrónimo de las siglas del inglés: HyperText Markup Language (lenguaje de mar-
cas de hipertexto). Las páginas de hipertexto se codifican con HTML. Los navegadores de in-
ternet están preparados para interpretar los comandos de HTML y desplegar la información
en forma de una página de internet con texto e imágenes.
El hipertexto de las páginas HTML está definido por tags, que son los comandos. Los tags
comienzan con el carácter < y terminan con el carácter >. La información del tag va dentro
de estos dos caracteres. Los navegadores arman y dan forma a las páginas de internet inter-
pretando estos comandos. A continuación, presentamos la estructura general de una página
HTML. Observa que hay tags para marcar el comienzo y otros para marcar el final. Por ejem-
plo, el comienzo de la página comienza con el tag <html> y para señalar el final de la página
se usa el tag </html>. La diagonal es importante para señalar los finales.
HTML no es sensible a las mayúsculas y minúsculas, sin embargo, por claridad se acostum-
bran las minúsculas. Para hacer más legible la página HTML, se emplean espacios y líneas
en blanco.
<html>
<head>
<title> Título de la página </title>
</head>
<body>
<h1> Página de ejemplo de HTML </h>
<h2> Este es un subtítulo </h2>
<p> El texto en este tag es un párrafo,
por ejemplo pueden ser instrucciones </p>
</body>
</html>
30 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Las páginas HTML se pueden escribir en cualquier editor de textos (NotePad, Word, etcé-
tera). También hay poderosas herramientas, que sirven para trabajar con páginas HTML y
darles un acabado profesional. Para diseñar una aplicación Web, se acostumbra utilizar un
ambiente de desarrollo integrado (IDE: Integrated Development Environment).
En los ejemplos de esta sección utilizaremos NetBeans. Recomendamos Sublime Text (http://
www.sublimetext.com/) para trabajar fácilmente con la edición de páginas Web. Otra opción
es Atom, un editor gratuito y de código abierto.
Recordar que para crear una aplicación Web con NetBeans, hay que crear un nuevo proyecto
seleccionando la categoría JavaWeb y el proyecto Web Aplication. Una vez que se da el nombre
y localización del proyecto, hay que seleccionar el servidor, en nuestro caso Apache Tomcat.
Finalmente NetBeans nos da la opción de seleccionar algún framework (marco de trabajo).
Como estamos iniciando con el desarrollo Web, no seleccionaremos un framework para nues-
tra aplicación.
NetBeans genera automáticamente una página JSP con código HTML que contiene única-
mente el título “Hello World!”. Si sustituimos este código con el de la sección anterior tenemos
el código de la Figura II-1.
Para hacer que la página HTML se despliegue en el navegador es necesario elegir la opción
“Ejecutar Main Project”, en la barra del menú o con el ícono señalado en la Figura II-1. En la
Figura II-2 se muestra la página desplegada por el navegador.
Otra forma de correr un proyecto es seleccionarlo y, con el botón derecho del mouse y elegir
el comando run (Ejecutar).
Recordar que los tags son los comandos de HTML. En la Tabla II1se muestran los tags básicos,
es decir, los que sirven para construir una página HTML y dar los formatos más comunes.
Los campos de texto se utilizan para capturar la información del usuario. Estos campos se
definen con el tag <input> el cual tiene varios atributos, por lo pronto estudiaremos el atribu-
to type. Cuando indicamos type=”text” los caracteres que introduce el usuario se muestran
dentro del campo. Si indicamos type=”password”, en lugar de los caracteres se muestran pun-
tos. Además, existe type=”hidden”, que permite guardar un campo que no se despliega en la
página.
El siguiente código HTML despliega un campo de texto normal, uno de tipo password y un
campo de texto oculto.
</body>
</html>
El atributo value sirve para indicar el valor por default del campo, en el siguiente código
agregamos este atributo y los campos ya no se despliegan vacíos, sino con su valor de dafault,
como se aprecia en la Figura II-4.
2. INTRODUCCIÓN AL HTML ÍNDICE 33
El tag <input> no solamente se usa para campos de texto, en la sección II.5 se estudian los
otros usos de <input>.
La Tabla II-2 contiene los principales tags de HTML para construir una tabla. Cada tag tiene
uno o varios atributos. En la última columna se indica cuáles son los valores que puede tomar
cada uno de los atributos.
6
34 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
El siguiente código HTML despliega una tabla con tres columnas y cuatro renglones, el pri-
mer renglón es el encabezado de la tabla.
<tr>
<td > Nombre 1</td>
<td > Apellidos 1</td>
<td > Calific. 1</td>
</tr>
<tr>
<td > Nombre 2</td>
<td > Apellidos 2</td>
<td > Calific. 2</td>
</tr>
<td align="center"> Apellidos</td>
<td align="center"> Calificacion</td>
</tr>
<tr>
<td > Nombre 1</td>
2. INTRODUCCIÓN AL HTML ÍNDICE 35
<td > Apellidos 1</td>
<td > Calific. 1</td>
</tr>
<tr>
<td > Nombre 2</td>
<td > Apellidos 2</td>
<td > Calific. 2</td>
</tr>
<tr>
<td > Nombre 3</td>
<td > Apellidos 3</td>
<td > Calific. 3</td>
</tr>
</table>
</body>
</html>
La imagen es uno de los elementos que se pueden incluir en una página HTML, en la Tabla
II-3 se describen los atributos del tag <img>.
En la Figura II-6 se muestra una página con dos imágenes, una alineada a la izquierda y la
otra a la derecha.
Para que el navegador tenga acceso a las imágenes es necesario que el archivo con la imagen
se encuentre dentro de la carpeta del proyecto. El código de la página de la Figura II-6 es el
siguiente:
</body>
</html>
2.5 Formularios
Los formularios Web se utilizan para cifrar los datos del usuario, así viajan del cliente al ser-
vidor de manera más segura, (el cifrado de datos es una forma de protegerlos de un acceso
no deseado). Un formulario debe contener por lo menos un botón, el cual sirve de control, ya
que cuando el usuario pulsa el botón se envían los datos del formulario a la página indicada.
2. INTRODUCCIÓN AL HTML ÍNDICE 37
Dentro del tag del formulario el tag <input> se usa para definir los campos en los que se
captura la información y también para definir los controles del formulario. En la Tabla II-5 se
incluyen todos los atributos de <input>.
Los controles del formulario sirven para reunir la información proporcionada por el usuario
y para enviarla al destino indicado en el atributo action. Existen varios tipos de controles, en
esta sección estudiaremos: botones, check-box, combo-box, list-box y áreas de texto.
2.5.3.1 Botones
Para que funcione un formulario, es obligatorio que exista un botón de envío, ya que sin él no
se enviarían los datos capturados.
<body>
<h1> Ejemplo de Campos de Texto y Botones</h1>
</form>
</body>
</html>
2. INTRODUCCIÓN AL HTML ÍNDICE 39
En el siguiente ejemplo un campo de texto está afuera del formulario, y hay un botón para
borrar que está dentro del formulario. Nótese que el primer campo de texto del ejemplo tiene
definido un valor por default con el atributo value.
<body>
<h1> Campos de Texto y Botones</h1>
<p> Campo fuera del formulario: <input type="text" name="C"
value= "Datos del Campo"></p>
</form>
</body>
</html>
40 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
En la Figura II-8 se observa como el botón que está dentro del formulario se despliega a la de-
recha de éste, mientras que el que está fuera se despliega abajo. En la Figura II8 a) se muestra
una página en la que el usuario ya introdujo datos. Al dar clic en el botón “borrar” (Figura II-8
b), se borran los datos de los campos que están dentro del formulario, pero no el del campo
que está fuera.
a) b)
Los radio-botones (radio button) sirven para seleccionar una de varias opciones. Aunque,
también se pueden configurar para que el usuario pueda seleccionar dos o más opciones, éstos
no se usan de esta manera, porque cuando el usuario selecciona un radio-botón éste ya no se
puede des-seleccionar. En el siguiente código de ejemplo se muestra el funcionamiento de los
radio-botones.
Nótese que el primer conjunto de radio-botones se despliega en una misma línea, mientras
que en el segundo se despliega cada opción en una línea por separado. Además, en el primer
grupo los tres tienen el mismo name=”transporte”, por lo que el usuario sólo puede elegir
una opción (transporte sólo puede tener un valor). El calificativo checked indica que ése es
el radio-botón seleccionado por default. Cuando el usuario selecciona una opción, las demás
opciones se des-seleccionan automáticamente.
2. INTRODUCCIÓN AL HTML ÍNDICE 41
</body>
</html>
En la Figura II-9 a) se muestra la página antes de la selección del usuario y en la Figura II- 9
b) la selección del usuario.
a) b)
Figura II-9. Radio-Botones con una sola selección y con varias selecciones
15
42 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
En el segundo grupo, cada radio-botón tiene un name diferente, y cada uno tiene su valor. Por
lo tanto, el usuario puede seleccionar varias opciones. Sin embargo, si el usuario selecciona
una, ésta ya no se puede des-seleccionar. Cuando se requiere que el usuario pueda seleccionar
varias opciones, en lugar de utilizar radio botones se utilizan las casillas de verificación (check
box), como se explica en la siguiente sección.
</body>
</html>
2. INTRODUCCIÓN AL HTML ÍNDICE 43
a) b)
Figura II-10. Radio Botones y Casillas de Verificación
En la Figura II-10 se observa cómo el usuario puede elegir varias casillas a la vez, y las puede
seleccionar y des-seleccionar libremente con el mouse.
Con la lista de opciones el usuario selecciona (con clic) la opción deseada de una lista, en este
caso se le llama “Combo box”. También es posible seleccionar varias opciones y a este caso se le
llama “list box”. En la primera lista del siguiente ejemplo, llamada transporte, el usuario puede
seleccionar solamente una opción, mientras que en la lista de opciones llamada destinos, el
usuario puede seleccionar varias opciones, ya que se incluye el calificador multiple.
<select name="transporte">
<option selected>Coche</option>
<option>Avión</option>
<option>Autobus</option>
</select>
<select name="transporte">
44 <option selected>Coche</option>
DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<option>Avión</option>
<option>Autobus</option>
</select>
</body>
</html>
En la Figura II-11 se muestra la página que despliega el navegador. Para seleccionar dos o más
opciones, el usuario debe dar ctrl-clic.
El área de texto sirve para capturar caracteres, como un campo de texto. La diferencia es que
17 de texto está preparada para capturar muchos más caracteres que el campo de texto y
el área
desplegar varias líneas. Se despliega una barra de desplazamiento vertical para poder visua-
lizar todo el texto.
El siguiente código despliega dos áreas de texto: la primera con menos renglones, menos co-
lumnas y con un texto que se despliega por default, la segunda con más renglones y columnas,
se despliega en blanco.
</body>
</html>
2.6 Prácticas
2.6.1 Práctica 1
Hacer una página HTML con una tabla que contenga tres columnas y dos renglones. En el
primer renglón van los encabezados de la imágenes, y en el segundo renglón se despliegan las
imágenes, como se muestra en la Figura II-13.
2.6.2 Práctica 2
Hacer una página HTML que capture los datos en una solicitud como la que se muestra en
la Figura II14. Observar que al oprimir el botón “borrar” se borran todos los datos de la so-
licitud. En la Figura II14 b) se pueden apreciar los campos borrados y los valores por default.
a)
a) b)
Figura II-14. Práctica 2: Solicitud
2. INTRODUCCIÓN AL HTML ÍNDICE 47
2.6.3 Solución
</td>
</tr>
</table>
</body>
</html>
48 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<h1> Solicitud</h1>
<p> Despues de introducir tus datos oprime el botón
"enviar"</p>
<p> Eres:
<input type="radio" name="genero"
value="masculino"checked> Hombre
<input type="radio" name="genero"
value="femenino">Mujer<br>
21
2. INTRODUCCIÓN AL HTML ÍNDICE 49
<td>
<textarea name="comentario" rows ="3" cols="20">
</textarea>
</td>
</tr>
</table>
</form>
</body>
</html>
22
ÍNDICE
3.1 Objetivo
Usar una JSP para capturar datos del usuario, y enviar la información capturada a otra JSP
que despliegue esta información.
Una aplicación Web contiene un conjunto de páginas de internet que están conectadas entre
sí por medio de ligas (links). Una liga contiene la dirección de URL de la nueva página que
se desplegará. La URL es una cadena de caracteres con la dirección en donde se encuentra la
página destino.
Cuando queremos pasar de una página a otra sin enviar algún tipo de información, utiliza-
mos un enlace. El tag de HTML llamado “ancla”, permite pasar de una pagina1.JSP a otra
pagina2.JSP. Para hacer esto, es necesario poner el ancla en la pagina1.JSP, cuyo formato es el
siguiente:
Cuando el navegador despliega la pagina1 la liga se muestra con el texto indicado, en este
caso: Texto del enlace. Cuando el usuario da clic en esta liga, el navegador despliega ahora la
página2.JSP.
a) b) c)
Las páginas JSP deben estar en la misma carpeta. Si la página JSP se encuentra en otro lugar,
será necesario proporcionar la ruta.
La petición GET se utiliza para solicitar datos que están en el servidor, por ejemplo, para
solicitar una página.
Las peticiones GET se pueden guardar en el historial de navegación, se pueden indexar en los
buscadores, o agregar a enlaces favoritos. La información que se envía en el GET normalmen-
te es una liga. Get contiene mucho menos información que POST.
El tag ancla: <a href=”paginaDestino.jsp”> </a> siempre utiliza el método GET para solicitar la
página destino.
25
54 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
La petición POST sirve para enviar información al servidor para que ésta sea procesada. Una
vez que se procesa, se envía en la respuesta al navegador alguna página con información. En
una petición POST puede viajar mucho más información.El valor de los parámetros que pro-
porcionó el usuario en una petición POST, se encuentran dentro de un objeto llamado request.
En la siguiente sección utilizaremos el método POST para enviar información de una página
JSP a otra.
Un scriptlet es un fragmento de código en Java que se incrusta en una página JSP. Para insertar
un scriptlet en una JSP, se utiliza la siguiente sintaxis:
A continuación, se muestra un scriptlet que sirve para recuperar los parámetros que recibe la
JSP en el objeto request y guardarlas en variables String.
<
// Este es un scriptlet
// Es c digo en a a ue captura los parámetros en iados
// en el objeto re uest
tring nombre re uest getParameter nombre
tring color re uest getParameter color
tring mail re uest getParameter mail
>
Una expresión se utiliza para desplegar como texto, una variable Java. Para insertar una expre-
sión en una JSP se usa la siguiente sintaxis:
En el siguiente ejemplo se muestran las expresiones que sirven para desplegar el contenido de
las tres variables del scriptlet anterior:
3. COMUNICACIÓN ENTRE PÁGINAS WEB: PASO DE PARÁMETROS ÍNDICE 55
La Figura III.2 a) muestra una página JSP llamada index.jsp que captura datos del usuario. Al
oprimir el botón “enviar”, index.jsp envía los datos (parámetros) dentro del objeto request
a la paginaDestino.jsp. La paginaDestino.jsp de la Figura III.2 b) despliega los parámetros
recibidos. El botón “regresar” en la paginaDestino.jsp sirve para regresar a index.jsp.
a) b)
</body>
</html>
index.jsp pide los datos al usuario y las capturas en los atributos llamados nombre, color y
mail. Cuando el usuario oprime el botón “Enviar”, se ejecuta la acción “ir a paginaDestino.
jsp”. Si no se capturó un dato, se envía el valor null.
3. COMUNICACIÓN ENTRE PÁGINAS WEB: PASO DE PARÁMETROS ÍNDICE 57
<%
// Este es un scriptlet
// Es código en Javaque captura los parámetros enviados
// en el objeto "request"
String nombre = request.getParameter("nombre");
String color = request.getParameter("color");
String mail = request.getParameter("mail");
%>
</body>
</html>
29
58 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Existen varios tags que se pueden utilizar dentro de una JSP; ya hemos visto dos de ellos: el tag
para insertar un scriptlet y el tag para insertar una expresión. En la Tabla III-1 se muestra un
resumen con todos los tags y su uso.
A lo largo del curso veremos ejemplos en los que utilizaremos estos tags.
La página de la Figura III.3 a), llamada index.jsp, captura los datos del usuario por medio de
radio-botones y casillas de verificación. Su código es el siguiente:
</body>
</html>
a) index.jsp b) paginaDestino.jsp
La página destino.jsp de la Figura III-3 b) recupera la información con un scriptlet que captura
los valores de cada uno de los atributos enviados por index.jsp. Posteriormente despliega la
información recibida usando scriptlets que contienen el condicional if, como se aprecia en el
siguiente código:
60 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<%
// Este es un scriptlet
// Es código en Javaque captura los parámetros enviados
// en el objeto "request"
String transp = request.getParameter("transporte");
String ciudad = request.getParameter("ciudad");
String bosque = request.getParameter("bosque");
String playa = request.getParameter("playa");
%>
<% }%>
<% }%>
<% if ( playa != null) { %>
playa
<% }%>
</body>
</html>
32
3. COMUNICACIÓN ENTRE PÁGINAS WEB: PASO DE PARÁMETROS ÍNDICE 61
a) index.jsp b) paginaDestino.jsp
Figura III 4 Captura y despliegue con lista de opciones
En la Figura III4 a) se muestra una página index.jsp que captura la información del usuario
por medio de una combo box y una list box. Su código es el siguiente:
<select name="idioma">
<option selected>Espanol</option>
<option>Ingles</option>
<option>Frances</option>
<option>Aleman</option>
</select>
</p>
<select name="idioma">
<option selected>Espanol</option>
<option>Ingles</option>
62 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<option>Frances</option>
<option>Aleman</option>
</select>
</p>
</body>
</html>
En el código de páginaDestino.jsp podemos observar que, para obtener todas las opciones que
seleccionó el usuario para el atributo “lenguajes”, en el scriptlet del principio se captura la
referencia al arreglo de String que contiene las opciones seleccionadas. Posteriormente, con la
combinación de un scriptlet y una expresión se despliegan estas opciones en la página.
</body>
</html>
La recepción de los caracteres que escribe el usuario en un área de texto, es muy sencilla, y
se hace de la misma manera que para un campo de texto. El siguiente código es de la página
origen index.jsp, cuya pantalla se muestra en la Figura III5-a).
</body>
</html>
64 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
La página de la Figura III5a) contiene el texto que introdujo el usuario en el área de texto 2,
en la Figura III5 b) la página destino muestra el texto recibido como parámetro en el atributo
área 2.
a) index.jsp b) paginaDestino.jsp
%>
</body>
</html>
<h1> Esta es la página destino</h1>
<h2> Aquí se despliegan los datos que se recibieron</h2>
</body>
</html>
3.10 Práctica
Hacer una página HTML que capture los datos en una solicitud como la que se muestra en la
Figura II14 a). Que es la misma que la de la práctica 2 del capítulo II. Al oprimir el botón “En-
viar” se deben pasar todos los datos capturados en la solicitud a una paginaDestino.jsp como
la de la Figura III6 b) en la que se despliegan todos los datos recibidos.
36
a) index.jsp b) paginaDestino.jsp
Figura III-6. Práctica: Solicitud
66 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
3.10.1 Solución
<h1> Solicitud</h1>
<p> Despues de introducir tus datos oprime el botón
"enviar"</p>
<p> Eres:
<input type="radio" name="genero"
value="masculino"checked> Hombre
<input type="radio" name="genero"
value="femenino">Mujer<br>
21
<input type="reset" value="Borrar">
<input type="submit" value="Enviar">
</form>
</body>
</html>
String[] idiomasSelec =
request.getParameterValues("idiomas");
%>
</table>
<% }%>
<% }%>
<% if ( basic != null) { %>
basic
39
<% }%>
<% if ( html != null) { %>
html
<% }%>
</p>
<p> Los idiomas que comprendes son: <br>
<%
for( int i=0; i< idiomasSelec.length; i++)
{
%>
<%= idiomasSelec[i] %>
<% }
%>
</p>
</body>
</html>
ÍNDICE
4.1 Objetivos
- Capturar la información del usuario en una JSP inicial y enviarla a una clase Java
que procesa la información.
- Desplegar los resultados que proporciona una clase Java en una JSP.
- Utilizar un archivo de texto para guardar la información capturada.
- Leer información de un archivo de texto y desplegarla mediante una JSP.
Hasta el capítulo anterior hemos estudiado cómo capturar información del usuario en una
página inicial y pasarla a una página destino para que se despliegue. Sin embargo, hasta ahora
no hemos hecho ningún tipo de procesamiento a la información.
Es posible incluir código Java en las JSPs para procesar los datos, pero esto no es una buena
práctica. Lo recomendable es utilizar algún patrón que organice la aplicación en partes inde-
pendientes. Para aplicaciones muy sencillas, utilizamos páginas JSP para capturar y mostrar
información, es decir, para implementar la vista. Y el procesamiento se hace con clases nor-
males de Java. Sin embargo, para aplicaciones reales, que tienen mayor complejidad, es mejor
utilizar un patrón de diseño, como el Modelo-Vista-Controlador MVC que estudiaremos en
el capítulo V.
Cuando se solicita una página JSP por primera vez, el motor JSP genera un servlet corres-
pondiente a la página (se le llama instancia de la JSP). La instancia de la JSP se guarda en la
memoria del servidor. Si la JSP contiene código Java, también se inicia lo que se llama un hilo
(thread). Posteriormente, cada que hay otra petición de la página, se utiliza la instancia de
la JSP y además, se crea otro hilo por cada nueva petición de la página, como se ilustra en la
Figura IV1.
70 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Figura IV-1. Creación de un hilo de Java por cada petición de una JSP
Las variables globales se guardan en la instancia de la JSP, y se declaran dentro del tag <%! %>.
Las variables locales se crean para cada thread, y se declaran dentro de un scriptlet. Por ejem-
plo, en el siguiente código se declara una variable global que lleva la cuenta de las peticiones
que se han hecho sobre la página.
(Tabla III1)
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 71
En la Figura IV2 se observa que esta página se solicitó tres veces. Esta técnica puede fallar
cuando dos computadoras solicitan la página JSP exactamente al mismo tiempo. Se le dice en
inglés no thread-safe cuando se manejan las variables globales de esta forma. En este caso, no
sería grave que se perdiera la cuenta. Para los casos en que es indispensable que no se pierda
la cuenta, existen métodos más sofisticados para manejar variables globales de forma más
segura (thread-safe).
42
72 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
4.2.2 Encapsulamiento
Los getters no reciben parámetros y el tipo de dato que regresan es el mismo que el del atributo
correspondiente. Su nombre comienza con “get” seguido del nombre del atributo, pero inician
con mayúscula, y regresan el valor del atributo. Por ejemplo:
Para que otros objetos puedan modificar el valor de los atributos de una clase, usamos los
métodos setter, por ejemplo:
Los setters reciben como parámetro el mismo tipo de dato que el del atributo. El nombre de
los métodos setter se construye de forma análoga a la de los getters, pero iniciando con la pa-
labra “set”, y asignan al atributo el valor del parámetro recibido. El parámetro recibido tiene
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 73
el mismo nombre que el atributo. Para diferenciar entre el valor enviado como parámetro y el
nombre del atributo se utiliza la palabra ‘this’. De tal forma que this.nombreAtributo
se refiere al atributo del objeto. Por ejemplo:
Cuando se trabaja con JSPs y servlets, se usan las rutas relativas para hacer referencia a los
archivos, por ejemplo: “/WEB-INF/Promedios.txt”. Sin embargo para leer o guardar datos en
un archivo, es necesario tener la ruta completa, es decir la ruta real del archivo.El servlet Con-
text (contexto del servlet) maneja la información a nivel de toda la aplicación Web. La clase
ServletContext contiene métodos que sirven para que un servlet se comunique con su
contenedor. Todos los servlets de una aplicación tienen el mismo ServletContext.
El ServletContext contiene un método que sirve para obtener la ruta real de un archivo
que está dentro del proyecto de la aplicación. Entonces, para obtener la ruta real de “/WEB-
INF/Promedios.txt” hacemos:
ServletContext sc = this.getServletContext();
String path = sc.getRealPath(“/WEB-INF/Promedios.txt”);
C:\Users\usuario\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\Pro-
medios.txt
La ruta expresada con diagonales invertidas: “\” es un problema en los sistemas operativos que
requieren la diagonal normal “/”. En nuestro caso, utilizaremos la siguiente instrucción para
solucionar el problema:
path = path.replace(‘\\’,’/’);
74 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Los String tienen el método replace, que sirve para cambiar un caracter por otro. Pri-
mero se debe poner el caracter que se desea remplazar y después el caracter correcto. Estos
caracteres deben ir entre comillas simples y separados por una coma. Además, en este caso,
la diagonal invertida tiene un significado adicional, entonces usamos lo que se llama el “có-
digo de escape” que consiste en poner doble diagonal, de esta forma “\” se interpreta como el
caracter diagonal invertida y no como el inicio de un código de control (por ejemplo, cambio
de linea: \n).
C:/Users/usuario/Documents/NetBeansProjects/WebApplication1/build/web/WEB-INF/
Promedios.txt
Como ya habíamos mencionado, es una buena práctica separar las funcionalidades de tal
forma que las JSP realicen las funciones de la vista y delegar el procesamiento de los datos
a las clases Java (incluyendo los servlets). Para una aplicación sencilla, como la del siguiente
ejemplo, no es necesario utilizar servlets, basta con una clase normal de Java. En la Figura IV3
se ilustra un ejemplo de aplicación Web en la que se requiere hacer cálculos.
a) index.jsp b) paginaDestino.jsp
Figura IV-3. Aplicación web que hace cálculos con una clase Java
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 75
En la página de inicio (Figura IV3 a), se solicitan los datos. Cuando estos datos se envían al
servidor, la aplicación Web debe realizar los cálculos y después desplegarlos, como se muestra
en la Figura IV3 b). La página de inicio es muy sencilla, y se muestra a continuación:
La siguiente clase Java, llamada Calcula es la encargada de llevar a cabo los cálculos sobre
los datos proporcionados por el usuario. Es importante que desde el principio nos acostum-
bremos a hacer paquetes en donde se agrupen las funcionalidades. Recordar que a la reali-
zación de los cálculos se le llama lógica de negocio (business). Entonces, haremos un paquete
llamado negocios dentro de los source packages, como se muestra en la Figura IV4.
76 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
La paginaDestino.jsp usa la clase Calcula para obtener los resultados de los cálculos y los
despliega ( Figura IV3 b), su código es el siguiente:
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 77
Ahora trabajaremos con un archivo de texto desde una JSP utilizando una clase Java. En este
ejercicio la página principal solicita al usuario su nombre, sus apellidos y su promedio, como
en la Figura IV5 a).
45
78 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
a) index.jsp b) paginaRestino.jsp
Figura IV-5. Los datos que proporciona el usuario se registran en un archivo de texto
Cuando el usuario oprime el botón “Enviar” en la página de la Figura IV55 a), ésta envía los
datos del usuario a la JSP de la Figura IV5 b), llamada paginaRegistro.jsp, quien se encarga de
guardar los datos recibidos en un archivo llamado Promedios.txt. El código de la paginaRe-
gistro.jsp manda guardar los datos a la clase EscribeArchivo, que se encuentra dentro del
paquete datos. A continuación presentamos la clase EscribeArchivo
package datos;
o t a a o
import negocios.Alumno;
public class EscribeArchivo{
public tat c void add(Alumno a, String path) throws IOException{
File archivo;
FileWriter fw=null;
PrintWriter pw=null;
try{
archivo = new File(path);
fw = new FileWriter(archivo, true);
pw = new PrintWriter( fw );
pw.println(a.getNombre()+","+a.getApellidos()+","
+a.getPromedio() );
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if( pw != null)
pw.close(); FileWriter
} catch(Exception e2){ PrintWriter
e2.printStackTrace();} try-catch-finally
}
}
}
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 79
Se da el valor true al parámetro append para indicar que cáda vez que se escriba en el archivo,
se hará al final. Es decir, se agrega al final de lo que yá está escrito en el archivo. Cuando no
se indica true en el constructor, entonces append está en false y cáda vez que se escribe algo
nuevo se sobre-escribe lo que yá estaba, y se pierde la información anterior.
package negocios;
Alumno
<body>
<%@ page import="datos.EscribeArchivo, negocios.Alumno" %>
<%
// Obtención de los parámetros de la petición
String nombre = request.getParameter("nombre");
String apellidos = request.getParameter("apellidos");
String promedio = request.getParameter("prom");
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Promedios.txt");
path = path.replace('\\','/');
// Guardar en archivo
EscribeArchivo.add(alumno, path);
EnArchivo
%>
</body>
</html>
En una aplicación web, no se hace sólo una operación (como escribir en un archivo), sino que
se requiere que el usuario pueda llevar a cabo diferentes operaciones, por ejemplo, registrarse,
buscar un registro y ver todos los registros. Para hacer esto de una forma organizada, se usan
JSPs para capturar y desplegar datos, clases para procesar los datos y servlets para controlar el
flujo de datos entre las clases y las JSPs. En el siguiente capítulo estudiaremos qué son los ser-
vlets y como pasar información entre un servlet y una JSP y, entre un servlet y una clase Java.
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 81
4.4 Prácticas
4.4.1 Práctica 1
Hacer una aplicación Web que pida al usuario su nombre, su sueldo diario y la cantidad de
días trabajados. Al seleccionar el botón “Calcular sueldo” debe calcular y desplegar el sueldo
total. Usar JSPs y una clase Java para hacer el cálculo. La Figura IV-6 muestra un ejemplo de
ejecución de esta aplicación:
4.4.2 Práctica 2
Hacer una aplicación Web que resuelva una ecuación de segundo grado; los datos que debe
proporcionar el usuario son los coeficientes a, b y c de la ecuación. Además, se deben guardar
los resultados en un archivo de texto. La aplicación debe poder desplegar tanto raices reales,
como raíces complejas. Usar una clase Java para resolver la ecuación. En index.jsp se incluye-
ron las siguientes imágenes:
En la Figura IV7 se muestra un ejemplo de la práctica en la que la solución está dada por dos
raices reales:
82 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
a) index.jsp b) resultados.jsp
Figura IV-7. Solución de una ecuación de segundo grado con raíces reales
a) index.jsp b) resultados.jsp
Figura IV-8. Solución de una ecuación de segundo grado con raíces complejas
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 83
</table>
<br>
<br>
</body>
</html>
84 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Finalmente, la paginaDestino.jsp:
< page contentType text/html pageEncoding T >
< T PE html>
<html>
<head>
<meta http e ui ontent Type
content text/html charset T >
<title>Pagina estino</title>
</head>
<body>
< page import negocios alcular >
<
// Extracci n de los parámetros recibidos
tring nombre re uest getParameter nombre
tring sueldo ia re uest getParameter sueldo ia
tring diasTrab re uest getParameter diasTra
ouble total
50
4. COMUNICACIÓN ENTRE JSPS Y CLASES JAVA ÍNDICE 85
</tr>
<td> La solución se obtiene con la fórmula:
</td>
<tr>
<td> <img src="formula.jpg" width="150" heigth="150"
align="left"
alt="No se pudo mostrar la imagen">
</td>
</tr>
</table>
<tbody>
<tr>
<td align="right"> a: </td>
<td><input type="text" name="VarA"
value="" required/></td>
</tr>
<tr>
<td align="right"> b: </td>
<td><input type="text" name="VarB"
value="" required/></td>
</tr>
<tr>
<td align="right"> c: </td>
<td><input type="text" name="VarC"
value="" required/></td>
</tr>
<tr>
<td><input type="reset" value="Borrar"></td>
<td><input type="submit"
value="Resolver" /></td>
</tr>
</tbody>
<td align="right"> b: </td>
<td><input type="text" name="VarB"
value="" required/></td>
</tr>
<tr>
86 <td align="right"> c: </td>
DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<td><input type="text" name="VarC"
value="" required/></td>
</tr>
<tr>
<td><input type="reset" value="Borrar"></td>
<td><input type="submit"
value="Resolver" /></td>
</tr>
</tbody>
</table>
</form>
</body>
52
</html>
package negocios;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
File archivo;
FileWriter fw;
PrintWriter pw;
public boolean guardarResultado(String r1, String r2,
String path)throws IOException {
try {
archivo = new File(path);
fw = new FileWriter(archivo, true);
pw = new PrintWriter(fw);
pw.println("Raiz 1: "+r1 + " Raiz 2:" + r2);
return true;
} catch (Exception e) {
return false;
} finally {
fw.close();
}
}
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Resultados.txt");
88 ResuelveEc solucion
DRA. MARÍA=DEL
new ResuelveEc(A,B,C);
CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Resultados.txt");
</body>
</html>
56
ÍNDICE
5.1 Objetivos
- Estructurar una aplicación web con tres capas: Modelo, Vista y Controlador
(MVC)
- Pasar correctamente la información entre cada una de las capas del MVC.
En este capítulo aprenderemos a utilizar las páginas JSP para establecer la vista, los servlets
para construir el control y clases Java para conformar el modelo de una aplicación Web. Las
JSP y las clases Java ya se estudiaron en capítulos anteriores. En esta sección estudiaremos los
servlets, con los cuales se construyen los controladores. Un controlador recibe la información
de la vista, pide a las clases del modelo que procesen la información y, posteriormente, manda
desplegar los resultados a la vista correspondiente.
Un servlet es una clase Javaque hereda de la clase HttpServlet. Los cinco métodos más
comunes de un servlet son:
Observar que los métodos service(), doPost() y doGet() tienen como parámetros los
objetos request y response. El objeto request contiene la información que se le envía
al servlet para que éste se encargue de procesarla, y en el objeto response el servlet manda
la información resultante.
En la Figura V1 se ilustra el ciclo de vida de un servlet. Cuando se llama al servlet por primera
vez, es decir, se hace una petición, éste se instancia (se dice que “se carga”) en la memoria del
servidor y se invoca al método init() el cual se encarga de inicializarlo, posteriormente
se invoca al método service(). En las siguientes peticiones, el servlet ya está cargado en la
memoria, por lo que no es necesario invocar a init(). Entonces se llama directamente al
service(), y éste llama a los demás métodos del servlet.
Y para el doPost():
En este ejemplo, la página index.jsp de la Figura V2 a) solicita los datos al usuario. Al dar clic
en “Enviar” se invoca al servlet muestraRegistro de la Figura V2 b):
a) index.jsp b) muestraRegistro.jsp
<body>
<%@ page import="controller.muestraRegistro" %>
<h1>Hola! Proporciona tus datos:</h1>
<tr>
<td align="right"> Apellidos: </td>
<td> <input type="text" name="apellidos"> </td>
</tr>
<tr>
<td align="right"> Promedio: </td>
<td> <input type="text" name="prom"> </td>
</tr>
</table>
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import negocios.Alumno;
try {
String nombre= request.getParameter("nombre");
String apellidos= request.getParameter("apellidos");
Double promedio =
Double.parseDouble(request.getParameter("prom"));
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
60
}
}
94 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Aunque es posible desplegar una página HTML desde un servlet, como se ilustró en el ejemplo
de la sección anterior, esto no es una buena práctica. Los servlets deben enviar la información a
una JSP, quien se encargará de mostrar la vista, es decir, de desplegar la página para el usuario.
En el ejemplo de esta sección, los datos se capturan en el index.jsp de la Figura V3 a). Al dar
clic en “Enviar”, los datos capturados se pasan al servlet recibeDatos.java, el cual a su
vez los envía a muestraDatos.jsp (Figura V3 b):
a) index.jsp b) muestraDatos.jsp
Figura V-3. index.jsp a), envía datos a un servlet, que a su vez los envía a la JSP de b).
El código de index.jsp es el mismo que el de la sección anterior, sólo cambia el nombre del
servlet al cual se envía la petición POST: action = recibeDatos.
Las dos instrucciones que se usan para enviar datos de un servlet a una JSP son
request.setAttribute(“nombreAtributo”,objetoAEnviar);
request.getRequestDispatcher(“nombre.jsp”).forward(request,
response);
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import negocios.Alumno;
try {
String nombre= request.getParameter("nombre");
String apellidos= request.getParameter("apellidos");
Double promedio =
Double.parseDouble(request.getParameter("prom"));
request.setAttribute("atribAlumn",alumno);
request.getRequestDispatcher(
"/muestraDatos.jsp").forward(request, response);
request
} finally {
out.close();
}
}
@Override
62
96 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<%
Alumno alumno = (Alumno) request.getAttribute("atribAlumn");
%>
<h1> MuestraDatos.jsp</h1>
<h2> Aqui se despliegan los datos que envió el servlet</h2>
<p> Tus datos son los siguientes: </p>
También existe una forma de transferir a otra URL, y es con el siguiente método del objeto
response:
Este método no transfiere los objetos request y response, por lo tanto, sólo se utiliza
para re-direccionar a una URL específica, usualmente fuera de la aplicación actual.
Los servlets constituyen el controlador de la aplicación, éstos utilizan las clases Java para pro-
cesar la información. Estas clases conforman el modelo. Una vez procesada la información, los
servlets la mandan desplegar a la vista.
El intercambio de información entre servlets y clases Javaes es trivial. Sólo es necesario impor-
tar en el servlet, la o las clases con las que trabaja. Para enviar información a una clase, se ins-
tancia un objeto en el servlet y se envían los parámetros en el método constructor. El resultado
del procesamiento se obtiene con los métodos de la clase diseñados para proporcionar datos
y resultados. Un ejemplo claro es el servlet muestraRegistro.Java de la sección V.2.
En el ejemplo de esta sección, modificaremos el proyecto anterior de tal forma que los datos
que introduce el usuario se guarden en un archivo llamado promedios.txt, cuando el usuario
haga clic en el botón “Registrar”. Después de que los datos se guardan en el archivo, se des-
pliega la página muestraDatos.jsp con los datos que se guardaron, como en la Figura V4 b).
a) index.jsp b) muestraDatos.jsp
Figura V-4. Registro de los datos del usuario en un archivo
98 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import negocios.*;
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Promedios.txt");
path = path.replace('\\','/');
// Guardar en archivo
EscribeArchivo.add(alumno, path);
request.setAttribute("atribAlumn",alumno);
request.getRequestDispatcher("/muestraDatos.jsp")
.forward(request, response);
} finally {
out.close(); }
} alumno
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
5. EL MODELO DE TRES CAPAS CON JSP, SERVLETS, Y CLASES JAVA ÍNDICE 99
<h3> MuestraDatos.jsp</h3>
</body>
</html>
Ahora agregaremos funcionalidad al botón “Ver alumnos”, de index.jsp (ver Figura V4 a) con
el cual se mostrarán todos los alumnos registrados en promedios.txt. Con este botón se in-
voca al servlet muestraRegistro.java, el cual pide a la clase LeeArchivo.Java que
lea los datos del archivo solicitado y los capture en un ArrayList. Posteriormente pasa esta
información a alumnosRegistrados.jsp, la cual despliega todos los registros recibidos. Como
se muestra en la Figura V-5:
100 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
alumnosRegistrados.jsp
Figura V-5. Página que despliega todos los registros leidos en «promedios.txt
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import negocios.Alumno;
import negocios.LeeArchivo;
@WebServlet(name = "muestraRegistro",
urlPatterns = {"/muestraRegistro"})
public class muestraRegistro extends HttpServlet {
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Promedios.txt");
path = path.replace('\\','/');
alumnos = LeeAlumno.leeAlumnos(path);
ArrayList
// Resetea la variable estática Alumnos
LeeArchivo.clearCont();
cont = LeeArchivo.getCont();
contador= String.valueOf(cont);
request.setAttribute("Alumnos",alumnos);
request.setAttribute("contador", contador);
request.getRequestDispatcher("/alumnosRegistrados.jsp")
.forward(request, response);
} finally {
out.close();
}
}
}
package negocios;
import java.io.*;
import java.util.ArrayList;
66 class LeeArchivo {
public
private static int cont = 0;
private static File archivo;
private static FileReader fr;
private static BufferedReader br;
cont cuenta el número de registros leídos. Nótese que cuando el servlet pasa el contador a
alumnosRegistrados.jsp,
67 lo pasa como String (no como un entero), por lo que hay que hacer
la conversión correspondiente.
La aplicación Web de este ejemplo está organizada con el modelo de tres capas MVC (Modelo
Vista Controlador). En la Figura V6 observamos que las páginas JSP forman la vista de la
aplicación ya que son la interfaz con el usuario, éstas se encargan de capturar y mostrar datos.
Los servlets: recibeDatos.Javay muestraRegistro.Java funcionan como contro-
ladores. Éstos hacen uso de las clases que están en el modelo para procesar los datos recibidos
5. EL MODELO DE TRES CAPAS CON JSP, SERVLETS, Y CLASES JAVA ÍNDICE 103
y transferir el control a una JSP. Y el modelo está formado por las clases EscribeArchivo.
java, Alumno.Javay LeeArchivo.java.
En este caso en particular, usamos un ArrayList para guardar los objetos de la clase
Alumno leídos en el archivo. Sin embargo, puede usarse también un LinkedList.
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>Alumnos Registrados</title>
</head>
<body>
<%@ page import="negocios.Alumno, java.util.ArrayList" %>
<h2>Los alumnos que están registrados son: </h2>
<%
ArrayList<Alumno> alumnos = null;
alumnos =
(ArrayList<Alumno>)request.getAttribute("Alumnos");
String numReg= (String) request.getAttribute("contador");
int numRegistros = Integer.parseInt(numReg);
%>
<table border="1">
<tr>
<th>Nombre</th> alumno Alumno
<th>Apellidos</th> ArrayList
<th>Promedio</th> alumnos
</tr>
<%
for (Alumno alumno: alumnos)
{
%>
<tr valign="top">
<body>
<%@ page import="negocios.Alumno, java.util.ArrayList" %>
<h2>Los alumnos que están registrados son: </h2>
<%
ArrayList<Alumno> alumnos = null;
alumnos =
104 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
(ArrayList<Alumno>)request.getAttribute("Alumnos");
String numReg= (String) request.getAttribute("contador");
int numRegistros = Integer.parseInt(numReg);
%>
<table border="1">
<tr>
<th>Nombre</th> alumno Alumno
<th>Apellidos</th> ArrayList
<th>Promedio</th> alumnos
</tr>
<%
for (Alumno alumno: alumnos)
{
%>
<tr valign="top">
<td><%=alumno.getNombre() %></td>
<td><%=alumno.getApellidos() %></td>
<td><%=alumno.getPromedio() %></td>
</tr> alumnos
<% } %>
<% alumnos.clear();%>
</table>
</body>
</html>
La organización del proyecto en NetBeans se ilustra en la Figura V7. La vista (páginas JSP)
siempre van en la carpeta WEB-Pages. Los servlets y clases Java deben estar agrupados en pa-
quetes dentro de la carpeta Source Packages. Normalmente, se le llama “controller” al paquete
en donde se encuentran los servlets, ya que es en éste en donde se llevan a cabo las funciones
del controlador. Al paquete en donde se realizan las funciones del modelo se le suele llamar
“modelo”(model) o también “negocios” (business).
68
5. EL MODELO DE TRES CAPAS CON JSP, SERVLETS, Y CLASES JAVA ÍNDICE 105
5.6 Práctica
5.6.1 Planteamiento
a) index.jsp b) muestraRegistro.jsp
Figura V-8. Registro de un producto
Figura V-9. despliegaProductos.jsp muestra todos los productos registrados en el archivo productos.txt
69
108 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import negocios.*;
70
@WebServlet(name = "registraProducto",
urlPatterns = {"/registraProducto"})
public class registraProducto extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
int clave=
Integer.parseInt(request.getParameter("clave"));
String nombre= request.getParameter("nombre");
Double precio=
Double.parseDouble(request.getParameter("precio"));
int cantidad=
Integer.parseInt(request.getParameter("cant"));
Producto producto =
new Producto(clave, nombre, precio, cantidad);
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Productos.txt");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
int clave=
Integer.parseInt(request.getParameter("clave"));
5. EL MODELOString nombre=
DE TRES CAPAS CON request.getParameter("nombre");
JSP, SERVLETS, Y CLASES JAVA ÍNDICE 109
Double precio=
Double.parseDouble(request.getParameter("precio"));
int cantidad=
Integer.parseInt(request.getParameter("cant"));
Producto producto =
new Producto(clave, nombre, precio, cantidad);
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Productos.txt");
path = path.replace('\\','/');
// Guardar en archivo
GuardaProducto.add(producto, path);
request.setAttribute("atribProd",producto);
request.getRequestDispatcher("/muestraRegistro.jsp")
.forward(request, response);
} finally {
out.close();
}
}
}
71
110 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<h3> MuestraRegistro.jsp</h3>
</body>
</html>
5. EL MODELO DE TRES CAPAS CON JSP, SERVLETS, Y CLASES JAVA ÍNDICE 111
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import java.util.ArrayList;
import negocios.Producto;
import negocios.LeeProductos;
@WebServlet(name = "muestraProductos",
urlPatterns = {"/muestraProductos"})
public class muestraProductos extends HttpServlet {
request.setAttribute("Productos",productos);
request.setAttribute("contador", contador);
request.getRequestDispatcher("/despliegaProductos.jsp")
.forward(request, response);
} finally {
out.close();
}
}
}
112 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
package negocios;
import java.io.*;
import java.util.ArrayList;
public class LeeProductos {
private static int cont = 0;
private static File archivo;
private static FileReader fr;
private static BufferedReader br;
try {
archivo = new File(path);
fr = new FileReader(archivo);
br = new BufferedReader(fr);
String linea=null;
String [] tokensLinea = null;
int clave;
String nombre;
Double precio;
int cant;
Producto producto;
linea=br.readLine();
while( linea!=null){
tokensLinea = linea.split(",");
clave= Integer.parseInt(tokensLinea[0]);
nombre =tokensLinea[1];
precio= Double.parseDouble(tokensLinea[2]);
cant = Integer.parseInt(tokensLinea[3]);
producto = new Producto(clave,nombre, precio, cant);
productos.add(producto);
cont++;
linea=br.readLine();
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if( null != fr )
fr.close();
}catch (Exception e2){
e2.printStackTrace();}
}
return productos;
}
public static int getCont(){
return cont;
}
public static void clearCont(){
cont=0;
}
}
5. EL MODELO DE TRES CAPAS CON JSP, SERVLETS, Y CLASES JAVA ÍNDICE 113
6.1 Objetivo
Construir aplicaciones Web que se conecten con una base de datos para recuperar, guardar y
modificar la información.
Una base de datos relacional es un conjunto de información relacionada que está estructurada
en tablas. Cada tabla contiene varias filas, cada fila está formada por columnas. Se asume que
el lector ya está capacitado en el tema de las bases de datos, por lo que en esta sección sólo se
presenta un resumen a manera de recordatorio.
Antes de trabajar con una base de datos es necesario crearla y crear sus tablas mediante un
gestor de bases de datos. En este curso trabajamos con MySQL porque es un sistema de ges-
tión de base de datos muy aceptado y ampliamente utilizado. Si aún no se tiene instalado
MySQL, éste se puede bajar gratuitamente de http://www.mysql.com/downloads/
Para iniciar una sesión de MySQL se puede utilizar la herramienta MySQL línea de Comando
(Command Line), a la cual únicamente se le proporciona el password, como en la Figura VI1.
Ésta es la forma que utilizaremos en este curso.
La otra forma de trabajar con MySQL es mediante las herramientas de interfaz gráfica (MyS-
QL GUI tools).
Antes de comenzar a trabajar con una base de datos es necesario crearla, esto se hace con el
comando:
El comando CREATE no es suficiente, una vez que se crea la base de datos, hay que “usarla”
con el comando USE. Entonces, para poder trabajar con ella, es necesario el comando:
en nuestro caso:
Cuando se trabajen sesiones posteriores, no habrá que crear la base de datos nuevamente,
bastará con “usarla” con el comando USE. Nótese, que si se crea la base de datos con CREATE
y después no se utiliza el comando USE, será imposible empezar a trabajar con ella.
Leer la base de datos.- Para saber en que base de datos estamos trabajando se utiliza la función
DATABASE(), en nuestro caso, como se muestra en la Figura VI2 la base de datos se llama
“escuela”:
Una vez que nuestra base de datos está lista para trabajar, podemos crear una tabla dentro de
esta base de datos con el comando CREATE y proporcionamos los campos correspondientes:
Para consultar todas las tablas que tenemos en una base de datos, podemos usar el comando
SHOW TABLES. Para consultar los campos de una tabla, usamos el comando DESCRIBE
nombre_tabla, esto es útil para acordarnos del nombre, del orden o el tipo de dato de los cam-
pos de la tabla, como se muestra en la Figura VI3:
Figura VI-3. Consulta de las tablas en la base de datos y de los campos de una tabla
Para borrar una columna de una tabla se usa el comando ALTER TABLE añadiendo la cláu-
sula DROP. Por ejemplo, si tenemos la tabla t2 y necesitamos borrar la columna c, entonces
usamos el comando ALTER TABLE con la cláusula DROP, como se muestra a continuación:
Para agregar una columna a una tabla se usa el comando ALTER TABLE añadiendo la cláu-
sula ADD. Por ejemplo, si tenemos la tabla t2 y necesitamos agregarle la columna d, de tipo
TIME, entonces usamos el comando ALTER TABLE con la cláusula ADD, como se muestra
a continuación:
Para hacer modificaciones a la columna de una tabla se usa el comando ALTER TABLE aña-
diendo las cláusulas CHANGE y/o MODIFY según sea el caso.
Para cambiar el tipo de dato de una columna de la tabla t2 para que en lugar de INT sea
DOUBLE dejando el mismo nombre (calific), utilizamos la cláusula MODIFY.
Para cambiar el nombre del campo de una tabla t2 utilizamos la cláusula CHANGE. Por
ejemplo, si queremos renombrar la columna de b a d:
También es posible cambiar el nombre de la columna al mismo tiempo que su tipo de datos,
por ejemplo:
Por ejemplo:
Para renombrar una tabla se usa el comando ALTER TABLE. Por ejemplo, para renombrar
una tabla de t1 a t2 usamos:
Para consultar todos los datos de una tabla usamos SELECT. La sintaxis de este comando es
la siguiente:
MySQL> SELECT *
FROM nombreTabla
[WHERE criterio-de-selección]
[ORDER BY campo1 [ASC|DESC],
campo2 [ASC|DESC],….] ;
el cual despliega todos los registros de la tabla. Cuando la tabla está vacía se despliega el men-
saje “empty set”, como se observa en la Figura VI4. En esta figura también se puede ver la
inserción de tres registros (ver VI.2.4.1). Después, con SELECT * se despliegan todos los re-
gistros de la tabla.
120 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Figura VI-4. Insersión de registros en una tabla y desplegado de todos los datos
El comando SELECT regresa un conjunto de resultados conocido como result set (o tabla de
resultados).
Para insertar un registro en una tabla usamos el comando INSERT con la siguiente sintaxis:
La conexión de una aplicación Web con una base de datos es de suma importancia, ya que en
la mayoría de los sistemas se requiere operar con la información de una base de datos. Para
establecer la conexión es necesario saber:
6.3.1 Ambiente
El primer paso para establecer una conexión desde NetBeans con el gestor de bases de datos
MySQL es instalar el conector “mysql-connector-java”, la última versión se puede descargar
del sitio:
http://dev.mysql.com/downloads/connector/j/
La carpeta con el conector contiene varios archivos y subcarpetas, como se muestra en la Figura
VI-5 a). El archivo más importante es el jar, en este caso: mysql-connector-java-5.1.25-bin.jar.
Una vez instalado el ConectorMySQL, hay que ligarlo al proyecto en donde los vamos a utili-
zar. Por ejemplo, una aplicación con tres capas llamada PruebaContectBD tiene una index.jsp
que captura los datos, y un servlet registro.Java que usa la clase GuardaEnBD.Java
para guardar la información capturada en la tabla “productos” de una base de datos llamada
“tienda”. El árbol de carpetas y archivos del proyecto es el de la Figura VI-6 a).
Para incorporar el conector de la base de datos al proyecto, hay que agregar el Conector-
MySQL en la carpeta de librerías (con clic-derecho-> agregar biblioteca), como se aprecia en
la VI-6Figura VI6 b). Con el conector en la librería, ya estamos listos para pasar al siguiente
paso: codificar el conector.
Para obtener la conexión a una base de datos se utiliza el método getConnection() de la cla-
se DriverManager, este método regresa un objeto de la clase Connection, y requiere tres
parámetros: la URL donde se encuentra la base de datos, el nombre del usuario y el password.
onnect on ab ()
la o a e( co l bc D e )
con = D e ana e et onnect on(u l u ua o a w)
etu n con
o ce a ()
124 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Lo primero que haremos será crear la base de datos en MySQL, y en seguida la tabla, como se
muestra en la Figura VI-7:
La clase Producto en el paquete model es la misma que la que usamos para la práctica 6. La
captura de datos en index.jsp también es igual.
Creamos la clase GestorBD.Javaen la cual incluiremos métodos para trabajar con la base
de datos. El primero que crearemos sirve para registrar productos en la base de datos.
6. ACCESO A BASE DE DATOS ÍNDICE 125
Los datos del producto (clave, nombre, precio, cantidad) están dentro del objeto request
que el servlet recibió de index.jsp. Para desplegarlos en registroGuardado.jsp no es necesario
incluir un atributo con el objeto producto, basta con el reenvío del objeto request (for-
ward(request,response)).
Ge to D e to D = new Ge to D()
e to D e t a (cla e no b e ec o cant)
e t oGua a o
e o n e t o
126 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Recordar que para guardar un registro en una tabla con el gestor de base de datos usamos la
instrucción:
Para guardar un nuevo registro (fila) en una tabla de la base de datos, desde Java se ejecutan
cuatro pasos:
sensible a las mayúsculas y minúsculas). Si los valores a insertar son numéricos, entonces no
hace falta que vayan entre comillas simples. Sin embargo, las comillas simples son obligatorias
para cadenas de caracteres.
ubl c cla Ge to D
boolean e t a
nt e ult ate =
e ult ate =
t e ecute ate( n e t nto o ucto alue (
cla e no b e ec o cant ) )
( e ult ate != )
onecta D ce a ()
etu n t ue
el e
onecta D ce a ()
etu n al e
En la Figura VI-9 se ilustra cómo funciona la aplicación. En la Figura VI-9 a) el usuario pro-
porciona los datos, cuando da clic en el botón “Registrar” se invoca al servlet registro.
Java el cual pide a gestorBD.registrar() que registre los datos en la tabla “productos”
y si todo salió bien entonces se despliega la página registroGuardado.jsp de la Figura VI-9 b).
El método executeUpdate() de la clase Statement regresa un 0 en caso de que no se
haya ejecutado exitosamente la actualización (que puede ser un INSERT, DELETE o UPDA-
TE). Cuando la actualización se realizó con éxito regresa un entero indicando el número de
renglones afectados.
128 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
a)index.jsp b) registroGuardado.jsp
Figura VI-9. Aplicación que registra productos en una base de datos
Vemos ahora en la Figura VI-10 cómo se ha insertado una fila en la tabla “productos”. Con esta
inserción el nuevo producto queda registrado.
Figura VI-10. El producto proporcionado por el usuario queda registrado en la base de datos
El código del servlet registro.java, está preparado para cuando hay problema para dar de
alta un registro en la base de datos. En este caso, se redirecciona a la página errorEnRegistro.
jsp. Como ejemplo provocaremos un caso de error, como se muestra en la Figura VI11.
Cuando creamos la tabla “productos”, sólo dimos 12 caracteres a la columna “nombre” (ver
Figura VI7). El dato “Raquetas de ping-pong” sobrepasa el tamaño permitido. Para arreglar
6. ACCESO A BASE DE DATOS ÍNDICE 129
a) index.jsp b) errorEnRegistro.jsp
Figura VI-11. Error al guardar el registro en la base de datos
La consulta de datos es una de las funciones más importantes en las aplicaciones Web. Como
mencionamos en la sección VI.2, el comando MySQL para hacer consultas es SELECT. Para
realizar una consulta en una tabla de la base de datos, desde Java se ejecutan cuatro pasos:
package Model;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
ConectaBD.cierraConexion();
etu n o uct alla o;
}
}catch(Exception e){
System.out.println("Error en la base de datos.");
e.printStackTrace();
return null;
}
}
80
6. ACCESO A BASE DE DATOS ÍNDICE 131
Para guardar el resultado de una consulta se utiliza un objeto de clase ResulSet el cual es
de sólo lectura.
ResultSet es una clase Java similar a una lista en la que está el resultado de la consulta.
Cada elemento de la lista es uno de los registros de la base de datos. En realidad, ResulSet
no contiene todos los datos, sino que los va consiguiendo de la base de datos según se van
pidiendo. Así, mientras que el método executeQuery() tarda poco, el recorrido de los
elementos del ResultSet no es tan rápido. De esta forma se evita que una consulta que con-
tenga muchos resultados tarde mucho tiempo y llene la memoria del programa java.
ResultSet tiene un apuntador interno el cual apunta inicialmente antes del primer renglón
que devuelve el método executeQuery(). El método next() del ResultSet hace que
el apuntador avance al siguiente renglón. Si lo consigue, el método next() devuelve true.
Si no lo consigue significa que no hay siguiente renglón que leer, y devuelve false. Cuando el
método next() devuelve false desde la primera vez que se le invoca significa que el registro
está vacío porque no se encontró la información buscada.
a) index.jsp b) consultaProd.jsp
Figura VI-12. Consulta de un producto
package Controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Model.*;
import java.util.ArrayList;
try {
Producto producto;
GestorBD gestorBD = new GestorBD();
producto = gestorBD.consultar(clave,nombre);
if(producto != null){
request.setAttribute("atribProd",producto);
request.getRequestDispatcher("/resultadoConsulta.jsp")
.forward(request, response);
}else
request.getRequestDispatcher("/noEncontrado.jsp")
.forward(request, response);
} finally {
out.close();
}
}
}
81
6. ACCESO A BASE DE DATOS ÍNDICE 133
a) resultadoConsulta.jsp b) noEncontrado.jsp
En esta sección completaremos la funcionalidad de la página index.jsp ( Figura VI-12 a), que
es la opción de ver los registros que están dados de alta en la base de datos. Cuando el usuario
elige “Ver registros” se despliegan todos los renglones encontrados en la tabla de la base de
datos, como se muestra en la página listaProductos.jsp de la Figura VI-14 a). Cuando no hay
productos registrados se despliega la página noHayRegistros.jsp (Figura VI-14 b).
<%
Producto producto = (Producto)request.getAttribute("atribProd");
%>
a) listaProductos.jsp b) noHayRegistros.jsp
134 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
package Controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Model.*;
@WebServlet(name = "muestraProductos",
urlPatterns = {"/muestraProductos"})
public class muestraProductos extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
ArrayList <Producto> productos = new ArrayList<Producto>();
Producto producto;
GestorBD gestorBD = new GestorBD();
productos = gestorBD.leeTodo();
ArrayList
if (productos != null){
request.setAttribute("Productos",productos);
request.getRequestDispatcher("/listaProductos.jsp")
.forward(request, response);
}else
request.getRequestDispatcher("/noHayRegistros.jsp")
.forward(request, response);
} finally {
out.close();
}
}
<%
ArrayList<Producto> productos = null;
productos= (ArrayList<Producto>)request.getAttribute("Productos");
%>
6. ACCESO A BASE DE DATOS ÍNDICE 135
}catch(Exception e){
System.out.println("Error en la base de datos.");
e.printStackTrace();
return null;
}
}
En la Figura VI-15 se muestra el árbol de carpetas y archivos en NetBeans del proyecto com-
pleto. Sus tres capas son:
85
136 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
1.- Vista.- Las páginas JSP están dentro de la carpeta “Web Pages”.
2.- Controlador.- Los servlets están dentro del paquete “Controller”.
3.- Modelo.- Las clases que dan servicio a los servlets están dentro del paquete “Model”.
a) Hay que tener especial cuidado con el nombre de los atributos en las páginas JSP, ya que
no pasan por un proceso de compilación. Si el nombre de un atributo está mal, suceden
cosas difíciles de detectar. Por ejemplo, no se encuentra un registro en la base de datos por-
que el nombre de la columna es erróneo. Así que, lo primero que hay que hacer, es verificar
que todos los nombres de los atributos estén correctos.
b) Los nombres equivocados de las JSP tampoco se detectan, así que cuando se requiere la
página al ejecutar la aplicación, el navegador muestra el error de “recurso no disponible”.
6. ACCESO A BASE DE DATOS ÍNDICE 137
3.- Es importante contemplar los casos no exitosos. En la aplicación que desarrollamos en este
capítulo están incluidos los ejemplos de cómo se manejan (cuando no se encontró un registro,
cuando no se pudo guardar un registro).
6.5 Práctica
6.5.1 Planteamiento
1.a.- Proporcionar su cuenta y su contraseña para ingresar a la página del sistema (Figura
VI-16 a). La página inicial del sistema debe saludar utilizando el nombre asociado a la
cuenta y contraseña ( Figura VI-16 b):
a) index.jsp b) inicioSistema.jsp
Figura VI-16. Ingreso exitoso al sistema
En caso de que el usuario no esté registrado, se enviará un mensaje de error (Figura VI-17 b):
138 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
a) inicioSistema.jsp b) noEncontrado.jsp
Figura VI-17. Ingreso no exitoso
1.b.- Registrar un nuevo usuario con los siguientes datos: nombre, cuenta, contraseña,
mail. Al elegir el botón “Registrar” ( Figura VI-17 a) debe salir una página para capturar
los datos del usuario ( Figura VI-18 a). Cuando el registro se hizo con éxito se despliega
una página como la de la Figura VI-18b.
a) llenaRegistro.jsp b) registroGuardado.jsp
2.a.- Con el botón “Ver usuarios” se despliegan todos los usuarios registrados (Figura VI-
19 b). (Con el botón “Salir” se redirecciona a la página de inicio).
6. ACCESO A BASE DE DATOS ÍNDICE 139
a) inicioSistema.jsp b) listaUsuarios.jsp
Figura VI-19. Ver usuarios registrados
2.b.- Con el botón “Borrar usuario” se podrá eliminar a un usuario registrado proporcio-
nando su cuenta y su clave. Al elegir el botón “Borrar un usuario” (Figura VI-19 b) se des-
pliega una página para capturar la cuenta y la contraseña del usuario que se quiere borrar
(Figura VI-20). Al dar clic en “Borrar un usuario” se despliega una página con el mensaje
apropiado (se borró con éxito o no). En la Figura VI-20 se muestra un caso de borrado con
éxito y uno sin éxito:
6.5.2 Solución
</body>
</html>
La clase Usuario.java:
ubl c cla ua o
6. ACCESO A BASE DE DATOS ÍNDICE 141
} catch (Exception e) {
System.out.println("Error en la conexion...");
e.printStackTrace();
return null;
88 }
return con;
}
6.5.2.2 El registro
La página llenaRegistro.jsp:
</body>
</html>
6. ACCESO A BASE DE DATOS ÍNDICE 143
El servlet registro.java:
ubl c cla e t o
Ge to D e to D = new Ge to D()
el e
e ue t et e ue tD atc e ( e o n e t o )
o wa ( e ue t e on e)
package Model;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
} catch (Exception e) {
System.out.println("Error en la base de datos.");
e.printStackTrace();
return false;
}
}
La página registroGuardado.jsp:
El servlet login.java:
package Controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
93
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Model.*;
import java.util.ArrayList;
try {
Usuario usuario;
GestorBD gestorBD = new GestorBD();
usuario = gestorBD.consultar(cuenta,clave);
if(usuario != null){
request.setAttribute("nombre",usuario.getNombre());
request.getRequestDispatcher("/inicioSistema.jsp")
.forward(request, response);
}else
request.getRequestDispatcher("/noEncontrado.jsp")
.forward(request, response);
} finally {
out.close();
try {
Usuario usuario;
GestorBD gestorBD = new GestorBD();
if(usuario != null){
request.setAttribute("nombre",usuario.getNombre());
request.getRequestDispatcher("/inicioSistema.jsp")
.forward(request, response);
}else
request.getRequestDispatcher("/noEncontrado.jsp")
.forward(request, response);
} finally {
out.close();
}
}
ConectaBD.cerrar();
return usuarioHallado;
}
6. ACCESO A BASE DE DATOS ÍNDICE 147
La página llenaRegistro.jsp:
La página capturaBorrado.jsp:
<tr>
<td align="right"> Contraseña: </td>
<td><input type="password" name="clave"></td>
</tr>
96
</head>
<body>
<%@ a e o t= ont olle bo a ua o %>
<h > Datos del usuario a borrar</h >
< orm act on= bo a ua o method="post">
148 <table cellspacing=" " cellpadding=" " border=" " >
DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<tr>
<td align="right"> Cuenta: </td>
<td><input type="text" name="cuenta"></td>
</tr>
<tr>
<td align="right"> Contraseña: </td>
<td><input type="password" name="clave"></td>
</tr>
</table>
El servlet borraUsuario.jsp:
ubl c cla bo a ua o
97
6. ACCESO A BASE DE DATOS ÍNDICE 149
ubl c boolean bo a
conn = onecta D ab ()
t = conn c eate tate ent()
RegistroBorrado.jsp:
noBorroRegistro.jsp:
150 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
El servlet muestraUsuarios.java:
package Controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Model.*;
@WebServlet(name = "muestraUsuarios",
urlPatterns = {"/muestraUsuarios"})
public class muestraUsuarios extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
ArrayList <Usuario> usuarios = new ArrayList<Usuario>();
Usuario usuario;
GestorBD gestorBD = new GestorBD();
usuarios = gestorBD.leeTodos();
if (usuarios != null){
request.setAttribute("Usuarios",usuarios);
request.getRequestDispatcher("/listaUsuarios.jsp")
.forward(request, response);
}else
request.getRequestDispatcher("/noHayRegistros.jsp")
.forward(request, response);
} finally {
out.close();
}
}
6. ACCESO A BASE DE DATOS ÍNDICE 151
La página listaUsuarios.jsp:
<%
ArrayList<Usuario> usuarios = null;
usuarios =
(ArrayList<Usuario>)request.getAttribute("Usuarios");
%>
152 <%
DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
ArrayList<Usuario> usuarios = null;
usuarios =
(ArrayList<Usuario>)request.getAttribute("Usuarios");
%>
<%
for (Usuario usuario: usuarios)
{
%>
<tr align rigth >
<td><%=usuario.getCuenta() %></td>
<td><%=usuario.getNombre() %></td>
<td><%=usuario.getClave() %></td>
<td><%=usuario.getMail() %></td>
</tr>
<% } %>
</table>
<br>
<form action="inicioSistema.jsp" method="post">
<input type="submit" value="Regresar">
</form>
</body>
</html>
104
6. ACCESO A BASE DE DATOS ÍNDICE 153
7.1 Objetivos
7.2 Introducción
En el capítulo anterior hemos aprendido a desarrollar una aplicación Web con conexión a una
base de datos que tiene las funcionalidades básicas: buscar un registro, darlo de alta, darlo de
baja y desplegar todos los registros de una tabla. Sin embargo, aún faltan por estudiar aspectos
adicionales que brindan robustez a estas aplicaciones. En este capítulo explicamos algunos de
los más sencillos. El mundo de las aplicaciones Web es bastante extenso. En este curso hemos
visto sólo una introducción que permitirá posteriormente comprender cursos más avanzados.
En ocasiones es muy útil guardar datos que estén disponibles para todas las páginas y servlets
de una sesión. Esto evita tener que pasar constantemente la información de un lado a otro.
Por ejemplo, en la práctica del capítulo anterior, la página index.jsp pasa a inicioSistema.jsp los
datos del usuario. Y en inicioSistema.jsp, que es la página de bienvenida, se escribe el nombre
del usuario, como se observa en la Figura VII-1 b):
156 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
a) index.jsp b) inicioSistema.jsp
Pero si después accesamos otra página, por ejemplo la lista de todos los usuarios registrados
(Figura VII-2 a), y regresamos a la página de bienvenida, entonces el nombre del usuario se
pierde, como se observa en la Figura VII-2 b:
a) listaUsuarios.jsp b) inicioSistema.jsp
Figura VII-2. Ver usuarios registrados y regresar
Hemos modificado el código del servlet login.Java para guardar el atributo “nombre” en
una sesión, en lugar de guardarlo en el request.
7. ALGUNOS ASPECTOS ADICIONALES ÍNDICE 157
package Controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Model.*;
import java.util.ArrayList;
import javax.servlet.http.HttpSession;
try {
Usuario usuario;
GestorBD gestorBD = new GestorBD();
usuario = gestorBD.consultar(cuenta,clave);
if(usuario != null){
HttpSession session = request.getSession();
session.setAttribute("nombre", usuario.getNombre());
//request.setAttribute("nombre",usuario.getNombre());
request.getRequestDispatcher("/inicioSistema.jsp")
.forward(request, response);
}else
request.getRequestDispatcher("/noEncontrado.jsp")
.forward(request, response);
} finally {
out.close();
}
}
<%
String nombre= (String) session.getAttribute("nombre");
%>
<h1> Hola <%= nombre %> bienvenido al sistema!</h1>
105
158 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
JavaScript es un lenguaje que se usa para extender las capacidades del HTML. JavaScript fun-
ciona del lado del cliente (lo interpreta el navegador) y se incluye adentro del código de una
página Web. JavaScript está orientado a documento, es decir, se usa principalmente para ha-
cer algunas adiciones en las páginas Web. El estudio de JavaScript es tema para otro libro, aquí
sólo lo aplicaremos para validar que los datos de un formulario estén completos. Podremos
comprender cómo lo hace porque su sintaxis es muy similar a la de Java.
<script>
. . .
</script>
Los JavaScripts pueden ir en cualquier parte del código de la página Web, nosotros lo escribi-
remos en el <body> antes de iniciar con el código HTML.
Para accesar los campos del formulario en JavaScript, es necesario dar nombre al formulario.
En nuestro ejemplo, le llamaremos forma:
name="forma"
Y para accesar a cada uno de los campos del formulario se utiliza la siguiente sintaxis:
document.nombreFormulario.nombreCampo.value
El siguiente código es el de la página index.jsp del Sistema Gestor de Productos visto en el ca-
pítulo anterior. Le hemos agregado un JavaScript que verifica que todos los campos del formu-
lario estén llenos. Los navegadores ya tienen implementada la ventana de alerta de JavaScript,
para lanzarla sólo es necesario invocarla con:
alert(“mensaje”);
7. ALGUNOS ASPECTOS ADICIONALES ÍNDICE 159
<body>
< page import ontroller registro >
<h2> istema de esti n de productos</h2>
< c t>
unct on al a( o )
( ocu ent o a cla e alue == )
ale t( alta nt o uc la cla e )
el e
( ocu ent o a no b e alue == )
ale t( alta nt o uc el no b e )
el e
( ocu ent o a ec o alue == )
ale t( alta nt o uc el ec o )
el e
( ocu ent o a cant alue == )
ale t( alta nt o uc la cant a )
el e
o ub t()
< c t>
108
160 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
</form>
</body>
</html>
En la Figura VII-3 se muestra un ejemplo de la ventana que aparece con la instrucción “alert”
de JavaScript:
Los JavaBeans son clases Java con las siguientes reglas establecidas:
Los JavaBeans son componentes reutilizables que ofrecen un determinado servicio. El pro-
gramador que los implementa hace públicos los métodos que sirven para utilizarlo, y privados
los que contienen el “cómo lo hace”, es decir, la lógica interna. A continuación, presentamos
10
7. ALGUNOS ASPECTOS ADICIONALES ÍNDICE 161
El JavaBean producto sólo tiene los métodos para acceder a sus atributos, faltaría imple-
mentar métodos que hicieran operaciones sobre sus atributos.
Existen tags especializados para trabajar con JavaBeans, éstos abrevian el código de los script-
les y las expresiones de las JSP.
110
162 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Para hacer uso del Bean en una JSP existen los siguientes tags:
• jsp:useBean
Este tag sirve para construir un nuevo Bean, y su sintaxis es la siguiente:
Ejemplo:
• jsp:getProperty
Este tag sirve para leer el atributo (propiedad) de un Bean. El valor leido se guarda en el nom-
bre del atributo (property name). La sintaxis es la siguiente:
Ejemplo:
• jsp:setProperty
Este tag sirve para modificar un atributo (property) de un Bean, y su sintaxis es la siguiente:
Ejemplo:
Si queremos poner en el atributo del Bean el valor que se recibe en el objeto request, enton-
ces en lugar de utilizar value, usamos param.
Ejemplo:
Si el nombre del parámetro en el objeto request tiene el mismo nombre que el del atributo del
Bean, entonces no será necesario usar param.
Ejemplo:
Cuando todos los nombres de los atributos del Bean son los mismos que los nombres en el
request, se puede hacer la siguiente abreviación, y nos permite apreciar el porqué trabajar con
Beans puede llegar a ser más práctico que los scriptlets.
Ejemplo:
<% producto.setClave(request.getParameter(“clave”));
producto.setNombre(request.getParameter(“nombre”));
producto.setPrecio(request.getParameter(“precio”));
producto.setCantidad(request.getParameter(“cantidad”));
%>
En proyectos grandes, el uso de los JavaBeans es una práctica común. El ejemplo anterior
nos permite apreciar el porqué trabajar con Beans puede llegar a ser más práctico que con
scriptlets.
164 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Una secuencia de escape es la forma en la que se desactiva el efecto de uno o varios caracteres
que forman parte de un comando. Cuando se usa la secuencia de escape, se escribe literal-
mente el o los caracteres.
Por ejemplo, si en una página HTLM queremos que se despliege “<html>” literalmente en la
página, en lugar de que se interprete como un tag entonces ponemos: <code><html></
code>
En la siguiente tabla presentamos la secuencia de escape de los caracteres especiales más uti-
lizados:
Cuando estamos desarrollando una aplicación Web que hace acceso a base de datos, es prác-
tico saber cómo pasar la base de datos con la que estamos trabajando a otra computadora. Al-
gunos ambientes para manejar bases de datos tienen la opción para exportar/importar bases
de datos. Nosotros proporcionamos la manera generál de hacerlo.
Lo primero que hay qué hacer es localizar el directorio en donde se encuentra el comando
mysqldump, por regla general se encuentra en el directorio bin de la instalación de mysql.
Es necesario abrir la consola del sistema operativo y situarse en este directorio, como en el
ejemplo de la Figura VII-4:
7. ALGUNOS ASPECTOS ADICIONALES ÍNDICE 165
Es muy importante proporcionar una ruta de acceso en donde se tenga permiso para escribir,
ya que, si no damos esta ruta, el comando intentará escibir en el directorio bin y se recibirá el
error “acceso denegado”, ya que normalmente no tenemos permiso para escribir en este sub-
directorio. En la Figura VII-5 exportamos la base de datos llamada escuela. Nótese que en el
comando de la Figura VII-5, usuario es el nombre del usuario con el que se accesa a la base
de datos, en este caso root, y que el password se proporciona después de dar el comando.
El script con los comandos para crear la base de datos en otra computadora se escribió en el
archivo escuela_dump.sql
Hay varias formas de importar una base de datos, puede hacerse desde la ventana del sistema
operativo, o desde la ventana de comandos MySQL, (también desde un ambiente manejador
de base de datos). A continuación, importaremos la base de datos que exportamos en el ejem-
plo de la sección anterior: escuela_dump.sql.
Una vez que ya nos encontramos dentro de la base de datos, ejecutamos el comando sour-
ce y el archivo con extensión .sql que es donde se encuentra el script. Es muy importante
notar que las diagonales de la ruta de acceso no deben estar invertidas (voltearlas a mano, si
es necesario).
8.1 Objetivos
- Conocer en qué consiste el Framework “JavaServer Faces” y los servicios que éste pro-
porciona y principales componentes.
- Saber en que consisten los JavaBeans administrados y entender su alcance.
- Entender cómo se comunican las vistas con la lógica de la aplicación.
- Saber navegar desde una página Web hacia un Bean y desde una clase Java hacia una
página Web.
- Conocer los elementos básicos de la interfaz de usuario en JSF.
JavaServer Faces (JSF) es otro entorno de desarrollo de aplicaciones Web en Java, diferente
al de los Servlets que hemos visto hasta ahora. Esta tecnología está diseñada para simplificar
el desarrollo Web con Java, y fomenta la separación de la presentación de las interfaces de
usuario con la lógica de la aplicación. JSF utilizaba JSPs, añadiendo librerías que contienen
componentes de alto nivel (menús, paneles, campos de texto,…), cada uno de estos compo-
nentes puede interactuar con el servidor de forma independiente. En la actualidad, se utilizan
“Facelets” que son páginas con extensión xhtml que sirven para lo mismo que las JSF pero son
una forma más sencilla de trabajar. Como JavaServer Faces es un “ framework” (marco de re-
ferencia), simplifica el diseño de la estructura de la aplicación y también proporciona librerías
que hacen más facil el desarrollo de la aplicación.
Con JavaServer Faces es posible utilizar Ajax (Asynchronous JavaScript and XML). Ajax es
un enfoque en el que las diferentes acciones que solicita el usuario se realizan dentro de una
misma página, de tal manera que el servidor no genera una nueva página sino sólo los datos.
En las aplicaciones tradicionales, cada petición al servidor hace que éste genere una nueva
página HTML/XHTML. Las aplicaciones RIA (Rich Internet Applications), como lo es JSF,
intentan simular las aplicaciones de escritorio y, cuando usan Ajax, son más rápidas que las
aplicaciones tradicionales.
JSF contiene dos importantes componentes de software: las Tag Libraries y los Managed Beans.
Los Facelets son páginas .xhtml con librerías adicionales llamadas Tag libraries. Las librerías
de etiquetas (tag libraries) son componentes especiales de software que encapsulan funcio-
nalidad dinámica y compleja. Estas librerías las construyen especialistas en ciertos servicios,
como, por ejemplo: el acceso a la base de datos, o el manejo de botones, menús, desplegado de
listas, etc. La idea principal es que el diseñador de las vistas pueda incorporar poderoso con-
tenido dinámico en sus páginas sin necesidad de saber cómo se codifican los detalles.
JSTL (JavaServer pages Standard Tag Library) es una librería que contiene la funcionalidad
más comun de las aplicaciones Web. Los diseñadores de páginas Web sólo deben saber cómo
incluir los tags. JSF proporciona componentes para construir una aplicación con GUIs (Gra-
phical User Interfaces: Interfaces de Usuario Gráficas). El desarrollador personaliza objetos
como menús, check box, botones, etc. manipulando los atributos de los tags de cada uno de
estos componentes.
Cuando creamos un proyecto en JavaServer Faces en NetBeans, se generan XHTML, las cual
se llaman facelets, y ya tienen incluidas las Tag libraries.
Un Bean administrado (Managed Bean) es un JavaBean que puede ser accedido desde una
página Web. El managed Bean se inventó para que el usuario remoto pueda comunicarse con
un programa en Java que está en el servidor. A diferencia de los JavaBeans, los managed Beans
no están obligados a implementar la interfaz serializable.
También existen los Beans CDI (Context and Dependency Injection). Los CDI poseen un mo-
8. LOS PRINCIPIOS DE JAVASERVER FACES ÍNDICE 169
delo un poco más avanzado para administrar los Beans, sin embargo, aún no se ha demos-
trado su ventaja sobre los Managed Beans, por lo tanto, en este curso, trabajaremos con los
Managed Beans.
En la Figura VIII-1 se muestra la conexión de una página wWeb con su managed Bean asocia-
do. JavaServer Faces usa el mecanismo de los managed Beans para establecer la conexión entre
los datos que se despliegan al usuario y lo que está registrado en el código Java.
• Vistas.- Se implementan con páginas .xhtml a las que se les llama facelets. Los Ma-
naged Beans también pueden usarse como parte de la vista. Incluso, si una clase Java
organiza las páginas Web y sus correspondientes Managed Beans (de la vista) entonces
la clase Java también es parte de la vista.
• Modelo.- Las clases con la lógica de la aplicación se construyen con clases Java.
En la sección VIII.7 estudiaremos ejemplos de cómo implementar estas tres capas en un pro-
yecto JavaServer Faces, en NetBeans.
XML (Extensible Markup Language) es un lenguaje de marcado de texto, que permite de-
finir etiquetas personalizadas que describen y organizan datos. Se dice que es un lenguaje
de etiquetas, porque cada paquete de información está delimitado por dos etiquetas como
se hace en HTML, con la diferencia de que las etiquetas XML describen el significado de la
información que contiene cada etiqueta, mientras que las etiquetas HTML se ocupan de la
presentación del contenido y no de su significado.
El siguiente es un ejemplo de XML. Al igual que en HTML, el fin de la etiqueta se indica con
el caracter “/”. Nótese que las etiquetas se anidan para que el código sea más claro:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
Con la etiqueta <session-config> sabemos que los datos que ésta encierra se refieren a
la configuración de la sesión. Con la etiqueta anidada: </session-timeout> podemos
intuir que el dato se refiere al tiempo que una sesión puede permanecer inactiva.
Los archivos escritos en este XML son archivos de texto con la extensión XML. Estos archi-
vos .XML siempre están presentes en las aplicaciones Javaweb, ya que sirven para indicar su
configuración. Como el XML es un archivo clave, se genera automáticamente cuando se crea
8. LOS PRINCIPIOS DE JAVASERVER FACES ÍNDICE 171
un proyecto Web (en NetBeans, eclipse, etc…) y, aunque algunas dependencias se generan
automáticamente, es necesario agregar las dependencias que no son autogeneradas en este
archivo.
Se les llama dependencias a todos aquellos elementos sw que el sistema requiere para fun-
cionar (librerías Java, librerías JSF, conector a base de datos, etc.). Escribir directamente las
dependencias en los archivos XML, da pié a que se cometan errores, ya que hay que escribir
mucho código repetitivo. Las anotaciones en el contexto de las aplicaciones Web, surgieron
como una forma de simplificar la codificación, reducir los errores y facilitar el mantenimiento
de los sistemas Web.
Las anotaciones Java permiten indicar en el código fuente cómo debe comportarse el software.
También sirven para añadir metadatos al código fuente. Los metadatos son “información acer-
ca de la información”. Por eso se dice que con las anotaciones se asocia la meta-información.
8.2.5 XHTML
Una de las características más importantes del XHTML es que tanto el texto como las imáge-
nes pueden ser hipervínculos. Se pueden consultar varios manuales de XHTML en español en
la Web. También recomendamos [Deitel P., Deitel H., Internet & World Wide Web, 2008] que
tiene un capítulo dedicado a XHTML con ejemplos muy prácticos. Y otro capítulo dedicado
a las hojas de estilo (CSS).
172 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Hay dos maneras de declarar un JavaBean administrado, con anotaciones y con comandos
especiales en un archivo faces-config.xml, en este curso trabajaremos con anotaciones.
Existen diferentes ámbitos en los que puede operar un Bean. Los ámbitos más representati-
vos, de menor a mayor alcance, son: petición, vista, sesión y aplicación. Con la anotación de
ámbito, se establece el alcance de los métodos y atributos de un Bean. Las anotaciones para los
ámbitos más utilizados son las siguientes:
@RequestScoped.- Persiste sólo durante la petición (request) del usuario. Cuando se envía
la respuesta correspondiente (response), se elimina la instancia del Bean. El constructor se
ejecuta cada vez que la página se solicita.
@SessionScoped .- El Bean está activo durante toda la sesión del usuario. En otras palabras,
mientras la sesión exista, existe el Bean.
Para declarar un managed Bean con anotaciones es necesario poner antes del nombre de la
clase, la anotación @ManagedBean. En seguida se pone una anotación para declarar el al-
cance del Bean, posteriormente se declara el nombre del Bean, con sus atributos privados y el
constructor vacío. Cada atributo de un Bean debe tener su método getter y setter.
JavaServer Faces administra los managed Beans automáticamente, por eso deben cumplir con
estas características mencionadas. Las tres acciones que JSF hace de manera automática con
los managed Beans son:
8. LOS PRINCIPIOS DE JAVASERVER FACES ÍNDICE 173
@ManagedBean
@RequestScoped
public class EjemploBean{
. . .
Cuando renombramos un Bean, se puede hacer referencia a él con otro nombre desde las pá-
ginas JSF, la sintaxis para renombrar es la siguiente:
@ManagedBean(name=”nombreBean”)
Por ejemplo:
@ManagedBean (name=”Ejemplito”)
@RequestScoped
public class EjemploBean{
. . .
Toda aplicación Web hecha con JavaServer Faces tiene tres objetos que se instancian automá-
ticamente:
http://download.oracle.com/otndocs/jcp/el-3_0-fr-eval-spec/index.html
Las expresiones de valor (value expressions) son probablemente las expresiones EL más utili-
zadas porque son las que se utilizan para hacer referencia a los métodos y los atributos de un
objeto o de un managed Bean. EL proporciona un conjunto de objetos implícitos que sirven
para obtener valores de parámetros y atributos de diferentes ámbitos. Con las value expres-
sions se pueden acceder fácilmente los métodos y atributos de un JavaBean, las colecciones y
los datos de tipo enum.
• rvalue.- Son aquellas que pueden leer los datos, pero no pueden sobreescribirlos. Se
encierran entre llaves, precedidas por el carácter $, es decir, tienen la sintaxis: ${ }
• lvalue.- Son las que pueden leer y escribir en los datos. Se encierran entre llaves, pre-
cedidas por el carácter #, es decir, tienen la sintaxis: #{ }
#{nombreBean.atributoBean}
Y para acceder al método de un Bean, los paréntesis son obligatorios sólo cuando el método
recibe parámetros:
Nótese que se utilizó letra minúscula en nombreBean, esto se debe a que JSF instancia au-
tomáticamente un objeto de la clase NombreBean, y cuando se desea acceder a un atributo
del Bean con EL hay que usar el objeto, no la clase.
8. LOS PRINCIPIOS DE JAVASERVER FACES ÍNDICE 175
Ejemplo:
@ManagedBean
@RequestScoped
public EjemploBean(){
}
#{ejemploBean.atributo1}, #{ejemploBean.atributo2}
176 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
public EjemploBean(){
}
Cuando queremos hacer referencia a uno de los atributos de Direccion, utilizamos la nota-
ción de anidamiento, que es la siguiente:
#{ejemploBean.atributo3.calle}, #{ejemploBean.atributo3.nume-
ro}, #{ejemploBean.atributo3.codigoPostal}
Como pudimos apreciar en los ejemplos anteriores, EL nos permite enlazar la vista con el
modelo.
En JavaServer Faces todo se maneja con etiquetas <h: …. /> y <f: …./>.
Como JSF se basa en la filosofía de componentes que interactúan con el servidor de forma
114
independiente, no se manejan las etiquetas HTLM, como <form>, <input>, <select>, sino
etiquetas para los componentes de JSF, como son por ejemplo <h:form>, <h:inputText>, <h:-
selectOneListBox>. Los componentes JSF brindan funcionalidad del lado del servidor, como
conversiones de tipo, formateo, la posibilidad de definir campos de texto obligatorios, entre
otras.
178 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
En cualquier etiqueta se pueden accesar los métodos y los atributos de un Bean con la siguien-
te sintaxis:
#{nombreBean.atributoBean}
#{nombreBean.metodoBean()}
<h: inputText …. /> para campos de texto. En el siguiente ejemplo, junto al campo de texto
se pone la etiqueta nombre del campo.
<h: inputtext pt:placeholder =”nombre del campo” />
<h: commandButton …. /> para botones.
Es común utilizar los botones para la navegación implícita, es decir, en el action se pone el
nombre de la vista a la que se va a transferir el control. No se necesita poner la extensión, como
en el siguiente ejemplo, en el que el botón con la etiqueta “ir a página 2” nos lleva a la vista que
se llama “pagina2”:
<h:commandButton value=”Ingresar”
action=”#{loginBean.validarUsuario}”/>
Cuando se instancia una página web (.xhtml), se instancia también su managed Bean asocia-
do. En la Figura VIII-3 se ilustra el caso en el que se despliega un facelet en el navegador, en
ese momento se instancian todos los managed Beans asociados con ese facelet, lo que implica
que en ese momento se ejecutan los constructores de los managed Beans.
8. LOS PRINCIPIOS DE JAVASERVER FACES ÍNDICE 179
Cada vez que el usuario modifica el dato de uno de los campos de la página Web, automáti-
camente se modifica su atributo correspondiente en el managed Bean asociado. A esto se le
conoce como ligado de datos (data binding en inglés).
Figura VIII-3. Los Managed Beans se instancian cuando se despliega la página a la que están asociados
Es muy importante comprender lo que sucede con la vida de los managed Beans en función de
su alcance, para poder llevar un control adecuado de la información.
@RequestScoped.- El constructor del Managed Bean se ejecuta cada vez que se hace un re-
quest desde la página asociada al Bean (desplegar, pulsar un botón,…). Los datos del Bean se
actualizan cada vez que se construye Bean y se pierden cuando el managed Bean desaparece.
@ViewScoped.- Su constructor se ejecuta cada vez que se despliega la página asociada al Bean.
Los datos están presentes mientras se despliegue la página y se pierden cuando la página des-
aparece, ya que también desaparece el managed Bean.
La navegación estática es la navegación más sencilla, consiste en pasar de una página a otra.
En el siguiente código de ejemplo se asocia la página “homeSistema” a la acción del botón
de comando, es decir, cuando el usuario seleccione el botón “Entrar” se desplegará la página
homeSistema.xhtml.
En la navegación dinámica se ejecuta un método del Managed Bean asociado, cuando el usua-
rio selecciona un botón de la página Web. En este Bean se inicia el proceso de la información,
y la página destino se determina después de que se finaliza este proceso.
Para enviar el control a un Bean es necesario indicar el nombre del Bean y el método al que se
enviará el control. En el siguiente ejemplo, se transfiere el control al método registrar del
Bean login. Como el método registrar no requiere parámetros, no se usan paréntesis.
8.5.3 Flujo desde una clase Java hacia una página Web
Hay dos opciones para desplegar una página desde una clase Java; la primera es invocar al
método de un managed Bean que regresa el nombre de la página destino, y la segunda es con
el comando redirect. En el primer caso, el método toma la decisión de que vista se desplegará,
pero la transferencia se hace desde la página Web que lo invoca. En el segundo caso, la trans-
ferencia se hace desde la clase Java con el comando redirect.
182 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Primero hay que hacer un managed Bean que implemente la interfaz Serializable. Den-
tro de este Bean se codifican los métodos que regresan un String con el nombre de la pá-
gina a la que se hará la transferencia. Este String es el que espera el parámetro “action” del
commandButton.
También se puede usar el comando “redirect”, para desplegar una página Web desde cual-
quier clase. Su sintaxis es la siguiente:
FacesContext.getCurrentInstance().getExternalContext().re-
direct(“nombreVista”);
FacesContext.getCurrentInstance().getExternalContext().re-
direct(nombre.nombreMetodo(parámetro));
En este último comando, el método invocado debe devolver un String con el nombre de la
vista. A continuación, presentamos un ejemplo:
Nota: El comando redirect siempre debe estar dentro de un try-catch. NetBeans genera auto-
máticamente el try-catch con “clic” derecho.
116
184 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
</center>
</h form>
</h body>
</html>
AdministraVista administrador
118
186 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
package Controller;
import java.io.IOException;
import javax.faces.context.FacesContext;
import Model.Interfaces;
- Form.- Encapsula un grupo de controles que envían datos de la página Web a la aplicación,
es análogo a la etiqueta </Form> de HTML. Su sintaxis es:
- SelectBooleanCheckbox.- Crea una casilla con dos estados: activado y desactivado. Su sin-
taxis:
<h:selectBooleanCheckbox
value=”#{formulario.recibirInfo}” />
<h:selectManyCheckbox value=”#{formulario.idiomas}”>
<f:selectItem itemValue=”español” itemLabel= “Español”/>
<f:selectItem itemValue=”ingles” itemLabel= “Ingles”/>
<f:selectItem itemValue=”frances” itemLabel= “Frances”/>
<f:selectItem itemValue=”aleman” itemLabel= “Aleman”/>
</h:selectManyCheckbox>
- SelectManyListbox.- Crea una lista que permite seleccionar múltiples elementos. Su sintaxis:
<h:selectManyListbox value=”#{formulario.lenguajes}”>
<f:selectItem itemValue=”c” itemLabel= “C”/>
<f:selectItem itemValue=”c++” itemLabel= “C++”/>
<f:selectItem itemValue=”java” itemLabel= “Java”/>
<f:selectItem itemValue=”python” itemLabel= “Python”/>
</h:selectManyListbox>
<h:selectOneRadio value=”#{formulario.genero}”>
<f:selectItem itemValue=”masculino” itemLabel= “Masculi
no”/>
<f:selectItem itemValue=”femenino” itemLabel= “Femenino”/>
</h:selectOneRadio>
8. LOS PRINCIPIOS DE JAVASERVER FACES ÍNDICE 189
<h:selectOneMenu value=”#{formulario.sistema}”>
<f:selectItem itemValue=”windows” itemLabel= “Windows”/>
<f:selectItem itemValue=”linux” itemLabel= “Linux”/>
</h:selectOneMenu>
En la figura VIII-8 se muestran ejemplos de los elementos para hacer una selección.
Figura VIII-8. Ejemplos de elementos de interfaz de usuario para hacer una selección
En el siguiente capítulo aprenderemos cómo hacer un proyecto JSF en NetBeans y cómo codi-
ficar el facelet Muestra Elementos y su managed Bean asociado.
9. Primer proyecto JSF en NetBeans
9.1 Objetivos
Para crear un proyecto JSF con NetBeans hay que crear una aplicación Web (Web Application)
como hemos hecho hasta ahora, pero además hay que llegar al cuarto paso, para definir el
marco de trabajo JSF, como en la Figura IX-1:
contiene la configuración de JSF. El proyecto se creó con el servidor Apache Tomcat, como se
puede apreciar en la carpeta de librerías.
rar un facelet nuevo, hacer clic derecho en WebPages, y luego seleccionar new/JSF Page. Como
ya se explicó en la sección de ligado de datos, los facelets tienen asociado un managed Bean en
el que se actualizan los datos que el usuario introduzca en la página Web.
Se pueden generar automáticamente el constructor, los setters y los getters de los atributos
declarados.
194 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Para que se despliegue la imagen agregamos una nueva carpeta que llamaremos “images”. La
imagen debe estar en /NetBeansProjects/ProyectoJSF_1/web/images.
Cuando se comienza una ruta con la diagonal: “/”, significa que la primera parte de la ruta será
la necesaria para llegar a la carpeta “Web Pages” del proyecto JSF.
login
<h:commandButton actionListener="#{login.aceptar()}"
value="Aceptar" />
<h:commandButton value="Registrarse"
action="{login.registrarUsuario()" />
</center>
</h:form>
</h:body>
</html>
Los botones “Aceptar” y “Registrarse” ejecutan dos acciones diferentes. Con “Aceptar” se
transfiere el control al método aceptar() del Bean login, mientras que con “Registrarse”
el control pasa al método registrarUsuario() del mismo Bean login.
Ahora haremos una aplicación en la que la página principal (Figura IX6) tiene dos botones.
Con el botón “Mostrar” se transfiere el control a la página MostrarElementosInterfaz.xhtml,
con ejemplos de elementos para seleccionar, y con el botón “Ir a sonrisa” se despliega una
imagen.
121
196 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Para mostrar una página con algunos elementos para seleccionar (menú, checkbox…) co-
menzaremos construyendo un facelet al que llamaremos muestraElementosInterfaz.xhtml, al
que agregaremos el botón más sencillo: el BooleanCheckbox.
<h head>
<title>Muestra elementos</title>
</h head>
<h body>
<h form id form >
<center>
<h:selectBooleanCheckbox alue formulario recibir nfo />
<span> eseo recibir más informaci n </span> <br/><br/>
<h commandLin alue egresar action index />
</center>
</h form>
</h body>
</html>
El comando:
<h:commandButton value=”Mostrar”
action=”muestraElementosInterfaz” />
Es muy importante que cada atributo del managed Bean que se utilice en la vista a la que está
ligado, tenga su setter y/o su getter. Incluir getter cuando en la vista se lee el atributo y setter
cuando éste se modifica. En la Figura IX-8 se muestra el mensaje de error que despliega el na-
vegador, cuando el Managed Bean asociado a una página Web, no contiene el setter o el getter
del atributo al cual se pretende acceder desde la página:
9. PRIMER PROYECTO JSF EN NETBEANS ÍNDICE 199
Figura IX-9. Ejemplos de elementos de interfaz de usuario para hacer una selección
200 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<h:head>
<title>Muestra elementos</title>
</h:head>
<h:body>
<h:form id="form">
<center>
< elect oolean ec bo
value="#{formulario.recibirInfo}" >
<span> Deseo recibir más información </span>
<span> </span>
<span><i><b>BooleanCheckbox</b></i></span><br/><br/><br/>
<span><i><b>selectManyCheckbox</b></i></span>
<br/><br/><br/>
<td>
< elect ne a o value="#{formulario.genero}">
<f:selectItem itemValue="masculino"
itemLabel= "Masculino"/>
<f:selectItem itemValue="femenino"
itemLabel= "Femenino"/>
< elect ne a o>
<span><i><b>
selectOneRadio</b></i></span><br/><br/><br/>
</td>
</tr>
</table>
< elect ne enu value="#{formulario.sistema}">
125
9. PRIMER PROYECTO JSF EN NETBEANS ÍNDICE 201
</h:body>
</html>
El código del managed Bean Formulario.java, que está asociado a la vista muestraEle-
mentosInterfaz.xhtml, es el siguiente:
12
202 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
127
Al final de la lección 5 de SEAWeb 2 podrás operar en vivo el ejemplo que hemos estudiado
en este capítulo.
10. Captura, procesamiento y muestra de
información en JSF
10.1 Objetivos
- Construir una aplicación Web en la que se capturen los datos del usuario, se procesen
y se desplieguen los resultados.
- Comprender en la práctica el alcance de los Managed Beans y la disponibilidad de su
contenido.
10.2 Introducción
En este capítulo aprenderemos a capturar datos del usuario para luego procesarlos y desplegar
el resultado. Construiremos una aplicación que presenta al usuario una página de captura.
Cuando el usuario proporciona la información y selecciona el botón “Calcular”, se procesa la
información y se despliega el resultado.
Como estudiamos anteriormente, los campos para capturar información en un facelet pueden
ser de tipo texto o de selección. Recordemos cómo se captura desde un campo de texto:
<h:selectManyCheckbox value=”#{formulario.idiomas}”>
<f:selectItem itemValue=”español” itemLabel= “Español”/>
204 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
La selección del usuario se guarda en el atributo idiomas del mannaged bean formula-
rio, el cual debe ser un ArrayList de String, que guardar la lista de cadenas seleccionadas.
La página de captura de datos se muestra en la Figura X-1:
Usaremos la arquitectura MVC, así que construimos un paquete llamado Controller para
guardar ahí los dos Managed beans de la aplicación: el que lleva el control y el del formulario.
También hay otro paquete llamado Model que contiene una pequeña clase que ejecuta la ló-
gica de la aplicación. Este pequeño ejemplo, contiene sólo una multiplicación en la parte del
procesamiento de los datos. La Figura X-2 muestra la estructura del Proyecto:
10. CAPTURA, PROCESAMIENTO Y MUESTRA DE INFORMACIÓN EN JSF ÍNDICE 205
Para poder capturar los datos que introduce el usuario se construye un Managed Bean que
tiene como atributos los nombres de los campos de captura del facelet. Recuerda que debe
tener los métodos setters y getters para cada uno de los atributos que se capturan en la página
Web. El código del Managed Bean es el siguiente:
@ManagedBean(name="formularioManagedBean")
package Controller;
import javax.faces.bean.ManagedBean;
import java.util.ArrayList;
import javax.faces.bean.SessionScoped;
@ e on co e
public class FormularioManagedBean {
private String nombre;
private Double sueldo;
private int numDias;
private ArrayList <String> idiomas;
public FormularioManagedBean() {
idiomas = new ArrayList <String>();
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Double getSueldo() {
return sueldo;
}
private String nombre;
private Double sueldo;
private int numDias;
private ArrayList <String> idiomas;
public FormularioManagedBean() {
206 idiomas = new DRA. MARÍA DEL
ArrayList CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<String>();
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Double getSueldo() {
return sueldo;
}
public void setSueldo(Double sueldo) {
this.sueldo = sueldo;
}
public int getNumDias() {
return numDias;
}
public void setNumDias(int numDias) {
this.numDias = numDias;
}
public ArrayList<String> getIdiomas() {
return idiomas;
}
public void setIdiomas(ArrayList<String> idiomas) {
this.idiomas = idiomas;
}
}
El controller debe tener acceso a los datos que proporcionó el usuario para poder pedir al
model que los procese y posteriormente mandar a desplegar el resultado del procesamiento.
@ManagedProperty(value=”#{nombreDelBeanAInyectar}”)
Posteriormente se agrega un atributo que debe ser de la clase del bean que se inyectó. La sin-
taxis es la siguiente:
208 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
@ManagedProperty(value=”#{formularioManagedBean}”)
private FormularioManagedBean formularioManagedBean;
import Model.Modelo;
import . . .
10. CAPTURA,
publicPROCESAMIENTO Y MUESTRA DE INFORMACIÓN EN JSF
void ejecutar(){ ÍNDICE 209
try {
sueldo = formularioManaged ean.getSueldo();
numDias = formularioManaged ean.getNumDias();
// Se pide al model que calcule el salario
ala o = calcula o calcula ala o( uel o nu D a )
// Se redirecciona a la página "resultado"
acesContext.getCurrent nstance().getExternalContext()
. e ect( e ulta o t l );
} catch ( Exception ex) {
ogger.get ogger(ControllerManaged ean
.class.getName()).log( evel.SE E E, null, ex);
}
}
}
Es importante subrayar que también es necesario hacer un setter y un getter para el objeto del
bean131
que se inyecta, de lo contrario saldrá el error de la Figura X-3: “No existe la propiedad
formularioManagedBean para el bean administrado controllerManagedBean”.
Figura X-3. Error cuando no se tienen el setter y getter del bean que se inyectó
Para poder desplegar datos y resultados del procesamiento, aprenderemos en la siguiente sec-
ción, a accesar los atributos de los Managed Beans desde un facelet.
210 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<span>Sueldo: </span>
<h:outputText value="#{ o mu a io ana dB an.sueldo}"
style=" width:25%;" />
<br/><br/>
</h:body>
</html>
La página resultado.xhtml tiene acceso a los datos de los dos managed beans: controller-
ManagedBean y formularioManagedBean. Esto se debe a que ambos beans tienen
un alcance de sesión. Es muy importante tener en cuenta el alcance de los beans, el cual debe
determinarse en función de la necesidad de cada aplicación en particular.
10. CAPTURA, PROCESAMIENTO Y MUESTRA DE INFORMACIÓN EN JSF ÍNDICE 211
La elección del alcance depende de los datos que contiene el managed bean. Se usa @Re-
questScoped cuando sólo se despliegan datos en la página asociada. Se usa @View-
Scoped cuando se incluyen elementos ajax en la página (validación ajax, diálogos, etc.). Si
es necesario tener un mismo dato disponible durante toda la sesión, entonces utilizaremos @
SessionScoped, por ejemplo: datos específicos del cliente, como el usuario y las preferen-
cias de usuario (idioma, etc). Y se utiliza @ApplicationScoped para datos o constantes
de uso común, como listas desplegables que son iguales para todos. También puede usarse
para beans administrados que sólo tienen métodos, sin atributos.
Abusar del alcance @ApplicationScoped para los datos que son de sesión, vista, o so-
licitud (request), hará que los datos se compartan entre todos los usuarios, y que cualquiera
pueda ver los datos de los demás. El uso abusivo de @SessionScoped para datos que son de
vista (o request) hace que los datos perduren más tiempo del necesario y podría haber incon-
sistencias al navegar de una vista a otra porque se complica mantener los datos actualizados.
Si usamos un bean @RequestScoped para datos que deberían ser @viewScoped enton-
ces los datos se reinicializan al valor predeterminado en cada postback (ajax), y posiblemente
no funcionarán bien los formularios.
En la Figura X-4 se ilustra lo que sucede cuando el sistema intenta desplegar resultado.xhtml.
El mensaje de error es el siguiente:
Figura X-4. Cuando dos managed bean tienen diferentes alcances surgen problemas
Codificamos getters para los atributos del controllerManagedBean. Como sólo se des-
plegará la información (no se captura), no codificamos setters, ya que no se necesitan.
10. CAPTURA, PROCESAMIENTO Y MUESTRA DE INFORMACIÓN EN JSF ÍNDICE 213
o mu a io ana dB an
Usamos:
controllerManagedBean
Al final de la lección 6 de SEAWeb 2 podrás operar en vivo el ejemplo que hemos estudiado en
este capítulo. En la figura X-5 se ilustra el funcionamiento del proyecto de ejemplo:
134
214 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
10.6 Práctica
Construir una aplicación similar al ejercicio de la sección anterior, pero que solicite los puntos
obtenidos en un videojuego y que de cómo resultado el nivel del jugador, de acuerdo con la
siguiente tabla:
11.1 Objetivos
Se utiliza el acrónimo “CRUD” para nombrar a una aplicación con las funciones básicas de
base de datos que son, por sus siglas en inglés: Create, Read, Update, Delete (crear, leer, ac-
tualizar y borrar). En esta sección construiremos una aplicación CRUD para administrar una
base de datos que contiene las materias de Ingeniería en Computación.
Hacer la base de datos llamada materiasIngComp que contiene una tabla llamada “ueas”. Re-
cordar que para crear la base de datos se usa el comando:
Después hay que entrar a la base de datos por medio del comando:
En la Figura XI-1 se muestran los comandos para crear la tabla “ueas”, sus campos son:
> INSERT INTO ueas VALUES(‘460006’, ‘Programacion Orientada a Objetos’, ‘2’, ‘Pro
gramacion Estructurada’);
Ahora prepararemos nuestra aplicación para leer y desplegar lo que hay en la tabla “ueas”.
Primero creamos un proyecto JSF llamado UeasIngComp, con los paquetes Controller y Mo-
del. En Model tenemos las clases ConectaBD, GestorBD y Uea. En el paquete Controller
el managed bean ControllerManagedBean. En la Figura XI2 se muestra la fotografía
del proyecto:
Recordar que es muy importante agregar en las librerías del proyecto, el conector
a la base de datos.
11. PROYECTO JSF CON ACCESO A BASE DE DATOS ÍNDICE 217
con sus respectivos setters y getters. En las siguientes secciones analizaremos los demás com-
ponentes del proyecto.
Dentro del paquete Model del proyecto, creamos la clase ConectaBD, la cual contiene el có-
digo para conectarse a la base de datos llamada “MateriasIngComp”. Su constructor establece
la conexión con la base de datos. El método getConexion() regresa el objeto conexion
218 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
package Model;
Para leer la lista de elementos de la tabla UEA, creamos la clase GestorBD, la cual contiene
un método para leer una lista de UEA, como se muestra a continuación:
package Model;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
En la Figura XI-3 se muestra la vista que se le presentará al usuario. Ésta despliega una tabla
con todos los registros encontrados en la base de datos.
El código del facelet (index.xhtml) de la Figura XI3 contiene el tag <h:dataTable, cuya
sintaxis es la siguiente:
<h:form>
<h:dataTable value=”#{nombreManagedBean.nombreLista}”
var=”claseDelElemento” >
<h:column>
<f:facet name=”header”>Encabezado 1</f:facet>
#{claseDelElemento.atributo1}
</h:column>
. . .
<h:column>
<f:facet name=”header”>Encabezado N </f:facet>
#{claseDelElemento.atributoN}
</h:column>
</h:dataTable>
</h:form>
11. PROYECTO JSF CON ACCESO A BASE DE DATOS ÍNDICE 221
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>UEA Ing Comp</title>
</h:head>
<h:body>
<h2 style="color: blue;">Lista de UEA de Ingeniería en
Computación</h2>
<h:form>
<h:dataTable value="#{controllerManagedBean.ueasList}"
var="uea" border="2"
cellspacing="1" cellpadding="1">
<h:column>
<f:facet name="header">Clave</f:facet>
#{uea.clave}
</h:column>
<h:column>
<f:facet name="header">Nombre</f:facet>
#{uea.nombre}
</h:column>
<h:column>
<f:facet name="header">Trimestre</f:facet>
#{uea.trimestre}
</h:column>
<h:column>
<f:facet name="header">Requisito</f:facet>
#{uea.requisito}
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
222 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
package Controller;
import Model.GestorBD;
import Model.Uea;
import java.util.ArrayList;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean(name = "controllerManagedBean")
@SessionScoped
public class ControllerManagedBean {
public ControllerManagedBean() {
gestorBD = new GestorBD();
ueasList = gestorBD.leerUeas();
}
Figura XI-5. Vista agregar_UEA.xhtml para que el usuario proporcione los datos de la UEA nueva
<span>Nombre: </span>
<h:inputText value="#{controllerManagedBean.nombre}"
style=" width:25%;" />
<br/><br/>
<span>Trimestre: </span>
<h:inputText value="#{controllerManagedBean.trimestre}"
style=" width:9%;" />
<br/><br/>
<span>Requisito: </span>
<h:inputText value="#{controllerManagedBean.requisito}"
style=" width:25%;" />
<br/><br/>
<br/><br/>
<h:commandButton value="Submitir" type="submit"
action="#{controllerManagedBean.guardarUEA()}" >
</h:commandButton>
</h:form>
</h:body>
</html>
11. PROYECTO JSF CON ACCESO A BASE DE DATOS ÍNDICE 225
pedirDatosUEA_aAgregar ()
redirect("agregar_UEA.xhtml");
controllerManagedBean
gestorBD
if (gestorBD.guardarUea(ueaNueva)){
try{
ueasList = gestorBD.leerUeas();
FacesContext.getCurrentInstance()
.getExternalContext()
.redirect("index.xhtml");
}catch(IOException ex) {
Logger.getLogger(ControllerManagedBean
.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
226 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
En la Figura XI-6 se observa cómo se despliega la lista actualizada con la nueva UEA que
agregó el usuario:
Si lo ponemos entre <span> </span> el botón “Borrar UEA” queda alineado con el botón
“Agregar UEA”, como se muestra en la Figura XI-7:
Figura XI-7. Vista con los botones “Agregar UEA” y “Borrar UEA”
Figura XI-8. Vista borrar_UEA.xhtml para que el usuario ingrese clave y nombre de la UEA a borrar
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Borrar UEA</title>
</h:head>
<h:body>
<h:form id="form" style="width: 100%;padding: 20px 33px;">
<h2 style="color: blue;">Proporciona clave y nombre de la UEA
a eliminar</h2>
<span>Clave: </span>
<h:inputText value="#{controllerManagedBean.clave}"
style=" width:25%;" />
<br/><br/>
<span>Nombre: </span>
<h:inputText value="#{controllerManagedBean.nombre}"
style=" width:25%;" />
<br/><br/>
<br/><br/>
<h:commandButton value="Submitir" type="submit"
action="#{controllerManagedBean.borrarUEA()}" >
</h:commandButton>
</h:form>
</h:body>
</html>
11. PROYECTO JSF CON ACCESO A BASE DE DATOS ÍNDICE 229
pedirDatosUEA_aBorrar ()
redirect("borrar_UEA.xhtml");
gestorBD
if (gestorBD. orrarUea(ueaABorrar)){
try{
ueasList = gestorBD.leerUeas();
FacesContext.getCurrentInstance()
.getExternalContext()
.redirect("index.xhtml");
}catch(IOException ex) {
Logger.getLogger(ControllerManagedBean
.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
230 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
En la Figura XI-9 se observa como se despliega la lista actualizada y ya no aparece la UEA que
borró el usuario:
<span>
<h:commandButton value=”Modificar UEA”
type=”submit”
action=”#{controllerManagedBean
.pedirDatosUEA_aLocalizar()}”>
</span>
En la Figura XI-10 se observa la vista que incluye también el botón “Modificar UEA”. El méto-
do pedirDatosUEA _ aLocalizar() redirecciona a la página localizar_UEA.xhtml en
la que se pide la clave y el nombre de la UEA a modificar.
Figura XI-10. Vista con los botones “Agregar UEA”, “Borrar UEA” y “Modificar UEA”
action=”#{controllerManagedBean.localiza-
rUEA()}” >
</h:commandButton>
localizarUEA()
if(gestorBD.localizaUEA(clave,nombre))
modificar_UEA.xhtml
else
"error.xhtml"
Si en la base de datos no hay una UEA con la clave y nombre proporcionados, se despliega el
mensaje de error de la Figura XI-12; al dar clic en “Ok” la aplicación muestra nuevamente la
página de inicio: “index.xhtml”.
11. PROYECTO JSF CON ACCESO A BASE DE DATOS ÍNDICE 233
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Borrar UEA</title>
</h:head>
<h:body>
<h:form id="form" style="width: 100%;padding: 20px 33px;">
<img src="#{ e ue t conte t at a e e o e "
width="80" height="80"/>
<span> o b e </span>
<h:outputText value="#{cont olle ana e ean no b e}"
style=" width:25%;" />
<br/><br/>
<span>
<h:commandButton alue= act on= n e />
</span>
</h:form>
</h:body>
</html>
(En este ejemplo añadimos una imagen que está localizada dentro de la carpeta “images” que
a su vez están en la carpeta “Web Pages”).
234 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
return false;
return true;
En caso de que si se localice en la base de datos un registro con la clave y el nombre proporcio-
nados, entonces el método localizarUEA() redirecciona a la página modificar_UEA.xht-
ml para que el usuario introduzca las modificaciones que desea. En este ejercicio, el usuario
podrá modificar cualquier campo excepto la clave de la UEA. Si requiere cambiar la clave será
necesario borrar primero la UEA y después darla de alta con la clave correcta. Por esta razón,
en la Figura XI-3 se observa que la clave se despliega con un <h:outputText:
Figura XI-13. Vista modificar_UEA.xhtml para que el usuario ingrese los nuevos datos de la UEA
11. PROYECTO JSF CON ACCESO A BASE DE DATOS ÍNDICE 235
gestorBD
if (gestorBD.modi icarUea(uea_a_Cambiar)){
try{
ueasList = gestorBD.leerUeas();
FacesContext.getCurrentInstance().getExternalContext()
.redirect("index.xhtml");
}catch(IOException ex) {
Logger.getLogger(ControllerManagedBean
.class.getName()).log(Level.SEVERE, null, ex);}
}
}
En la Figura XI-14 se observa cómo se despliega la lista actualizada, la última UEA contiene
los cambios que solicitó el usuario:
236 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
11.10 Práctica
1.- En la página de inicio se debe desplegar la lista de videojuegos registrados en una base
de datos. Los campos de cada registro se muestran en la Figura XI-15:
1.a).- Crear una base de datos en MySQL llamada “videojuegos” con una tabla llamada
“existencias”. Los campos de la tabla existencias son los siguientes:
- clave int
- nombre varchar
- genero varchar
- plataforma varchar
- precio varchar
1.b).- Con el botón “Agregar Nuevo” se podrá agregar un nuevo registro en la base de datos.
En la Figura XI-16 se muestra la página de captura del registro de un nuevo videojuego.
238 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
1.c).- Con el botón “Borrar” se podrá borrar un registro de la base de datos. Para borrar un
registro, primero se debe desplegar una página para pedir la clave y el nombre del video-
juego, como se muestra en la Figura XI-17:
Figura XI-17: Solicitud de la clave y el nombre del videojuego que se quiere borrar
1.d).- Con el botón “Modificar” se podrán modificar los datos de un registro existente. Pri-
mero será necesario solicitar la clave y el nombre para validar que el registro se encuentre
en la base de datos, como se muestra en Figura XI-18:
11. PROYECTO JSF CON ACCESO A BASE DE DATOS ÍNDICE 239
Figura XI-18. Página que pide los datos del videojuego que se quiere modificar
En caso de que éste no se encuentre, se debe desplegar una página con un mensaje de error,
indicando que no se encontró el registro. Al seleccionar el botón “Ok” se despliega nuevamen-
te la página de inicio.
12.1 Objetivos
Los validadores evitan que surjan errores de procesamiento debido a datos incompletos o con
formato incorrecto que introduce el usuario. Para usar los validadores de JavaServer Faces es
necesario incluir la librería:
xmlns:f=”http://java.sun.com/jsf/core”
Cuando es indispensable que el usuario introduzca el dato en un campo, sólo hay que agregar
el indicador required=true en el campo de texto, por ejemplo:
<h:inputText id=”numeroCuenta”
value=»#{loginBean.numeroCuenta}”
required=»true»/>
Cuando el usuario deja vacío un campo de texto marcado como obligatorio, se despliega un
mensaje de texto por default. Para el campo “Nombre” del ejemplo de la Figura XII1 se codificó:
Figura XII-2. Error cuando el usuario pone más dígitos de los permitidos
Determina si una entrada numérica entra dentro de un rango aceptable. Los validadores es-
tándar de JSF que sirven para validar el rango son:
En la Figura XII-3 presentamos un ejemplo con tres errores. En el primer campo se proporcio-
nó un número mayor que 100. El segundo campo sólo admite números enteros y en este ejem-
plo contiene un número real, y el tercer campo tiene un valor fuera del rango especificado.
<h:body>
<h:form id="form">
<center>
<span style="margin-right: 15px;"> Numero 1 (máximo
100):</span>
<h:inputText id="num1" value="#{inicio.num1}">
<f:validateDoubleRange maximum="100"/>
</h:inputText><br/><br/>
<h:commandButton value="enviar"
action="#{inicio.sumar}"/>
</center>
</h:form>
</h:body>
Para invocar al método validador de un campo de texto, es necesario incluir la propiedad va-
lidator, en esta propiedad se indica el método de un managed Bean que se invocará para hacer
la validación y el nombre del atributo que se va a validar, por ejemplo:
\w+([-+.]\w+)
157
Esta expresión regular indica que una dirección de e-mail es válida si el lado izquierdo de la
arroba @ contiene uno o más caracteres de palabra (una letra, un carácter alfanumérico o
guión bajo), seguido opcionalmente de un guión, signo + o punto y más caracteres de palabra.
Además, el lado derecho de @ debe contener uno o más grupos de caracteres de palabra sepa-
rados por guión o punto. Por ejemplo, las siguientes direcciones de mail son válidas.
pedro-paramo@mi-email
[email protected]
[email protected]
12. VALIDADORES Y EXISTENCIA DE LIBRERÍAS ADICIONALES ÍNDICE 245
Existen librerías que mejoran la presentación del front-end. PrimeFaces y RichFaces son dos
de las más utilizadas. Con estas librerías, los elementos de la Interfaz de Usuario (botones,
menus, tablas, etc.) son más llamativos que los de JSF. Hay tutoriales interactivos en internet
que enseñan a utilizar cada uno de estos elementos de la interfaz de usuario. Para PrimeFaces
recomendamos:
http://www.primefaces.org/showcase/
http://showcase.richfaces.org/
http://livedemo.exadel.com/richfaces-demo/
Cabe señalar que RichFaces está descontinuado, es decir, ya no habrá nuevas versiones, por lo
que se sugiere PrimeFaces como primera opción.
246 DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
Bibliografía
Basham B., Sierra K., Bates B. , Head First Servlets and JSP, O Reilly & Associates, 2nd Ed,
USA, 2008.
Deitel P., Deitel H., Internet & World Wide Web, How to program. Pearson-Prentice-Hall,
USA, 2008.
Deitel P., Deitel H., Cómo programar en Java, Pearson Educación, 7a ed., México, 2008.
Falkner J., Jones K., Servlets and JavaServer Pages, Addison-Wesley, USA, 2004.García-Molina
H., Ullman J., Widom J., Database Systems. The Complete Book, Pearson-Prentice Hall,
USA, 2009.
Leonard A., Mastering JavaServer Faces 2.2, Master the art of implementing user interfaces
with JSF 2.2, Packt Publishing, U.K., 2014.
Murach J, Steelman A. Murach´s JavaServlets and JSP, Ed. Murach’s, 2nd edition, USA, 2008.
INTRODUCCIÓN A LA PROGRAMACIÓN WEB CON JAVA ÍNDICE 247
Glosario de términos
Aplicación Web.- Es un conjunto de páginas que funcionan en internet; éstas páginas son las
que el usuario ve a través de un navegador de internet (Internet Explorer de Microsoft,
Chrome, Mozilla Firefox, etc.).
Controlador.- Es el software que procesa las peticiones del usuario. Decide qué modulo tendrá
el control para que ejecute la siguiente tarea
JSP.- JavaServer Page es una página HTML a la que se le incrusta código Java.
Modelo.- Contiene el núcleo de la funcionalidad, es decir, ejecuta la “lógica del negocio”. Se le lla-
ma lógica del negocio a la forma en la que se procesa la información para generar los resulta-
dos esperados. El modelo se conecta a la base de datos para guardar y recuperar información
Página Web dinámica.- Es una página Web en la cual el servidor procesa la información pro-
porcionada por el usuario y muestra los resultados de este procesamiento.
Página Web estática.- Es una página Web informativa, en la que el usuario no puede hacer
modificaciónes.
Servlet.- Es una clase Java (hija de la clase HttpServlet) que corre en el servidor.