Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacin II
LENGUAJE DE PROGRAMACIN II 2
ndice
Presentacin 4
Red de contenidos 5
Unidad de Aprendizaje 1
HTML, JQuery, Servlet, JSP y JDBC.
1.1 Tema 1 : HTML, JSP y elementos de script 7
1.1.1 : Etiquetas HTML 5. 7
1.1.2 : JSP y elementos de script 15
Unidad de Aprendizaje 2
CRUD con patrn DAO, sesiones y Lenguaje de Expresiones
2.1 Tema 5 : Patrn DAO Parte I 55
2.1.1 : Patrones de diseo de software 55
2.1.2 : Patrn DAO 60
2.1.3 : Aplicacin Listado 65
Unidad de Aprendizaje 3
Etiquetas JSTL, Transacciones, Ajax y Listeners
3.1 Tema 7 : Custom Tag y JSTL 93
3.1.1 : Custom Tag 93
3.1.2 : Creacin de etiquetas personalizadas (Custom TAG) 93
3.1.3 : JSTL y Libreras 103
3.1.4 : Aplicacin Listado con JSTL 116
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.
Red de contenidos
Lenguaje de Programacin II
Servlet AJAX
Tag JSTL
Sesiones Dinmicos
JSP Generacin
EL
de Libreras
Patrn DAO
UNIDAD
1
HTML, JQuery, JSP Y JDBC
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
1.1 Tema 1 : HTML, JSP y elementos de script
1.1.1 : Etiquetas HTML 5
1.1.2 : JSP y elementos de script
1.2 Tema 2 : JQuery, Servlet y JSP
1.2.1 : JQuery
1.2.2 : Validaciones con JQuery
1.2.3 : Arquitectura del Servlet
1.2.4 : Servlet y JSP
1.3 Tema 3 : JDBC, Aplicaciones Parte I
1.3.1 : Aplicacin de Logueo
1.3.2 : Aplicacin de Listado
1.4 Tema 4 : JDBC, Aplicaciones Parte II
1.4.1 : Aplicacin de Mantenimiento
ACTIVIDADES PROPUESTAS
HTML es el lenguaje usado para escribir las pginas web, describe la estructura y el
contenido usando solo texto y lo complementa con objetos tales como imgenes, flash
y otros. Los archivos as creados son guardados con la extensin de archivo HTM o
HTML. Su estructura se compone de etiquetas o tags entre las cuales van insertados
los diferentes elementos que componen la pgina como son los bloques de texto,
scripts y la ruta a la ubicacin de archivos externos como imgenes y otros archivos
multimedia.
Es ms ligero al ser ms sencillo y simple el cdigo, lo que permite que las pginas
escritas en este lenguaje carguen ms rpido en el navegador. Si an no fuera
suficiente, introduce infinidad de opciones que hasta ahora estaban vedadas a las
pginas web, como insertar directamente video (no flash), msica, y casi cualquier
elemento.
Formulario
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
TEXT
CHECKBOX
RESET
RADIO
PASSWORD
BUTTON
FILE
HIDDEN
IMAGE
SUBMIT
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
Input Type:Hidden
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
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
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.
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>
<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>
En HTML5 se han incluido nuevos tipos de entradas de datos para los formularios,
algunos de estos nuevos tipo de entrada tienen la capacidad de comprobar si el valor
introducido coincide con su tipo de dato lo que nos ayuda bastante a la hora de
solucionar la validacin de los datos que el usuario introduce.
Input type:url
Esta entrada de datos se utiliza para especificar una direccin web. Se muestra como
un simple campo de texto normal.
Input type:search
Input Type=Date
Esto engloba la fecha (ao, mes, da) pero no la hora; Ejemplo, 2008-06-22, Podemos
seleccionar el ao, mes y da.
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>
<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>
<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>
JSP permite la creacin de sitios web dinmicos donde se puede combinar contenido
HTML y bloques de programacin en java que permitan la programacin de
sentencias.
JSP scripting incluye los siguientes elementos de cdigo Java que pueden aparecer
dentro de una pgina JSP:
Scriptlets
Expresiones
Scriptlets
Expresiones
Cdigo:
AccesoAction.jsp
<%
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:
Cdigo:
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:
</h4>
</body>
</html>
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.
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:
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"
Nota:
Si trabajamos con jquery.validation hay que tener claros que son los mtodos de
validacin y las reglas de validacin.
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:
web
Respuesta (Response)
javax.servlet
javax.servlet.http
b) El mtodo service. Este mtodo es llamado por cada peticin de cliente. Para las
peticiones HTTP, este mtodo se ha especializado para enviar la peticin al
mtodo doGet o doPost.
Cada peticin de cliente es servida sobre un diferente hilo (thread); por lo tanto,
muchos clientes pueden acceder al mismo cdigo en paralelo. Es responsabilidad
del desarrollador sincronizar los accesos a los recursos compartidos.
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.
String getAuthType()
Returns the name of the authentication scheme used to protect
the servlet
String getContextPath()
Returns an array containing all of the Cookie objects the client
sent with this request.
Cookie[] getCookies()
Returns an array containing all of the Cookie objects the client
sent with this request.
long getDateHeader(String name)
Returns the value of the specified request header as a long
value that represents a Date object.
String getHeader(String name)
Returns the value of the specified request header as a String.
Enumeration
getHeaderNames()
Returns an enumeration of all the header names this request
contains.
int getIntHeader(String name)
Returns the value of the specified request header as an int.
String getMethod()
Returns the name of the HTTP method with which this request
was made, for example, GET, POST, or PUT.
String getPathInfo()
Returns any extra path information associated with the URL the
client sent when it made this request.
String getPathTranslated()
Returns any extra path information after the servlet name but
before the query string, and translates it to a real path.
String getQueryString()
Returns the query string that is contained in the request URL
after the path.
String getRemoteUser()
Returns the login of the user making this request, if the user has
been authenticated, or null if the user has not been authenticated.
String getRequestedSessionId()
Returns the session ID specified by the client.
String getRequestURI()
Returns the part of this request's URL from the protocol name
up to the query string in the first line of the HTTP request.
StringBuffe getRequestURL()
r Reconstructs the URL the client used to make the request.
String getServletPath()
Returns the part of this request's URL that calls the servlet.
HttpSession getSession()
Returns the current session associated with this request, or if
the request does not have a session, creates one.
HttpSession getSession(boolean create)
Returns the current HttpSession associated with this request or, if
there is no current session and create is true, returns a new
session.
boolean getUserPrincipal()
Returns a java.security.Principal object containing the name of
the current authenticated user.
boolean isRequestedSessionIdFromCookie()
Checks whether the requested session ID came in as a cookie.
boolean isRequestedSessionIdFromURL()
Checks whether the requested session ID came in as part of
the request URL.
boolean isRequestedSessionIdValid()
Checks whether the requested session ID is still valid.
boolean isUserInRole(String role)
Returns a boolean indicating whether the authenticated user is
included in the specified logical "role".
COMPARTIENDO OBJETOS
El objeto ServletContext y
El objeto HttpServletRequest
MiClase elObjeto;
ElObjeto =(MiClase)getServletContext().getAttribute(objeto);
Un jsp tiene poco cdigo Java que puede ser fcilmente entendido por un
diseador html.
Ejemplo:
<HTML>
<HEAD><TITLE>Saludo</TITLE><HEAD>
<BODY>
<% String miAlias=request.getParameter(miAlias);
%> <H1>Hola <%=miAlias%></H1>
</BODY>
</HTML>
Antes de poder ser ejecutado, un jsp debe ser convertido en un servlet de Java. Esto
es hecho en dos etapas:
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:
elJSP. Ejemplo:
<HTML>
<HEAD><TITLE>Prueba<TITLE></HEAD>
<BODY>
<%@ include file=loguito.html%>
</BODY>
</HTML>
Directiva page info. Define una cadena de texto que es ubicada en el mtodo
Servlet.getServletInfo() del cdigo traducido. Ejemplo:
JSP SCRIPTING
Declarations
Scriplets
Expressions
Sintaxis:
<%! Declaracin %>
Ejemplo:
Sintaxis:
<% cdigo_java %>
Ejemplo:
<%String sexo =
request.getParameter(
sexo);
If(sexo.equals(M)) {
%>
<H2>Sr.</H2>
<%
}else{
%>
<H2>Sra.</H2>
<% } %>
Sintaxis:
<%= expression %>
Ejemplo:
La fecha actual es
<%=new java.util.Date() %>
http://nombreservidor/aplicacionweb/nombrejsp.jsp
b) Un JSP puede ser invocado desde un servlet usando el mtodo forward del objeto
RequestDispatcher. Ejemplo:
<FORM
ACTION=/aplicacionWeb/URLServlet>
<A HREF=/aplicacionWeb/URLServlet>
texto </A>
<FORM
ACTION=/aplicacionWeb/nombrejsp.jsp>
<A
HREF=/aplicacionWeb/nombrejsp.jsp>
texto </A>
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.
Se usa lo siguiente:
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:
Se usa lo siguiente:
OBJETO SIGNIFICADO
request El objeto HttpServletRequest asociado con la peticin
response El objeto HttpServletResponse asociado con la respuesta
out 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).
session El objeto HttpSession asociado con la peticin actual. En JSP, las
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)
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>
<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
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);
}
}
respuesta.jsp
Cdigo:
</h4>
</body>
</html>
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.
Pasos de la Conexin
Pasos a seguir:
Dnde:
entidad: Almacena la clase Alumno(Definir atributos)
misServlets: Almacena los Servlets del proyecto(ServletListado,
ServletLogueo, ServletMantenimiento)
utils: Almacena la clase para conexin con la base de datos
(MysqlDBConexion)
img: Almacena las imgenes (delete.gif,edit.gif )
js: Almacena los archivos de JQuery para realizar
validaciones
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;
}
}
package entidad;
public class Alumno {
private int codigo;
private String nombre,paterno,materno;
private int edad;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getPaterno() {
return paterno;
}
public void setPaterno(String paterno) {
this.paterno = paterno;
}
public String getMaterno() {
return materno;
}
public void setMaterno(String materno) {
this.materno = materno;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
}
package modelo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import entidad.Empleado;
import utils.MysqlDBConexion;
public class ModelEmpleado {
public Empleado iniciarSesion(String log,String pas){
Empleado obj=null;
Connection cn=null;
ResultSet rs=null;
PreparedStatement pstm=null;
try {
String sql="select *from tbempleado where login_emp=?
and clave_emp=?";
cn=MysqlDBConexion.getConexion();
pstm=cn.prepareStatement(sql);
pstm.setString(1, log);
pstm.setString(2, pas);
rs=pstm.executeQuery();
if(rs.next()){
obj=new Empleado();
obj.setCodigo(rs.getInt(1));
obj.setNombre(rs.getString(2));
obj.setApellidos(rs.getString(3));
obj.setLogin(rs.getString(4));
obj.setLogin(rs.getString(4));
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(rs!=null)rs.close();
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return obj;y guardarlo en el paquete controlador.
6. Crear el ServletEmpleado
}
}
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");
}
}
}
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>
package controlador;
@WebServlet("/ServletEmpleado")
public class ServletEmpleado extends HttpServlet {
protected void service(HttpServletRequest request,
HttpServletResponse response) throws
ServletException,
IOException {
String login,clave;
login=request.getParameter("txtlogin");
clave=request.getParameter("txtpass");
Empleado e=m.iniciarSesion(login, clave);
if(e==null){
request.setAttribute("msj", "Error usuario y/o
clave");
request.getRequestDispatcher("index.jsp").forward(
request,response);
}
else{
response.sendRedirect("menu.jsp");
}
}
Pasos a seguir
package modelo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import utils.MysqlDBConexion;
import entidad.Alumno;
public class ModelAlumno {
public List<Alumno> listar(){
Alumno alu=null;
List<Alumno> data=new ArrayList<Alumno>();
Connection cn=null;
ResultSet rs=null;
PreparedStatement pstm=null;
try {
cn=MysqlDBConexion.getConexion();
String sql="select *from tb_alumno";
pstm=cn.prepareStatement(sql);
rs=pstm.executeQuery();
while(rs.next()){
alu=new Alumno();
alu.setCodigo(rs.getInt(1));
alu.setNombre(rs.getString(2));
alu.setPaterno(rs.getString(3));
alu.setMaterno(rs.getString(4));
alu.setEdad(rs.getInt(5));
data.add(alu);
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(rs!=null)rs.close();
if(pstm!=null)pstm.close();
if(cn!=null)cn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return data;
}
}
package controlador;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entidad.Alumno;
import modelo.ModelAlumno;
public class ServletAlumno extends HttpServlet {
ModelAlumno m=new ModelAlumno();
private static final long serialVersionUID = 1L;
public ServletAlumno() {
super();
}
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String tipo=request.getParameter("tipo");
if(tipo.equals("listar"))
listar(request,response);
}
private void listar(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
List<Alumno> info=new ModelAlumno().listar();
request.setAttribute("data", info);
request.getRequestDispatcher("listarAlumno.jsp").forward(
request, response);
}
}
<%@page import="entidad.Alumno"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
List<Alumno> da=
(List<Alumno>)request.getAttribute("data");
%>
<h2 align="center">LISTADO DE ALUMNOS</h2>
<p align="center" ><a href="registrarAlumno.jsp"> + Nuevo Registro</a>
Pasos a seguir
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;
}
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>
<%
}
}
%>
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>
Cdigo:
<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>
Resumen
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
http://today.java.net/pub/a/today/2003/12/04/exceptions.html
Aqu hallar importantes reglas bsicas para la gestin de excepciones en java.
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Exception.html
En esta pgina, hallar documentacin detallada de la clase base de todas las
excepciones controladas: Exception
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 : Patrn DAO Parte I
2.1.1 : Patrones de diseo de software
2.1.2 : Patrn DAO
2.1.3 : Aplicacin Listado
2.2 Tema 6 : Patrn DAO Parte II, Sesiones web y EL
2.2.1 : Lenguaje de expresiones
2.2.2 : Aplicacin Mantenimiento
2.23 : Sesiones web
2.2.4 : Aplicacin de Logueo
Actividades propuestas
El diseo es un modelo del sistema, realizado con una serie de principios y tcnicas,
que permite describir el sistema con el suficiente detalle como para ser
implementado. Sin embargo, los principios y reglas no son suficientes. En el contexto
de diseo, podemos observar que los buenos ingenieros tienen esquemas y
estructuras de solucin que usan numerosas veces en funcin del contexto del
problema. Este es el sentido cabal de la expresin "tener una mente bien amueblada",
y no el significado de tener una notable inteligencia. Estos esquemas y estructuras
son conceptos reusables y nos permiten no reinventar la rueda. Un buen ingeniero
reutiliza un esquema de solucin ante problemas similares.
Historia
Alexander comenta que cada patrn describe un problema que ocurre una y otra
vez en nuestro entorno, para describir despus el ncleo de la solucin a ese
problema, de tal manera que esa solucin pueda ser usada ms de un milln de veces
sin hacerlo siquiera dos veces de la misma forma. El patrn es un esquema de
solucin que se aplica a un tipo de problema. Esta aplicacin del patrn no es
mecnica, sino que requiere de adaptacin y matices. Por ello, dice Alexander que
los numerosos usos de un patrn no se repiten dos veces de la misma forma.
Siguiendo el libro de GOF, los patrones se clasifican segn el propsito para el que
han sido definidos:
Capa de Presentacin
Capa de Negocios
Capa de Integracin
Los patrones de diseo son descripciones de clases cuyos objetos colaboran entre
s. Cada patrn es adecuado para ser adaptado a un cierto tipo de problema. Para
describir un caso se debe especificar lo siguiente:
Nombre
Propsito o finalidad
Sinnimos (otros nombres por los que puede ser conocido)
Problema al que es aplicable
Estructura (diagrama de clases)
Participantes (responsabilidad de cada clase)
Colaboraciones (diagrama de interacciones)
Implementacin (consejos, notas y ejemplos)
Otros patrones con los que est relacionado
Contexto
El acceso a los datos vara dependiendo de la fuente de los datos. El acceso al
almacenamiento persistente, como una base de datos, vara en gran medida
dependiendo del tipo de almacenamiento (bases de datos relacionales, bases de
datos orientadas a objetos, archivos de texto, etc.) y de la implementacin del
vendedor.
Problema
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.
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).
Diagrama de Clases
Factory
Abstract Factory
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.
Contexto resultante
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.
Modelo de Datos
Pasos:
1. Crear la clase ProductoDTO dentro del paquete beans, con los siguientes
atributos privados, e implemente los mtodos de acceso: set y get.
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:
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.
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:
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.
Pasos a seguir:
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;
}
@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;
}
@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;
}
}
package service;
import interfaces.ProductoDAO;
import java.util.List;
import utils.Constantes;
import dao.DAOFactory;
import beans.ProductoDTO;
public class ProductoService {
DAOFactory
fabrica=DAOFactory.getDAOFactory(Constantes.ORIGEN_DATOS);
ProductoDAO objPro=fabrica.getProducto();
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);
}
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>
<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>
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>
<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>
HTTPSESSION
En una transaccin http, cada conexin entre un cliente y un servidor es muy breve.
Esta es una caracterstica tpica de cualquier protocolo sin estado (staless). El
protocolo http no mantiene el estado, es decir, no tiene un mecanismo para saber que
una serie de peticiones (request) provienen de un mismo cliente. Ante esta limitacin,
surge la sesin como el mecanismo adecuado para identificar un usuario que est
interactuando con el sitio web.
HttpSession
Campos ocultos HTML(hidden fields)
Cookies
URL Rewriting
Las sesiones son compartidas por todos los Servlets y jsps accesados por un cliente;
por lo tanto, es comn que se cree un objeto Sesin cuando nos logueamos a un
sitio web. Por otro lado, si nos deslogueamos de un sitio web, la sesin debera ser
destruida.
Sintaxis:
request.getSession() o request.getSession(true). Retornan la sesin actual si existe;
de lo contrario, crean una nueva.
CONTENIDO DE LA SESIN
Los datos son almacenados como un par <nombre, valor> siendo valor cualquier
objeto que se desee almacenar en la sesin.
Ejemplo:
Programticamente
Por tiempo de expiracin
Cuando el usuario cierra el browser
Programticamente:
Sintaxis:
removeAttribute(String nombreAtributo)
nombreAtributo es el nombre del atributo a ser removido.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Pasos a seguir:
package misServlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import beans.EmpleadoDTO;
import service.EmpleadoService;
public class MantenimientoEmpleado extends HttpServlet {
private static final long serialVersionUID = 1L;
EmpleadoService servicio=new EmpleadoService();
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
String xtipo=request.getParameter("tipo");
if(xtipo.equals("sesion"))
iniciarSesion(request,response);
else if(xtipo.equals("cerrarSesion"))
cerrarSesion(request,response);
}
private void cerrarSesion(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
HttpSession sesion=request.getSession();
sesion.invalidate();
request.setAttribute("msg", "Iniciar sesin");
request.getRequestDispatcher("index.jsp").
forward(request, response);
}
private void iniciarSesion(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
String xlogin=request.getParameter("txt_login");
String xpass=request.getParameter("txt_pass");
EmpleadoDTO obj=servicio.IniciaSesion(xlogin);
if(obj!=null){
if(obj.getPassword().equals(xpass)){
HttpSession sesion=request.getSession();
sesion.setAttribute("datos",obj);
request.getRequestDispatcher("encabezado.jsp").
forward(request, response);
}
else{
request.setAttribute("msg", "Contrasea
incorrecta...");
request.getRequestDispatcher("index.jsp").
forward(request, response);
}
}
else{
request.setAttribute("msg", "Usuario no existe...");
request.getRequestDispatcher("index.jsp").
forward(request, response);
}
}
}
Pgina: listarProducto.jsp
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).
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.
UNIDAD
3
Etiquetas, JSTL, Transacciones,
Ajax y Listeners
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
3.1 Tema 7 : Custom Tag y JSTL
3.1.1 : Custom Tag
3.1.2 : Creacin de etiquetas personalizadas (Custom TAG)
3.1.3 : JSTL y Libreras
3.1.4 : Aplicacin Listado con JSTL
3.2 Tema 8 : Ajax y Transacciones en web
3.2.1 : Ajax
3.2.2 : Transacciones
3.2.3 : Aplicacin Ajax y Transaccin
3.3 Tema 3 : Listeners
3.3.1 : Tipos
3.3.2 : Aplicacin Auditoria
Actividades propuestas
La tecnologa JSP nos permite introducir cdigo Java en pginas HTML. Este
documento supone que est familiarizado con la creacin de pginas JSP y que tiene
instalado Apache-Tomcat (en realidad, valdra cualquier servidor de JSP que cumpla la
especificacin JSP 1.1, pero los ejemplos se han probado en Tomcat).
Las JSP estn compuestas por varios tags o, como las denominaremos en adelante,
etiquetas. Ejemplos de etiquetas JSP son setProperty, include, forward, usebean.
Todas ellas encapsulan comportamientos de una manera sencilla. Nos detendremos
en la etiqueta <jsp:useBean>. Esta etiqueta crea una instancia de una clase definida
como un JavaBean. El uso de la etiqueta <jsp: useBean> en conjuncin con los
JavaBeans hace que podamos separar la lgica de presentacin de la de proceso y
consigue unos archivos JSP ms claros, y lo que es ms importante, el que escribe la
JSP no tiene por qu tener unos conocimientos avanzados de programacin para
crear pginas JSP de funcionalidades avanzadas. Pues bien, las JSP Custom Tags
son un paso ms all. Con ellas se pueden aadir nuevas etiquetas a las ya existentes
en JSP (eso s a partir de la especificacin JSP 1.1) que encapsulen comportamientos
ms o menos complicados. Antes de seguir, vamos a revisar algunos conceptos.
Hay dos tipos principales de etiquetas: etiquetas que no tienen cuerpo y etiquetas que
s lo tienen. Ejemplos son la etiqueta <img src="asdfa.gif"> que no tiene cuerpo y no
tiene etiqueta de final; y <title>manolo</title> que tiene cuerpo y etiqueta de final.
Estos son tambin los dos tipos de etiquetas JSP que nosotros podemos crear a
medida.
Pasos:
Nota:
doStartTag: Se procesa la etiqueta de apertura.
doEndTag: Se ejecuta despues de doStartTag.
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
7. 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:
9. Crear una interface con el nombre ComboDAO dentro del paquete interfaces:
13. Crear una clase dentro del paquete service con el nombre ComboService y
escribir las siguientes instrucciones:
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 WEB-
INF, para registrar las etiquetas personalizadas
Cambiar por
Cambiar por
23. Ejecutar la pgina index.jsp, luego hacer clic en el men listar y se mostrara la
siguiente pgina:
JSTL 1.0 especifica un conjunto de libreras de etiquetas basadas en el API JSP 1.2.
Hay cuatro libreras de etiquetas independientes, cada una contiene acciones
personalizadas dirigidas a un rea funcional especfica. Esta tabla lista cada librera
con su prefijo de etiqueta recomendado y la URI por defecto:
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.
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:
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.
${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]}$
Operador Descripcin
. Accede a una propiedad.
[] Accede a un elemento de un array/lista.
() Agrupa una subexpression.
+ Suma
- Resta o negacin de un nmero
/ o div Divisin
% o mod Mdulo (resto)
== o eq Comprueba Igualdad.
!= o ne Comprueba desigualdad.
< o lt Comprueba menor que.
> o gt Comprueba mayor que.
<= o le Comprueba menor o igual que.
>= o gt Comprueba mayor o igual que.
&& o and Comrpueba AND lgico.
|| o or Comprueba OR lgico.
! o not Complemento binario booleano
empty Comprueba un valor vaco (null, string vaco o una colleccin
vaca)
Cualquier objeto en uno de los mbitos de JSP (pgina, solicitud, sesin o aplicacin)
se puede utilizar como una variable en una expresin EL. Por ejemplo, si tenemos un
bean con una propiedad firstName en el mbito de la solicitud bajo el nombre
customer, esta expresin EL representa el valor de la propiedad firstName del bean.
${customer.firstName}
Variable Descripcin
Param Una collection de todos los valores de los parmetros de la solicitud
como un slo valor string para cada parmetro
paramValues Una collection de todos los valores de los parmetros de la solicitud
como un array de valores string por cada parmetro
Header Una collection de todas las cabeceras de solicitud como un slo
valor string por cada cabecera
headerValues Una collection de todos los valores de cabecera de la solicitud
como un array de valores string por cada cabecera
Cookie Una collection con todas las cookies de la solicitud en un slo
ejemplar de javax.servlet.http.Cookie por cada cokkie
initParams Una collection de todos los parmetros de inicializacin de la
aplicacin en un slo valor string por cada parmetro
pageContext Un ejemplar de la clase javax.servlet.jspPageContext
pageScope Una collection de todos los objetos en el mbito de la pgina
requestScope Una collection de todos los objetos en el mbito de la solicitud
sessionScope Una collection de todos los objetos en el mbito de la sesin
applicationScope 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']}
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.
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:
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:
Veamos algunos ejemplos de cmo podemos usar el JSTL condicional y las acciones
de iteracin: <c:if>; <c:choose>, <c:when>, y un triple <c:otherwise>; y <c:forEach>.
Por el camino, tambin usaremos acciones de salida bsica y de seleccin de
variables: <c:out> y <c:set>.
<c:if> nos permite incluir, o procesar, condicionalmente una parte de una pgina,
dependiendo de la informacin durante la ejecucin. Este ejemplo incluye un saludo
personal si el usuario es un visitante repetitivo, segn lo indica la presencia de una
cookie con el nombre del usuario:
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>
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:
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:
<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>
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
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.
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:
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.
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.
JSTL soporta varias formas para hacer que un objeto DataSource est disponible para
las acciones de bases de datos. En un contenedor web con soporte JNDI (Java
Naming and Directory Interface), se puede definir un DataSource por defecto como un
recurso JNDI con un parmetro de contexto en el archivo web.xml:
< context-param>
<param-name>
javax.servlet.jsp.jstl.sql.dataSource
</param-name>
<param-value>
jdbc/Production
</param-value>
</context-param>
Se deben utilizar las herramientas de configuracin JNDI del contenedor WEB para
configurar un recurso JNDI con el nombre especificado; por ejemplo, con un nombre
de usuario y un password de una cuenta de usuario en una base de datos, las
conexiones mnimas y mximas en el almacen, etc. La forma de realizar esto vara
entre los contenedores y est fuera del mbito de este artculo.
Una alternativa para los contenedores que no soportan JNDI es que un oyente del
ciclo de vida de la aplicacin (contexto del servlet) cree y configure un DataSource y lo
seleccione como el valor por defecto usando la clase Config de JSTL:
import javax.servlet.*;
import javax.servlet.http.*;
import oracle.jdbc.pool.*;
public class AppListener implements
ServletContextListener {
private OracleConnectionCacheImpl ds =null;
public void contextInitialized(ServletContextEvent sce){
ServletContext application =sce.getServletContext();
try {
ds = new OracleConnectionCacheImpl();
ds.setURL("jdbc:oracle:thin:@voyager2:1521:Oracle9i");
ds.setMaxLimit(20);
ds.setUser("scott");
ds.setPassword("tiger");
}
catch (Exception e){
application.log("Failed to create data source:"+
e.getMessage());
}
Config.set(application, Config.SQL_DATASOURCE, ds);
}
...
}
Otra forma, slo disponible para prototipos o aplicaciones que no van a utilizarse tan
duramente como para necesitar el almacn de conexiones, es usar la accin
<sql:setDataSource>:
<sql:setDataSource
url="jdbc:mysql://dbserver/dbname"
driver="org.gjt.mm.mysql.Driver"
user="scott"
password="tiger" />
Esta accin crea una sencilla fuente de datos, sin almacenamiento, para la URL JDBC
especificada, con el usuario y la password, usando el driver JDBC especificado.
Podramos usar esta accin para empezar, pero recomendamos la utilizacin de una
de las otras alternativas para una site del mundo real. Adems de privarnos del
almacn de conexiones para una fuente de datos creada de esta forma, no es una
buena idea incluir informacin sensible como la URL de la base de datos, el nombre
de usuario y la password en una pgina JSP, ya que sera posible para alguien
acceder al cdigo fuente de la pgina.
Con una DataSource a nuestra disposicin, podemos acceder a la base de datos. Aqu
podemos leer datos desde una base de datos representada por el DataSource por
defecto:
<%@ taglib prefix="sql"
uri="http://java.sun.com/jstl/sql" %>
<html>
<body>
<h1>Reading database data</h1>
<sql:query var="emps" sql="SELECT * FROM
Employee" />
...
</body>
</html>
Primero, necesitamos declarar la librera JSTL que contiene las acciones de bases de
datos, usando la directiva taglib de la parte superior de este ejemplo. La accin
<sql:query> ejecuta la sentencia SQL SELECT especificada por el atributo sql (o como
el cuerpo del elemento accin) y graba los resultados en una variable nombrada por el
atributo var.
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:
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>
Adems de leer datos desde una base de datos, tambin podemos usar JSTL para
actualizar informacin. Este ejemplo muestra cmo insertar una nueva fila en una
tabla:
<c:catch var="error">
<fmt:parseDate var="empDate" value="${param.empDate}"
pattern="yyyy-MM-dd" />
</c:catch>
<c:if test="${error != null}">
<jsp:useBean id="empDate" class="java.util.Date" />
</c:if>
<sql:update>
INSERT INTO Employee (FirstName, LastName, EmpDate)
VALUES(?, ?, ?)
<sql:param value="${param.firstName}" />
<sql:param value="${param.lastName}" />
<sql:dateParam value="${empDate}" type="date" />
</sql:update>
Antes de insertar la fila, este ejemplo ilustra cmo usar las acciones de validacin
JSTL. La pgina espera que todos los datos para la nueva fila se enven como
parmetros de solicitud (quizs introducidos en un formulario HTML), incluyendo una
fecha de contratacin. Antes de que la fecha se pueda insertar en la base de datos,
debemos convertirla a su forma nativa Java. Esto es lo que hace la accin
<fmt:parseDate>. El atributo value contiene una expresin EL que obtiene el valor del
parmetro de solicitud empDate. La accin trata de interpretarlo como una fecha
escrita en el formato especificado por el atributo pattern (un ao de cuatro dgitos,
seguido por dos dgitos del mes y dos dgitos del da, separados por barras
inclinadas). Si tiene xito, almacena la fecha en su forma nativa con el nombre
especificado por el atributo var.
La accin <c:catch> tiene en cuenta los strings invlidos. Si el valor del parmetro no
puede ser interpretado como una fecha, el <fmt:parseDate> lanza una excepcin, que
la accin <c:catch> captura y graba en la variable especificada. Cuando esto sucede,
la condicin de comprobacin de la accin <c:if> se evala a true, por lo que la fecha
de contratacin es creada por la accin <jsp:useBean> anidada.
En este ejemplo (como en las mayora de las aplicaciones del mundo real), no se
conocen los nombres de las columnas en tiempo de ejecucin; vienen de los
parmetros de la solicitud. Por lo tanto, la sentencia INSERT de SQL incluye una
marca de interrogacin por cada valor como un contenedor y parmetros internos de la
accin que seleccionan el valor dinmicamente. Las columnas FirstName y LastName
son columnas de texto y las acciones <sql:param> seleccionan sus valores al valor del
parmetro de solicitud correspondiente.
Hay una accin JSTL ms que no hemos descrito hasta ahora: <sql:transaction>.
Podemos usarla para agrupar varias acciones update (o incluso query) donde todas
ellas se deben ejecutar como parte de la misma transaccin de la base de datos. El
ejemplo estndar es transferir una cantidad de dinero de una cuenta a otra;
implementada como una sentencia SQL que elimina el dinero de la primera cuenta y
otra sentencia que lo aade a la segunda.
Si encapsulamos todos los accesos a una base de datos en clases Java en lugar de
usar las acciones de JSTL, todava hay una parte de JSTL que nos puede ser til. Es
una clase llamada javax.servlet.jsp.jstl.sql.ResultSupport, con estos dos mtodos:
Podemos usar esta clase para convertir un objeto ResultSet estndar JDBC en un
objeto Result JSTL antes de reenviarlo a la pgina JSP para mostrarlo. Las acciones
JSTL pueden acceder fcilmente a los datos de un objeto Result, como vimos
anteriormente. Otra aproximacin, todava mejor, es pasar el resultado de la consulta a
la pgina JSP como una estructura de datos personalizada, como una List de beans
que contienen los datos de cada fila, pero el objeto Result an es un buen candidato
para prototipos y pequeas aplicaciones.
Funcin Descripcin
fn:contains(string, substring) Devuelve true si el string contiene
substring.
fn:containsIgnoreCase(string, substring) Devuelve true si el string contiene a
substring, ignorando capitalizacin.
fn:endsWith(string, suffix) Devuelve true si el string termina con
suffix.
fn:escapeXml(string) Devuelve el string con todos aquellos
caracteres con especial significado en
Pasos a seguir:
1. Proceda a copiar todos los jar que se entreg en clase dentro de la carpeta lib del
proyecto web.
Cambiar por
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
En el esquema anterior vemos las ideas en torno a Ajax de forma grfica. En la parte
superior hemos representado lo que sera un esquema de comunicacin tradicional: el
cliente solicita una pgina web completa al servidor. El servidor recibe la peticin, se
toma su tiempo para preparar la respuesta y la enva. El resultado, una pequea
demora debido al tiempo que tarda en llegar la peticin al servidor, el tiempo que ste
tarda en preparar la respuesta, y el tiempo que tarda en llegar la respuesta ms
recargarse en el navegador.
Las funciones y utilidades relacionadas con AJAX son parte fundamental de jQuery. El
mtodo principal para realizar peticiones AJAX es $.ajax() (importante no olvidar el
punto entre $ y ajax). A partir de esta funcin bsica, se han definido otras funciones
relacionadas, de ms alto nivel y especializadas en tareas
concretas: $.get(), $.post(), $.load(), etc.
$.ajax(opciones);
La URL que se solicita tambin se incluye dentro del array asociativo de opciones. A
continuacin se muestra un ejemplo bsico realizado con $.ajax():
$.ajax({
url: 'pagina o servlet',
type: 'POST',
async: true,
data:
'parametro1=valor1¶metro2=valor2',
success: procesaRespuesta,
error: muestraError
});
La siguiente tabla muestra todas las opciones que se pueden definir para el
mtodo $.ajax():
Opcin Descripcin
Opcin Descripcin
3.2.2 Transacciones
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,
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.
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.)
con.setAutoCommit (false);
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.
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)
Por lo general, usted no tiene que hacer nada sobre el nivel de aislamiento de
transaccin; slo puede utilizar el valor predeterminado para su DBMS. El nivel de
aislamiento de transaccin por defecto depende de su DBMS. Por ejemplo, para Java
DB, TRANSACTION_READ_COMMITTED . JDBC permite averiguar cul es el nivel
de aislamiento de transaccin de su DBMS (utilizando el mtodo
getTransactionIsolation de Connection) y tambin le permite establecerlo a otro nivel
(usando el mtodo setTransactionIsolation de Connection).
Pasos a seguir:
Clase DetalleBoletaDTO
Clase ClienteDTO
Clase BoletaDTO
ClienteDAO
BoletaDAO
10. Crear la clase BoletaService dentro del paquete services, segn la siguiente
imagen:
11. Crear el servlet ServletCliente dentro del paquete misServlets y escribir las
siguientes instrucciones:
package misServlets;
import java.io.IOException;
public class ServletBoleta extends HttpServlet {
BoletaService serviBoleta=new BoletaService();
private static final long serialVersionUID = 1L;
public ServletBoleta() {
super();
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String tipo=request.getParameter("tipo");
if(tipo.equals("verCliente"))
verCliente(request,response);
else if(tipo.equals("verProducto"))
verProducto(request,response);
else if(tipo.equals("ingresa"))
ingresa(request, response);
else if(tipo.equals("elimina"))
eliminar(request, response);
else if(tipo.equals("registra"))
registra(request, response);
}
private void registra(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//Boleta que esta en sesion
ArrayList<ProductoDTO> boleta =(ArrayList<ProductoDTO>)
session.getAttribute("boleta");
//Cliente que esta en sesion
String cliente[]=
(String[])session.getAttribute("datoCliente");
int codCliente = Integer.parseInt(cliente[0]);
//Creamos la Boleta
EmpleadoDTO codEmpleado=(EmpleadoDTO)
session.getAttribute("datos");
BoletaDTO b = new BoletaDTO();
b.setCodEmpleado(codEmpleado.getCodigo());
b.setCodCiente(codCliente);
//Creamos el detalle
ArrayList<DetalleBoletaDTO> detalles = new
ArrayList<DetalleBoletaDTO>();
for (ProductoDTO x : boleta) {
DetalleBoletaDTO det = new DetalleBoletaDTO(0,
x.getCodigo(), x.getStock(), x.getPrecio());
detalles.add(det);
}
serviBoleta.registrarBoleta(b, detalles);
//limpiamos la sesion
session.removeAttribute("boleta");
session.removeAttribute("datoCliente");
session.removeAttribute("datoProducto");
//reenvio
request.getRequestDispatcher("registrarBoleta.jsp").
forward(request, response);
}
}
}
23. Se mostrar la pgina con los tres mens, luego clic en Boleta.
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
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
- javax.servlet.http.HttpSessionListener
ServletContextListener:
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
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
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;
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.
Pasos a seguir:
En aplicacin web los eventos son nuevos, a partir en la especificacin Servlet 2.3.
Ellos le dan mayor grado de control sobre su aplicacin web. En este captulo, se va a
estudiar la aplicacin de dos importantes eventos:
1. Crear dentro del paquete beans la clase AuditoriaDTO con los siguientes atributos:
2. Crear una interfaz dentro del paquete interfaces con el nombre AuditoriaDAO que tenga
los siguientes mtodos:
4. Crear un servicio dentro del paquete service con el nombre AuditoriaService que permita
trabajar con los mtodos que existen en MySqlAuditoriaDAO.
7. Crear la clase AuditoriaSrevice dentro del paquete service y escribir las siguientes
instrucciones:
Resumen
Evita el envo automtico
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
o http://www.tutorialspoint.com/jdbc/jdbc-transactions.htm
Transacciones
o http://www.java2s.com/Code/Java/Database-SQL-
JDBC/CommitorrollbacktransactioninJDBC.htm
Ejemplos de transacciones