Está en la página 1de 153

Lenguaje de

Programacin II

LENGUAJE DE PROGRAMACIN II

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

ndice
Presentacin
Red de contenidos

4
5

Unidad de Aprendizaje 1

HTML, JQuery, Servlet, JSP y JDBC.


1.1 Tema 1 : HTML, JSP y elementos de script
1.1.1 : Etiquetas HTML 5.
1.1.2 : JSP y elementos de script
1.2 Tema 2
1.2.1
1.2.2
1.2.3

:
:
:
:

JQuery, Servlet y JSP


JQuery
Validaciones con JQuery
Arquitectura del Servlet

7
7
15
20
20
23

1.3 Tema 3 : JDBC, Aplicaciones Parte I


1.3.1 : Aplicacin de Logueo
1.3.2 : Aplicacin de Listado

35
36
43

1.4 Tema 4 : JDBC, Aplicaciones Parte II


1.4.1 : Aplicacin de Mantenimiento

46
46

Unidad de Aprendizaje 2

CRUD con patrn DAO, sesiones y Lenguaje de Expresiones


2.1 Tema 5 : Patrn DAO Parte I
2.1.1 : Patrones de diseo de software
2.1.2 : Patrn DAO
2.1.3 : Aplicacin Listado
2.2 Tema 6
2.2.1
2.2.2
2.2.3
2.2.4

:
:
:
:
:

Patrn DAO Parte II, Sesiones Web y EL

Lenguaje de expresiones
Aplicacin Mantenimiento
Sesiones web
Aplicacin de Logueo

55
55
60
65
74
74
74
83
85

Unidad de Aprendizaje 3

Etiquetas JSTL, Transacciones, Ajax y Listeners


3.1 Tema 7 : Custom Tag y JSTL
3.1.1 : Custom Tag
3.1.2 : Creacin de etiquetas personalizadas (Custom TAG)
3.1.3 : JSTL y Libreras
3.1.4 : Aplicacin Listado con JSTL
3.2 Tema 8
3.2.1
3.2.2
3.2.3

:
:
:
:

Ajax y Transacciones en Web

AJAX
Transacciones
Aplicacin Ajax y Transaccin

3.3 Tema 9 : Listeners


3.3.1 : Tipos
3.3.2 : Aplicaciones

CIBERTEC

93
93
93
103
116
118
118
121
125
146
146
149

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

Presentacin
Lenguaje de Programacin II pertenece a la lnea de cursos de programacin y se
dicta en la carrera de Computacin e Informtica. El curso brinda un conjunto de
herramientas del lenguaje Java que permite a los estudiantes utilizarlas en la
implementacin de aplicaciones web en Java.
El manual para el curso ha sido diseado bajo la modalidad de unidades de aprendizaje,
las que se desarrollan durante semanas determinadas. En cada una de ellas, hallar los
logros que debe alcanzar al final de la unidad; el tema tratado, el cual ser ampliamente
desarrollado; y los contenidos, que debe desarrollar, es decir, los subtemas. Asimismo,
encontrar las actividades que deber desarrollar en cada sesin, que le permitirn
reforzar lo aprendido en la clase.
El curso es eminentemente prctico: consiste en desarrollar una aplicacin web. En
primer lugar, se inicia con crear programas utilizando la tecnologa de Servlet y JSP.
Contina con la presentacin de nuevas tecnologas como el patrn Data Access
Object, sesiones en la web. Luego, se desarrollan los componentes reutilizables
mediante CustomTag. Finalmente, se concluye con el uso de transacciones, Ajax,
JQuery y Listeners.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

Red de contenidos

Lenguaje de Programacin II

Servlet y JSP

Sesiones y
EL

Customg
Tag

JSTL

Sesiones

Tag
Dinmicos

JSTL

EL

Generacin
de Libreras

Servlet

JSP

AJAX

Patrn DAO

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

AJAX

LENGUAJE DE PROGRAMACIN II

UNIDAD

1
HTML, JQuery, JSP Y JDBC
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno implementa una aplicacin Java Web que
utilice las tecnologas JQuery, JSP y Servlet con base de datos.

TEMARIO
1.1 Tema 1
1.1.1
1.1.2
1.2 Tema 2
1.2.1
1.2.2
1.2.3
1.2.4
1.3 Tema 3
1.3.1
1.3.2
1.4 Tema 4
1.4.1

:
:
:
:
:
:
:
:
:
:
:
:
:

HTML, JSP y elementos de script


Etiquetas HTML 5
JSP y elementos de script
JQuery, Servlet y JSP
JQuery
Validaciones con JQuery
Arquitectura del Servlet
Servlet y JSP
JDBC, Aplicaciones Parte I
Aplicacin de Logueo
Aplicacin de Listado
JDBC, Aplicaciones Parte II
Aplicacin de Mantenimiento

ACTIVIDADES PROPUESTAS
Los alumnos resuelven ejercicios que involucran el uso de etiquetas
HTML 5 y validacin de datos.
Los alumnos implementan una aplicacin con base de datos para realizar
mantenimiento y logueo a un portal web.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

1.1 HTML, JSP Y ELEMENTOS DE SCRIPT


HTML, siglas de HyperText Markup Language (lenguaje de marcas de hipertexto),
hace referencia al lenguaje de marcado para la elaboracin de pginas web. Es un
estndar que sirve de referencia para la elaboracin de pginas web en sus diferentes
versiones, define una estructura bsica y un cdigo (denominado cdigo HTML) para
la definicin de contenido de una pgina web, como texto, imgenes, videos, entre
otros. Es un estndar a cargo de la W3C, organizacin dedicada a la estandarizacin
de casi todas las tecnologas ligadas a la web, sobre todo en lo referente a su escritura
e interpretacin.
JSP, es un lenguaje para la creacin de sitios web dinmicos, acrnimo de Java
Server Pages. Est orientado a desarrollar pginas web en Java. JSP es un lenguaje
multiplataforma. Creado para ejecutarse del lado del servidor. JSP fue desarrollado por
Sun Microsystems. La tecnologa de JSP permite a los desarrolladores y a los
diseadores de web desarrollar rpidamente y mantener fcilmente pginas
dinmicas, tambin permite introducir cdigo para la generacin dinmica de HTML
dentro de una pgina web.

1.1.1 Etiquetas HTML5


HTML es el lenguaje usado para escribir las pginas web, describe la estructura y el
contenido usando solo texto y lo complementa con objetos tales como imgenes, flash
y otros. Los archivos as creados son guardados con la extensin de archivo HTM o
HTML. Su estructura se compone de etiquetas o tags entre las cuales van insertados
los diferentes elementos que componen la pgina como son los bloques de texto,
scripts y la ruta a la ubicacin de archivos externos como imgenes y otros archivos
multimedia.
Es ms ligero al ser ms sencillo y simple el cdigo, lo que permite que las pginas
escritas en este lenguaje carguen ms rpido en el navegador. Si an no fuera
suficiente, introduce infinidad de opciones que hasta ahora estaban vedadas a las
pginas web, como insertar directamente video (no flash), msica, y casi cualquier
elemento.
Formulario
Es el contenedor principal donde se encuentran los controles que utilizaremos para
ingresar informacin referente a una entidad de un sistema.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

Parmetros de la etiqueta FORM

action: sirve para indicar a donde enviaremos los datos introducidos en los
campos del formulario, un destino determinado como: servlet, jsp, etc.
method: este atributo indica el modo de transmisin de los datos. El
modo GET utiliza la direccin URL para pasar los valores introducidos en los
campos
del
formulario,
da
como
resultado
una
url
como:
(www.plataforma.com/enviar.jsp?Apellido=Lara&Nombre=Luis).
El
modo
POST enva los datos como parte de la entrada estndar (no visible en la url).
name: Identifica el nombre del formulario, este nombre facilita identificar el
formulario desde el script.
target: Indica la ventana de destino diferente a la del envi de los datos.
accept-charset: Especifica el juego de caracteres que el servidor utiliza para
gestionar los datos del formulario.
auto-complete: puede ser ON u OFF. Para activar el autocompletado de datos
del formulario.

Etiqueta INPUT
Esta es la etiqueta ms utilizada y tambin la que presenta ms opciones. El
atributo TYPE le permite indicar la clase de entrada de datos. El valor predeterminado
es TEXT y representa una lnea de entrada de datos.
Se lista los diferentes tipos de datos que trabaja la etiqueta INPUT:

TEXT
CHECKBOX
RESET
RADIO
PASSWORD
BUTTON
FILE
HIDDEN
IMAGE
SUBMIT

Atributos de la etiqueta input


El principal atributo de la etiqueta INPUT es TYPE, ya que es el que le indica el tipo de
datos que debe recibir. A continuacin mostraremos una lista de atributos que se le
pueden agregar a la etiqueta INPUT.

TYPE: Mencionado anteriormente, es el que indica el tipo de control de datos


que se ha elegido.
SRC: Indica el origen de los datos.
STEP: Permite establecer la cantidad de valores posibles dentro de un rango.
VALUE: Indica el valor que devuelve el control.
REQUIRED: Valor booleano que nos indica que es una informacin obligatoria.
PLACEHOLDER: Texto que sirve de informacin o gua al usuario y
desaparece al pulsar dentro del campo, anteriormente este efecto se creaba
con JavaScript

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

AUTOCOMPLETE: Indica se se activa (on) o se desactiva (off) el auto


completado de la entrada de datos.
ALT: Se utiliza cuando el tipo es una imagen y no se puede cargar en la
interfaz del usuario, se muestra este texto alternativo.
AUTOFOCUS: Permite especificar que una parte del formulario debe tener
foco para ingresar informacin cuando se carga la pgina.
CHECKED: Para indicar si el elemento est seleccionado por defecto, solo se
utiliza en algunos tipos.
DISABLED: Es un valor booleano que indica que el elemento est desactivado,
con lo cual no admite entrada de datos.
READONLY: Valor booleano que indica que el campo no se puede modificar,
solo lectura.
FORM ENCTYPE: Indica el modo de envo de los datos.
FORM ACTION: Es la direccin Url que se utiliza al activar el elemento.
FORM NOVALIDATE: Es un valor booleano que indica que el formulario no se
valida antes de enviarse.
FORM TARGET: Ventana del destino del formulario.
HEIGHT: Altura del campo en cuestin.
WIDTH: Anchura del campo en cuestin.
SIZE: Indica la cantidad de caracteres que se pueden introducir en el campo.
MAX: Valor mximo que se puede entrar en el elemento de datos.
MIN: Valor Mnimo que se puede entrar en el elemento de datos.
MAXLENGTH: Longitud mxima de la entrada de datos.
LIST: Es un identificador de una lista que se define con DATALIST
MULTIPLE: Valor booleano que indica que se permite la seleccin de valores
mltiples.
NAME: Nombre que identifica al campo de datos.
PATTERN: Expresin regular que se utiliza para validar entradas de datos.
Este atributo permite hacer validaciones muy complejas y utilizado
correctamente puede ahorrarse muchas lneas de cdigo.

Tipos de campos de formulario (Etiqueta - input)

Input Type:Text
El tipo texto representa una lnea de texto, como en casi todos los campos de
formulario su valor se puede inicializar utilizando el atributo value.

Input Type:Password
Representa una entrada de datos de texto que se visualizan asteriscos pero al
enviarse se envan los datos reales, el datos introducido en el campo se asigna
al atributo value.

Input Type:Hidden
Es un control que se mantiene oculto a la vista pero que se pasa al servidor
junto con el resto de los campos del formulario. Es un campo adecuado para
pasar informacin de una pgina a otra y que se puede utilizar en los script
como un dato ms. Al ser un control oculto, el usuario no puede ni ver ni
modificar. El dato se le asigna al atributo value.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

10

Input Type:Checkbox
Es un control que es presentado al usuario por una casilla de verificacin; por
lo tanto, slo puede tener dos valores: seleccionado o no seleccionado. Si se
utiliza el atributo checked, el campo se muestra seleccionado por defecto.

Input Type:Radio
Es un control que es presentado al usuario con botones de opcin; una variable
asignada a un grupo de botones en el que solo uno puede estar seleccionado.
Si se utiliza el atributo checked, el campo aparece seleccionado por defecto,
para informarle a HTML que todos los botones forman parte de un grupo de
opciones, estos comparten el atributo name.

Input Type:SUBMIT
Es un control que se representa por un botn que al ser pulsado enva los
datos recogidos por el formulario al destino escrito en el parmetro action, en
este caso el atributo value se utiliza para poner el texto dentro del botn.

Input Type:RESET
Es un control que se representa por un botn que al ser pulsado reinicia los
campos del formulario con los valores predeterminados. El atributo value se
utiliza como texto del botn.

Input type:File
Este control permite enviar archivos al servidor mediante el mtodo POST. En
el navegador se muestra un botn examinar o seleccionar para que podamos
elegir el archivo que se requiere enviar.

Etiqueta TEXTAREA
Se puede crear reas de texto (en columnas y filas) dnde el usuario pueda insertar
contenido donde requiere gran cantidad de informacin. A diferencia de los input de
tipo text, en los textarea el usuario puede incluir saltos de lnea. Rn parmetro rows y
cols indica la cantidad de filas y columnas que tendr el control.
Etiqueta FIELDSET
Sirve para agrupar los elementos. Se utiliza con su respectiva etiqueta de cierre y crea
un recuadro que rodea a los elementos de formulario colocados dentro de ella.
Etiqueta LEGEND
Sirve para nombrar o etiquetar un grupo creado con FIELDSET. Aade simplemente
una nota aclaratoria sobre qu tipo de informacin se est agrupando en el recuadro.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

11

Ejercicio 01: pagina01.html


Disear la siguiente pgina para ingresar y seleccionar datos

Cdigo:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="">
<fieldset>
<legend>Datos bsicos</legend>
Nombre<br>
<input type="text" name="nombre" required><br><br>
Descripcin<br>
<textarea rows="8" cols="30" name="descripcion" required></textarea>
<br><br>
Foto <input type="file" name="foto"><br><br>
<input type="checkbox" name="partida"> Partida
<input type="checkbox" name="pago"> Pago
</fieldset>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

12

<fieldset>
<legend>Datos econmicos</legend>
Precio
<input type="text" name="nombre" size="10" required> &ensp;&ensp;
Impuestos
<select name="inpuestos">
<option>4%</option>
<option>7%</option>
<option>16%</option>
<option>25%</option>
</select>
<br><br>
Promocin<br>
<input type="radio" name="promocion" >Ninguno<br>
<input type="radio" name="promocion" >Transporte gratuito<br>
<input type="radio" name="promocion" >Descuento 5%<br>
<br>
<input type="submit" value="Procesar">
<input type="reset" value="Nuevo">
</fieldset>
</form>
</body>
</html>

Nuevos Tipos de input


En HTML5 se han incluido nuevos tipos de entradas de datos para los formularios,
algunos de estos nuevos tipo de entrada tienen la capacidad de comprobar si el valor
introducido coincide con su tipo de dato lo que nos ayuda bastante a la hora de
solucionar la validacin de los datos que el usuario introduce.
Input type:url
Esta entrada de datos se utiliza para especificar una direccin web. Se muestra como
un simple campo de texto normal.
Input type:search
El tipo de entrada de datos Search(type="search") proporciona un campo de
bsqueda, es muy parecido a un campo de texto normal.
Input type: email
Se utiliza para especificar una o ms direcciones de correo electrnico. Soporta
el atributo booleano mltiple, para permitir varias direcciones separadas por coma.
Input type: number
El tipo number (input=number) proporciona una entrada de dato para agregar un
nmero. Normalmente se trata de un cuadro donde se puede escribir un nmero o
hacer clic en las flechas arriba o abajo para seleccionarlo.
Esta entrada de datos cuenta con los atributos max y min para especificar los valores
mnimo y mximos permitidos, tambin puede utilizar el atributo step, este determina la
cantidad a disminuir o aumentar cuando hace clic en las flechas.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

13

Input type: range


Este tipo de entrada de datos nos proporciona un deslizador en aquellos navegadores
que lo soportan. Al igual que number, permite los atributos min, max y step.
Input Type=Date
Esto engloba la fecha (ao, mes, da) pero no la hora; Ejemplo, 2008-06-22, Podemos
seleccionar el ao, mes y da.
Ejercicio 02: pagina02.jsp

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="">
<fieldset style="width:400px;">
<legend style="text-align:center">Registrar Empleado</legend>
<table border="0" width="100%">
<tr>
<td>Nombres:</td>
<td><input type="text" name="txt_nom" required autofocus
placeholder="Ingresar nombre"></td>
</tr>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

14

<tr>
<td>Apellido Paterno:</td>
<td><input type="text" name="txt_ape_pat" required
placeholder="Ingresar paterno"></td>
</tr>
<tr>
<td>Apellido Materno:</td>
<td><input type="text" name="txt_ape_mat" required
placeholder="Ingresar materno"></td>
</tr>
<tr>
<td>Sexo:</td>
<td>
<select name="cbo_sexo" style="width:165px">
<option>Masculino</option>
<option>Femenino</option>
</select>
</td>
</tr>
<tr>
<td>DNI:</td>
<td><input type="text" name="txt_dni" required
placeholder="Ingresar DNI"></td>
</tr>
<tr>
<td>Fecha Registro:</td>
<td><input type="date" name="txt_fecha" required></td>
</tr>
<tr>
<td>Celular:</td>
<td><input type="text" name="txt_celular"
placeholder="Ingresar celular"></td>
</tr>
<tr>
<td>Telefono:</td>
<td><input type="text" name="txt_telefono"
placeholder="Ingresar Telefono"></td>

</tr>
<tr>
<td>Correo:</td>
<td><input type="email" name="txt_fecha" required
placeholder="Ingresar correo"></td>
</tr>
<tr>
<td>Tipo Empleado:</td>
<td>
<select name="cbo_tipo" style="width:165px">
<option>Secretaria</option>
<option>Auditor</option>
</select>
</td>

</tr>
<tr>
<td>Direccion:</td>
<td><input type="text" name="txt_direccion"
placeholder="Ingresar direccion"></td>
</tr>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

15

<tr>
<td>Distrito:</td>
<td>
<select name="cbo_distrito" style="width:165px">
<option>Comas</option>
<option>Surco</option>
</select>
</td>
</tr>
<tr>

<td>Foto:</td>
<td><input type="file" name="txt_foto"></td>
</tr>
<tr height="60px">
<td colspan="2" align="center">
<button type="submit" value="Grabar">
<img src="../img/save.png" /> Grabar
</button></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>

1.1.2 JSP y elementos de script


JSP permite la creacin de sitios web dinmicos donde se puede combinar contenido
HTML y bloques de programacin en java que permitan la programacin de
sentencias.
JSP scripting incluye los siguientes elementos de cdigo Java que pueden aparecer
dentro de una pgina JSP:
Scriptlets
Expresiones
Scriptlets
Son porciones de cdigo Java mezclados con el lenguaje de marcas de la pgina. Un
scriptlet, o fragmento de cdigo, puede consistir de una o ms lneas de cdigo Java y
se puede usar con el cdigo HTML o JSP para configurar saltos condicionales o
bucles por ejemplo. Un scriptlet JSP est contenido dentro de los smbolos <%...%> y
se escribe usando la sintaxis Java.
Expresiones
Se evalan y convierten a valores de String y luego son mostradas en la ubicacin
respectiva dentro de la pgina. Una expresin JSP no termina en ;. Est contenida
dentro de los smbolos: <%=...%>.
Objeto request

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

16

El objeto request est disponible de forma automtica por lo que no es necesario


instanciarlo.
getParameter(String), permite recuperar una variable enviada por url.
setAttribute(String, Object), para cargar (setear) el objeto en el request.
getAttribute(String), para recuperar el objeto
Ejercicio 03: Acceso.jsp

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form name="frmAcceso method="post" action="AccesoAccion.jsp">
<table border="1" align="center" width="35%">
<tr>
<th colspan="2">Control de Acceso</th>
</tr>
<tr>
<td>Ingresar Cdigo:</td>
<td><input type="text" name="txt_codigo"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Procesar">
</td>
</tr>
</table>
</form>
</body>
</html>

AccesoAction.jsp

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

17

<%
String mensaje="",codigo;
codigo=request.getParameter("txt_codigo");
int digito=Integer.parseInt(""+codigo.charAt(0));
if(digito>=1 && digito<=4)
mensaje="Grupo Sistemas";
else if(digito==5)
mensaje="Gerencia General";
else if(digito>=6 && digito<=8)
mensaje="Portal Web";
else
mensaje="No existe Area";
request.setAttribute("msj", mensaje);
pageContext.forward("Respuesta.jsp");
%>

Respuesta.jsp

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
String msj=(String)request.getAttribute("msj");
%>
<h2 align="center">Acceso a : <%=msj%></h2>
</body>
</html>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

18

Ejercicio 04: Registro.jsp

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form name="frmRegistro method="post" action="RegistroAccion.jsp">
<table border="1" align="center" width="35%">
<tr>
<th colspan="2">Registro de Viajes</th>
</tr>
<tr>
<td>Apellidos y Nombres:</td>
<td><input type="text" name="txt_ape_nom"></td>
</tr>
<tr>
<td>Destino:</td>
<td>
<select name="cbo_destino" style="width:120px">
<option value="Cajamarca">Cajamarca</option>
<option value="Trujillo">Trujillo</option>
<option value="Arequipa">Arequipa</option>
<option value="Ayacucho">Ayacucho</option>
</select>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Procesar">
</td>
</tr>
</table>
</form>
</body>
</html>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

19

RegistroAction.jsp
<%
String mensaje[]=new String[3];
String datos,destino;
datos=request.getParameter("txt_ape_nom");
destino=request.getParameter("cbo_destino");
mensaje[0]=datos;
mensaje[1]=destino;
if(destino.equals("Cajamarca"))
mensaje[2]="150.00";
else if(destino.equals("Trujillo"))
mensaje[2]="180.00";
else if(destino.equals("Arequipa"))
mensaje[2]="210.00";
else
mensaje[2]="170.00";
request.setAttribute("msj", mensaje);
pageContext.forward("Ayuda.jsp");
%>

Ayuda.jsp

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
String msj[]=(String[])request.getAttribute("msj");
%>
<h4>
Cliente : <%=msj[0]%><br>
El precio del destino <%=msj[1]%> es de
S/. <%=msj[2] %> nuevos soles.
</h4>
</body>
</html>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

1.2

20

JQuery, Servlet y JSP

1.2.1. JQuery
JQuery es una librera gratuita y open source que simplifica la creacin de pginas
web altamente interactivas. Funciona en todos los exploradores de internet modernos
y abstrae caractersticas especficas de cada uno de estos, permitindonos
enforcarnos en el diseo y resultado final, en lugar de tratar de desarrollar funciones
complejas en exploradores individuales.
Especficamente jQuery facilita:

La bsqueda y manipulacin de contenido en una pgina HTML;


Trabajar con el modelo de eventos de los exploradores modernos;
Y aadir efectos y transiciones sofisticadas que vemos en pginas modernas, como
animaciones disparadas por eventos.

