Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacin II
LENGUAJE DE PROGRAMACIN II
CIBERTEC
LENGUAJE DE PROGRAMACIN II
ndice
Presentacin
Red de contenidos
4
5
Unidad de Aprendizaje 1
:
:
:
:
7
7
15
20
20
23
35
36
43
46
46
Unidad de Aprendizaje 2
:
:
:
:
:
Lenguaje de expresiones
Aplicacin Mantenimiento
Sesiones web
Aplicacin de Logueo
55
55
60
65
74
74
74
83
85
Unidad de Aprendizaje 3
:
:
:
:
AJAX
Transacciones
Aplicacin Ajax y Transaccin
CIBERTEC
93
93
93
103
116
118
118
121
125
146
146
149
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.
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
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
:
:
:
:
:
:
:
:
:
:
:
:
:
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.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
CIBERTEC
LENGUAJE DE PROGRAMACIN II
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
CIBERTEC
LENGUAJE DE PROGRAMACIN II
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
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.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
11
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
LENGUAJE DE PROGRAMACIN II
12
<fieldset>
<legend>Datos econmicos</legend>
Precio
<input type="text" name="nombre" size="10" required>   
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>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
13
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
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>
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>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
16
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
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
LENGUAJE DE PROGRAMACIN II
18
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>
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
LENGUAJE DE PROGRAMACIN II
1.2
20
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:
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:
Validar lo siguiente:
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
LENGUAJE DE PROGRAMACIN II
22
</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:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
23
Peticin (Request)
Servidor
web
Respuesta (Response)
Cliente
ejecutando
un Browser
CIBERTEC
Aplicacin web
Servlets
LENGUAJE DE PROGRAMACIN II
24
javax.servlet
javax.servlet.http
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
CIBERTEC
LENGUAJE DE PROGRAMACIN II
25
getAuthType()
the servlet
String
getContextPath()
getCookies()
getDateHeader(String name)
getHeader(String name)
getIntHeader(String name)
getMethod()
Returns the name of the HTTP method with which this request
was made, for example, GET, POST, or PUT.
CIBERTEC
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()
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()
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()
getUserPrincipal()
isRequestedSessionIdFromCookie()
boolean
isRequestedSessionIdFromURL()
isRequestedSessionIdValid()
isUserInRole(String role)
CIBERTEC
LENGUAJE DE PROGRAMACIN II
27
El objeto ServletContext y
El objeto HttpServletRequest
CIBERTEC
LENGUAJE DE PROGRAMACIN II
28
Ejemplo:
<HTML>
<HEAD><TITLE>Saludo</TITLE><HEAD>
<BODY>
<% String miAlias=request.getParameter(miAlias);
%> <H1>Hola <%=miAlias%></H1>
</BODY>
</HTML>
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 page info. Define una cadena de texto que es ubicada en el mtodo
Servlet.getServletInfo() del cdigo traducido. Ejemplo:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
29
JSP SCRIPTING
Declarations
Scriplets
Expressions
CIBERTEC
LENGUAJE DE PROGRAMACIN II
30
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);
CIBERTEC
LENGUAJE DE PROGRAMACIN II
31
<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 out. Es usado para las salidas de texto que se quieran incluir en la pgina.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
32
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:
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)
CIBERTEC
LENGUAJE DE PROGRAMACIN II
33
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
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
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
LENGUAJE DE PROGRAMACIN II
36
Pasos de la Conexin
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.
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
LENGUAJE DE PROGRAMACIN II
38
CIBERTEC
LENGUAJE DE PROGRAMACIN II
39
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");
}
}
}
CIBERTEC
LENGUAJE DE PROGRAMACIN II
41
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>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
42
CIBERTEC
LENGUAJE DE PROGRAMACIN II
43
CIBERTEC
LENGUAJE DE PROGRAMACIN II
44
CIBERTEC
LENGUAJE DE PROGRAMACIN II
45
CIBERTEC
LENGUAJE DE PROGRAMACIN II
46
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
LENGUAJE DE PROGRAMACIN II
2.
48
CIBERTEC
LENGUAJE DE PROGRAMACIN II
49
3.
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
LENGUAJE DE PROGRAMACIN II
4.
50
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
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
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>
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
CIBERTEC
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
:
:
:
:
:
:
:
:
:
Actividades propuestas
CIBERTEC
LENGUAJE DE PROGRAMACIN II
55
CIBERTEC
LENGUAJE DE PROGRAMACIN II
Clase
Creacin
Mtodo de
Fabricacin
56
Estructural
Adaptador (clases)
Objeto
Fbrica,
Constructor,
Prototipo,
Singleton
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
CIBERTEC
LENGUAJE DE PROGRAMACIN II
58
Capa de Presentacin
View Helper
Composite view
Service To Worker
Dispatcher View
CIBERTEC
LENGUAJE DE PROGRAMACIN II
59
Capa de Negocios
Business Delegate
Aggregate Entity
Value Object Assembler
Service Locator
Capa de Integracin
Service Activator
CIBERTEC
LENGUAJE DE PROGRAMACIN II
60
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
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
LENGUAJE DE PROGRAMACIN II
62
Diagrama de Clases
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
LENGUAJE DE PROGRAMACIN II
64
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.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
65
Modelo de Datos
CIBERTEC
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.
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
LENGUAJE DE PROGRAMACIN II
68
3.
4.
la siguiente imagen:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
69
5.
6.
7.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
70
8.
9.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
71
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
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:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
73
CIBERTEC
LENGUAJE DE PROGRAMACIN II
74
.
19. Clic en Listar y se muestra lo siguiente:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
1.
75
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
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;
}
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
LENGUAJE DE PROGRAMACIN II
78
3.
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);
}
CIBERTEC
LENGUAJE DE PROGRAMACIN II
79
CIBERTEC
LENGUAJE DE PROGRAMACIN II
80
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>
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.
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
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>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
83
HttpSession
Campos ocultos HTML(hidden fields)
Cookies
URL Rewriting
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:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
84
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();
CIBERTEC
LENGUAJE DE PROGRAMACIN II
85
<session-config>
<session-timeout>30</session-timeout>
</session-config>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
86
CIBERTEC
LENGUAJE DE PROGRAMACIN II
87
CIBERTEC
LENGUAJE DE PROGRAMACIN II
88
CIBERTEC
LENGUAJE DE PROGRAMACIN II
89
CIBERTEC
LENGUAJE DE PROGRAMACIN II
90
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.
${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
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
:
:
:
:
:
:
:
:
:
:
:
:
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.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
93
CIBERTEC
LENGUAJE DE PROGRAMACIN II
94
Pasos:
1.
2.
3.
4.
Nota:
doStartTag: Se procesa la etiqueta de apertura.
doEndTag: Se ejecuta despues de doStartTag.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
5.
95
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.
CIBERTEC
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:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
9.
97
Crear una interface con el nombre ComboDAO dentro del paquete interfaces:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
98
13. Crear una clase dentro del paquete service con el nombre ComboService y
escribir las siguientes instrucciones:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
99
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
LENGUAJE DE PROGRAMACIN II
100
CIBERTEC
LENGUAJE DE PROGRAMACIN II
101
Cambiar por
CIBERTEC
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:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
103
Prefijo
c
x
fmt
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
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
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)
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
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: <c:out value="${customer.firstName}" />
<c:out value="First name: ${customer.firstName}" />
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() %>" />
CIBERTEC
LENGUAJE DE PROGRAMACIN II
107
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:
CIBERTEC
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>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
109
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
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.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
111
<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
LENGUAJE DE PROGRAMACIN II
112
Propiedad
Rows
Tipo Java
Descripcin
Un array con un mapa insensible a las
java.util.SortedMap[]
maysculas por cada fila con las claves
CIBERTEC
LENGUAJE DE PROGRAMACIN II
rowsByIndex
Object[][]
columnNames
rowCount
String[]
Int
limitedByMaxRows
boolean
113
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
LENGUAJE DE PROGRAMACIN II
114
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,
CIBERTEC
LENGUAJE DE PROGRAMACIN II
115
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
LENGUAJE DE PROGRAMACIN II
fn:indexOf(string, substring)
fn:join(array, separator)
fn:length(item)
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
CIBERTEC
LENGUAJE DE PROGRAMACIN II
117
3.
Cambiar por
CIBERTEC
LENGUAJE DE PROGRAMACIN II
118
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
CIBERTEC
LENGUAJE DE PROGRAMACIN II
119
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¶metro2=valor2',
success: procesaRespuesta,
error: muestraError
});
La siguiente tabla muestra todas las opciones que se pueden definir para el
mtodo $.ajax():
CIBERTEC
LENGUAJE DE PROGRAMACIN II
Opcin
120
Descripcin
async
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
contentType
data
dataType
error
ifModified
processData
success
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
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
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
LENGUAJE DE PROGRAMACIN II
124
CIBERTEC
LENGUAJE DE PROGRAMACIN II
125
CIBERTEC
LENGUAJE DE PROGRAMACIN II
126
Clase DetalleBoletaDTO
CIBERTEC
LENGUAJE DE PROGRAMACIN II
127
Clase ClienteDTO
CIBERTEC
LENGUAJE DE PROGRAMACIN II
128
Clase BoletaDTO
CIBERTEC
LENGUAJE DE PROGRAMACIN II
129
ClienteDAO
BoletaDAO
CIBERTEC
LENGUAJE DE PROGRAMACIN II
130
CIBERTEC
LENGUAJE DE PROGRAMACIN II
6.
131
CIBERTEC
LENGUAJE DE PROGRAMACIN II
132
CIBERTEC
LENGUAJE DE PROGRAMACIN II
133
10.
Crear la clase BoletaService dentro del paquete services, segn la siguiente
imagen:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
134
11.
Crear el servlet ServletCliente dentro del paquete misServlets y escribir las
siguientes instrucciones:
12.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
135
CIBERTEC
LENGUAJE DE PROGRAMACIN II
136
CIBERTEC
LENGUAJE DE PROGRAMACIN II
137
CIBERTEC
LENGUAJE DE PROGRAMACIN II
138
CIBERTEC
LENGUAJE DE PROGRAMACIN II
139
CIBERTEC
LENGUAJE DE PROGRAMACIN II
140
CIBERTEC
LENGUAJE DE PROGRAMACIN II
141
CIBERTEC
LENGUAJE DE PROGRAMACIN II
142
CIBERTEC
LENGUAJE DE PROGRAMACIN II
143
CIBERTEC
LENGUAJE DE PROGRAMACIN II
144
23. Se mostrar la pgina con los tres mens, luego clic en Boleta.
CIBERTEC
LENGUAJE DE PROGRAMACIN II
145
26.
Clic en el botn () que se encuentra cerca de la caja de Cantidad, se
mostrar lo siguiente:
CIBERTEC
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
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:
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.
CIBERTEC
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>
CIBERTEC
LENGUAJE DE PROGRAMACIN II
149
int idAuditoria;
int codigoempleado;
String fechaLogin;
String fechaLogout;
String usuario;
String tiempo;
CIBERTEC
el
nombre:
LENGUAJE DE PROGRAMACIN II
150
CIBERTEC
LENGUAJE DE PROGRAMACIN II
151
7. Crear la clase AuditoriaSrevice dentro del paquete service y escribir las siguientes
instrucciones:
CIBERTEC
LENGUAJE DE PROGRAMACIN II
152
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