1.2.2. Validacin
Una de las tareas ms comunes en los sistemas, sea web o escritorio, es la validacin
de campos, ya que a partir de la informacin que se genere en formularios, sta ser
enviada para ser procesada.
Para realizar la validacin usamos los siguientes archivos:

jquery-1.11.3.js, es la librera principaldel JQuery.


jquery.validate.js, continene los mtodos para realizar la validacin en los
formularios.
jquery.metadata.js, Su funcionamiento permite incluir datos adicionales dentro de
nuestro cdigo HTML, estos datos utilizan el formato JSON

Ejercicio 01: registrarPelicula.jsp

Validar lo siguiente:

Ingresar en forma obligatoria: Nombre, Duracin, Director, Actores, Sinopsis.


Duracin solo nmero de 1 a 3 cifras

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

21

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Registro de Pelicula</title>
<!-- Se referencia al estilo -->
<link href="css/style.css" rel="stylesheet" type="text/css" />
<!-- Importar las librerias de Jquery -->
<script type="text/javascript" src="js/jquery-1.11.3.js"></script>
<script type="text/javascript" src="js/jquery.validate.js">
<script type="text/javascript" src="js/jquery.metadata.js">
<!-- Se indica que al momento de cargar la pagina,
se agregue el evento "validate" al control form -->
<script type="text/javascript">
$(document).ready(function() {
$("#dataPelicula").validate();
});
</script>
<!-- En JQuery se tiene en cuenta que los objetos pueden ser
llamados de la siguiente forma:
#+nombre: el caracter # buscara por el valor de "id" del control
.+nombre: el caracter . buscara por el valor de "class" del
control
- Siempre se inicia con "$" para invocar a una funcion de Jquery
- validate() es el metodo de Jquery.validate.js que utiliza los
tipos por defecto del atributo "class" (ej: required, number...)
-->
</head>
<body>
<form action="ServletMantenimientoPelicula" id="dataPelicula">
<table class="mitabla" cellspacing="0" cellpadding="3">
<tr>
<td colspan="2" class="grilla_cabecera">Registro
de
Pelcula</td>
</tr>
<tr>
<td>Nombre:</td>
<td><input type="text" name="nombre"
class="required" /></td>
</tr>
<tr>
<td>Genero:</td>
<td><select name="idGenero">
<option value="1">Comedia</option>
<option value="2">Drama</option>
<option value="3">Ciencia
Ficcin</option>
<option value="4">Romntico</option>
<option value="5">Animacin</option>
</select></td>
</tr>
<tr>
<td>Clasificacin:</td>
<td><input type="radio" name="clasificacion"
value="A" />Apta para todos<br />
<input type="radio" name="clasificacion"

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

22

<input type="radio" name="clasificacion"


value="C" />Adultos</td>
</tr>
<tr>
<td>Duracin:</td>
<td><input type="text" name="duracion"
class="{required:true,number:true,
rangelength:[1,3]}" /></td>
</tr>
<tr>
<td>Director:</td>
<td><input type="text" name="director"
class="required" /></td>

</tr>
<tr>
<td>Actores:</td>
<td><input type="text" name="actores"
class="required" /></td>
</tr>
<tr>
<td>Sinopsis:</td>
<td><input type="text" name="sinopsis"
class="required" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Registrar" />
<input type="reset" value="Limpiar" /></td>
</tr>
<tr>
<td colspan="2"><input type="hidden"
name="operacion" value="registrar" /></td>
</tr>
</table>
</form>
</body>
</html>

Nota:
Si trabajamos con jquery.validation hay que tener claros que son los mtodos de
validacin y las reglas de validacin.
Los mtodos de validacin implementan el cdigo necesario para validar un elemento.
Tenemos disponibles un nmero considerable de mtodos de validacin para las
comprobaciones ms habituales, pero siempre es posible agregar a jquery.validation
nuestras propias validaciones personalizadas.
Por otro lado, las reglas de validacin permiten asociar un elemento de nuestro
formulario a uno o ms mtodos de validacin.
Para asociar una regla de validacin a un elemento, podemos hacerlo de las
siguientes formas y pueden combinarse segn nuestras necesidades:

A travs de nombres de clases css en atributo class. Por ejemplo


class=required number especifica que nuestro elemento ser requerido y
slo aceptar nmeros.
Estos nombres de clases no tienen por qu existir en la hoja de estilos, son
clases que utilizar slo jquery.validation.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

23

A travs de cdigo javascript y aadiendo las reglas a travs del objeto


rules.

En el formulario de la pgina registrarPelicula.jsp se observa lo siguiente:

Se ha especificado las reglas de validacin a travs de nombres de clases.


Se ha llamado al mtodo validate() para el elemento dataPelicula, que
configura el formulario para que sea validado.
A partir de este momento, el formulario no podr ser enviado al servlet:
ServletMantenimientoPelicula si no cumple con las reglas impuestas.
Para mostrar los mensajes se tiene que abrir el archivo jquery.validate.js y
proceder a realizar los siguientes cambios:

1.2.3. Arquitectura del Servlet


Un servlet es un componente JEE que extiende la capacidad de proceso de un
servidor que emplea el paradigma request response. Por lo tanto, Un servlet es
una clase Java que recibe requerimientos de un cliente para cumplir con un servicio;
luego de cumplir con el servicio, enva la respuesta hacia el cliente.

Peticin (Request)

Servidor
web

Respuesta (Response)
Cliente
ejecutando
un Browser

CIBERTEC

Aplicacin web
Servlets

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

24

La API Servlet se constituye de dos paquetes bsicos:

javax.servlet
javax.servlet.http

Ciclo de Vida de un SERVLET

El ciclo de vida del servlet est compuesto de tres fases:


a) El mtodo init. Este mtodo es llamado por el servidor de aplicaciones cuando el
servlet se est cargando en memoria.
b) El mtodo service. Este mtodo es llamado por cada peticin de cliente. Para las
peticiones HTTP, este mtodo se ha especializado para enviar la peticin al
mtodo doGet o doPost.
c) El mtodo destroy. Este mtodo es llamado por el servidor de aplicaciones
cuando el servlet es descargado de memoria.
Los Servlets son cargados en memoria en la primera peticin de un cliente o cuando
el servidor de aplicaciones arranca.
Cada peticin de cliente es servida sobre un diferente hilo (thread); por lo tanto,
muchos clientes pueden acceder al mismo cdigo en paralelo. Es responsabilidad
del desarrollador sincronizar los accesos a los recursos compartidos.
Se pueden crear Servlets de un solo hilo (SingleThread) implementando la interfaz:
javax.servlet.SingleThreadModel

La clase HTTPSERVLET
Los clientes web (browsers) interactan con los Servlets usando el protocolo HTTP
(Request-Response); por lo tanto, para crear Servlets que soporten este protocolo,
se debe heredar de la clase javax.servlet.http.HttpServlet.
La clase HttpServlet provee una estructura de trabajo adecuada para manipular el
protocolo HTTP junto con los mtodos GET y POST.
Mtodos de la clase HttpServlet

protected doDelete(HttpServletRequest req, HttpServletResponse resp)


Called by the server (via the service method) to allow a servlet to
void

handle a DELETE request.


protected doGet(HttpServletRequest req, HttpServletResponse resp)
void
Called by the server (via the service method) to allow a servlet to

handle a GET request.


protected doHead(HttpServletRequest req, HttpServletResponse resp)
Receives an HTTP HEAD request from the protected service
void

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

25

method and handles the request.


protected doOptions(HttpServletRequest req, HttpServletResponse resp)
Called by the server (via the service method) to allow a servlet to
void

handle a OPTIONS request.


protected doPost(HttpServletRequest req, HttpServletResponse resp)
Called by the server (via the service method) to allow a servlet to
void

handle a POST request.


protected doPut(HttpServletRequest req, HttpServletResponse resp)
Called by the server (via the service method) to allow a servlet to
void

handle a PUT request.


protected doTrace(HttpServletRequest req, HttpServletResponse resp)
Called by the server (via the service method) to allow a servlet to
void

handle a TRACE request.


protected getLastModified(HttpServletRequest req)
Returns the time the HttpServletRequest object was last modified,
long

in milliseconds since midnight January 1, 1970 GMT.


protected service(HttpServletRequest req, HttpServletResponse resp)
Receives standard HTTP requests from the public service method
void

and dispatches them to the doXXX methods defined in this class.


void

service(ServletRequest req, ServletResponse res)

Dispatches client requests to the protected service method.

Mtodos de la clase HttpServletRequest


String

getAuthType()

Returns the name of the authentication scheme used to protect

the servlet
String

getContextPath()

Returns an array containing all of the Cookie objects the client


sent with this request.
Cookie[]

getCookies()

Returns an array containing all of the Cookie objects the client


sent with this request.
long

getDateHeader(String name)

Returns the value of the specified request header as a long


value that represents a Date object.
String

getHeader(String name)

Returns the value of the specified request header as a String.


Enumeration
getHeaderNames()

Returns an enumeration of all the header names this request


contains.
int

getIntHeader(String name)

Returns the value of the specified request header as an int.


String

getMethod()

Returns the name of the HTTP method with which this request
was made, for example, GET, POST, or PUT.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

String

26

getPathInfo()

Returns any extra path information associated with the URL the
client sent when it made this request.
String

getPathTranslated()

Returns any extra path information after the servlet name but
before the query string, and translates it to a real path.
String

getQueryString()

Returns the query string that is contained in the request URL


after the path.
String

getRemoteUser()

Returns the login of the user making this request, if the user has
been authenticated, or null if the user has not been authenticated.
String

getRequestedSessionId()

Returns the session ID specified by the client.


String

getRequestURI()

Returns the part of this request's URL from the protocol name
up to the query string in the first line of the HTTP request.
StringBuffe getRequestURL()
r
Reconstructs the URL the client used to make the request.
getServletPath()
String

Returns the part of this request's URL that calls the servlet.
HttpSession getSession()

Returns the current session associated with this request, or if


the request does not have a session, creates one.
HttpSession getSession(boolean create)

Returns the current HttpSession associated with this request or, if


there is no current session and create is true, returns a new
session.
boolean

getUserPrincipal()

Returns a java.security.Principal object containing the name of


the current authenticated user.
boolean

isRequestedSessionIdFromCookie()

boolean

isRequestedSessionIdFromURL()

Checks whether the requested session ID came in as a cookie.

Checks whether the requested session ID came in as part of


the request URL.
boolean

isRequestedSessionIdValid()

Checks whether the requested session ID is still valid.


boolean

isUserInRole(String role)

Returns a boolean indicating whether the authenticated user is


included in the specified logical "role".

DESPACHADOR DE LA PETICIN (Request Dispatcher)


El despachador de la peticin (RequestDispatcher) permite remitir una peticin
(request) a otro servlet o a otro componente JEE.
Un objeto RequestDispatcher es obtenido de la siguiente manera:
RequestDispatcher rd=getServletContext ().getRequestDispatcher (ruta);
Una vez obtenido el objeto RequestDispatcher, invocamos al otro recurso (servlet)
envindole el objeto request.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

27

rd.forward (request, response)


Hay que registrar el servlet MyForwardServlet para lo cual debemos modificar el
archivo web.xml.
COMPARTIENDO OBJETOS
Existen dos formas de compartir objetos entre Servlets:

El objeto ServletContext y

El objeto HttpServletRequest

El ServletContext es usado cuando un grupo de Servlets necesitan trabajar con un


mismo objeto. El servlet que desea compartir el objeto usa el mtodo setAttribute del
objeto ServletContext y otro servlet dentro del contexto de Servlets que desea tomar
el objeto usa el mtodo getAttribute. Ejemplo:
Servlet 1 (compartiendo objeto) :
MiClase elObjeto = new MiClase ();
getServletContext ().setAttribute(objeto, elObjeto);
Servlet 2 (tomando objeto):
MiClase elObjeto;
ElObjeto =(MiClase)getServletContext().getAttribute(objeto);

HttpServletRequest es usado cuando al hacer uso de una remisin (forward) se


necesita compartir un objeto entre Servlets. El servlet que desea compartir el objeto
usa el mtodo setAttribute del objeto HttpServletRequest y el otro servlet usa el
mtodo getAttribute. Ejemplo:
MiClase elObjeto = new MiClase();
request.setAttribute(objeto,elObjeto);
El Objeto =(MiClase)request.getAttribute(objeto);
Java Server Pages JSP
Un JSP es un servlet; por lo tanto, es un componente web que se encuentra en el
lado del servidor. Un JSP tiene cdigo Java dentro del cdigo en HTML (embedded);
a diferencia de los Servlets que pueden generar HTML desde cdigo Java.
Los JSPs son utilizados para generar pginas web dinmicas.
No es muy frecuente encontrar programadores Java buenos en diseo html o
diseadores de html buenos programando en Java; por ello, JSP es la solucin para
separar roles:
Un jsp tiene poco cdigo Java que puede ser fcilmente entendido por un
diseador html.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

28

Ejemplo:
<HTML>
<HEAD><TITLE>Saludo</TITLE><HEAD>
<BODY>
<% String miAlias=request.getParameter(miAlias);
%> <H1>Hola <%=miAlias%></H1>
</BODY>
</HTML>

CICLO DE VIDA DEL JSP


Antes de poder ser ejecutado, un jsp debe ser convertido en un servlet de Java. Esto
es hecho en dos etapas:

El texto jsp es traducido en cdigo Java.


El cdigo java es compilado en servlet.
El servlet resultante procesa las peticiones http. El proceso de traducido y compilado
es realizado una sola vez antes de procesar la primera peticin http; luego, el servlet
resultante tiene el mismo ciclo de vida que cualquier servlet. Los equivalentes a los
mtodos init, service y destroy son los siguientes:

jspInit,
_jspService
jspDestroy

DIRECTIVAS JSP
Las directivas JSP son usadas para definir informacin al traductor java acerca de la
pgina.
La sintaxis es la siguiente:

<%@ directiva[ atributo=valor ] %>

Directiva include. Se usa para definir el contenido de otro archivo en


elJSP. Ejemplo:
<HTML>
<HEAD><TITLE>Prueba<TITLE></HEAD>
<BODY>
<%@ include file=loguito.html%>
</BODY>
</HTML>

Directiva page. Se usa para definir las caractersticas de las cuales va a


depender la pgina. La directiva aplica a todo el JSP incluso los archivos
incluidos con la directiva include.

Directiva page info. Define una cadena de texto que es ubicada en el mtodo
Servlet.getServletInfo() del cdigo traducido. Ejemplo:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

29

<%@ page info=En el mar, la vida es ms sabrosa %>

Directiva page import. Se usa para importar una lista de nombres de


paquetes separados por comas. Ejemplo:
<%@ page import=java.math.*,java.util.* %>

Directiva page errorPage. Se usa para redireccionar un cliente a un URL


especfico cuando ocurre una excepcin que no ha sido capturada en la
pgina. Ejemplo:
<%@ page errorPage=/jsps/error.jsp %>

Directiva page isErrorPage. Se usa para indicar si la pgina es un target


vlido (destino) de una directiva page errorPage. El valor por defecto es false.
Ejemplo:
<%@ page isErrorPage=true %>
<%@ page isErrorPage=false %>

JSP SCRIPTING

El scripting es utilizado para codificar el JSP. El scripting est conformado de:

Declarations

Scriplets

Expressions

a) Declarations. Son utilizadas para declarar mtodos y variables de instancia en el


servlet JSP.
Sintaxis:
<%! Declaracin %>
Ejemplo:
<%! private int contador = 0; %>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

30

b) Scriplets. Se utilizan para escribir cdigo Java en el JSP.


Sintaxis:
<% cdigo_java %>
Ejemplo:
<%String sexo =
request.getParameter(
sexo);
If(sexo.equals(M)) {
%>
<H2>Sr.</H2>
<%
}else{
%>
<H2>Sra.</H2>
<% } %>
c)

Expressions. Las expresiones son para incluir directamente dentro de la salida de


la pgina cadenas (Strings), que son el resultado de evaluar una expresin de
cdigo Java y luego convertirla en una cadena.
Sintaxis:
<%= expression %>
Ejemplo:
La fecha actual es
<%=new java.util.Date() %>

INTERACCIN CON UN JSP


Existen tres formas bsicas de interactuar con un JSP:
a)

Un JSP puede ser invocado por su URL. Ejemplo:


http://nombreservidor/aplicacionweb/nombrejsp.jsp

b)

Un JSP puede ser invocado desde un servlet usando el mtodo forward del objeto
RequestDispatcher. Ejemplo:
String miRuta = /jsps/consultas.jsp;
RequestDispatcher rd =
getServletContext().getRequestDispatcher(miRuta);
Rd.forward(request,response);

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

31

c) Un Servlet o un JSP pueden ser invocados desde un JSP usando la etiqueta


<FORM> o la etiqueta <A HREF>. Ejemplo:

<FORM
ACTION=/aplicacionWeb/URLServlet>
<A HREF=/aplicacionWeb/URLServlet>
texto </A>
<FORM
ACTION=/aplicacionWeb/nombrejsp.jsp>
<A
HREF=/aplicacionWeb/nombrejsp.jsp>
texto </A>
OBJETOS IMPLCITOS EN EL JSP
El cdigo JSP puede acceder a informacin del servlet usando objetos implcitos
definidos por cada pgina. Los objetos implcitos son variables predefinidas (no
necesitamos declararlas) que se pueden referenciar en el cdigo Java del JSP.

Objeto request. Contiene la informacin de peticin del actual HTTP request.

Objeto session. Contiene la informacin de la sesin del cliente. Es una instancia


de la clase javax.servlet.http.HttpSession.

Objeto out. Es usado para las salidas de texto que se quieran incluir en la pgina.

Objeto Application. Contiene informacin del contexto de todos los componentes


web de la misma aplicacin web. Es una instancia de la clase
javax.servlet.ServletContext

ATRIBUTOS DEL SCOPE (MBITO)


Un JSP puede acceder a objetos en tiempo de ejecucin va uno de los siguientes
scopes o mbitos:

request (Es el objeto HttpServletRequest Actual)

session (Es el objeto HttpSession actual)

application (Es el objeto ServletContext actual)

a) Request Scope. Este mbito se constituye en la va ms adecuada para que un


servlet pase referencias de objetos al JSP. Las referencias a objetos con mbito
Request son almacenadas en el objeto request.
Se usa lo siguiente:

setAttribute(String,Object) para cargar (setear) el objeto en el request.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

32

getAttribute(String) para recuperar el objeto.

b) Session Scope. Se puede acceder a este mbito desde Servlets y pginas JSP
que estn procesando peticiones que se encuentran en la misma sesin.
Las referencias a los objetos son perdidas despus que la sesin asociada es
finalizada.
Las referencias a los objetos con mbito Session son almacenadas en el objeto
session.
Se usa lo siguiente:

setAttribute(String,Object) para cargar(setear) el objeto en la sesin


getAttribute(String) para recuperar el objeto

c) Application Scope. Se puede acceder a este mbito desde Servlets y pginas


JSP que estn procesando peticiones que se encuentran en la misma aplicacin
web. (El mismo contexto)
Las referencias a los objetos con mbito Application son almacenadas en el objeto
application.
Se usa lo siguiente:

setAttribute(String,Object) para cargar(setear) el objeto en el contexto


getAttribute(String) para recuperar el objeto

OBJETOS IMPLCITOS EN UN JSP


OBJETO
request
response
out

SIGNIFICADO
El objeto HttpServletRequest asociado con la peticin
El objeto HttpServletResponse asociado con la respuesta
El Writer empleado para enviar la salida al cliente. La salida de los
JSP emplea un buffer que permite que se enven cabeceras HTTP o
cdigos de estado aunque ya se haya empezado a escribir en la
salida (out no es un PrintWriter, sino un objeto de la clase especial
JspWriter).
El objeto HttpSession asociado con la peticin actual. En JSP, las
session
sesiones se crean automticamente, de modo que este objeto est
instanciado aunque no se cree explcitamente una sesin.
application
El objeto ServletContext, comn a todos los Servlets de la aplicacin
web
config
El objeto ServletConfig, empleado para leer parmetros de
inicializacin
pageContext Permite acceder desde un nico objeto a todos los dems objetos
implcitos
page
Referencia al propio servlet generado (tiene el mismo valor que
this).Como tal, en Java no tiene demasiado sentido utilizarla, pero
est pensada para el caso en que se utilizara un lenguaje de
programacin distinto.
exception
Representa un error producido en la aplicacin. Solo es accesible si la
pgina se ha designado como pgina de error (mediante la directiva
page isErrorPage)

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

33

Ejercicio 01: registrarNota.jsp

Realizar las siguientes operaciones:


Todas las cajas deben aceptar datos de forma obligatoria
DNI, solo nmeros de 8 cifras
Parcial y final solo nmeros entre 1 y 20

Cdigo
|<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Registro de Notas</title>
<script type="text/javascript" src="js/jquery-1.11.3.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<script type="text/javascript" src="js/jquery.metadata.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#frmRegistro").validate();
});
</script>
</head>
<body>
<form id="frmRegistro" method="post" action="/ServletNota">
<table border="1" align="center" width="60%">
<tr>
<th colspan="2">Registro de Notas</th>
</tr>
<tr>
<td>DNI</td>
<td><input type="text" name="txt_dni" size="10"
class="{required:true,number:true,
minlength:[8],maxlength:[8]}">
</td>
</tr>
<tr>
<td>Apellidos y Nombres:</td>
<td><input type="text" name="txt_ape_nom" size="30"
class="required"></td>
</tr>
CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

34

<tr>
<td>Curso:</td>
<td>
<select name="cbo_curso" style="width:140px">
<option value="Algebra">Algebra</option>
<option value="Lenguaje">Lenguaje</option>
<option value="Historia">Historia</option>
<option value="Ingles">Ingles</option>
</select>
</td>
</tr>
<tr>
<td>Parcial:</td>
<td><input type="text" name="txt_parcial" size="3"
class="{required:true,number:true,
range:[1,20]}"></td>
</tr>
<tr>
<td>Final:</td>
<td><input type="text" name="txt_final" size="3"
class="{required:true,number:true,
range:[1,20]"></td>
</tr>

ServletNota
Captura los valores enviados por el formulario que se encuentra en la pgina
registrarNota.jsp, realiza el clculo del promedio y adiciona 4 o 2 puntos segn la
condicin establecida. Luego enva un arreglo de tipo String algunos datos del Servlet
a la pgina respuesta.jsp.
Package controlador;
@WebServlet("/ServletNota")
public class ServletNota extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletNota() {
super();
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String dni,ape_nom,curso;
int parcial,fin,adicional,promedio;
String valores[]=new String[4];
dni=request.getParameter("txt_dni");
ape_nom=request.getParameter("txt_ape_nom");
curso=request.getParameter("cbo_curso");
parcial=Integer.parseInt(request.getParameter("txt_parcial"));
fin=Integer.parseInt(request.getParameter("txt_final"));
if(curso.equals("Algebra")|| curso.equals("Historia"))
adicional=4;
else
adicional=2;
promedio=((parcial+2*fin)+adicional)/3;
request.setAttribute("info", valores);
valores[0]=dni;valores[1]=ape_nom;
valores[2]=curso;valores[3]=""+promedio;
request.getRequestDispatcher("respuesta.jsp").forward(request,
response);
}
}
CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

35

respuesta.jsp

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
String msj[]=(String[])request.getAttribute("info");
%>
<h4>
DNI : <%=msj[0]%><br>
Alumno : <%=msj[1]%><br>
Curso : <%=msj[2]%><br>
Promedio : <%=msj[3]%><br>
</h4>
</body>
</html>

1.3

JDBC Aplicaciones parte I

Connection, Class.forName
Java Database Connectivity, ms conocida por sus siglas JDBC es una API que
permite la ejecucin de operaciones sobre bases de datos desde el lenguaje de
programacin Java, independientemente del sistema operativo donde se ejecute o de
la base de datos a la cual se accede, utilizando el dialecto SQL del modelo de base de
datos que se utilice.
El API JDBC se presenta como una coleccin de interfaces Java y mtodos de gestin
de manejadores de conexin hacia cada modelo especfico de base de datos. Un
manejador de conexiones hacia un modelo de base de datos en particular es un
conjunto de clases que implementan las interfaces Java y que utilizan los mtodos de
registro para declarar los tipos de localizadores a base de datos (URL) que pueden
manejar. Para utilizar una base de datos particular, el usuario ejecuta su programa
junto con la biblioteca de conexin apropiada al modelo de su base de datos, y accede
a ella estableciendo una conexin; para ello provee el localizador a la base de datos y
los parmetros de conexin especficos. A partir de all puede realizar cualquier tipo de
tarea con la base de datos a la que tenga permiso: consulta, actualizacin, creacin,
modificacin y borrado de tablas, ejecucin de procedimientos almacenados en la
base de datos, etc.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

36

Pasos de la Conexin

1.3.1 Aplicacin de Logueo


Modelo de base de datos: instituto

Script base de datos

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

37

Pasos a seguir:
1. Crear un proyecto web y construya la siguiente estructura:

Dnde:
entidad:
misServlets:
utils:
img:
js:

2.

Almacena la clase Alumno(Definir atributos)


Almacena los Servlets del proyecto(ServletListado,
ServletLogueo, ServletMantenimiento)
Almacena la clase para conexin con la base de datos
(MysqlDBConexion)
Almacena las imgenes (delete.gif,edit.gif )
Almacena los archivos de JQuery para realizar
validaciones

Crear la clase MysqlDBConexion y guardarlo en el paquete utils.

package utils;
import java.sql.Connection;
import java.sql.DriverManager;
public class MysqlDBConexion {
public static Connection getConexion(){
Connection cn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
cn=DriverManager.getConnection("jdbc:mysql://localhost/instituto",
"root","mysql");
} catch (Exception e) {
e.printStackTrace();
}
return cn;
}
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

38

3. Crear la clase Alumno y guardarlo en el paquete entidad.


package entidad;
public class Alumno {
private int codigo;
private String nombre,paterno,materno;
private int edad;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getPaterno() {
return paterno;
}
public void setPaterno(String paterno) {
this.paterno = paterno;
}
public String getMaterno() {
return materno;
}
public void setMaterno(String materno) {
this.materno = materno;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
}

4. Crear la clase Empleado y guardarlo en el paquete entidad.


package entidad;
public class Empleado {
private int codigo;
private String nombre,apelliedos;
private String login,clave;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApelliedos() {
return apelliedos;
}
CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

39

public void setApelliedos(String apelliedos) {


this.apelliedos = apelliedos;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getClave() {
return clave;
}
public void setClave(String clave) {
this.clave = clave;
}
}

5. Crear la clase ModelEmpleado y guardarlo en el paquete modelo.


package modelo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import entidad.Empleado;
import utils.MysqlDBConexion;
public class ModelEmpleado {
public Empleado iniciarSesion(String log,String pas){
Empleado obj=null;
Connection cn=null;
ResultSet rs=null;
PreparedStatement pstm=null;
try {
String sql="select *from tbempleado where login_emp=?
and clave_emp=?";
cn=MysqlDBConexion.getConexion();
pstm=cn.prepareStatement(sql);
pstm.setString(1, log);
pstm.setString(2, pas);
rs=pstm.executeQuery();
if(rs.next()){
obj=new Empleado();
obj.setCodigo(rs.getInt(1));
obj.setNombre(rs.getString(2));
obj.setApellidos(rs.getString(3));
obj.setLogin(rs.getString(4));
obj.setLogin(rs.getString(4));
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(rs!=null)rs.close();
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return obj;y guardarlo en el paquete controlador.
6. Crear el ServletEmpleado
}
}
CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

40

package controlador;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
import modelo.ModelEmpleado;
import entidad.Empleado;
@WebServlet("/ServletEmpleado")
public class ServletEmpleado extends HttpServlet {
ModelEmpleado m=new ModelEmpleado();
private static final long serialVersionUID = 1L;
public ServletEmpleado() {
super();
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
String login,clave;
login=request.getParameter("txtlogin");
clave=request.getParameter("txtpass");
Empleado e=m.iniciarSesion(login, clave);
if(e==null){
request.setAttribute("msj", "Error usuario y/o clave");
request.getRequestDispatcher("index.jsp").forward(
request,response);
}
else{
response.sendRedirect("menu.jsp");
}
}
}

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

41

7. Crear la pgina index.jsp y guardarlo dentro de WebContent

Cdigo:
<%
String x=(String) request.getAttribute("msj");
String a="";
if(x!=null)
a=x;
%>
<form action="ServletEmpleado" name="frmsesion" method="post">
<table border="1" align="center">
<tr>
<td>Login</td>
<td><input type="text" name="txtlogin"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="text" name="txtpass"></td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit" value="Iniciar"></td>
</tr>
</table>
<h5 align="center"><%=a %></h5>
</form>

En el ServletEmpleado se recupera los valores de las cajas:


package controlador;
@WebServlet("/ServletEmpleado")
public class ServletEmpleado extends HttpServlet {
protected void service(HttpServletRequest request,
HttpServletResponse response) throws
ServletException,
IOException {
String login,clave;
login=request.getParameter("txtlogin");
clave=request.getParameter("txtpass");
Empleado e=m.iniciarSesion(login, clave);
if(e==null){
request.setAttribute("msj", "Error usuario y/o
clave");
request.getRequestDispatcher("index.jsp").forward(
request,response);
}
else{
response.sendRedirect("menu.jsp");
}
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

42

Si ingresamos un usuario y/o clave en forma incorrecta se mostrara lo siguiente

Si los datos ingresados son corretos se mostrara la pgina men.jsp

8. Crear la pgina menu.jsp y guardarlo dentro de WebContent


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="ServletAlumno?tipo=listar">Listar Alumnos</a><br>
<a href="registrarAlumno.jsp">Registrar Alumno</a>
</body>
</html>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

43

1.3.2 Aplicacin de Listado


Pasos a seguir
Usando el proyecto anterior (LPII_Clase02), realizar lo siguiente:
1. Crear la clase ModelAlumno y guardarlo dentro del paquete modelo.
package modelo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import utils.MysqlDBConexion;
import entidad.Alumno;
public class ModelAlumno {
public List<Alumno> listar(){
Alumno alu=null;
List<Alumno> data=new ArrayList<Alumno>();
Connection cn=null;
ResultSet rs=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="select *from tb_alumno";
pstm=cn.prepareStatement(sql);
rs=pstm.executeQuery();
while(rs.next()){
alu=new Alumno();
alu.setCodigo(rs.getInt(1));
alu.setNombre(rs.getString(2));
alu.setPaterno(rs.getString(3));
alu.setMaterno(rs.getString(4));
alu.setEdad(rs.getInt(5));
data.add(alu);
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(rs!=null)rs.close();
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return data;
}
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

44

2. Crear el ServletAlumno y guardarlo dentro del paquete controlador.


package controlador;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entidad.Alumno;
import modelo.ModelAlumno;
public class ServletAlumno extends HttpServlet {
ModelAlumno m=new ModelAlumno();
private static final long serialVersionUID = 1L;
public ServletAlumno() {
super();
}
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String tipo=request.getParameter("tipo");
if(tipo.equals("listar"))
listar(request,response);
}
private void listar(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
List<Alumno> info=new ModelAlumno().listar();
request.setAttribute("data", info);
request.getRequestDispatcher("listarAlumno.jsp").forward(
request, response);
}
}

3. Crear la pgina listarAlumno.jsp y guardarlo dentro de WebContent.


<%@page import="entidad.Alumno"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
List<Alumno> da=
(List<Alumno>)request.getAttribute("data");
%>
<h2 align="center">LISTADO DE ALUMNOS</h2>
<p align="center" ><a href="registrarAlumno.jsp"> + Nuevo Registro</a>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

45

<table border="2" align="center" width="75%">


<tr>
<th>CODIGO</th>
<th>NOMBRES</th>
<th>PARTENO</th>
<th>MATERNO</th>
<th>EDAD</th>
<th colspan="2">ACCIONES</th>
</tr>
<%
if(da!=null){
for(Alumno a:da){
%>
<tr>
<td><%=a.getCodigo()%></td>
<td><%=a.getNombre()%></td>
<td><%=a.getPaterno()%></td>
<td><%=a.getMaterno()%></td>
<td><%=a.getEdad()%></td>
<td colspan="2" align="center">
<a href=""><img alt="Editar" title="Editar"
src="img/edit.gif"></a>
<a href=""><img alt="Eliminar" title="Eliminar"
src="img/delete.gif"></a>
</td>
</tr>
<%
}
}
%>
</table>
</body>
</html>

Se mostrara el siguiente resultado:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

46

1.4 JDBC Aplicaciones parte II


1.4.1 Aplicacin de Mantenimiento
Pasos a seguir
Usando el proyecto anterior (LPII_Clase02), realizar lo siguiente:
1. Agregar los siguientes mtodos dentro de la clase ModelAlumno.
public Alumno buscarAlumno(int cod){
Alumno alu=null;
Connection cn=null;
PreparedStatement pstm=null;
ResultSet rs=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="select *from tb_alumno where cod_alu=?";
pstm=cn.prepareStatement(sql);
pstm.setInt(1, cod);
rs=pstm.executeQuery();
if(rs.next()){
alu=new Alumno();
alu.setCodigo(rs.getInt(1));
alu.setNombre(rs.getString(2));
alu.setPaterno(rs.getString(3));
alu.setMaterno(rs.getString(4));
alu.setEdad(rs.getInt(5));
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(rs!=null) rs.close();
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return alu;
}
public int registrarAlumno(Alumno obj){
int estado=-1;
Connection cn=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="insert into tb_alumno values(null,?,?,?,?)";
pstm=cn.prepareStatement(sql);
pstm.setString(1, obj.getNombre());
pstm.setString(2, obj.getPaterno());
pstm.setString(3, obj.getMaterno());
pstm.setInt(4, obj.getEdad());
estado=pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

47

finally{
try {
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return estado;
}
public int actualizarAlumno(Alumno obj){
int estado=-1;
Connection cn=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="update tb_alumno set nom_alu=?,pat_alu=?,
mat_alu=?,edad_alu=? where cod_alu=?";
pstm=cn.prepareStatement(sql);
pstm.setString(1, obj.getNombre());
pstm.setString(2, obj.getPaterno());
pstm.setString(3, obj.getMaterno());
pstm.setInt(4, obj.getEdad());
pstm.setInt(5, obj.getCodigo());
estado=pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return estado;
}
public int eliminarAlumno(int cod){
int estado=-1;
Connection cn=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="delete from tb_alumno where cod_alu=?";
pstm=cn.prepareStatement(sql);
pstm.setInt(1, cod);
estado=pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return estado;
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

2.

48

Modificar el ServletAlumno segn la siguiente imagen:

protected void service(HttpServletRequest request, HttpServletResponse


response)throws ServletException, IOException {
String tipo=request.getParameter("tipo");
if(tipo.equals("listar"))
listar(request,response);
else if(tipo.equals("registrar"))
registrar(request,response);
else if(tipo.equals("buscar"))
buscar(request,response);
else if(tipo.equals("actualizar"))
actualizar(request,response);
else if(tipo.equals("eliminar"))
eliminar(request,response);
}
private void actualizar(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Alumno obj=new Alumno();
String cod=request.getParameter("txt_cod");
String nom=request.getParameter("txt_nom");
String pat=request.getParameter("txt_pat");
String mat=request.getParameter("txt_mat");
String edad=request.getParameter("txt_edad");
obj.setCodigo(Integer.parseInt(cod));
obj.setNombre(nom);
obj.setPaterno(pat);
obj.setMaterno(mat);
obj.setEdad(Integer.parseInt(edad));
int estado=m.registrarAlumno(obj);
if(estado!=-1)
listar(request, response);
else
response.sendRedirect("error.html");
}
private void registrar(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Alumno obj=new Alumno();
String nom=request.getParameter("txt_nom");
String pat=request.getParameter("txt_pat");
String mat=request.getParameter("txt_mat");
String edad=request.getParameter("txt_edad");
obj.setNombre(nom);
obj.setPaterno(pat);
obj.setMaterno(mat);
obj.setEdad(Integer.parseInt(edad));
int estado=m.registrarAlumno(obj);
if(estado!=-1)
listar(request, response);
else
response.sendRedirect("error.html");
}

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

49

private void buscar(HttpServletRequest request,


HttpServletResponse response) throws ServletException, IOException {
String dato=request.getParameter("cod");
int codigo=Integer.parseInt(dato);
Alumno x=m.buscarAlumno(codigo);
request.setAttribute("registro", x);
request.getRequestDispatcher("actualizarAlumno.jsp").
forward(request, response);
}
private void eliminar(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String dato=request.getParameter("cod");
int codigo=Integer.parseInt(dato);
m.eliminarAlumno(codigo);
request.getRequestDispatcher("ServletListado").
forward(request, response);
}

3.

Modificar la pgina listarAlumno,jsp segn la siguiente imagen:

if(da!=null){
for(Alumno a:da){
%>
<tr>
<td><%=a.getCodigo()%></td>
<td><%=a.getNombre()%></td>
<td><%=a.getPaterno()%></td>
<td><%=a.getMaterno()%></td>
<td><%=a.getEdad()%></td>
<td colspan="2" align="center">
<a href="ServletAlumno?tipo=buscar&cod=<%=a.getCodigo()%>">
<img title="Editar" src="img/edit.gif"></a>
<a href="ServletAlumno?tipo=eliminar&cod=<%=a.getCodigo()%>">
<img title="Eliminar" src="img/delete.gif"></a>
</td>
</tr>
<%
}
}
%>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

4.

50

Crear la pgina actualizarAlumno.jsp

Cdigo:
<%@page import="entidad.Alumno"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
Alumno a=(Alumno)request.getAttribute("registro");
%>
<form action="ServletAlumno?tipo=actualizar"
name="frmactualizar" method="post">
<input type="hidden" name="txt_cod" value="<%=a.getCodigo()%>">
<table border="1" align="center">
<tr>
<td>Nombres</td>
<td><input type="text" name="txt_nom"
value="<%=a.getNombre()%>"></td>
</tr>
<tr>
<td>Paterno</td>
<td><input type="text" name="txt_pat"
value="<%=a.getPaterno()%>"></td>
</tr>
<tr>
<td>Materno</td>
<td><input type="text" name="txt_mat"
value="<%=a.getMaterno()%>"></td>
</tr>
<tr>
<td>Edad</td>
<td><input type="text" name="txt_edad"
value="<%=a.getEdad()%>"></td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit"
value="Actualizar"></td>
</tr>
</table>
</form>
</body>
</html>
CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

5.

51

Crear la pgina registrarAlumno.jsp

Cdigo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.metadata.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<script type="text/javascript">
$(document).ready(
function(){
$("#frmregistro").validate({
rules:{
txtnom:{
required:true,
letras:true
},
txtapepat:{
required:true,
minlength:3
},
txtapemat:{
required:true,
minlength:3
}
},
messages:{
txtnom:{
required:"Ingrese Nombre",
letras:"solo letras"
},
txtapepat:{
required:"Ingrese Apellido Paterno",
minlength:"Mnimo 3 letras"
},
txtapemat:{
required:"Ingrese Apellido Materno",
minlength:"Mnimo 3 letras"
}
}
});
});
</script>
</head>
CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

52

<body>
<form action="ServletInsertar" id="frmregistro" method="post">
<table>
<tr>
<td>Nombres</td>
<td><input type="text" name="txt_nom"
class="{required:true,letras:true}"></td>
</tr>
<tr>
<td>Paterno</td>
<td><input type="text" name="txt_mat" class="required"></td>
</tr>
<tr>
<td>Materno</td>
<td><input type="text" name="txt_mat" class="required"></td>
</tr>
<tr>
<td>Edad</td>
<td><input type="text" name="txt_edad" class="required"></td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit"
value="Registrar"></td>
</tr>
</table>
</form>
</body>
</html>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

53

Resumen
1. Las etiquetas HTML 5 permiten mejorar el aspecto de las pginas y usar
Responsive Design.
2. El uso de la librera JQuery permite realizar validaciones en los formularios y a la
vez poder crear nuestras propias validaciones con sus mensajes personalizados.
3. Para la creacin de validaciones tenemos que usar expresiones regulares o
trabajar directamente con JavaScript.
4. El uso de un servlet dentro de una sistema web permite la comunicacin entre vista
con el modelo usando el paradigma request y response.
5. El uso de mtodos dentro del servlet permitir ordenar las sentencias que se han
implementado en el modelo debido a que estos ltimos son invocados segn el
requerimiento del usuario

6. Si desea saber ms acerca de estos temas, puede consultar las siguientes


pginas.
http://today.java.net/pub/a/today/2003/12/04/exceptions.html
Aqu hallar importantes reglas bsicas para la gestin de excepciones en java.
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Exception.html
En esta pgina, hallar documentacin detallada de la clase base de todas las
excepciones controladas: Exception

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

54

UNIDAD

2
CRUD con patrn DAO, sesiones
y EL
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno implementa una aplicacin Java Web
usando el patrn DAO, sesiones y Lenguaje de Expresiones (EL).

TEMARIO
2.1 Tema 5
2.1.1
2.1.2
2.1.3
2.2 Tema 6
2.2.1
2.2.2
2.23
2.2.4

:
:
:
:
:
:
:
:
:

Patrn DAO Parte I

Patrones de diseo de software


Patrn DAO
Aplicacin Listado
Patrn DAO Parte II, Sesiones web y EL
Lenguaje de expresiones
Aplicacin Mantenimiento
Sesiones web
Aplicacin de Logueo

Actividades propuestas

Implementar un aplicativo web usando el patrn DAO


Crear aplicaciones con conexin a base de datos que resuelvan casos
prcticos de la vida real.
Trabajar con sesiones que permitan a cada usuario logueado poder
trabajar con su propia sesin.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

55

2.1 Patrn DAO Parte I


2.1.1 Patrones de Diseo de Software
El diseo es un modelo del sistema, realizado con una serie de principios y tcnicas,
que permite describir el sistema con el suficiente detalle como para ser
implementado. Sin embargo, los principios y reglas no son suficientes. En el contexto
de diseo, podemos observar que los buenos ingenieros tienen esquemas y
estructuras de solucin que usan numerosas veces en funcin del contexto del
problema. Este es el sentido cabal de la expresin "tener una mente bien amueblada",
y no el significado de tener una notable inteligencia. Estos esquemas y estructuras
son conceptos reusables y nos permiten no reinventar la rueda. Un buen ingeniero
reutiliza un esquema de solucin ante problemas similares.
Historia
El concepto de "patrn de diseo" que tenemos en Ingeniera del Software se ha
tomado prestado de la arquitectura. En 1977, se publica el libro "A Pattern Language:
Towns/Building/Construction", de Christopher Alexander, Sara Ishikawa, Murray
Silverstein, Max Jacobson, Ingrid Fiksdahl-King y Shlomo Angel, Oxford University
Press. Contiene numerosos patrones con una notacin especfica de Alexander.
Alexander comenta que cada patrn describe un problema que ocurre una y otra
vez en nuestro entorno, para describir despus el ncleo de la solucin a ese
problema, de tal manera que esa solucin pueda ser usada ms de un milln de veces
sin hacerlo siquiera dos veces de la misma forma. El patrn es un esquema de
solucin que se aplica a un tipo de problema. Esta aplicacin del patrn no es
mecnica, sino que requiere de adaptacin y matices. Por ello, dice Alexander que
los numerosos usos de un patrn no se repiten dos veces de la misma forma.
La idea de patrones de diseo estaba "en el aire", la prueba es que numerosos
diseadores se dirigieron a aplicar las ideas de Alexander a su contexto. El catlogo
ms famoso de patrones se encuentra en Design Patterns: Elements of Reusable
Object-Oriented Software, de Erich Gamma, Richard Helm, Ralph Johnson y John
Vlissides, 1995, Addison-Wesley, tambin conocido como el libro GOF (Gang-OfFour).
Siguiendo el libro de GOF, los patrones se clasifican segn el propsito para el que
han sido definidos:

Creacionales: solucionan problemas de creacin de instancias. Nos ayudan a


encapsular y abstraer dicha creacin.
Estructurales: solucionan problemas de composicin (agregacin) de clases y
objetos.
De Comportamiento: soluciones respecto a la interaccin y responsabilidades
entre clases y objetos, as como los algoritmos que encapsulan.

Segn el mbito, se clasifican en patrones de clase y de objeto:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

Clase

Creacin
Mtodo de
Fabricacin

56

Estructural
Adaptador (clases)

Objeto

Fbrica,
Constructor,
Prototipo,
Singleton

CARRERA DE COMPUTACIN E INFORMTICA

Adaptador
(objetos), Puente,
Composicin,
Decorador,
Fachada, Flyweight

De Conducta
Interprete
Plantilla
Cadena de
Responsabilidad,
Comando (orden),
Iterador,
Intermediario,
Observador, Estado,
Estrategia, Visitante,
Memoria

CIBERTEC

LENGUAJE DE PROGRAMACIN II

57

Catlogo de patrones J2EE

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

58

Capa de Presentacin

Decorating Filter / Intercepting


Filter

Front Controller/ Front


Component

View Helper

Composite view

Service To Worker

Dispatcher View

CARRERA DE COMPUTACIN E INFORMTICA

Un objeto que est entre el cliente y los


componentes web. Este procesa las
peticiones y las respuestas.
Un
objeto
que
acepta
todos
los
requerimientos de un cliente y los direcciona
a manejadores apropiados. El patrn Front
Controller podra dividir la funcionalidad en 2
diferentes objetos: el Front Controller y el
Dispatcher. En ese caso, El Front Controller
acepta todos los requerimientos de un cliente
y realiza la autenticacin, y el Dispatcher
direcciona los requerimientos a manejadores
apropiada
Un objeto helper que encapsula la lgica de
acceso a datos en beneficio de los
componentes de la presentacin. Por
ejemplo, los JavaBeans pueden ser usados
como patrn View Helper para las pginas
JSP.
Un objeto vista que est compuesto de otros
objetos vista. Por ejemplo, una pgina JSP
que incluye otras pginas JSP y HTML
usando la directiva include o el action
include es un patrn Composite View.
Es como el patrn de diseo MVC con el
Controlador actuando como Front Controller
pero con una cosa importante: aqu el
Dispatcher (el cual es parte del Front
Controller) usa View Helpers a gran escala y
ayuda en el manejo de la vista.
Es como el patrn de diseo MVC con el
controlador actuando como Front Controller
pero con un asunto importante: aqu el
Dispatcher (el cual es parte del Front
Controller) no usa View Helpers y realiza
muy poco trabajo en el manejo de la vista. El
manejo de la vista es manejado por los
mismos componentes de la Vista

CIBERTEC

LENGUAJE DE PROGRAMACIN II

59

Capa de Negocios

Business Delegate

Value Object/ Data Transfer


Object/
Replicate Object

Session Faade/ Session Entity


Faade/ Distributed Facade

Aggregate Entity
Value Object Assembler

Value List Handler/ Page-by-Page


Iterator/ Paged List

Service Locator

Un objeto que reside en la capa de


presentacin y en beneficio de los otros
componentes de la capa de presentacin
llama a mtodos remotos en los objetos de la
capa de negocios.
Un objeto serializable para la transferencia de
datos sobre la red.
El uso de un bean de sesin como una
fachada (facade)
para
encapsular
la
complejidad de las interacciones entre los
objetos de negocio y participantes en un flujo
de trabajo. El Session Faade maneja los
objetos de negocio y proporciona un servicio
de acceso uniforme a los clientes.
Un objeto que reside en la capa de negocios
y crea Value Objets cuando es requerido
Es un objeto que maneja la ejecucin de
consultas SQL, cach y procesamiento del
resultado. Usualmente implementado como
beans de sesin
Es como el patrn de diseo MVC con el
controlador actuando como Front Controller
pero con un asunto importante: aqu el
Dispatcher (el cual es parte del Front
Controller) no usa View Helpers y realiza muy
poco trabajo en el manejo de la vista. El
manejo de la vista es manejado por los
mismos componentes de la Vista
Consiste en utilizar un objeto Service Locutor
para abstraer toda la utilizacin JNDI y para
ocultar las complejidades de la creacin del
contexto inicial, de bsqueda de objetos home
EJB y recreacin de objetos EJB.
Varios clientes pueden reutilizar el objeto
Service Locutor para reducir la complejidad del
cdigo, proporcionando un punto de control.

Capa de Integracin

Data Access Object Service


Activator

Service Activator

CIBERTEC

Consiste en utilizar un objeto de acceso a


datos para abstraer y encapsular todos los
accesos a la fuente de datos. El DAO maneja
la conexin con la fuente de datos para
obtener y almacenar datos.
Se utiliza para recibir peticiones y mensajes
asncronos de los clientes. Cuando se recibe
un mensaje, el Service Activator localiza e
invoca a los mtodos de los componentes de
negocio necesarios para cumplir la peticin de
forma asncrona.

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

60

Concepto de patrn de diseo


"Una arquitectura orientada a objetos bien estructurada est llena de patrones. La
calidad de un sistema orientado a objetos se mide por la atencin que los diseadores
han prestado a las colaboraciones entre sus objetos. Los patrones conducen a
arquitecturas ms pequeas, ms simples y ms comprensibles". (Grady Booch)
Los patrones de diseo son descripciones de clases cuyos objetos colaboran entre
s. Cada patrn es adecuado para ser adaptado a un cierto tipo de problema. Para
describir un caso se debe especificar lo siguiente:

Nombre
Propsito o finalidad
Sinnimos (otros nombres por los que puede ser conocido)
Problema al que es aplicable
Estructura (diagrama de clases)
Participantes (responsabilidad de cada clase)
Colaboraciones (diagrama de interacciones)
Implementacin (consejos, notas y ejemplos)
Otros patrones con los que est relacionado

Ventajas de los patrones:


La clave para la reutilizacin es anticiparse a los nuevos requisitos y cambios, de
modo que los sistemas evolucionen de forma adecuada. Cada patrn permite que
algunos aspectos de la estructura del sistema puedan cambiar independientemente de
otros aspectos. Facilitan la reusabilidad, extensibilidad y mantenimiento.
Un patrn es un esquema o microarquitectura que supone una solucin a problemas
(dominios de aplicacin) semejantes (aunque los dominios de problema pueden ser
muy diferentes e ir desde una aplicacin CAD a un cuadro de mando empresarial).
Interesa constatar una vez ms la vieja distincin entre dominio del problema (donde
aparecen las clases propias del dominio, como cuenta, empleado, coche o
beneficiario) y el dominio de la solucin o aplicacin (donde adems aparecen clases
como ventana, men, contenedor o listener). Los patrones son patrones del dominio
de la solucin.
Tambin, conviene distinguir entre un patrn y una arquitectura global del sistema. Por
decirlo en breve, es la misma distancia que hay entre el diseo de un componente (o
mdulo) y el anlisis del sistema. Es la diferencia que hay entre el aspecto micro y el
macro; por ello, en ocasiones, se denomina a los patrones como "microarquitecturas".
En resumen, un patrn es el denominador comn, una estructura comn que tienen
aplicaciones semejantes. Esto tambin ocurre en otros rdenes de la vida. Por
ejemplo, en nuestra vida cotidiana, aplicamos a menudo el esquema
saludopresentacin- mensaje-despedida en ocasiones diversas.

2.1.2 Patrn DAO


Contexto
El acceso a los datos vara dependiendo de la fuente de los datos. El acceso al
almacenamiento persistente, como una base de datos, vara en gran medida
dependiendo del tipo de almacenamiento (bases de datos relacionales, bases de
datos orientadas a objetos, archivos de texto, etc.) y de la implementacin del
vendedor.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

61

Problema
Muchas aplicaciones de la plataforma JEE en el mundo real necesitan utilizar datos
persistentes en algn momento. Para muchas de ellas, este almacenamiento
persistente se implementa utilizando diferentes mecanismos, y hay marcadas
diferencias en los APIS utilizados para acceder a esos mecanismos de
almacenamiento diferentes o datos residentes en sistemas diferentes.
Tpicamente, las aplicaciones utilizan componentes distribuidos compartidos
persistentes como los entity bean para representar la data persistente. Una aplicacin
es considerada que emplear un bean managed persistence para sus entity beans
cuando estas entity beans explcitamente accesen al almacn persistente, es decir,
cuando el entity bean incluya cdigo para acceder directamente al almacn
persistente. Una aplicacin con requerimientos simples no utilizara entity beans y, en
vez de ellos, utilizara session beans o Servlets para acceder directamente al almacn
persistente para recuperar y modificar datos.
Las aplicaciones pueden usar la API-JDBC para acceder a los datos que residen en
un RDBMS. Esta API permite el acceso estndar y la manipulacin de datos en un
almacn persistente como una base de datos relacional. JDBC permite a las
aplicaciones JEE utilizar sentencias SQL estndar. Sin embargo, las sentencias SQL
podran v ariar dependiendo del DBMS.
Solucin
Utilizar un Data Access Object (DAO) para abstraer y encapsular todos los accesos a
la fuente de datos. El DAO maneja la conexin con la fuente de datos para obtener y
almacenar datos.
El DAO implementa el mecanismo de acceso requerido para trabajar con la fuente de
datos.
El Objeto de Acceso a Datos (DAO) es el objeto principal de este patrn. La fuente de
datos podra ser un almacn persistente como un RDBMS, un servicio externo como
B2B, un servicio de negocios accesado va CORBA.
Los componentes del negocio que cuentan con los objetos DAO utilizan una interfaz
simple expuesta por el DAO para sus clientes. El DAO completamente oculta la
implementacin de la fuente de datos y lo aparta de los clientes, debido a que la
interfaz expuesta por el DAO no cambia cuando la implementacin de la fuente de
datos cambia. Este patrn permite al DAO adaptarse a diferentes esquemas de
almacenamiento sin afectar a sus clientes o componentes de negocio. DAO
esencialmente acta como un adaptador entre el componente de negocio y la fuente
de datos (data source).

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

62

Diagrama de Clases

ESTRATEGIAS DE IMPLEMENTACIN DEL PATRN DAO


Factory
El patrn DAO se puede flexibilizar adoptando los patrones Factory y Abstract
Factory.
Cuando el almacenamiento asociado a la aplicacin no est sujeto a cambios de una
implementacin a otra, esta estrategia se puede implementar utilizando el patrn
Factory para producir el nmero de DAOs que necesita la aplicacin. En la siguiente
figura, podemos ver el diagrama de clases para este caso:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

63

Abstract Factory
Cuando el almacenamiento asociado a la aplicacin s est sujeto a cambios de una
implementacin a otra, esta estrategia se podra implementar usando el patrn
Abstract Factory. Este patrn a su vez puede construir y utilizar la implementacin
Factory.
En este caso, esta estrategia proporciona un objeto factora abstracta de DAOs
(Abstract Factory) que puede construir varios tipos de factoras concretas de DAOs:
cada factora soporta un tipo diferente de implementacin del almacenamiento
persistente. Una vez que obtenemos la factora concreta de DAOs para una
implementacin especfica, la utilizamos para producir los DAOs soportados e
implementados en esa implementacin.
En la siguiente figura, podemos ver el diagrama de clases para esta estrategia. En l
vemos una fbrica base de DAOs, que es una clase abstracta que extienden e
implementan las diferentes factoras concretas de DAOs para soportar el acceso
especfico a la implementacin del almacenamiento.
El cliente puede obtener una implementacin de la factora concreta del DAO como
una RdbDAOFactory y utilizarla para obtener los DAOs concretos que funcionan en la
implementacin del almacenamiento.
Por ejemplo, el cliente puede obtener una RdbDAOFactory y utilizarlas para obtener
DAOs especfcios como RdbCustomerDAO, RdbAccountDAO, etc.
Los DAOs pueden extender e implementar una clase base genrica (mostradas como
DAO1 y DAO2) que describa especficamente los requerimientos del DAO para el
objeto de negocio que soporta. Cada DAO concreto es responsable de conectar con la
fuente de datos y de obtener y manipular los datos para el objeto de negocio que
soporta.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

64

En la siguiente figura, podemos ver el diagrama de secuencia para esta


estrategia:

Contexto resultante
DAO permite la transparencia de los detalles de la implementacin de la fuente de
datos. El acceso es transparente porque los detalles de la implementacin se ocultan
dentro del DAO.
La capa de DAOs permite una migracin ms fcil, hace ms fcil que una aplicacin
pueda migrar a una implementacin de base de datos diferente. Los objetos de
negocio no conocen la implementacin de datos subyacente; la migracin implica
cambios slo en la capa DAO.
Reduce la Complejidad del Cdigo de los Objetos de Negocio.
Centraliza todos los accesos a datos en una capa independiente.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

65

2.1.3 Aplicacin Listado


Estructura del Programa

Modelo de Datos

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

66

Pasos:
1.

Crear la clase ProductoDTO dentro del paquete beans, con los siguientes
atributos privados, e implemente los mtodos de acceso: set y get.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

67

package beans;
public class ProductoDTO {
private int codigo;
private String descripcion;
private double precio;
private int stock;
private int codMarca;
private String nomMarca;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public double getPrecio() {
return precio;
}
public void setPrecio(double precio) {
this.precio = precio;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public int getCodMarca() {
return codMarca;
}
public void setCodMarca(int codMarca) {
this.codMarca = codMarca;
}
public String getNomMarca() {
return nomMarca;
}
public void setNomMarca(String nomMarca) {
this.nomMarca = nomMarca;
}
}

2.

Crear una interface ProductoDAO dentro del paquete interfaces, con los
siguientes mtodos:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

68

3.

Registrar los DAOs(interface) dentro de la clase DAOFactory

4.

En la clase DAOFactory se mostrar

la siguiente imagen:

Esto sucede porque la clase MySqlDAOFactory no existe o se ha realizado cambios


en el DAOFactory como registrar ms DAOs (RECORDAR).

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

69

5.

Hacer clic en el foco y se mostrar la siguiente imagen:

6.

Hacer doble clic en Create class MySqlDAOFactory y se mostrar la siguiente


ventana:

7.

Clic en botn Finish.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

70

8.

Se mostrar una clase nueva con el nombre: MySqlDAOFactory, como se


muestra en la siguiente imagen:

9.

En la clase MySqlDAOFactory escribir lo siguiente:

10. Clic en el foco y se mostrar la siguiente imagen:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

71

11. Hacer doble clic en Create class MySqlProductoDAO, se mostrar la siguiente


ventana:

12. Clic en el botn Finish y se mostrar la siguiente imagen:

Se puede observar que en esta clase se debe implementar los mtodos creados en la
interface ProductoDAO, es aqu donde se debe escribir los cdigos para listar,
insertar, modificar, eliminar y buscar.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

72

13. Implementar el cdigo para listar los registros de la tabla tb_producto, escribir las
siguientes lneas dentro del mtodo listarProducto().

14. Crear una clase ProductoService dentro del paquete service y escribir los
siguientes cdigos:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

73

15. Crear un Servlet con el nombre: ServletProducto dentro del paquete


misServlets y escriba lo siguiente:

16. En la pgina listarProducto.jsp escribir lo siguiente:

17. En la pgina encabezado.jsp escribir lo siguiente:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

74

18. Cuando se ejecuta la pgina encabezado.jsp se muestra la siguiente figura:

.
19. Clic en Listar y se muestra lo siguiente:

2.2 Patrn DAO Parte II y Sesiones Web y EL


2.2.1 Lenguaje de Expresiones
EL es un lenguaje para acceder a datos de varias fuentes en tiempo de ejecucin. Su
sintaxis es considerablemente ms amigable que la de Java, que es el nico lenguaje
soportado directamente por la especificacin JSP 1.2. Todas las acciones JSTL
reconocen expresiones EL en sus valores de atributos, y se podran desarrollar
acciones personalizadas para que hicieran lo mismo. Se espera que EL sea
incorporado dentro de la prxima versin de la especificacin JSP para mejorar su uso
en el acceso a los datos sobre el lenguaje Java. Si es as, podremos usar expresiones
EL en un valor de atributo de una accin, o incluso en una plantilla de texto.
EL toma prestada de JavaScript la sintaxis para acceder a estructuras de datos tanto
como propiedades de un objeto (con el operador.) como con elementos con nombres
de un array (con el operador ["nombre"]).
Como se ve aqu, una expresin EL siempre debe estar encerrada entre los caracteres
$ { y } $. Las dos primeras expresiones acceden a una propiedad llamada myProperty
en un objeto representado por una variable llamada myObj. La tercera expresin
accede a una propiedad con un nombre contenido en una variable. Esta sintaxis se
puede utilizar con cualquier expresin que evale el nombre de la propiedad.
Estas etiquetas tratan de abstraer la complejidad de introducir cdigo Java (scriptlet)
dentro de JSP, del mismo modo que trata de evitar que cada equipo de desarrollo cree
un juego de etiquetas no estndar para las mismas labores.
sessionScope-------------------recupera una variable de sesin
requestScope-------------------recupera variable que el servlet enva a un jsp

2.2.2 Aplicacin Mantenimiento


Trabajar con el proyecto anterior: Proyecto_DAO2.
Pasos a seguir:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

1.

75

Implementar los mtodos que se encuentra en la clase MySqlProductoDAO:

package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import utils.MysqlDBConexion;
import beans.ProductoDTO;
import interfaces.ProductoDAO;
public class MySqlProductoDAO implements ProductoDAO{
@Override
public ProductoDTO buscarProducto(int cod) {
ProductoDTO obj=null;
Connection cn=null;
PreparedStatement pstm=null;
ResultSet rs=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="select *from tb_producto where cod_pro=?";
pstm=cn.prepareStatement(sql);
pstm.setInt(1, cod);
rs=pstm.executeQuery();
if(rs.next()){
obj=new ProductoDTO();
obj.setCodigo(rs.getInt(1));
obj.setDescripcion(rs.getString(2));
obj.setPrecio(rs.getDouble(3));
obj.setStock(rs.getInt(4));
obj.setNomMarca(rs.getString(5));
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(rs!=null)rs.close();
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return obj;
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

76

@Override
public int registrarProducto(ProductoDTO obj) {
int estado=-1;
Connection cn=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="insert into tb_producto
values(null,?,?,?,?)";
pstm=cn.prepareStatement(sql);
pstm.setString(1, obj.getDescripcion());
pstm.setDouble(2, obj.getPrecio());
pstm.setInt(3, obj.getStock());
pstm.setInt(4, obj.getCodMarca());
estado=pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return estado;
}
@Override
public int actualizarProducto(ProductoDTO obj) {
int estado=-1;
Connection cn=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="update tb_producto set
des_pro=?,pre_pro=?,stock_act_pro=?,cod_mar=
? where cod_pro=?";
pstm=cn.prepareStatement(sql);
pstm.setString(1, obj.getDescripcion());
pstm.setDouble(2, obj.getPrecio());
pstm.setInt(3, obj.getStock());
pstm.setInt(4, obj.getCodMarca());
pstm.setInt(5, obj.getCodigo());
estado=pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return estado;
}

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

77

@Override
public int eliminarProducto(int cod) {
int estado=-1;
Connection cn=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="delete from tb_producto where cod_pro=?";
pstm=cn.prepareStatement(sql);
pstm.setInt(1, cod);
estado=pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return estado;
}
@Override
public List<ProductoDTO> listarProducto() {
List<ProductoDTO> data=new ArrayList<ProductoDTO>();
ProductoDTO obj=null;
Connection cn=null;
PreparedStatement pstm=null;
ResultSet rs=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="select
p.cod_pro,p.des_pro,p.pre_pro,p.stock_act_pro," +
"m.nom_mar from tb_producto p inner join tb_marca m " +
"on p.cod_mar=m.cod_mar";
pstm=cn.prepareStatement(sql);
rs=pstm.executeQuery();
while(rs.next()){
obj=new ProductoDTO();
obj.setCodigo(rs.getInt(1));
obj.setDescripcion(rs.getString(2));
obj.setPrecio(rs.getDouble(3));
obj.setStock(rs.getInt(4));
obj.setNomMarca(rs.getString(5));
data.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
}
return data;
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

78

2. Modificar la clase ProductoService:


package service;
import interfaces.ProductoDAO;
import java.util.List;
import utils.Constantes;
import dao.DAOFactory;
import beans.ProductoDTO;
public class ProductoService {
DAOFactory
fabrica=DAOFactory.getDAOFactory(Constantes.ORIGEN_DATOS);
ProductoDAO objPro=fabrica.getProducto();
public List<ProductoDTO> listaProducto() {
return objPro.listarProducto();
}
public ProductoDTO buscaProducto(int cod) {
return objPro.buscarProducto(cod);
}
public int registraProducto(ProductoDTO obj) {
return objPro.registrarProducto(obj);
}
public int actualizaProducto(ProductoDTO obj) {
return objPro.actualizarProducto(obj);
}
public int EliminaProducto(int cod) {
return objPro.eliminarProducto(cod);
}
}

3.

Modificar el servlet ServletProducto:

package misServlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import beans.ProductoDTO;
import service.ProductoService;
public class ServletProducto extends HttpServlet {
private static final long serialVersionUID = 1L;
ProductoService serviProducto=new ProductoService();
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
// TODO Auto-generated method stub
String xtipo=request.getParameter("tipo");
if(xtipo.equals("listar"))
listar(request,response);
else if(xtipo.equals("buscar"))
buscar(request,response);
else if(xtipo.equals("registrar"))
registrar(request,response);
else if(xtipo.equals("actualizar"))
actualizar(request,response);
else if(xtipo.equals("eliminar"))
eliminar(request,response);
}

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

79

private void eliminar(HttpServletRequest request,


HttpServletResponse response) throws ServletException,
IOException {
int cod=Integer.parseInt(request.getParameter("cod"));
serviProducto.EliminaProducto(cod);
listar(request, response);
}
private void buscar(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
int cod=Integer.parseInt(request.getParameter("cod"));
request.setAttribute("Producto",serviProducto.buscaProducto(cod));
request.getRequestDispatcher("actualizarProducto.jsp").
forward(request, response);
}
private void actualizar(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
int marca,stock,cod;
cod=Integer.parseInt(request.getParameter("txt_cod"));
String des=request.getParameter("txt_des");
double pre=Double.parseDouble(request.getParameter("txt_pre"));
stock=Integer.parseInt(request.getParameter("txt_stock"));
marca=Integer.parseInt(request.getParameter("cbo_marca"));
ProductoDTO obj=new ProductoDTO();
obj.setCodigo(cod);
obj.setDescripcion(des);
obj.setPrecio(pre);
obj.setStock(stock);
obj.setCodMarca(marca);
serviProducto.actualizaProducto(obj);
listar(request, response);
}
private void registrar(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
int marca,stock;
String des=request.getParameter("txt_des");
double pre=Double.parseDouble(request.getParameter("txt_pre"));
stock=Integer.parseInt(request.getParameter("txt_stock"));
marca=Integer.parseInt(request.getParameter("cbo_marca"));
ProductoDTO obj=new ProductoDTO();
obj.setDescripcion(des);
obj.setPrecio(pre);
obj.setStock(stock);
obj.setCodMarca(marca);
serviProducto.registraProducto(obj);
listar(request, response);
}
private void listar(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
request.setAttribute("data", serviProducto.listaProducto());
request.getRequestDispatcher("listarProducto.jsp").
forward(request, response);
}
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

80

4. Cuando se ejecuta la pgina encabezado.jsp se muestra la siguiente figura:

5. Clic en Nuevo, se mostrar la pgina: registrarProducto.jsp

Cdigo:
<%@page import="beans.MarcaDTO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.metadata.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<script type="text/javascript">
$(document).ready(
function(){
$("#frmagregar").validate();
});
</script>
</head>
<body>
<form action="ServletProducto?tipo=registrar" id="frmagregar"
method="post"
<table align="center">
<tr>
<td>Descripcion</td>
<td><input type="text" name="txt_des" class="required"></td>
</tr>
<tr>
<td>Precio</td>
<td><input type="text" name="txt_pre"
class="{required:true,number:true}"></td>
</tr>
<tr>
<td>Stock</td>
<td><input type="text" name="txt_stock"
class="{required:true,digits:true,maxlength:[2]}"></td>
</tr>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

81

<tr>
<td>Marca</td>
<td><select name="cbo_marca" style="width:150px">
<option value="1">SAMSUNG</option>
<option value="2">HP</option>
<option value="3">SONY</option>
</select>
</td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit"
value="Registrar" class="boton2"></td>
</tr>
</table>
</form>
</body>
</html>

6.

Cuando se ejecuta la pgina encabezado.jsp se muestra la siguiente figura:

7. Clic en Listar, se mostrar la pgina: listarProducto.jsp

8. Cuando se selecciona un registro para buscar, se muestra la siguiente pgina:


actualizarProducto.jsp:

Cdigo:
<%@page import="beans.ProductoDTO"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.metadata.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

82

<script type="text/javascript">
$(document).ready(
function(){
$("#frmagregar").validate();
});
</script>
</head>
<body>
<%
ProductoDTO obj=(ProductoDTO)request.getAttribute("Producto");
%>
<form action="MantenimientoProducto" id="frmagregar" method="post">
<input type="hidden" name="txt_cod"
value="${requestScope.Producto.codigo}">
<table align="center">
<tr>
<td>Descripcion</td>
<td><input type="text" name="txt_des" class="required"
value="${requestScope.Producto.descripcion}"></td>
</tr>
<tr>
<td>Precio</td>
<td><input type="text" name="txt_pre" class="required"
value="${requestScope.Producto.precio}"></td>
</tr>
<tr>
<td>Stock</td>
<td><input type="text" name="txt_stock" class="required"
value="${requestScope.Producto.codMarca}"></td>
</tr>
<tr>
<td>Marca</td>
<td>
<select name="cbo_marca">
<%
String marca[]={"","SAMSUNG","HP","SONY"};
String estado="";
for(int i=1;i<marca.length;i++){
if(obj.getCodMarca()==i){
estado="selected";
}
else
estado="";
%>
<option value="<%=i%>" <%=estado%>>
<%=marca[i]%></option>
<%
}
%>
</select>
</td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit"
value="Registrar" class="boton2"></td>
</tr>
</table>
</form>
</body>
</html>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

83

2.2.3 Sesiones Web


HTTPSESSION
En una transaccin http, cada conexin entre un cliente y un servidor es muy breve.
Esta es una caracterstica tpica de cualquier protocolo sin estado (staless). El
protocolo http no mantiene el estado, es decir, no tiene un mecanismo para saber que
una serie de peticiones (request) provienen de un mismo cliente. Ante esta limitacin,
surge la sesin como el mecanismo adecuado para identificar un usuario que est
interactuando con el sitio web.
La sesin puede ser implementada a travs de diferentes opciones:

HttpSession
Campos ocultos HTML(hidden fields)
Cookies
URL Rewriting

La interfaz HttpSession es parte de la API de Servlets y proporciona una alternativa


para manejar el estado de una aplicacin en un servidor web.
OBTENIENDO UNA SESIN
Las sesiones son compartidas por todos los Servlets y jsps accesados por un cliente;
por lo tanto, es comn que se cree un objeto Sesin cuando nos logueamos a un
sitio web. Por otro lado, si nos deslogueamos de un sitio web, la sesin debera ser
destruida.
En Java, el objeto HttpSession identifica una sesin y es obtenida utilizando el mtodo
getSession del objeto request. Ejemplo:
HttpSession miSesion = req.getSession(true);

Sintaxis:
request.getSession() o request.getSession(true). Retornan la sesin actual si existe;
de lo contrario, crean una nueva.
request.getSession(false). Retorna la sesin actual si existe; de lo contrario, retorna
un objeto nulo.
CONTENIDO DE LA SESIN
El objeto HttpSession contiene informacin acerca de la sesin. Para acceder a esta
informacin, existen una serie de mtodos getters de los cuales mostraremos los ms
utilizados:

session.getLastAccessedTime(). La ltima vez que el cliente envi una


peticin asociada con la sesin.
session.getCreationTime(). Cuando la sesin fue creada.
session.getMaxInactiveInterval(). El intervalo de tiempo mximo (en
segundos) que el Servlet Container mantiene abierta la sesin entre accesos
del cliente

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

84

session.getAttribute(). Obtiene un objeto que fue almacenado en la sesin

ALMACENANDO Y RECUPERANDO OBJETOS DE LA SESIN


La utilidad de una sesin radica en su capacidad de actuar como un repositorio donde
se almacenan datos de la aplicacin.
Los datos son almacenados como un par <nombre, valor> siendo valor cualquier
objeto que se desee almacenar en la sesin.
Los mtodos para acceder a los datos son los siguientes:
session.setAttribute(String, Object). Sirve para almacenar objetos en la sesin.
session.getAttribute(String). Sirve para recuperar objetos de la sesin.
Ejemplo:

HttpSession session = req.getSession(true);


String nombre= Cesar Vallejo ;
session.setAttribute("miNombre",nombre);

La sesin puede ser finalizada de diferentes formas:

Programticamente
Por tiempo de expiracin
Cuando el usuario cierra el browser

Programticamente:
a) Usando el mtodo invalidate() del objeto session
b) Removiendo todos los objetos de la sesin con el mtodo removeAttribute()
Sintaxis:
removeAttribute(String nombreAtributo)
nombreAtributo es el nombre del atributo a ser removido.
HttpSession session = req.getSession(true);
session.removeAttribute(nombre);
session.invalidate();

Por tiempo de expiracin:


La sesin es invalidada cuando se cumple un tiempo de inactividad de la sesin.
Podemos definir el tiempo de inactividad mximo de dos formas:
a) Utilizando el mtodo setMaxInactiveInterval(int)
Ejemplo:
session.setMaxInactiveInterval(int)
b) Utilizando la etiqueta <session-config> dentro del archivo web.xml :

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

85

<session-config>
<session-timeout>30</session-timeout>
</session-config>

2.2.4 Aplicacin de Logueo


Trabajar con el proyecto anterior: Proyecto_DAO2.
Pasos a seguir:
1. Crear una clase EmpleadoDTO y guardarlo en la carpeta beans.
package beans;
public class EmpleadoDTO {
private int codigo;
private String nombres;
private String apellidos;
private String login;
private String password;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNombres() {
return nombres;
}
public void setNombres(String nombres) {
this.nombres = nombres;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

86

2. Crear una interface con el nombre EmpleadoDAO y guardarlo en el paquere


interfaces.

3. Registrar el DAO en la clase DAOFactory

4. Actualizar la clase MySqlDAOFactory.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

87

5. En la clase MySqEmpleadolDAO, programar lo siguiente.


package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import utils.MysqlDBConexion;
import beans.EmpleadoDTO;
import interfaces.EmpleadoDAO;
public class MySqlEmpleadoDAO implements EmpleadoDAO{
@Override
public EmpleadoDTO IniciarSesion(String xlogin) {
EmpleadoDTO em=null;
Connection cn=null;
PreparedStatement pstm=null;
ResultSet rs=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="select *from tb_empleado where log_emp=?";
pstm=cn.prepareStatement(sql);
pstm.setString(1, xlogin);
rs=pstm.executeQuery();
if(rs.next()){
em=new EmpleadoDTO();
em.setCodigo(rs.getInt(1));
em.setNombres(rs.getString(2));
em.setApellidos(rs.getString(3));
em.setLogin(rs.getString(4));
em.setPassword(rs.getString(5));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(rs!=null)rs.close();
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
6. dd
return em;
}
}

7. Crear la clase EmpleadoService, programar lo siguiente.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

88

8. Crear el servlet ServletEmpleado, programar lo siguiente.


package misServlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import beans.EmpleadoDTO;
import service.EmpleadoService;
public class MantenimientoEmpleado extends HttpServlet {
private static final long serialVersionUID = 1L;
EmpleadoService servicio=new EmpleadoService();
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
String xtipo=request.getParameter("tipo");
if(xtipo.equals("sesion"))
iniciarSesion(request,response);
else if(xtipo.equals("cerrarSesion"))
cerrarSesion(request,response);
}
private void cerrarSesion(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
HttpSession sesion=request.getSession();
sesion.invalidate();
request.setAttribute("msg", "Iniciar sesin");
request.getRequestDispatcher("index.jsp").
forward(request, response);
}
private void iniciarSesion(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
String xlogin=request.getParameter("txt_login");
String xpass=request.getParameter("txt_pass");
EmpleadoDTO obj=servicio.IniciaSesion(xlogin);
if(obj!=null){
if(obj.getPassword().equals(xpass)){
HttpSession sesion=request.getSession();
sesion.setAttribute("datos",obj);
request.getRequestDispatcher("encabezado.jsp").
forward(request, response);
}
else{
request.setAttribute("msg", "Contrasea
incorrecta...");
request.getRequestDispatcher("index.jsp").
forward(request, response);
}
}
else{
request.setAttribute("msg", "Usuario no existe...");
request.getRequestDispatcher("index.jsp").
forward(request, response);
}
}
}

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

89

9. Crear la pgina index.jsp, programar lo siguiente.


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="ServletEmpleado?tipo=sesion" name="frmsesion" method="post">
<table border="1" align="center">
<tr>
<td>Login</td>
<td><input type="text" name="txt_login"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="text" name="txt_pass"></td>
</tr>
<tr>
<td colspan="2" align="center">${requestScope.msg}</td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit"
value="Iniciar"></td>
</tr>
</table>
</form>
</body>
</html>

10. Crear la pgina validar.jsp y escribir las siguientes instrucciones:

11. Modificar la pgina encabezado.jsp, para poder cerrar sesin:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

90

12. Llamar a validar.jsp y encabezado.jsp, en las pginas: listarProducto.jsp,


registrarProducto.jsp y actualizarProducto.jsp, como se muestra en la
siguiente imagen
Pgina: listarProducto.jsp

Pgina: registrarProducto.jsp y actualizarProducto.jsp

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

91

Resumen
1. El catlogo ms famoso de patrones se encuentra en Design Patterns:
Elements of Reusable Object-Oriented Software, de Erich Gamma, Richard
Helm, Ralph Johnson y John Vlissides, 1995, Addison-Wesley, tambin conocido
como el libro GOF (Gang-Of-Four).
2. Patrn Factory "Factora"
En realidad, son una familia de patrones:

Factora simple: Una clase que crea objetos de otras clases. No delega
en otras subclases y sus mtodos pueden ser estticos.
Factory Method: Se define una interfaz para crear objetos, como en el
Abstract Factory, pero se delega a las subclases implementar la creacin
en concreto.
Abstract Factory: Da una interfaz para crear objetos de alguna familia, sin
especificar la clase en concreto.

3. El uso de Lenguaje de Expresiones es obtener las propiedades de un objeto


directamente a travs de estas formas:

${myObj.myProperty}$
${myObj["myProperty"]}$
${myObj[varWithTheName]}$

4. Si desea saber ms acerca de estos temas puede consultar las siguientes pginas.

http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html
Aqu hallar definiciones y ejemplos sobre patrones.
http://java.sun.com/javaee/5/docs/tutorial/doc/bnahq.html
Aqu hallar definiciones sobre los temas planteados.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

92

UNIDAD

3
Etiquetas, JSTL, Transacciones,
Ajax y Listeners
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno implementa una aplicacin Java Web que
utilice Custom Tag, Java Standard Tag, Library (JSTL) y transacciones usando
AJAX.

TEMARIO
3.1 Tema 7
3.1.1
3.1.2
3.1.3
3.1.4
3.2 Tema 8
3.2.1
3.2.2
3.2.3
3.3 Tema 3
3.3.1
3.3.2

:
:
:
:
:
:
:
:
:
:
:
:

Custom Tag y JSTL


Custom Tag
Creacin de etiquetas personalizadas (Custom TAG)
JSTL y Libreras
Aplicacin Listado con JSTL
Ajax y Transacciones en web
Ajax
Transacciones
Aplicacin Ajax y Transaccin
Listeners
Tipos
Aplicacin Auditoria

Actividades propuestas
Los alumnos resuelven ejercicios que involucran la creacin de etiquetas
personalizadas y el uso de JSTL para listar contenidos.
Los alumnos implementan una aplicacin con base de datos para realizar
una transaccin usando la Tecnologa Ajax y aplicando auditora.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

93

3.1 Custom Tag y JSTL


3.1.1 Custom Tag
La tecnologa JSP nos permite introducir cdigo Java en pginas HTML. Este
documento supone que est familiarizado con la creacin de pginas JSP y que tiene
instalado Apache-Tomcat (en realidad, valdra cualquier servidor de JSP que cumpla la
especificacin JSP 1.1, pero los ejemplos se han probado en Tomcat).
Las JSP estn compuestas por varios tags o, como las denominaremos en adelante,
etiquetas. Ejemplos de etiquetas JSP son setProperty, include, forward, usebean.
Todas ellas encapsulan comportamientos de una manera sencilla. Nos detendremos
en la etiqueta <jsp:useBean>. Esta etiqueta crea una instancia de una clase definida
como un JavaBean. El uso de la etiqueta <jsp: useBean> en conjuncin con los
JavaBeans hace que podamos separar la lgica de presentacin de la de proceso y
consigue unos archivos JSP ms claros, y lo que es ms importante, el que escribe la
JSP no tiene por qu tener unos conocimientos avanzados de programacin para
crear pginas JSP de funcionalidades avanzadas. Pues bien, las JSP Custom Tags
son un paso ms all. Con ellas se pueden aadir nuevas etiquetas a las ya existentes
en JSP (eso s a partir de la especificacin JSP 1.1) que encapsulen comportamientos
ms o menos complicados. Antes de seguir, vamos a revisar algunos conceptos.
Hay dos tipos principales de etiquetas: etiquetas que no tienen cuerpo y etiquetas que
s lo tienen. Ejemplos son la etiqueta <img src="asdfa.gif"> que no tiene cuerpo y no
tiene etiqueta de final; y <title>manolo</title> que tiene cuerpo y etiqueta de final.
Estos son tambin los dos tipos de etiquetas JSP que nosotros podemos crear a
medida.
Entonces podemos decir que un Custom Tag permite la creacin de etiquetas o
libreras Tags personalizadas para separar la vista de la lgica de proceso logrando la
reutilizacin de cdigo.
3.1.2 Creacin de etiquetas personalizadas (Custom TAG)
Trabajar con el proyecto anterior y agregar el paquete tags dentro de src.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

94

Pasos:
1.
2.

Crear una clase con el nombre: TagMeses


Realizar la herencia a la clase TagSupport, como se muestra en la siguiente
imagen:

3.

Dentro de la clase TagMeses escribir doStartTag y pulsar CTRL + Barra


Espaciadora y hacer doble clic en el mtodo que se muestra para que se
implemente.

Doble clic aqu

4.

Realizar el mismo procedimiento para doEndTag, la clase TagMeses quedara


de la siguiente manera:

Nota:
doStartTag: Se procesa la etiqueta de apertura.
doEndTag: Se ejecuta despues de doStartTag.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

5.

95

Escribir el siguiente cdigo:

Nota:
JspWriter, es la clase que permite escribir un valor.
SKIP_BODY, que se ejecute el cuerpo de la etiqueta creada.
EVAL_PAGE, procesar el resto de JSP
6.

Crear una etiqueta personalizada(etiqueta select) que permita mostrar cualquier


valor o valores que se ingresaran, crear una clase TagValores con el siguiente
cdigo:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

7.

96

Crear una etiqueta personalizada que muestre un mensaje segn un valor que se
ingresar. Crear una clase TagMensajes con el siguiente cdigo:

Etiqueta personalizada (etiqueta select) que almacene los registros de una tabla
(Marca).
8.

Crear una clase ComboDTO dentro del paquete beans con el siguiente cdigo:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

9.

97

Crear una interface con el nombre ComboDAO dentro del paquete interfaces:

10. Proceda a registrar el DAO dentro de DAOFactory con el nombre getCombo().

11. Actualizar la clase MySqlDAOFactory

12. Programar en la clase MySqlComboDAO lo siguiente:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

98

13. Crear una clase dentro del paquete service con el nombre ComboService y
escribir las siguientes instrucciones:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

99

14. Crear un archivo properties tags.properties dentro de src, como se muestra a


continuacin:

15. Crear una clase TagComboDinamico dentro del paquete tags y escribir las
siguientes instrucciones:

16. Crear un folder con el nombre: tag y un archivo con extensin tld dentro de WEBINF, para registrar las etiquetas personalizadas

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

100

17. El archivo tendr la siguiente estructura:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

101

18. En la pgina registrarProducto.jsp, llamar al archivo tld creado.

19. Llamar la etiqueta personaliza TagComboDinamico para que almacene los


registros de la tabla tb_marca

Cambiar por

20. Resultado al ejecutar la pgina:

21. En la pgina actualizarProducto.jsp, llamar al archivo tld creado.

22. Llamar la etiqueta personaliza TagComboDinamico para que almacene los


registros de la tabla tb_marca y muestre seleccionado la marca segn el
producto escogido en el listado.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

102

Cambiar por

23. Ejecutar la pgina index.jsp, luego hacer clic en el men listar y se mostrara la
siguiente pgina:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

103

3.1.3 JSTL y Librerias


JSTL responde a la demanda de los desarrolladores de un conjunto de acciones JSP
personalizadas para manejar las tareas que necesitan casi todas las pginas JSP,
incluyendo procesamiento condicional, internacionalizacin, acceso a bases de datos y
procesamiento XML. Esto acelerar el desarrollo de JSPs ms o menos eliminando la
necesidad de elementos de scripting, y los inevitables y difciles de encontrar errores
de sintaxis; y liberando el tiempo anteriormente gastado en desarrollar y aprender
trillones de acciones personalizadas especficas del proyecto para estas tareas
comunes.
JSTL 1.0 especifica un conjunto de libreras de etiquetas basadas en el API JSP 1.2.
Hay cuatro libreras de etiquetas independientes, cada una contiene acciones
personalizadas dirigidas a un rea funcional especfica. Esta tabla lista cada librera
con su prefijo de etiqueta recomendado y la URI por defecto:
Descripcin
Core
XML Processing
I18N & Formatting
Database Access

Prefijo
c
x
fmt
sql

URI por Defecto


http://java.sun.com/jstl/core
http://java.sun.com/jstl/xml
http://java.sun.com/jstl/fmt
http://java.sun.com/jstl/sql

La Librera Core contiene acciones para las tareas rutinarias, como incluir o excluir una
parte de una pgina dependiendo de una condicin en tiempo de ejecucin, hacer un
bucle sobre una coleccin de tems, manipular URLs para seguimiento de sesin, y la
correcta interpretacin del recurso objetivo. Asimismo, tiene acciones para importar
contenido de otros recursos y redireccionar la respuesta a una URL diferente.
La Librera XML contiene acciones para procesamiento XML, incluido validar un
documento XML y transformarlo usando XSLT. Tambin, proporciona acciones para
extraer parte de un documento XML validado, hacer bucles sobre un conjunto de
nodos y procesamiento condicional basado en valores de nodos.
La Internacionalizacin (i18n) y el formateo general estn soportados por las acciones
de la Librera I18N & Formatting. Podemos leer y modificar informacin almacenada en
una base de datos con las acciones proporcionadas por la Librera Database Access.
Ms adelante, podemos esperar que todos los contenedores web incluyan una
implementacin de las libreras JSTL, as no tendremos que instalar ningn cdigo
adicional. Hasta que esto suceda, podemos descargar e instalar la implementacin de
referencia (RI) de JSTL. Se ha desarrollado dentro del proyecto Apache Taglibs como
una librera llamada Standard.
Instalar RI es fcil, slo hay que copiar los archivos JAR del directorio lib de la
distribucin al directorio WEB-INF/lib de nuestra aplicacin. Obsrvese que JSTL 1.0
requiere un contenedor JSP 1.2; por ello, debemos asegurarnos de tener un
contenedor compatible con JSP 1.2 antes de probar esto.
Para usar una librera JSTL, tanto si la implementacin est incluida con el contenedor
o con el RI, debemos declarar la librera usando una directiva taglib, como lo haramos
con una librera de etiquetas personalizadas normal:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

104

Obsrvese que siempre deberamos usar la URI por defecto, incluso aunque la
especificacin JSP nos permita sobreescribirla. Un contenedor puede generar cdigo
optimizado para la accin JSTL en la clase correspondiente a una pgina JSP. Esto
puede resultar en un mejor rendimiento que cuando el cdigo generado llama a los
manejadores de etiquetas a travs del API estndar. Sin embargo, slo cuando se usa
la URI por defecto, es cuando el contenedor puede utilizar una implementacin
optimizada.
El Lenguaje de Expresin JSTL
Adems de las libreras de etiquetas, JSTL 1.0 define un llamado Lenguaje de
Expresiones (EL). EL es un lenguaje para acceder a datos de varias fuentes en tiempo
de ejecucin. Su sintaxis es considerablemente ms amigable que la de Java, que es
el nico lenguaje soportado directamente por la especificacin JSP 1.2. Todas las
acciones JSTL reconocen expresiones EL en sus valores de atributos, y se podran
desarrollar acciones personalizadas para que hicieran lo mismo. Se espera que EL
sea incorporado dentro de la prxima versin de la especificacin JSP para mejorar su
uso para acceder a datos sobre el lenguaje Java. Si es as, podremos usar
expresiones EL en un valor de atributo de una accin, o incluso en una plantilla de
texto.
EL toma prestada de JavaScript la sintaxis para acceder a estructuras de datos tanto
como propiedades de un objeto (con el operador.) como con elementos con nombres
de un array (con el operador ["nombre"]). Las propiedades de los componentes
JavaBeans y las entradas java.util.Map, que usan la clave como nombre de propiedad,
pueden ser accedidas de esta forma. Aqu tenemos algunos ejemplos:
${myObj.myProperty}$
${myObj["myProperty"]}$
${myObj[varWithTheName]}$
Como se ve aqu, una expresin EL siempre debe estar encerrada entre los caracteres
${ y }$. Las dos primeras expresiones acceden a una propiedad llamada myProperty
en un objeto representado por una variable llamada myObj. La tercera expresin
accede a una propiedad con un nombre contenido en una variable. Esta sintaxis se
puede utilizar con cualquier expresin que evale el nombre de la propiedad.
El operador de acceso a array tambin se usa para datos representados como una
coleccin de elementos indexados, como un array Java o una java.util.List:
${myList[2]}$
${myList[aVar + 1]}$
Adems de los operadores de propiedad y elemento array, y los operadores
aritmticos, relacionales y lgicos, hay un operador especial para comprobar si un
objeto est "vaco" o no puede ser usado en una expresin EL. La siguiente tabla lista
todos los operadores:
Operador
.
[]
()
+
-

Descripcin
Accede a una propiedad.
Accede a un elemento de un array/lista.
Agrupa una subexpression.
Suma
Resta o negacin de un nmero

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

/ o div
% o mod
== o eq
!= o ne
< o lt
> o gt
<= o le
>= o gt
&& o and
|| o or
! o not
empty

105

Divisin
Mdulo (resto)
Comprueba Igualdad.
Comprueba desigualdad.
Comprueba menor que.
Comprueba mayor que.
Comprueba menor o igual que.
Comprueba mayor o igual que.
Comrpueba AND lgico.
Comprueba OR lgico.
Complemento binario booleano
Comprueba un valor vaco (null, string vaco o una colleccin
vaca)

Lo que no encontraremos en EL son sentencias como asignaciones, if/else o while.


Para este tipo de funcionalidades, en JSP se usan los elementos Action. EL no est
pensado para utilizarse como un lenguaje de programacin de propsito general, slo
un lenguaje de acceso a datos.
Cualquier objeto en uno de los mbitos de JSP (pgina, solicitud, sesin o aplicacin)
se puede utilizar como una variable en una expresin EL. Por ejemplo, si tenemos un
bean con una propiedad firstName en el mbito de la solicitud bajo el nombre
customer, esta expresin EL representa el valor de la propiedad firstName del bean.
${customer.firstName}
Sin embargo, EL tambin hace que la informacin de la solicitud y la informacin
general del contenedor est disponible como un conjunto de variables implcitas:
Variable
Param
paramValues
Header
headerValues
Cookie
initParams
pageContext
pageScope
requestScope
sessionScope
applicationScope

Descripcin
Una collection de todos los valores de los parmetros de la solicitud
como un slo valor string para cada parmetro
Una collection de todos los valores de los parmetros de la solicitud
como un array de valores string por cada parmetro
Una collection de todas las cabeceras de solicitud como un slo
valor string por cada cabecera
Una collection de todos los valores de cabecera de la solicitud
como un array de valores string por cada cabecera
Una collection con todas las cookies de la solicitud en un slo
ejemplar de javax.servlet.http.Cookie por cada cokkie
Una collection de todos los parmetros de inicializacin de la
aplicacin en un slo valor string por cada parmetro
Un ejemplar de la clase javax.servlet.jspPageContext
Una collection de todos los objetos en el mbito de la pgina
Una collection de todos los objetos en el mbito de la solicitud
Una collection de todos los objetos en el mbito de la sesin
Una collection de todos los objetos en el mbito de la aplicacin

Las cinco primeras variables implcitas de la tabla nos ofrecen acceso a los valores de
parmetros, cabeceras y cookies de la solicitud actual. Aqu hay un ejemplo de cmo
acceder a un parmetro de solicitud llamado listType y a la cabecera User-Agent:

${param.listType}
${header['User-Agent']}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

106

Observe cmo se debe usar la sintaxis de array para la cabecera, porque el nombre
incluye un guion; con la sintaxis de propiedad, sera interpretado como la expresin
variable header.User menos el valor de una variable llamada Agent.
La variable initParameter proporciona acceso a los parmetros de inicializacin que se
definen en el archivo web.xml de la aplicacin. La variable pageContext tiene varias
propiedades que proporcionan acceso al objeto servlet que representa la solicitud, la
respuesta, la sesin y la aplicacin, etc.
Las cuatro ltimas variables son colecciones que contienen todos los objetos de cada
mbito especfico. Podemos usarlas para limitar la bsqueda de un objeto en slo un
mbito en lugar de buscar en todos ellos, lo que est por defecto si no se especifica
ningn mbito. En otras palabras, si hay un objeto llamado customer en el mbito de
sesin, estas dos primeras expresiones encuentran el mismo objeto, pero la tercera
vuelve vaca:
${customer}
${sessionScope.customer}
${requestScope.customer}
Todas las acciones JSTL aceptan expresiones EL cmo valores de atributo, para
todos los atributos excepto para var y scope, porque estos valores de atributo podran
usarse para chequear el tipo en el momento de la traduccin en una futura versin.
Hay un atributo de una accin JSTL adicional que no toma un valor de expresin EL,
pero slo se usa en la librera XML, por eso lo ignoraremos por ahora. Se pueden usar
una o ms expresiones EL en el mismo valor de atributo, y el texto fijo y las
expresiones EL se pueden mezclar en el mismo valor de atributo:
First name: &lt;c:out value="${customer.firstName}" /&gt;
&lt;c:out value="First name: ${customer.firstName}" /&gt;

Antes de saltar a ver ejemplos de utilizacin de las acciones Core, se ver lo que
dijimos anteriormente: todas las acciones JSTL de la librera EL aceptan expresiones
EL. Realmente hay un conjunto paralelo de libreras JSTL, llamado conjunto de librera
RT que slo acepta expresiones Java del antiguo estilo:
First name: <c_rt:out value="<%= customer.getFirstName() %>" />

Procesamiento Condicional y Bucles


Veamos algunos ejemplos de cmo podemos usar el JSTL condicional y las acciones
de iteracin: <c:if>; <c:choose>, <c:when>, y un triple <c:otherwise>; y <c:forEach>.
Por el camino, tambin usaremos acciones de salida bsica y de seleccin de
variables: <c:out> y <c:set>.
<c:if> nos permite incluir, o procesar, condicionalmente una parte de una pgina,
dependiendo de la informacin durante la ejecucin. Este ejemplo incluye un saludo
personal si el usuario es un visitante repetitivo, segn lo indica la presencia de una
cookie con el nombre del usuario:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

107

<c:if test="${!empty cookie.userName}">


Welcome back <c:out value="${cookie.userName.value}" />
</c:if>

El valor del atributo test es una expresin EL que chequea si la cookie existe. El
operador empty combinado con el operador "not" (!) significa que evala a true si el
cookie no existe, haciendo que el cuerpo del elemento sea procesado. Dentro del
cuerpo, la accin <c:out> aade el valor de la cookie a la respuesta. As de sencillo.
Pasar a travs de una coleccin de datos es casi tan sencillo. Este fragmento itera
sobre una coleccin de filas de una base de datos con informacin del tiempo de
diferentes ciudades:
<c:forEach items="${forecasts.rows}" var="${city}">
City: <c:out value="${city.name}" />
Tomorrow's high: <c:out value="${city.high}" />
Tomorrow's low: <c:out value="${city.low}" />
</c:forEach>
La expresin EL para el valor items obtiene el valor de la propiedad rows desde un
objeto representado por la variable forecasts. Como aprenderemos ms adelante, las
acciones de bases de datos de JSTL representan un resultado de consulta como un
ejemplar de una clase llamada javax.servlet.jsp.jstl.sql.Result. Esta clase se puede
utilizar como un bean con varias propiedades. La propiedad rows contiene un array de
ejemplares java.util.SortedMap, donde cada uno representa una fila con valores de
columnas. La accin <c:forEach> procesa su cuerpo una vez por cada elemento de la
coleccin especificado por el atributo tems. Adems de que con arrays, la accin
funciona con cualquier otro tipo de dato que represente una coleccin, como
ejemplares de las clases java.util.Collection o java.util.Map.
Si se especifica el atributo var, el elemento actual de la coleccin se hace disponible
para las acciones del cuerpo como una variable con el nombre especificado. Aqu se
llamaba city y, como la coleccin es un array de maps, esta variable contiene un nuevo
map con valores de columnas cada vez que se procesa el cuerpo. Los valores de las
columnas se aaden a la respuesta por el mismo tipo de acciones <c:out> que hemos
visto en ejemplos anteriores.
Para ilustrar el uso del resto de las acciones condicionales, extendamos el ejemplo de
iteraccin para procesar slo un conjunto fijo de filas por cada pgina solicitada,
aadamos enlaces "Previous" y "Next" a la misma pgina. El usuario puede entonces
pasar sobre los resultados de la base de datos, mirando unas pocas filas cada vez,
asumiendo que el objeto Result se ha grabado en el mbito de la sesin. Aqu est
cmo procesar slo algunas filas:

<c:set var="noOfRows" value="10" />


<c:forEach items="${forecasts.rows}" var="${city}"
begin="${param.first}" end="${param.first + noOfRows - 1}">
City: <c:out value="${city.name}" />
Tomorrow's high: <c:out value="${city.hZigh}" />
Tomorrow's low: <c:out value="${city.low}" />
</c:forEach>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

108

La accin <c:set> selecciona una variable con el valor especificado por el atributo
value; que puede ser un valor esttico, como en este ejemplo, o una expresin EL.
Tambin, podemos especificar el mbito de la variable con el atributo scope (page,
request, session o application). En este ejemplo, hemos seleccionado una variable
llamada noOfRows a 10 en el mbito de la pgina (por defecto). Este es el nmero de
filas que mostraremos en cada solicitud.
El <c:forEach>, en este ejemplo, toma los mismos valores para los atributos tems y
var como antes, pero hemos aadido dos nuevos atributos:
El atributo begin toma el ndice (base 0) del primer elemento de la coleccin a
procesar. Aqu se selecciona al valor de un parmetro de solicitud llamado first.
Para la primera solicitud, este parmetro no est disponible, por eso la
expresin se evala a 0; en otras palabras, la primea fila.
El atributo end especfica el ndice del ltimo elemento de la coleccin a
procesar. Aqu lo hemos seleccionado al valor del parmetro first ms
noOfRows menos uno. Para la primera solicitud, cuando no existe el parmetro
de la solicitud, este resultado es 9, por eso la accin itera sobre los ndices del
0 al 9.
Luego, aadimos los enlaces "Previous" y "Next":

<c:choose>
<c:when test="${param.first > 0}">
<a href="foreach.jsp?first=<c:out
value="${param.first -noOfRows}"/>">
Previous Page</a>
</c:when>
<c:otherwise>
Previous Page
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${param.first + noOfRows <
forecasts.rowsCount}">
<a href="foreach.jsp?first=<c:out
value="${param.first +
noOfRows}"/>">
Next Page</a>
</c:when>
<c:otherwise>
Next Page
</c:otherwise>
</c:choose>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

109

El <c:choose> agrupa una o ms acciones <c:when>, cada una especificando una


condicin booleana diferente. La accin <c:choose> chequea cada condicin en orden
y slo permite la primera accin <c:choose> con una condicin que se evale a true
para procesar su cuerpo. El cuerpo <c:choose> tambin podra contener un
<c:otherwise>. Su cuerpo slo se procesa si ninguna de las condiciones de los
<c:when> es true.
En este ejemplo, la primera accin <c:when> comprueba si el parmetro first es mayor
que cero, es decir, si la pgina muestra un subconjunto de filas distinto del primero. Si
esto es cierto, el cuerpo de la accin <c:when> aade un enlace a la misma pgina
con un parmetro first seleccionado al ndice del subconjunto anterior. Si no es true, se
procesa el cuerpo de la accin <c:otherwise>, aadiendo slo el texto "Previous
Page". El segundo bloque <c:choose> proporciona lgica similar para aadir el enlace
"Next Page".

Internacionalizacin y Formateo
Las grandes sites normalmente necesitan complacer a los visitantes de todo el mundo,
por lo que servir el contenido slo en un idioma no es suficiente. Para desarrollar una
site que proporcione una eleccin de idiomas, tenemos dos opciones:
Escribir un conjunto de pginas para cada idioma
Escribir un conjunto compartido de pginas que ponga el contenido en
diferentes idiomas desde fuentes externas
Frecuentemente, terminaremos con una mezcla de estas tcnicas, usar pginas
separadas para la mayora de las grandes cantidades de contenido esttico y pginas
compartidas cuando la cantidad de contenido sea pequea, pero dinmica (por
ejemplo, una pgina con unas pocas etiquetas fijas mostradas en diferentes idiomas y
todos los dems datos que vengan desde una base de datos).
Preparar una aplicacin para varios idiomas se llama internacionalizacin
(comnmente abreviado i18n); y hacer que el contenido est disponible para un idioma
especfico se llama localizacin (o l10n). Para hacer esto, necesitamos considerar
otras cosas adems del idioma: cmo se formatean las fechas y nmeros entre los
diferentes pases e, incluso, dentro de los pases. Tambin, podramos necesitar
adaptar los colores, las imgenes y otro contenido no textual. El trmino localidad se
refiere a un conjunto de reglas y contenido aceptable para una regin o cultura.
Formateo de Fechas y Nmeros Sensible a la Localidad
JSTL incluye un conjunto de acciones para simplificar la internacionalizacin,
principalmente cuando pginas compartidas se usan para varios idiomas. Primero,
veamos cmo formatear apropiadamente fechas y nmeros. Este ejemplo formatea la
fecha actual y un nmero basndose en las reglas de la localidad por defecto:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"
%>
<html>
<body>
<h1>Formatting with the default locale</h1>
<jsp:useBean id="now" class="java.util.Date" />
Date: <fmt:formatDate value="${now}" dateStyle="full" />
Number: <fmt:formatNumber value="${now.time}" />
</body>
</html>
CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

110

La primera lnea es la directiva taglib para la librera JSTL que contiene las acciones
de formateo e internacionalizacin. El prefijo por defecto, usado aqu, es fmt. Para
obtener un valor a formatear, entonces crea un objeto java.util.Date que representa la
fecha y hora actuales, y lo graba como una variable llamada now.
Ya estamos preparados para hacer algn formateo sensible a la localidad. La accin
JSTL <fmt:formatDate> formatea el valor de la variable now asignado al valor del
atributo value usando el tipo de expresin EL que aprendimos en la pgina anterior. El
atributo dateStyle le dice a la accin cmo debe formatear la fecha.
Podemos usar cualquiera de los valores default, short, medium, long, o full para el
atributo dateStyle. El tipo de formateo que representa cada uno de estos tipos
depende exactamente de la localidad. Para la localidad English, full resulta en un
string como Thursday, August 29, 2002. En este ejemplo, slo hemos formateado la
parte de la fecha, pero tambin podemos incluir la parte de la hora (o formatear slo la
hora), y definir reglas de formateo personalizadas tanto para la fecha como para la
hora en lugar de los estilos dependientes de la localidad:
<fmt:formatDate value="${now}" type="both"
pattern="EEEE, dd MMMM yyyy, HH:mm" />
El atributo pattern toma un patrn de formateo personalizado del mismo tipo que la
clase java.text.SimpleDateFormat. El patrn usado aqu resulta en Thursday, 29
August 2002, 17:29 con la localidad English. La accin <fmt:formatNumber> soporta
atributos similares para especificar cmo formatear un nmero usando estilos
dependientes de la localidad para nmeros normales, valores de moneda, o un
porcentaje, as como usar patrones personalizados de diferentes tipos.
Acceder a una Base de Datos
Un sujeto de controversia es la inclusin en JSTL de acciones para acceder a bases
de datos. Alguna gente ve esto como una mala prctica y argumenta que todos los
accesos a bases de datos se deberan realizar desde componentes Java puros en una
aplicacin basada en MVC en lugar de desde pgina JSP. Este precepto es para
aplicaciones que son extensas, ya que resulta bien prctico utilizar JSTL para
aplicaciones sencillas. Sin el soporte de JSTL, estas aplicaciones normalmente
terminan con el cdigo para acceder a la base de datos dentro de scriptles, lo que es
peor todava para un mantenimiento y desarrollo correctos. Por lo tanto, veremos
cmo acceder a bases de datos desde pginas JSP; sin embargo, esta aproximacin
no es la mejor para todos los tipos de aplicaciones. Si el equipo de desarrollo incluye
programadores Java, se debera considerar seriamente encapsular el cdigo de
acceso a la base de datos en clases Java, y utilizar las JSP slo para mostrar los
resultados.
Las acciones de bases de datos de JSTL estn basadas en el API JDBC de Java y
usan las abstracciones javax.sql.DataSource presentada en JDBC 2.0 para
representar una base de datos. Un DataSource proporciona conexiones a una base de
datos y puede implementar una caracterstica llamada almacn de conexiones.
Abrir una conexin fsica a una base de datos es una operacin que consume mucho
tiempo. Con el almacenamiento de conexiones, slo necesitamos hacerlo una vez, y la
misma conexin se puede reutilizar una y otra vez, sin los riesgos de problemas
asociados con otras aproximaciones de comparticin de conexiones.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

111

Poner un objeto DataSource a Disposicin de JSTL


JSTL soporta varias formas para hacer que un objeto DataSource est disponible para
las acciones de bases de datos. En un contenedor web con soporte JNDI (Java
Naming and Directory Interface), se puede definir un DataSource por defecto como un
recurso JNDI con un parmetro de contexto en el archivo web.xml:
< context-param>

<param-name>
javax.servlet.jsp.jstl.sql.dataSource
</param-name>
<param-value>
jdbc/Production
</param-value>
</context-param>
Se deben utilizar las herramientas de configuracin JNDI del contenedor WEB para
configurar un recurso JNDI con el nombre especificado; por ejemplo, con un nombre
de usuario y un password de una cuenta de usuario en una base de datos, las
conexiones mnimas y mximas en el almacen, etc. La forma de realizar esto vara
entre los contenedores y est fuera del mbito de este artculo.
Una alternativa para los contenedores que no soportan JNDI es que un oyente del
ciclo de vida de la aplicacin (contexto del servlet) cree y configure un DataSource y lo
seleccione como el valor por defecto usando la clase Config de JSTL:
import javax.servlet.*;
import javax.servlet.http.*;
import oracle.jdbc.pool.*;
public
class
AppListener
implements
ServletContextListener {
private OracleConnectionCacheImpl ds =null;
public void contextInitialized(ServletContextEvent sce){
ServletContext application =sce.getServletContext();
try {
ds = new OracleConnectionCacheImpl();
ds.setURL("jdbc:oracle:thin:@voyager2:1521:Oracle9i");
ds.setMaxLimit(20);
ds.setUser("scott");
ds.setPassword("tiger");
}
catch (Exception e){
application.log("Failed to create data source:"+
e.getMessage());
}
Config.set(application, Config.SQL_DATASOURCE, ds);
}
...
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

112

La clase oyente de este ejemplo crea un DataSource con capacidades de almacn de


conexiones para una base de datos Oracle9i, y la hace disponible como por defecto
para las acciones JSTL usando la clase Config para seleccionar la variable de
configuracin correspondiente.
Otra forma, slo disponible para prototipos o aplicaciones que no van a utilizarse tan
duramente como para necesitar el almacn de conexiones, es usar la accin
<sql:setDataSource>:
<sql:setDataSource
url="jdbc:mysql://dbserver/dbname"
driver="org.gjt.mm.mysql.Driver"
user="scott"
password="tiger" />
Esta accin crea una sencilla fuente de datos, sin almacenamiento, para la URL JDBC
especificada, con el usuario y la password, usando el driver JDBC especificado.
Podramos usar esta accin para empezar, pero recomendamos la utilizacin de una
de las otras alternativas para una site del mundo real. Adems de privarnos del
almacn de conexiones para una fuente de datos creada de esta forma, no es una
buena idea incluir informacin sensible como la URL de la base de datos, el nombre
de usuario y la password en una pgina JSP, ya que sera posible para alguien
acceder al cdigo fuente de la pgina.
Leer Datos de la Base de Datos
Con una DataSource a nuestra disposicin, podemos acceder a la base de datos. Aqu
podemos leer datos desde una base de datos representada por el DataSource por
defecto:
<%@
taglib
prefix="sql"
uri="http://java.sun.com/jstl/sql" %>
<html>
<body>
<h1>Reading database data</h1>
<sql:query var="emps" sql="SELECT * FROM
Employee" />
...
</body>
</html>
Primero, necesitamos declarar la librera JSTL que contiene las acciones de bases de
datos, usando la directiva taglib de la parte superior de este ejemplo. La accin
<sql:query> ejecuta la sentencia SQL SELECT especificada por el atributo sql (o como
el cuerpo del elemento accin) y graba los resultados en una variable nombrada por el
atributo var.
El resultado de la consulta a la base de datos se devuelve como un bean del tipo
javax.servlet.jsp.jstl.sql.Result con varias propiedades de solo lectura:

Propiedad
Rows

Tipo Java

Descripcin
Un array con un mapa insensible a las
java.util.SortedMap[]
maysculas por cada fila con las claves

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

rowsByIndex

Object[][]

columnNames
rowCount

String[]
Int

limitedByMaxRows

boolean

113

correspondiendo con los nombres de


columna y valores correspondiendo con
los valores de columna
Un array con un array por fila con
valores de columna
Un array con nombres de columnas
El nmero de filas en el resultado
true si no se han incluido todas las filas
debido a que se ha alcanzado el lmite
mximo de filas especificado

Ya vimos cmo utilizar la accin <c:forEach> para mostrar todas o slo algunas filas,
por eso ahora veremos cmo podemos obtener slo algunas filas para mostrarlas
todas en esta parte. Los enlaces Next y Previous le permiten al usuario solicitar un
conjunto diferente. Primero, aqu est cmo leer un subconjunto de filas y luego
mostrar el subconjunto completo:
<c:set var="noOfRows" value="10" />
<sql:query var="emps"
startRow="${param.start}" maxRows="${noOfRows}">
SELECT * FROM Employee
</sql:query>
<ul>
<c:forEach items="${emps.rows}" var="${emp}">
<li><c:out value="${emp.name}" />
</c:forEach>
</ul>

El atributo startRow para la accin <sql:query> se enva a una expresin EL que lee el
valor de un parmetro de solicitud llamado start. Luego veremos cmo cambia este
valor cuando se pulsa sobre los enlaces Next y Previous. La primera vez que se
accede a la pgina, el parmetro no existe, por eso la expresin se evala a 0.
Esto significa que el resultado de la consulta contiene filas empezando con la primera
que corresponda (ndice 0). El atributo maxRows limita el nmero total de filas del
valor de la variable noOfRows, lo seleccionamos a 10 en este ejemplo. La accin
<c:forEach> hace un bucle sobre todas las columnas del resultado y genera una lista
de tems con los valores de columna por cada fila.
Tambin, debemos generar los enlaces Next y Previous para permitir que el usuario
seleccione un nuevo conjunto de filas:
<c:choose>
<c:when test="${param.start > 0}">
<a href="emplist.jsp?start=<c:out
value="${param.start - noOfRows}"/>">Previous Page</a>
</c:when>
<c:otherwise>
Previous Page
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${emps.limitedByMaxRows}">
<a href="emplist.jsp?start=<c:out
value="${param.start + noOfRows}"/>">Next Page</a>
</c:when>
<c:otherwise>
Next Page
</c:otherwise>
</c:choose>
CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

114

El primer bloque <c:choose> es idntico al de la pgina 1; si el parmetro de la


solicitud start es mayor que cero, la pgina actual muestra un subconjunto de filas
distinto del primero, por eso se aade un enlace Previous. El enlace apunta hacia la
misma pgina, e incluye el parmetro start con un valor que es el valor actual menos el
nmero de filas mostrado por cada pgina.
El segundo bloque <c:choose> se aprovecha de la propiedad limitedByMaxRows del
resultado de la consulta. Si esta propiedad es true, significa que se ha truncado el
resultado al nmero de filas mostrado por cada pgina. De aqu, se genera el enlace
Next con valor del parmetro start para el nuevo subconjunto de filas.
Escribir Datos en la Base de Datos
Adems de leer datos desde una base de datos, tambin podemos usar JSTL para
actualizar informacin. Este ejemplo muestra cmo insertar una nueva fila en una
tabla:
<c:catch var="error">
<fmt:parseDate var="empDate" value="${param.empDate}"
pattern="yyyy-MM-dd" />
</c:catch>
<c:if test="${error != null}">
<jsp:useBean id="empDate" class="java.util.Date" />
</c:if>
<sql:update>
INSERT INTO Employee (FirstName, LastName, EmpDate)
VALUES(?, ?, ?)
<sql:param value="${param.firstName}" />
<sql:param value="${param.lastName}" />
<sql:dateParam value="${empDate}" type="date" />
</sql:update>

Antes de insertar la fila, este ejemplo ilustra cmo usar las acciones de validacin
JSTL. La pgina espera que todos los datos para la nueva fila se enven como
parmetros de solicitud (quizs introducidos en un formulario HTML), incluyendo una
fecha de contratacin. Antes de que la fecha se pueda insertar en la base de datos,
debemos convertirla a su forma nativa Java. Esto es lo que hace la accin
<fmt:parseDate>. El atributo value contiene una expresin EL que obtiene el valor del
parmetro de solicitud empDate. La accin trata de interpretarlo como una fecha
escrita en el formato especificado por el atributo pattern (un ao de cuatro dgitos,
seguido por dos dgitos del mes y dos dgitos del da, separados por barras
inclinadas). Si tiene xito, almacena la fecha en su forma nativa con el nombre
especificado por el atributo var.
La accin <c:catch> tiene en cuenta los strings invlidos. Si el valor del parmetro no
puede ser interpretado como una fecha, el <fmt:parseDate> lanza una excepcin, que
la accin <c:catch> captura y graba en la variable especificada. Cuando esto sucede,
la condicin de comprobacin de la accin <c:if> se evala a true, por lo que la fecha
de contratacin es creada por la accin <jsp:useBean> anidada.
Para insertar la fila, usamos la accin <sql:update>. Como la accin de consulta, la
sentencia SQL se puede especificar como el cuerpo del elemento o mediante un
atributo sql. La accin <sql:update> se puede usar para ejecutar sentencias INSERT,

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

115

UPDATE, DELETE, as como sentencias para crear o eliminar objetos en la base de


datos, como CREATE TABLE y DROP TABLE. El nmero de filas afectado por la
sentencia puede capturarse de forma opcional en una variable nombrada por el
atributo var.
En este ejemplo (como en las mayora de las aplicaciones del mundo real), no se
conocen los nombres de las columnas en tiempo de ejecucin; vienen de los
parmetros de la solicitud. Por lo tanto, la sentencia INSERT de SQL incluye una
marca de interrogacin por cada valor como un contenedor y parmetros internos de la
accin que seleccionan el valor dinmicamente. Las columnas FirstName y LastName
son columnas de texto y las acciones <sql:param> seleccionan sus valores al valor del
parmetro de solicitud correspondiente.
Sin embargo, la columna EmpDate es una columna de fecha, demandando una
atencin especial. Primero de todo, debemos usar una variable que contenga la fecha
en su forma nativa (un objeto java.util.Date) en lugar de usar el valor del parmetro de
solicitud, usamos la variable creada por las acciones <fmt:parseDate> o
<jsp:useBean>.
Segundo, debemos usar la accin <sql:dateParam> para seleccionar el valor. En este
ejemplo, hemos usado la parte de la fecha, por eso hemos seleccionado el atributo
opcional type a date. Otros valores vlidos son time y timestamp (por defecto), para las
columnas que slo toman la hora, o la fecha y la hora.
Hay una accin JSTL ms que no hemos descrito hasta ahora: <sql:transaction>.
Podemos usarla para agrupar varias acciones update (o incluso query) donde todas
ellas se deben ejecutar como parte de la misma transaccin de la base de datos. El
ejemplo estndar es transferir una cantidad de dinero de una cuenta a otra;
implementada como una sentencia SQL que elimina el dinero de la primera cuenta y
otra sentencia que lo aade a la segunda.
Si encapsulamos todos los accesos a una base de datos en clases Java en lugar de
usar las acciones de JSTL, todava hay una parte de JSTL que nos puede ser til. Es
una clase llamada javax.servlet.jsp.jstl.sql.ResultSupport, con estos dos mtodos:
public static Result toResult(java.sql.ResultSet rs);
public static Result toResult(java.sql.ResultSet rs, int maxRows);
Podemos usar esta clase para convertir un objeto ResultSet estndar JDBC en un
objeto Result JSTL antes de reenviarlo a la pgina JSP para mostrarlo. Las acciones
JSTL pueden acceder fcilmente a los datos de un objeto Result, como vimos
anteriormente. Otra aproximacin, todava mejor, es pasar el resultado de la consulta a
la pgina JSP como una estructura de datos personalizada, como una List de beans
que contienen los datos de cada fila, pero el objeto Result an es un buen candidato
para prototipos y pequeas aplicaciones.
Funcin
fn:contains(string, substring)
fn:containsIgnoreCase(string, substring)
fn:endsWith(string, suffix)
fn:escapeXml(string)

CIBERTEC

Descripcin
Devuelve true si el string contiene
substring.
Devuelve true si el string contiene a
substring, ignorando capitalizacin.
Devuelve true si el string termina con
suffix.
Devuelve el string con todos aquellos
caracteres con especial significado en

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

fn:indexOf(string, substring)
fn:join(array, separator)

fn:length(item)

fn:replace(string, before, after)

fn:split(string, separator)

fn:startsWith(string, prefix)
fn:substring(string, begin, end)

fn:substringAfter(string, substring)
fn:substringBefore(string, substring)
fn:toLowerCase(string)

fn:toUpperCase(string)

fn:trim(string)

116

XML y HTML convertidos a sus cdigos


de escape pertinentes.
Devuelve la primera ocurrencia de
substring en el string.
Devuelve un string compuesto por los
elementos del array, separados por
separator.
Devuelve el nmero de elementos en
tem (si un array o coleccin), o el
nmero de caracteres (es un string).
Devuelve un string donde todas las
ocurrencias del string before han sido
reemplazadas por el string after.
Devuelve un array donde los elementos
son las partes del string separadas por
separator.
Devuelve true si el string comienza por
prefix.
Devuelve la parte del string que
comienza por el ndice begin y que
acaba en el ndice end.
Devuelve la parte del string que sigue a
substring.
Devuelve la parte de string que precede
a substring.
Devuelve un string con todos los
caracteres de la entrada convertidos a
minsculas.
Devuelve un string con todos los
caracteres de la entrada convertidos a
maysculas.
Devuelve un string sin espacios en sus
laterales.

3.1.4 Aplicacin Listado con JSTL


Recuperar el proyecto anterior
Pasos a seguir:
1. Proceda a copiar todos los jar que se entreg en clase dentro de la carpeta lib del
proyecto web.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

117

2. Abrir la pgina listarProducto.jsp y escribir la directiva para trabajar con jstl.

3.

Modificar el listado de los productos como se muestra en la siguiente imagen:

Cambiar por

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

118

3.2 Ajax y Transacciones en Web


3.2.1 Ajax
Ajax es una tecnologa asncrona, en el sentido de que los datos adicionales se
solicitan al servidor y se cargan en segundo plano sin interferir con la visualizacin ni
el comportamiento de la pgina.

Realizar peticiones al servidor y esperar respuesta puede consumir tiempo (el tiempo
necesario para recargar una pgina completa). Para agilizar los desarrollos web surgi
Ajax (inicialmente Asynchronous JavaScript And XML, aunque hoy da ya no es una
tecnologa ligada a XML con lo cual no pueden asociarse las siglas a estos trminos),
una tecnologa que busca evitar las demoras propias de las peticiones y respuestas
del servidor mediante la transmisin de datos en segundo plano usando un protocolo
especficamente diseado para la transmisin rpida de pequeos paquetes de datos.
Con Ajax, se hace posible realizar peticiones al servidor y obtener respuesta de este
en segundo plano (sin necesidad de recargar la pgina web completa) y usar esos

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

119

datos para, a travs de JavaScript, modificar los contenidos de la pgina creando


efectos dinmicos y rpidos.
En el esquema anterior vemos las ideas en torno a Ajax de forma grfica. En la parte
superior hemos representado lo que sera un esquema de comunicacin tradicional: el
cliente solicita una pgina web completa al servidor. El servidor recibe la peticin, se
toma su tiempo para preparar la respuesta y la enva. El resultado, una pequea
demora debido al tiempo que tarda en llegar la peticin al servidor, el tiempo que ste
tarda en preparar la respuesta, y el tiempo que tarda en llegar la respuesta ms
recargarse en el navegador.
En la parte inferior vemos lo que sera un esquema de comunicacin usando Ajax: el
cliente tiene una pgina web cargada (puede ser una pgina web completa, o slo el
esqueleto de una pgina web). El cliente sigue trabajando y en segundo plano (de ah
que hayamos dibujado con lneas punteadas las comunicaciones) le dice al servidor
que le enve un paquete de datos que le hacen falta. El servidor procesa la peticin.
Ahora la respuesta es mucho ms rpida: no tiene que elaborar una pgina web
completa, sino slo preparar un paquete de datos. Por tanto el tiempo de respuesta es
ms rpido. El servidor enva el paquete de datos al cliente y el cliente los usa para
cambiar los contenidos que se estaban mostrando en la pgina web.
Funciones para Ajax
Las funciones y utilidades relacionadas con AJAX son parte fundamental de jQuery. El
mtodo principal para realizar peticiones AJAX es $.ajax() (importante no olvidar el
punto entre $ y ajax). A partir de esta funcin bsica, se han definido otras funciones
relacionadas,
de
ms
alto
nivel
y
especializadas
en
tareas
concretas: $.get(), $.post(), $.load(), etc.
La sintaxis de $.ajax() es muy sencilla:
$.ajax(opciones);

La URL que se solicita tambin se incluye dentro del array asociativo de opciones. A
continuacin se muestra un ejemplo bsico realizado con $.ajax():
$.ajax({
url: 'pagina o servlet',
type: 'POST',
async: true,
data:
'parametro1=valor1&parametro2=valor2',
success: procesaRespuesta,
error: muestraError
});

La siguiente tabla muestra todas las opciones que se pueden definir para el
mtodo $.ajax():

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

Opcin

120

Descripcin

async

Indica si la peticin es asncrona. Su valor por defecto es true, el


habitual para las peticiones AJAX

beforeSend

Permite
indicar
una
funcin
que
modifique
el
objeto XMLHttpRequest antes de realizar la peticin. El propio
objeto XMLHttpRequest se pasa como nico argumento de la funcin

complete

Permite establecer la funcin que se ejecuta cuando una peticin se


ha completado (y despus de ejecutar, si se han establecido, las
funciones
de success o error).
La
funcin
recibe
el
objetoXMLHttpRequest como primer parmetro y el resultado de la
peticin como segundo argumento

contentType

Indica el valor de la cabecera Content-Type utilizada para realizar la


peticin. Su valor por defecto esapplication/x-www-form-urlencoded

data

Informacin que se incluye en la peticin. Se utiliza para enviar


parmetros al servidor. Si es una cadena de texto, se enva tal cual,
por
lo
que
su
formato
debera
ser
parametro1=valor1&parametro2=valor2. Tambin se puede indicar un
array asociativo de pares clave/valor que se convierten
automticamente en una cadena tipo query string

dataType

El tipo de dato que se espera como respuesta. Si no se indica ningn


valor, jQuery lo deduce a partir de las cabeceras de la respuesta. Los
posibles valores son: xml (se devuelve un documento XML
correspondiente al valor responseXML), html (devuelve directamente
la respuesta del servidor mediante el valor responseText), script (se
evala la respuesta como si fuera JavaScript y se devuelve el
resultado) y json (se evala la respuesta como si fuera JSON y se
devuelve el objeto JavaScript generado)

error

Indica la funcin que se ejecuta cuando se produce un error durante la


peticin. Esta funcin recibe el objeto XMLHttpRequest como primer
parmetro, una cadena de texto indicando el error como segundo
parmetro y un objeto con la excepcin producida como tercer
parmetro

ifModified

Permite considerar como correcta la peticin solamente si la respuesta


recibida es diferente de la anterior respuesta. Por defecto su valor
es false

processData

Indica si se transforman los datos de la opcin data para convertirlos


en una cadena de texto. Si se indica un valor de false, no se realiza
esta transformacin automtica

success

Permite establecer la funcin que se ejecuta cuando una peticin se


ha completado de forma correcta. La funcin recibe como primer
parmetro los datos recibidos del servidor, previamente formateados
segn se especifique en la opcin dataType

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

Opcin
timeout

type
url

121

Descripcin
Indica el tiempo mximo, en milisegundos, que la peticin espera la
respuesta del servidor antes de anular la peticin
El tipo de peticin que se realiza. Su valor por defecto es GET, aunque
tambin se puede utilizar el mtodo POST
La URL del servidor a la que se realiza la peticin

3.2.2 Transacciones
Un sistema de procesamiento de transacciones (TPS por sus siglas en ingls) es un
tipo de sistema de informacin que recolecta, almacena, modifica y recupera toda la
informacin generada por las transacciones producidas en una organizacin. Una
transaccin es un evento que genera o modifica los datos que se encuentran
eventualmente almacenados en un sistema de informacin. Para que un sistema
informtico pueda ser considerado como un TPS, este debe superar el test ACID.
Desde un punto de vista tcnico, un TPS monitoriza los programas transaccionales (un
tipo especial de programas). La base de un programa transaccional est en que
gestiona los datos de forma que estos deben ser siempre consistentes (por ejemplo, si
se realiza un pago con una tarjeta electrnica, la cantidad de dinero de la cuenta sobre
la que realiza el cargo debe disminuir en la misma cantidad que la cuenta que recibe el
pago, de no ser as, ninguna de las dos cuentas se modificar), si durante el
transcurso de una transaccin ocurriese algn error, el TPS debe poder deshacer las
operaciones realizadas hasta ese instante. Si bien este tipo de integridad es que debe
presentar cualquier operacin de procesamiento de transacciones por lotes, es
particularmente importante para el procesamiento de transacciones on-line: si, por
ejemplo, un sistema de reserva de billetes de una lnea area es utilizado
simultneamente por varios operadores, tras encontrar un asiento vaco, los datos
sobre la reserva de dicho asiento deben ser bloqueados hasta que la reserva se
realice, de no ser as, otro operador podra tener la impresin de que dicho asiento
est libre cuando en realidad est siendo reservado en ese mismo instante. Sin las
debidas precauciones, en una transaccin podra ocurrir una reserva doble. Otra
funcin de los monitores de transacciones es la deteccin y resolucin de
interbloqueos (deadlock), y cortar transacciones para recuperar el sistema en caso de
fallos masivos.
Caractersticas
Respuesta rpida
En este tipo de sistemas resulta crtico que exista un rendimiento elevado con tiempos
de respuesta cortos. Una empresa no puede permitirse tener clientes esperando por
una respuesta del SPT; el tiempo total transcurrido desde que se inicia la transaccin
hasta que se produce la salida correspondiente debe ser del orden de unos pocos
segundos o menos.
Fiabilidad
Muchas organizaciones basan su fiabilidad en los SPT; un fallo en un SPT afectar
negativamente a las operaciones o incluso parar totalmente el negocio. Para que un
SPT sea efectivo, su tasa de fallos debe ser muy baja. En caso de fallo de un SPT,

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

122

debe existir algn mecanismo que permita una recuperacin rpida y precisa del
sistema. Esto convierte en esencial la existencia procedimientos de copia de seguridad
y de recuperacin ante fallos correctamente diseados.
Inflexibilidad
Un SPT requiere que todas las transacciones sean procesadas exactamente de la
misma forma, independientemente del usuario, el cliente o la hora del da. Si los SPT
fuesen flexibles, habra entonces demasiadas posibilidades de ejecutar operaciones
no estndar. Por ejemplo, una aerolnea comercial necesita aceptar de forma
consistente reservas de vuelos realizadas por un gran nmero de agencias de viaje
distintas; aceptar distintos datos de transaccin de cada agencia de viajes supondra
un problema.
Procesamiento controlado
El procesamiento en un SPT debe apoyar las operaciones de la organizacin. Por
ejemplo, si una organizacin establece roles y responsabilidades para determinados
empleados, el SPT debe entonces mantener y reforzar este requisito.
Propiedades
Atomicidad
Los cambios de estado provocados por una transaccin son atmicos: o bien ocurren
todos o bien no ocurre ninguno. Estos cambios incluyen tanto modificaciones de la
base de datos, como envo de mensajes o acciones sobre los transductores.
Consistencia
Una transaccin es una transformacin de estado correcta. Las acciones consideradas
en su conjunto no violan ninguna de las restricciones de integridad asociadas al
estado. Esto implica que la transaccin debe ser un programa correcto.
Aislamiento
Incluso cuando varias transacciones se ejecuten de forma concurrente, para cada
transaccin T debe parecer que el resto de transacciones se han ejecutado antes o
despus de T, pero no antes y despus.
Durabilidad
Una vez que una transaccin ha finalizado con xito (compromiso), cambia hacia un
estado estable a prueba de fallos.
Transacciones en JDBC
Hay momentos en los que no desea una declaracin entre en vigor a menos que otra
completa. Por ejemplo, cuando el propietario de The Coffee Break actualiza la
cantidad de caf que se vende cada semana, el propietario tambin desee actualizar
la cantidad total vendida hasta la fecha. Sin embargo, la cantidad vendida por semana
y la cantidad total vendida debe actualizarse al mismo tiempo; de lo contrario, los
datos sern inconsistentes. La manera de estar seguro de que se produzcan, ya sea
ambas acciones o ninguna accin ocurre es utilizar una transaccin.Una transaccin
es un conjunto de una o ms sentencias que se ejecuta como una unidad, por lo que o
bien todas las sentencias se ejecutan, o ninguna de las declaraciones se ejecuta.
Desactivacin del modo de confirmacin automtica

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

123

Cuando se crea una conexin, que est en modo auto-commit. Esto significa que cada
sentencia SQL individuo es tratado como una transaccin y se compromete de forma
automtica despus de que se ejecuta. (Para ser ms precisos, el valor
predeterminado es para una sentencia SQL que se comete cuando se haya
completado, no cuando se ejecuta. Se completa una declaracin cuando todos sus
conjuntos de resultados y cuentas de actualizacin se han recuperado. En casi todos
los casos, sin embargo, se completa una declaracin, y por lo tanto comprometido,
justo despus de que se ejecute.)
La manera de permitir que dos o ms declaraciones a agruparse en una transaccin
es desactivar el modo auto-commit. Esto se demuestra en el siguiente cdigo, donde
con una conexin activa:
con.setAutoCommit (false);
Uso de transacciones para Preservar la integridad de los datos
Adems de la agrupacin de estados juntos para la ejecucin como una unidad, las
transacciones pueden ayudar a preservar la integridad de los datos en una tabla. Por
ejemplo, imagine que un empleado tena que ingresar los nuevos precios del caf en
la tabla COFFEES pero no lo hizo durante unos das. Mientras tanto, los precios
subieron, y en la actualidad el propietario se encarga de introducir los precios ms
altos. El empleado finalmente consigue ingresar los precios ahora obsoletos, al mismo
tiempo que el dueo est tratando de actualizar la tabla. Despus de insertar los
precios desfasados, el empleado se da cuenta de que ya no son vlidos y llama al
mtodo rollback de la Connection para deshacer sus efectos. (El mtodo rollback
aborta la transaccin y restaura los valores a lo que eran antes del intento de
actualizacin.) Al mismo tiempo, el propietario est ejecutando una declaracin
SELECT para la impresin de los nuevos precios. En esta situacin, es posible que el
propietario imprimir un precio que se haba deshecho de su valor anterior, por lo que
el precio impreso es incorrecto.
Este tipo de situacin se puede evitar mediante el uso de transacciones para
proporcionar algn nivel de proteccin contra los conflictos que surgen cuando dos
usuarios intentan acceder a los datos al mismo tiempo.
Para evitar conflictos durante una transaccin, un DBMS utiliza bloqueos, mecanismos
para bloquear el acceso de otros a los datos que se est accediendo a la transaccin.
(Tenga en cuenta que el modo de auto-commit, donde cada sentencia es una
transaccin, bloqueos se mantienen durante una sola declaracin.) Despus se
establece un bloqueo, que permanece en vigor hasta que la transaccin se confirma o
se deshace. Por ejemplo, un DBMS podra bloquear una fila de una tabla por los
cambios que se han comprometido. El efecto de este bloqueo sera la de evitar que un
usuario conseguir una lectura sucia, es decir, la lectura de un valor antes de que se
haga permanente. (Acceso a un valor actualizado que no se ha confirmado se
considera una lectura sucia porque es posible que el valor que se revierte a su valor
anterior. Si se lee un valor que luego se deshace, se ha ledo un valor no vlido)
Cmo se establecen bloqueos est determinado por lo que se llama un nivel de
aislamiento, que puede ir desde no apoyar transacciones en absoluto para apoyar
transacciones que hacen cumplir las reglas de acceso muy estrictas.
Un ejemplo de un nivel de aislamiento es TRANSACTION_READ_COMMITTED, que
no permitir que un valor sea accedido hasta despus que se haya confirmado. En
otras palabras, si el nivel de aislamiento de transaccin se establece en

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

124

TRANSACTION_READ_COMMITTED , el DBMS no permite lecturas sucias que se


produzcan. La interfaz Connection incluye cinco valores que representan los niveles de
aislamiento de transaccin que puede utilizar en JDBC:

Una lectura no repetible se produce cuando la transaccin A recupera una fila, la


transaccin B posteriormente actualiza la fila, y la primera transaccin ms tarde
recupera la misma fila de nuevo. Transaccin A recupera la misma fila dos veces, pero
ve datos diferentes.
Una lectura fantasma se produce cuando la transaccin A recupera un conjunto de
filas que satisfacen una condicin dada, la transaccin B posteriormente inserta o
actualiza una fila de tal manera que la fila ahora cumple la condicin en la transaccin
A, y la primera transaccin ms tarde repite la recuperacin condicional. Transaccin
A ahora ve una fila adicional. Esta fila se conoce como un fantasma.
Por lo general, usted no tiene que hacer nada sobre el nivel de aislamiento de
transaccin; slo puede utilizar el valor predeterminado para su DBMS. El nivel de
aislamiento de transaccin por defecto depende de su DBMS. Por ejemplo, para Java
DB, TRANSACTION_READ_COMMITTED . JDBC permite averiguar cul es el nivel
de aislamiento de transaccin de su DBMS (utilizando el mtodo
getTransactionIsolation de Connection) y tambin le permite establecerlo a otro nivel
(usando el mtodo setTransactionIsolation de Connection).
Nota: Un controlador JDBC no admite todos los niveles de aislamiento de transaccin.
Si un conductor no soporta el nivel de aislamiento especificado en una invocacin de
setTransactionIsolation , el conductor puede sustituir un nivel de aislamiento ms
restrictivo superior. Si un conductor no puede sustituir a un nivel de transaccin
superior,
lanza
una
SQLException.
Utilice
el
mtodo
DatabaseMetaData.supportsTransactionIsolationLevel
para
determinar
si
el
controlador es compatible con un determinado nivel.
Ajuste y Recuperando los Puntos de salvaguarda
El mtodo Connection.setSavepoint, establece un objeto Savepoint dentro de la
transaccin actual. El mtodo Connection.rollback est sobrecargado para tomar un
argumento Savepoint.
Liberar Puntos de salvaguarda
El mtodo Connection.releaseSavepoint toma un objeto Savepoint como parmetro y
lo elimina de la transaccin actual.
Despus que un punto de rescate ha sido puesto en libertad, y se trata de hacer
referencia a ella en una operacin de reversin puede causar que se lance una

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

125

SQLException. Cualquier punto de salvaguarda que se han creado en una transaccin


se liberan automticamente y dejan de ser vlidas cuando se confirma la transaccin,
o cuando la transaccin se devuelve. Rodar una transaccin a un punto de
salvaguarda se desconecta automticamente y hace invlido a cualquier otro punto de
rescate que se crearon tras el punto en cuestin.
Al llamar al mtodo rollback
Como se mencion anteriormente, la llamada al mtodo rollback termina una
transaccin y devuelve los valores que se han modificado a sus valores anteriores. Si
usted est tratando de ejecutar una o ms declaraciones en una transaccin y obtiene
una SQLException, llame al mtodo rollback para poner fin a la operacin y comenzar
la operacin de nuevo. Esa es la nica manera de saber lo que se ha cometido y lo
que no se ha cometido. La captura de un SQLException te dice que algo est mal,
pero no le dice lo que fue o no fue cometido. Porque no se puede contar con el hecho
de que nada se haya cometido, una llamada al mtodo rollback es la nica manera de
estar seguro.
El mtodo CoffeesTable.updateCoffeeSales demuestra una transaccin e incluye una
catch bloque que invoca el mtodo rollback . Si la aplicacin contina y utiliza los
resultados de la transaccin, esta llamada a la rollback mtodo en la catch bloque
impide el uso de datos posiblemente incorrectos.

3.2.3 Aplicacin Ajax y Transaccin


Recuperar el proyecto anterior.
Pasos a seguir:
1. Crear la clase ClienteDTO, BoletaDTO,DeatalleBoletaDTO dentro del paquete
beans, segn la siguiente imagen:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

126

Clase DetalleBoletaDTO

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

127

Clase ClienteDTO

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

128

Clase BoletaDTO

2. Crear la interface ClienteDAO, BoletaDAO dentro del paquete interfaces,


segn la siguiente imagen:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

129

ClienteDAO

BoletaDAO

Actualizar la interface ProductoDAO

3. Registrar el DAO BoletaDAO y ClienteDAO dentro de la clase DAOFactory.

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

130

4. Actualizar la clase MySqlDAOFactory, segn la siguiente imagen:

5. Actualizar la clase MySqlProductoDAO en el mtodo buscarProducto, segn la


siguiente imagen:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

6.

131

Programar en la clase MySqlClienteDAO en el mtodo buscarCliente segn la


siguiente imagen:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

132

7. Programar en la clase MySqlBoletaDAO en el mtodo registrarBoleta, segn la


siguiente imagen:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

133

8. Crear la clase ClienteService dentro del paquete services, segn la siguiente


imagen:

9. Actualizar la clase ProductoService, segn la siguiente imagen:

10.
Crear la clase BoletaService dentro del paquete services, segn la siguiente
imagen:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

134

11.
Crear el servlet ServletCliente dentro del paquete misServlets y escribir las
siguientes instrucciones:

12.

Actualizar el servlet ServletProducto, segn la siguiente imagen:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

135

13. Crear la pgina: registrarBoleta.jsp y escribir las siguientes instrucciones:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://displaytag.sf.net" prefix="displaySession"%>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
<title>Boleta</title>
<script src="js/jquery.js" type="text/javascript"></script>
<script src="js/jquery.functions.js" type="text/javascript"></script>
<link href="css/displaytagex.css" rel="stylesheet" type="text/css"><script
type="text/javascript">
function addProducto(){
document.getElementById("tipo").value ='ingresa';
document.getElementById("frmBoleta").action = 'ServletBoleta';
document.getElementById("frmBoleta").submit();
}
function addBoleta(){
document.getElementById("tipo").value ='registra';
document.getElementById("frmBoleta").action = 'ServletBoleta';
document.getElementById("frmBoleta").submit();
}
function verCliente(){
document.getElementById("fondo").style.display ='block';
document.getElementById("divCliente").style.display ='block';
}
function verProducto(){
document.getElementById("fondo").style.display ='block';
document.getElementById("divProducto").style.display ='block';
}
function ocultaCliente(){
document.getElementById("fondo").style.display ='none';
document.getElementById("divCliente").style.display ='none';
}
function ocultaProducto(){
document.getElementById("fondo").style.display ='none';
document.getElementById("divProducto").style.display ='none';
}
</script>
<style>
.black_overlay {
display: none;
position: absolute;
top: 0%;
left: 0%;
width: 100%;
height: 100%;
background-color: aqua;
z-index: 1001;
-moz-opacity: 0.8;
opacity: .80;
filter: alpha(opacity = 80);
}
.white_content {
display: none;
position: absolute;
top: 25%;
left: 25%;
width: 50%;
height: 50%;
padding: 16px;

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

136

border: 2px solid orange;


background-color: white;
z-index: 1002;
overflow: auto;
}
</style>
</head>
<body>
<h3>Boleta de Venta</h3>
<form id="frmBoleta">
<input type="hidden" name="tipo" id="tipo">
<fieldset style="width: 60%">
<legend>Datos del Cliente</legend>
<table>
<tr>
<td>Cdigo:</td>
<td><input type="text" name="txt_cod_cli"
id="txt_cod_cli" size="5"></td>
</tr>
<tr>
<td>Apellidos y Nombres:</td>
<td><input type="text" name="txt_datos_cli"
id="txt_datos_cli">
<input type="button" value="..."
onclick="verCliente();"></td>
</tr>
</table>
</fieldset>
<fieldset style="width: 60%">
<legend>Seleccione Producto</legend>
<table>
<tr>
<td>Cdigo:</td>
<td> <input type="text" name="txt_cod_pro"
id="txt_cod_pro" size="5"></td>
<td>Descripcion:</td>
<td><input type="text" name="txt_des_pro"
id="txt_des_pro" size="50"></td>
</tr>
<tr>
<td>Precio:</td>
<td> <input type="text" name="txt_pre_pro"
id="txt_pre_pro" size="5"> </td>
<td>Cantidad</td>
<td> <input type="text" name="txt_can_pro"
id="txt_can_pro" size="5">
<input type="button" value="..."
onclick="verProducto();">
<input type="button" value="agregar"
onclick="addProducto();" >&nbsp;&nbsp;
</td>
</tr>
</table>
<input type="button" value="ingresar" onclick="addBoleta();">
</fieldset>
</form>
<div id="fondo" class="black_overlay">
</div>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

137

<div id="divCliente" class="white_content" >


<form action="" id="idFormCliente">
<table width="100%" border="2">
<tr>
<td colspan="2" align="center"><b>Buscar
Cliente</b></td>
</tr>
<tr>
<td width="180">Apellidos y Nombres:</td>
<td><input type="text" name="txt_ape" id="txt_ape"
onkeyup="buscarClienteBoleta()">
<input type="button" value="Salir"
onclick="ocultaCliente();"></td>
</tr>
</table>
</form>
<div id="tablaCliente"></div>
</div>
<div id="divProducto" class="white_content">
<form action="" id="idFormProducto">
<table width="100%" border="2">
<tr>
<td colspan="2" align="center"><b>Buscar
Producto</b></td>
</tr>
<tr>
<td width="140">Descripcion:</td>
<td><input type="text" name="txt_des" id="txt_des"
onkeyup="buscarProductoBoleta()">
<input type="button" value="Salir"
onclick="ocultaProducto();"></td>
</tr>
</table>
</form>
<div id="tablaProducto"></div>
</div>
</html>

14. Al ejecutar la pgina registroBoleta.jsp se mostrar la siguiente imagen:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

138

15. Abrir el archivo jquey.functions.js y escribir las siguientes instrucciones:

16. Crear las pginas: buscarCliente.jsp y escribir las siguientes instrucciones:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<table class="bordered2" width="100%" border="2">
<tr style="font:bold">
<td style="width:80px">ID</td>
<td style="width:245px">Apellidos y Nombres</td>
<td style="width:70px">Sexo</td>
<td style="width:70px">DNI</td>
<td style="width:120px">Direccion</td>
<td style="width:120px">Distrito</td>
<td style="width:20px"></td>
</tr>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

139

<c:forEach items="${requestScope.clientes}" var="f">


<tr>
<td>${f.codigo}</td>
<td>${f.apellido} ${f.nombre}</td>
<td>${f.sexo}</td>
<td>${f.dni}</td>
<td>${f.direccion}</td>
<td>${f.nomDistrito}</td>
<td>
<a href="ServletBoleta?tipo=verCliente&codigo=
${f.codigo}&datos=${f.apellido} ${f.nombre}">
<img src="img/edit.gif"></a></td>
</tr>
</c:forEach>
</table>
</body>
</html>

17. Crear las pginas: buscarProducto.jsp y escribir las siguientes instrucciones:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<table class="bordered2" width="100%" border="2">
<tr style="font:bold">
<td style="width:80px">ID</td>
<td style="width:245px">Descripcion</td>
<td style="width:70px">Precio</td>
<td style="width:70px">Stock</td>
<td style="width:120px">Marca</td>
<td style="width:20px"></td>
</tr>
<c:forEach items="${requestScope.productos}" var="f">
<tr>
<td>${f.codigo}</td>
<td>${f.descripcion}</td>
<td>${f.precio}</td>
<td>${f.stock}</td>
<td>${f.nomMarca}</td>
<td>
<a href="ServletBoleta?tipo=verProducto&codigo=
${f.codigo}&des=${f.descripcion}
&pre=${f.precio}">
<img src="img/edit.gif"></a></td>
</tr>
</c:forEach>
</table>
</body>
</html>

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

140

18. Al ejecutar la pgina registroBoleta.jsp se mostrar la siguiente imagen:

Al hacer clic se mostrar una ventana para buscar el


cliente por el campo apellido

Al hacer clic se mostrar una ventana para buscar el producto por su


descripcin.

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

141

19. Crear el servlet : ServletBoleta y escribir las siguientes instrucciones:


package misServlets;
import java.io.IOException;
public class ServletBoleta extends HttpServlet {
BoletaService serviBoleta=new BoletaService();
private static final long serialVersionUID = 1L;
public ServletBoleta() {
super();
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String tipo=request.getParameter("tipo");
if(tipo.equals("verCliente"))
verCliente(request,response);
else if(tipo.equals("verProducto"))
verProducto(request,response);
else if(tipo.equals("ingresa"))
ingresa(request, response);
else if(tipo.equals("elimina"))
eliminar(request, response);
else if(tipo.equals("registra"))
registra(request, response);
}
private void registra(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//Boleta que esta en sesion
ArrayList<ProductoDTO> boleta =(ArrayList<ProductoDTO>)
session.getAttribute("boleta");
//Cliente que esta en sesion
String cliente[]=
(String[])session.getAttribute("datoCliente");
int codCliente = Integer.parseInt(cliente[0]);
//Creamos la Boleta
EmpleadoDTO codEmpleado=(EmpleadoDTO)
session.getAttribute("datos");
BoletaDTO b = new BoletaDTO();
b.setCodEmpleado(codEmpleado.getCodigo());
b.setCodCiente(codCliente);
//Creamos el detalle
ArrayList<DetalleBoletaDTO> detalles = new
ArrayList<DetalleBoletaDTO>();
for (ProductoDTO x : boleta) {
DetalleBoletaDTO det = new DetalleBoletaDTO(0,
x.getCodigo(), x.getStock(), x.getPrecio());
detalles.add(det);
}
serviBoleta.registrarBoleta(b, detalles);
//limpiamos la sesion
session.removeAttribute("boleta");
session.removeAttribute("datoCliente");
session.removeAttribute("datoProducto");
//reenvio
request.getRequestDispatcher("registrarBoleta.jsp").
forward(request, response);
}

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

142

private void eliminar(HttpServletRequest request,


HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
int codi = Integer.parseInt(id);
HttpSession session = request.getSession();
ArrayList<ProductoDTO> boleta = (ArrayList<ProductoDTO>)
session.getAttribute("boleta");
for (int i = 0; i < boleta.size(); i++) {
if(boleta.get(i).getCodigo() == codi){
boleta.remove(i);
break;
}
}
//la lista se agrega a sesion
session.setAttribute("boleta", boleta);
//reenvio
request.getRequestDispatcher("registrarBoleta.jsp").
forward(request, response);
}
private void ingresa(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String cod = request.getParameter("txt_cod_pro");
String des = request.getParameter("txt_des_pro");
String can= request.getParameter("txt_can_pro");
String pre= request.getParameter("txt_pre_pro");
int codi = Integer.parseInt(cod.trim());
int cant = Integer.parseInt(can.trim());
double prec = Double.parseDouble(pre.trim());
ArrayList<ProductoDTO> boleta ;
//Se verifica si existe en sesion
HttpSession session = request.getSession();
if(session.getAttribute("boleta") == null){
boleta = new ArrayList<ProductoDTO>();
}else{
20. Modificar la pagina: registrarBoleta.jsp y escribir las siguientes instrucciones:
boleta = (ArrayList<ProductoDTO>)
session.getAttribute("boleta");
}
//Se crear el objeto
ProductoDTO p = new ProductoDTO();
p.setCodigo(codi);p.setDescripcion(des);
p.setPrecio(prec);
p.setStock(cant);
boolean noExiste = true;
//se verifica los repetidos
for (int i = 0; i < boleta.size(); i++) {
if(boleta.get(i).getCodigo() == codi){
boleta.set(i, p);
noExiste = false;
break;
}
}
//Si no existe se agrega
if(noExiste){
boleta.add(p);
}
//la lista se agrega a sesion
session.setAttribute("boleta", boleta);
request.getRequestDispatcher("registrarBoleta.jsp").
forward(request, response);
}

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

143

private void verProducto(HttpServletRequest request,


HttpServletResponse response) throws ServletException, IOException {
String codigo = request.getParameter("codigo");
String des = request.getParameter("des");
String pre = request.getParameter("pre");
String producto[]=new String[3];
producto[0]=codigo;producto[1]=des;producto[2]=pre;
HttpSession session = request.getSession();
session.setAttribute("datoProducto", producto);
request.getRequestDispatcher("registrarBoleta.jsp").
forward(request, response);
}
private void verCliente(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String codigo = request.getParameter("codigo");
String datos = request.getParameter("datos");
String cliente[]=new String[2];
cliente[0]=codigo;cliente[1]=datos;
HttpSession session = request.getSession();
session.setAttribute("datoCliente", cliente);
request.getRequestDispatcher("registrarBoleta.jsp").
forward(request, response);
}
}

21. Actualizar la pgina: registrarBoleta.jsp y escribir las siguientes instrucciones:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

144

22. Ejecutar la pgina index.jsp y se mostrar lo siguiente:

23. Se mostrar la pgina con los tres mens, luego clic en Boleta.

24. Se mostrar la pgina registrarBoleta.jsp, como se muestra a continuacin:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

145

25. Clic en el botn () que se encuentra cerca de la caja de Apellidos y Nombres,


se mostrar lo siguiente:

26.
Clic en el botn () que se encuentra cerca de la caja de Cantidad, se
mostrar lo siguiente:

Ingresar una cantidad,


luego clic en el botn
agregar

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

146

27. Luego de realizar la venta de los productos para registrar la venta, clic en el botn
Registrar y en las tablas: tb_boleta y tb_boleta_has_producto se realiz el
registro, como se muestra a continuacin:
Tabla: tb_boleta

Tabla: tb_boleta_has_producto

3.3 Listeners
3.3.1 Tipos
En aplicacin web los eventos son nuevos, a partir en la especificacin Servlet 2.3.
Ellos le dan mayor grado de control sobre su aplicacin web. En este captulo, se va a
estudiar la aplicacin de dos importantes eventos:
Inicio y apagado de una aplicacin
La creacin y la invalidacin de sesiones
Como sus nombres indican, la aplicacin de inicio de evento se produce cuando su
aplicacin web se carga por primera vez y comenz por el contenedor de Servlets; y
solicitud de cierre se produce cuando la aplicacin web se cierra.
El perodo de sesiones se produce en la creacin de una nueva sesin cada vez que
se crea en el servidor y de manera similar el perodo de sesiones se origina con la
invalidacin de una sesin cada vez que se anula. Para hacer uso de estas
aplicaciones web y eventos para hacer algo til, tendr que crear y hacer uso de
"clases oyentes". De aqu en adelante, vamos a implementar clases oyentes y cmo
se pueden utilizar.
Clases oyentes
Estos son simples clases Java que implementan una de las dos siguientes interfaz:
- javax.servlet.ServletContextListener

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

147

- javax.servlet.http.HttpSessionListener
La implementacin de ServletContextListener permite escuchar la creacin o
destruccin del contexto. La implementacin de HttpSessionListener le permite
escuchar la creacin de una sesin. Veamos cules son los diferentes mtodos de
esta interfaz, que se tendrn que aplicar.
ServletContextListener:
Esta interfaz contiene dos mtodos:

public void contextInitialized (ServletContextEvent SCE); //Creacin de un


Contexo.
public void contextDestroyed (ServletContextEvent SCE); //Destruccin de un
contexto.

Un ejemplo de esa clase es el siguiente:

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
public class ApplicationWatch implements ServletContextListener (
public static applicationInitialized long = 0L;
/ * Aplicacin de inicio del evento * /
public void contextInitialized (ServletContextEvent ce) (
applicationInitialized = System.currentTimeMillis ();
)
/ * Aplicacin del evento de apagado * /
public void contextDestroyed (ServletContextEvent ce) ()
)
En el cdigo anterior, una clase Java ApplicationWatch implementa
ServletContextListener. Al implementar sus dos mtodos realmente slo usa uno de
ellos y el segundo mtodo sigue teniendo el cuerpo vaco. En esta categora, se
observa en el momento de la solicitud de inicio en public static que puede ser llamado
desde otra aplicacin para saber qu clase fue la ltima vez que esta solicitud se
inici.
Se explicar cmo decirle al servidor de aplicaciones que tienen esta clase de oyente;
adems, se quiere que se les diga la aplicacin de estos acontecimientos en un
momento, pero primero vamos a ver cules son los diferentes mtodos de
HttpSessionListener interfaz.
HttpSessionListener
Esta interfaz te permite poder escuchar al crear o destruir una sesin.

public void sessionCreated (HttpSessionEvent se);


public void sessionDestroyed (HttpSessionEvent se);

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

148

Al igual que lo que hicimos en el caso de ApplicationWatch anterior, tendr que crear
una clase Java y aplicar HttpSessionListener interfaz. Un ejemplo de esa clase es el
siguiente:
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class SessionCounter implements HttpSessionListener (
private static int activeSessions = 0;
/ * Creacin de eventos de sesin * /
public void sessionCreated (HttpSessionEvent se) (
activeSessions + +;
)
/ * Sesin de invalidacin del evento * /
public void sessionDestroyed (HttpSessionEvent se) (
if (activeSessions> 0)
activeSessions -;
)
public static int getActiveSessions () (
activeSessions retorno;
)
)
En el cdigo anterior, SessionCounter clase implementa HttpSessionListener para
contar el nmero de sesiones activas.
Se ha aprendido cules son los eventos de aplicaciones web, interfaz de lo que est
disponible para nosotros y tambin se han visto ejemplos de la aplicacin de la interfaz
de las clases. Veamos cmo decirle al servidor de aplicaciones acerca de estas clases
oyentes.
Registro de las clases oyentes en el web.xml
Eso es lo que hacemos poniendo classpath de estas clases en / WEB-INF/web.xml
archivo con etiquetas especiales <listener>. Un ejemplo de este tipo de archivo
web.xml es el siguiente:
<! - Web.xml ->
<? xml version = "1.0" encoding = "ISO-8859-1">
<! DOCTYPE web-app
PUBLIC "- / / Sun Microsystems, Inc. / / DTD de aplicacin Web 2.3 / / EN"
"http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">
<web-app>
<! - Listeners ->
<listener>
<listener-class>
com.stardeveloper.web.listener.SessionCounter
</ oyente de clase>
</ oyente>
<listener>
<listener-class>
com.stardeveloper.web.listener.ApplicationWatch
</ oyente de clase>
</ oyente>
</ web-app>

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

149

Como se indica anteriormente, es muy fcil declarar oyentes en el archivo web.xml.


Ahora, cada vez que el servidor se inicia o cierre, una sesin se crea o destruye.

3.3.2 Aplicacin Auditoria


Recuperar el proyecto anterior.
Pasos a seguir:
En aplicacin web los eventos son nuevos, a partir en la especificacin Servlet 2.3.
Ellos le dan mayor grado de control sobre su aplicacin web. En este captulo, se va a
estudiar la aplicacin de dos importantes eventos:
Como sus nombres indican, la aplicacin de inicio de evento se produce cuando su
aplicacin web se carga por primera vez y comenz por el contenedor de Servlets; y
solicitud de cierre se produce cuando la aplicacin web se cierra.
1. Crear dentro del paquete beans la clase AuditoriaDTO con los siguientes atributos:
private
private
private
private
private
private

int idAuditoria;
int codigoempleado;
String fechaLogin;
String fechaLogout;
String usuario;
String tiempo;

Crear los mtodos de acceso: set, get y el constructor.


2. Crear una interfaz dentro del paquete interfaces con el nombre AuditoriaDAO que tenga
los siguientes mtodos:
public void registraSesionLogin(AuditoriaDTO audi);
public void registraSesionLogout(AuditoriaDTO audi);
3. Proceda a registrar el DAO y crear la clase MySqlAuditoriaDAO para implementar los
mtodos de la interfaz: AuditoriaDAO.
4. Crear un servicio dentro del paquete service con el nombre AuditoriaService que permita
trabajar con los mtodos que existen en MySqlAuditoriaDAO.
5. Crear un paquete con el nombre: listener y
una clase con
EscuchaAtributoSesion, la estructura ser la siguiente en su proyecto:

CIBERTEC

el

nombre:

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

CARRERA DE COMPUTACIN E INFORMTICA

150

CIBERTEC

LENGUAJE DE PROGRAMACIN II

151

6. La clase EscuchaAtributoSesion tendr el siguiente cdigo:

7. Crear la clase AuditoriaSrevice dentro del paquete service y escribir las siguientes
instrucciones:

CIBERTEC

CARRERA DE COMPUTACIN E INFORMTICA

LENGUAJE DE PROGRAMACIN II

152

8. Para registrar el listener y el tiempo de la sesin inactiva abrir el archivo web.xml y


escribir lo siguiente:

CARRERA DE COMPUTACIN E INFORMTICA

CIBERTEC

LENGUAJE DE PROGRAMACIN II

153

Resumen
Evita el envo automtico

conn.setAutoCommit(false);
Permite el envo de todas las sentencias sqls

conn.commit();
Permite la cancelacin de las sentencias sqls

conn.rollback();
El uso de etiquetas personalizadas le permitir al programador poder reutilzar la
etiqueta en otra pgina.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
o http://www.tutorialspoint.com/jdbc/jdbc-transactions.htm
Transacciones
o

CIBERTEC

http://www.java2s.com/Code/Java/Database-SQLJDBC/CommitorrollbacktransactioninJDBC.htm
Ejemplos de transacciones

CARRERA DE COMPUTACIN E INFORMTICA

También podría gustarte