Desarrollo de Aplicaciones en Web
-
Upload
elar-vasquez-paz -
Category
Documents
-
view
758 -
download
19
description
Transcript of Desarrollo de Aplicaciones en Web
UNIVERSIDAD PRIVADA TELESUP
1
UNIVERSIDAD PRIVADA TELESUP
2
Prefacio:
La asignatura es de naturaleza teórico – práctico,
orientada al desarrollo del estudiante, con un avanzado
nivel de habilidades en programación orientada al
desarrollo de aplicaciones para la web, aplicando
apropiadamente varios componentes y tecnología Java.
Definiendo; Una aplicación web es una aplicación a la
que se accede a través de internet u otras redes
similares como intranet, que no requiere instalación para
los usuarios. Es decir, es una aplicación de software
codificada en un lenguaje hecho para los navegadores web en la que es el navegador
el que la ejecuta. Estas aplicaciones contienen elementos que permiten interactuar al
usuario con la información que contienen.
Comprende cuatro Unidades de Aprendizaje:
Unidad I: Fundamentos de la Tecnología Java.
Unidad II: Tecnología JDBC (Java DataBase Connectivity).
Unidad III: Patrón de Diseño MVC (Model – View - Controller).
Unidad IV: Uso de Otros Componentes en el Desarrollo de Aplicaciones.
UNIVERSIDAD PRIVADA TELESUP
3
Estructura de los Contenidos
La competencia que el estudiante debe lograr al final de
la asignatura es:
“Conocer programas y componentes sistemáticos para el
desarrollo de las aplicaciones web, cumpliendo los
procesos adecuados que se recomiendan en el presente
material”.
Uso de Otros Componentes en el Desarrollo de
Aplicaciones
Tecnología JDBC (Java Database
Connectivity)
Patron de Diseño MVC
(Model – View - Controller).
Interfaces JDBC.
Las Interfaces y
Clases del JDBC.
Presentar el
Contenido de una
Tabla.
La Interface
Preparedstament y
Callablestament.
Servlet.
Pasos para Crear
un Servlet
Modelo Vista
Controlador
(MVC).
Consulta de Datos
– MVC.
Uso del
Reporteador
ITEXT.
Jfreechart.
JQUERY.
Gráfico con Base
de Datos.
Fundamentos de la Tecnología
Java
Fundamentos de
POO en JAVA
Herencia y
Polimorfismo
Estructuras de
Datos Dinámicas
(Java Collection
Framework).
Manejo y Uso de
Sesiones
UNIVERSIDAD PRIVADA TELESUP
4
Índice del Contenido
I. PREFACIO 02
II. DESARROLLO DE LOS CONTENIDOS 03 - 210
UNIDAD DE APRENDIZAJE 1: FUNDAMENTOS DE LA TECNOLOGIA JAVA 05-70
1. Introducción a. Presentación y contextualización b. Competencia (logro) c. Capacidades d. Actitudes e. Ideas básicas y contenido
2. Desarrollo de los temas a. Tema 01: Fundamentos de POO en JAVA b. Tema 02: Herencia y Polimorfismo c. Tema 03: Estructuras de Datos Dinámicas (Java Collection Framework). d. Tema 04: Manejo y Uso de Sesiones
3. Lecturas recomendadas 4. Actividades 5. Autoevaluación 6. Resumen
06 06 06 06 06 06
07-66 07 35 43 59 67 67 68 70
UNIDAD DE APRENDIZAJE 2: TECNOLOGÍA JDBC (JAVA DATABASE CONNECTIVITY) 71-125
1. Introducción a. Presentación y contextualización b. Competencia (logro) c. Capacidades d. Actitudes e. Ideas básicas y contenido
2. Desarrollo de los temas a. Tema 01: Interfaces JDBC b. Tema 02: Las Interfaces y Clases del JDBC c. Tema 03: Presentar el Contenido de una Tabla d. Tema 04: La Interface Preparedstament y Callablestament
3. Lecturas recomendadas 4. Actividades 5. Autoevaluación 6. Resumen
72 72 72 72 72 72
73-121 73 79 99
111 122 122 123 125
UNIDAD DE APRENDIZAJE 3: PATRON DE DISEÑO MVC (MODEL – VIEW - CONTROLLER). 126-183
1. Introducción a. Presentación y contextualización b. Competencia (logro) c. Capacidades d. Actitudes e. Ideas básicas y contenido
2. Desarrollo de los temas a. Tema 01: Servlet b. Tema 02: Pasos para Crear un Servlet c. Tema 03: Modelo Vista Controlador (MVC). d. Tema 04: Consulta de Datos – MVC.
3. Lecturas recomendadas 4. Actividades 5. Autoevaluación 6. Resumen
127 127 127 127 127 127
128-179 128 134 149 165 180 180 181 183
UNIDAD DE APRENDIZAJE 4: USO DE OTROS COMPONENTES EN EL DESARROLLO DE APLICACIONES
184-207
1. Introducción a. Presentación y contextualización b. Competencia c. Capacidades d. Actitudes e. Ideas básicas y contenido
2. Desarrollo de los temas a. Tema 01: Uso del Reporteador ITEXT. b. Tema 02: Jfreechart. c. Tema 03: Gráfico con Base de Datos. d. Tema 04: JQUERY.
3. Lecturas recomendadas 4. Actividades 5. Autoevaluación 6. Resumen
185 185 185 185 185 185
186-203 186 190 195 198 204 204 205 207
III. GLOSARIO 208
IV. FUENTES DE INFORMACIÓN 209
V. SOLUCIONARIO 210
UNIVERSIDAD PRIVADA TELESUP
5
UNIVERSIDAD PRIVADA TELESUP
6
Introducción
a) Presentación y contextualización
Java es la base para prácticamente todos los tipos de aplicaciones de red,
además del estándar global para desarrollar y distribuir aplicaciones móviles y
embebidas, juegos, contenido basado en web y software de empresa. Con más de
9 millones de desarrolladores en todo el mundo, Java le permite desarrollar,
implementar y utilizar de forma eficaz interesantes aplicaciones y servicios.
b) Competencia
Implementar páginas web dinámicas, con accesos a bases de datos, utilizando
XML, con cualquier tipo de conexión de red entre cualquier sistema.
c) Capacidades
1. Conoce los principales fundamentos y funciones de POO en Java.
2. Reconoce las utilidades adecuadas de la herencia y polimorfismo.
3. Describe objetivamente las estructuras de datos dinámicos.
4. Analiza el manejo y uso adecuado de las sesiones.
d) Actitudes
Pone en práctica cada uno de los procesos recomendados por Java.
Incentiva el cumplimiento de las estructuras de los datos dinámicos.
e) Presentación de Ideas básicas y contenido esenciales de la Unidad:
La Unidad de Aprendizaje 01: Fundamentos de la Tecnología Java, comprende el
desarrollo de los siguientes temas:
TEMA 01: Fundamentos de POO en JAVA
TEMA 02: Herencia y Polimorfismo
TEMA 03: Estructuras de Datos Dinámicas
(JAVA COLLECTION FRAMEWORK).
TEMA 04: Manejo y Uso de Sesiones
UNIVERSIDAD PRIVADA TELESUP
7
TEMA 1
Conocer los principales fundamentos y funciones de POO en Java.
Competencia:
Fundamentos de POO en
JAVA
UNIVERSIDAD PRIVADA TELESUP
8
Desarrollo de los Temas
Tema 01: Fundamentos de POO en Java
CONCEPTOS BASICOS DE LA PROGRAMACION ORIENTADA A OBJETOS:
Clase
La clase es una plantilla o patrón a partir de la
cual se crean muchos otros objetos similares,
también se podría definir a una clase como la
agrupación de objetos que poseen
características comunes.
Ejemplos:
Si Ud. tuviera que dibujar 30 mapas del Perú ¿Cómo los podría hacer de un
modo muy rápido? Tendría que conseguir un molde o plantilla y a partir de éste
podría crear los 30 mapas de un modo fácil y rápido. En este ejemplo el Molde o
Patrón sería la Clase y cada uno de los mapas reproducidos vendrían ser los
Objetos instanciados.
¿Qué clases puedes distinguir dentro de tu aula? En el aula existe la clase
Alumnos, cada alumno vendría ser un objeto que se origina de esta clase. Otras
clases podrían ser: Carpetas, Útiles, etc.
Como podemos darnos cuenta, los conceptos de la POO están en la vida diaria, y son
estos conceptos los que se aplican al momento de programar aplicaciones
informáticas.
Propiedades de la clase
Las propiedades o atributos son las características
descriptivas de una clase. Cuando definimos una
propiedad especificamos su nombre y su tipo de dato.
UNIVERSIDAD PRIVADA TELESUP
9
Ejemplos:
Propiedades de la clase Alumnos
Apellidos (Tipo de dato String)
Nombres (Tipo de dato String)
Edad (Tipo de dato int)
Talla (Tipo de dato double)
Métodos en las clases
Son las funcionalidades, acciones o habilidades de la clase. Los métodos son
funciones que están asociadas a un objeto. Los métodos responden a la pregunta:
¿Qué es lo que es capaz de hacer la clase?
Los nombres de los métodos generalmente están asociados a una acción o verbos. Al
final del nombre de los métodos siempre se utilizarán paréntesis dentro de los cuales
muchas veces es necesario enviar algunos datos, para que puedan realizarse los
procesos.
Ejemplos:
La clase Alumnos contiene los siguientes métodos:
Estudiar ()
Hablar ()
DecirSuEdad( )
La clase plumones contiene los siguientes métodos:
pintar()
escribir()
La clase calculadora contiene los siguientes métodos:
Sumar(4,5)
Restar(3,2)
Multiplicar(4,3)
Multiplicar(4,2)
UNIVERSIDAD PRIVADA TELESUP
10
Nota:
- Algunos métodos reciben entre los paréntesis: datos, los cuales sirven al método
para realizar su tarea. Estos datos son conocidos como argumentos del método.
- Algunos métodos retornan un dato como resultado de la acción, por ejemplo el
método sumar(4,5) de la clase Calculadora, luego de realizar su acción devolverá
un dato de respuesta el cual es el resultado de la suma: 9.
Objeto instanciado
Los objetos instanciados son objetos creados a partir de
una clase. Los objetos instanciados son copias de una
clase. Esta acción de crear un objeto a partir de una clase
se llama instanciar. Todo objeto instanciado hereda
automáticamente las propiedades y métodos de su clase base.
Estados en objetos
Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando
tenemos una Fracción, la propiedad numerador tomará un valor en concreto, como por
ejemplo 1 y la propiedad denominador puede tomar el valor de 3. El valor concreto
de una propiedad de un objeto se llama estado.
Para acceder a una propiedad o método, debemos especificar el objeto instanciado,
luego colocaremos un punto y posteriormente el nombre de la propiedad o método que
se ha heredado de su clase base. Ejemplo:
obj.apellidos=”Torres”;
obj.nombres=”Edwin”;
Ejemplos prácticos
A continuación, mostraremos algunos ejemplos de clases con sus respectivas
propiedades y métodos.
UNIVERSIDAD PRIVADA TELESUP
11
Clase reloj
Propiedades: Marca, Modelo, Precio, Tipo
Métodos: mostrarlaHora(), mostrarlaFecha(), fijarAlarma(),
iniciarCronometro()
Clase triangulo
Propiedades: Color, TipodeBorde, TipodeTriangulo
Métodos: calcularArea(), calcularSemiPerímetro()
Clase BoletadeNota
Propiedades: NroBoleta, FechadeEmision, Apellidos, Nombres
Métodos: calcularPromedioporAsignatura(), calcularPromedioPonderado().
Con el siguiente gráfico, puedes tener un resumen de lo tratado en la presente unidad:
UNIVERSIDAD PRIVADA TELESUP
12
Programación orientada a objetos en java
Creación de una clase en Java:
Click Derecho sobre el paquete: New / Java Class
public class Calculadora {
public static void main(String args[])
{
}
} //Fin de la clase
Atributos o propiedades de la clase
Se deberán crear a nivel de la clase (debajo de public class) y cada una corresponderá
a un tipo de dato.
Ejemplo: La clase con sus propiedades
public class Calculadora {
// DEFINICION DE PROPIEDADES
public String marca;
public double precio;
public String modelo;
} //Fin de la clase
UNIVERSIDAD PRIVADA TELESUP
13
Métodos de la clase
Se deberán crear dentro de la clase, cada método devuelve un tipo de dato como
resultado final (el cual puede ser int, double, String, boolean, etc), de no ser así el tipo
de dato devuelto es void. Los métodos usan paréntesis para recibir algunos datos
(argumentos) desde el exterior.
Ejemplo:
public double sumar(double a, double b)
{ double r;
r=a+b;
return r;
}
Ejemplo: La clase con sus Propiedades y métodos:
public class Calculadora {
// DEFINICION DE PROPIEDADES
public String marca; public double precio; public String modelo; public double sumar(double a, double b) { double r; r=a+b; return r; //Retorna el resultado } public double restar(double a, double b) { double r; r=a-b; return r; }
Argumentos de Entrada Dato que devuelve
Nombre del método
UNIVERSIDAD PRIVADA TELESUP
14
public double multiplicar(double a, double b) { double r; r=a*b; return r; } public double dividir(double a, double b) {double r; if(b!=0) { r=a/b; } else {System.out.println("Resultado no determinado en N"); } return r; } public double dimetuprecio() { return precio; } } //Fin de la clase
Métodos constructores
Un método constructor es un método especial dentro de la clase, que lleva el nombre
de la misma clase. Pueden existir uno o varios métodos constructores. Su función es
de permitir el instanciamiento de objetos y al mismo tiempo introducir estados (datos) a
todas o a algunas las propiedades del objeto instanciado.
Ejemplo: La misma clase anterior con 3 Métodos Constructores
Nota: Si una clase posee varios métodos constructores, significa que tiene varias
formas de instanciar un objeto.
public class Calculadora {
// DEFINICION DE PROPIEDADES
public String marca;
public double precio;
public String modelo;
public double sumar(double a, double b) { double r; r=a+b; return r; //Retorna el resultado }
UNIVERSIDAD PRIVADA TELESUP
15
public double restar(double a, double b) { double r; r=a-b; return r; } public double multiplicar(double a, double b) { double r; r=a*b; return r; } public double dividir(double a, double b) { double r; if(b!=0) { r=a/b; } else { System.out.println("Resultado no determinado en N"); } return r; } public double dimetuprecio() { return precio; } // EL METODO CONSTRUCTOR 1 // Permite el instanciamiento con el ingreso de los estados solo a 2 de // las propiedades del objeto instanciado public Calculadora(String ma, double p) { marca=ma; precio=p; } // EL METODO CONSTRUCTOR 2 - Permite el instanciamiento con el ingreso de los // estados solo a 3 de las propiedades del objeto // instanciado public Calculadora(String ma, double p, String mo) { marca=ma; precio=p; modelo=mo;
}
// EL METODO CONSTRUCTOR 3 - Permite solo el instanciamiento
public Calculadora() {
}
} //Fin de la clase
UNIVERSIDAD PRIVADA TELESUP
16
El método estático main
Este método es el “Método principal” de la clase, es aquel que es invocado cuando
ejecutamos la clase, si una clase no cuenta con el método main, es imposible ejecutar
la clase.
Instanciamiento de la clase
Tal como vimos durante la semana anterior, instanciar significar crear un objeto a partir
de una clase base, recordemos también que al instanciar un objeto, este hereda
automáticamente propiedades y métodos de su clase.
public class Calculadora {
// DEFINICION DE PROPIEDADES public String marca; public double precio; public String modelo; public double sumar(double a, double b) { double r; r=a+b; return r; //Retorna el resultado } public double restar(double a, double b) { double r; r=a-b; return r; } public double multiplicar(double a, double b) { double r; r=a*b; return r; } public double dividir(double a, double b) {double r=0; if(b!=0) { r=a/b; } else {System.out.println("Resultado no determinado en N"); } return r; }
UNIVERSIDAD PRIVADA TELESUP
17
public double dimetuprecio()
{ return precio; }
// EL METODO CONSTRUCTOR 1
// Permite el ingreso de los estados solo a 2 de
// las propiedades del objeto instanciado
public Calculadora(String ma,double p) {
marca=ma;
precio=p;
}
// EL METODO CONSTRUCTOR 2 - Permite el ingreso de los
// estados solo a 3 de las propiedades del objeto
// instanciado
public Calculadora(String ma,double p, String mo) {
marca=ma;
precio=p;
modelo=mo;
}
// EL METODO CONSTRUCTOR 3 - Permite solo el
// instanciamiento
public Calculadora() {
}
public static void main(String args[])
{
//Creación de diferentes objetos instanciados
//Se utilizará para cada instanciamiento a un método constructor diferente
//Puede utilizarse cualquier método constructor para la instancia
Calculadora c1=new Calculadora("CASIO",25.45); //Usa el constructor 1
Calculadora c2=new Calculadora("CITIZEN",32.99,"RS23"); //Usa el constructor 2
Calculadora c3=new Calculadora();
//Usa el constructor 3
//Usando la propiedades y métodos del 1er. obj. instanciado
System.out.println("La marca de la calculadora 1 es : "+ c1.marca);
System.out.println("La calculadora 1 suma 12+34 : "+ c1.sumar(12,34));
System.out.println("La calculadora 1 resta 12-34 : "+ c1.restar(12,34));
System.out.println("La calculadora 1 multiplica 12*34 : "+ c1.multiplicar(12,34));
System.out.println("La calculadora 1 divide 12/34 : "+ c1.dividir(12,34));
UNIVERSIDAD PRIVADA TELESUP
18
//Usando la propiedades y métodos del 2do. obj. instanciado
System.out.println("Accedemos al precio de la calculadora 2 : "+ c2.precio);
System.out.println("La calculadora 2 suma 2+-5 : "+ c2.sumar(2,-5));
System.out.println("La calculadora 2 nos dice su precio : "+ c2.dimetuprecio());
//Usando la propiedades y métodos del 3er. obj. instanciado
c3.marca="Panasonic";
c3.precio=29.99;
c3.modelo="RX123";
System.out.println("Accedemos al precio de la calculadora 3 : "+ c3.precio);
System.out.println("La calculadora 3 suma 10+32 : "+ c3.sumar(10,32));
System.out.println("La calculadora 3 nos dice su precio : "+ c3.dimetuprecio());
}
} //Fin de la clase
Invocación de una clase desde otros paquetes
¿Qué es una Paquete? Es una carpeta de java, dentro del cual podemos almacenar
muchas clases, los paquetes en Java sirven para organizar nuestras clases, cada IDE
tiene una forma distinta de crear paquetes.
Cuando una clase es creada dentro de un paquete, debe llevar en la primera línea: el
nombre del paquete.
package Ejemplo1; //Nombre del paquete
public class Calculadora {
.
.
.
}
Paquete 2
Paquete 1
Proyecto Aquí tenemos dos paquetes,
dentro de cada paquete
tenemos una clase.
Aquí va el contenido de la
clase Calculadora
UNIVERSIDAD PRIVADA TELESUP
19
Clase Anexo, creada en otro paquete
package Ejemplo2; //Nombre del paquete donde
se encuentra la clase
import Ejemplo1.Calculadora; //Debe importarse la clase
que está en otro paquete para que sea reconocida
public class Anexo {
public static void main(String args[])
{
//Creación de los objetos instanciados
Calculadora c5=new Calculadora("SANSUNG",25.45); //Usa el constructor 1
System.out.println("Multiplicando en la Calculadora 5: "+ c5.multiplicar(4,9));
}
}
Creación de variables y métodos estáticos
Variables Estáticas: Son aquellas variables que se declaran a nivel de la clase, se
diferencian de las propiedades, porque para acceder a ellas no se requiere de una
instancia, se puede acceder a estas variables directamente a través del nombre de la
clase. Las variables estáticas conservan un mismo valor para toda la clase y no
cuentan con estados (datos) diferentes en cada objeto instanciado.
Ejemplo del uso de variables estáticas en la Clase
Calculadora: En este ejemplo se están creando dos
variables estáticas: total: Variable utilizada para
acumular el precio de cada uno de los objetos
instanciados
cuenta : Variable utilizada para contar la cantidad de
objetos instanciados
Se usan las variables estáticas en cada una de los métodos constructores, para que
de esta forma se acumule o cuente, cada vez que se produce una instancia.
package Ejemplo1; //Nombre del paquete
public class Calculadora {
UNIVERSIDAD PRIVADA TELESUP
20
// DEFINICION DE PROPIEDADES
public String marca;
public double precio;
public String modelo;
//DECLARACION DE VARIABLES ESTATICAS : Ámbito en toda la clase
// comparten el mismo valor para todos los obj. Instanciados
//son como si fueran variables globales
public static double total;
public static double cuenta;
public double sumar(double a, double b)
{ double r;
r=a+b;
return r; //Retorna el resultado
}
public double restar(double a, double b)
{ double r;
r=a-b;
return r;
}
public double multiplicar(double a, double b)
{ double r;
r=a*b;
return r;
}
public double dividir(double a, double b)
{double r=0;
if(b!=0)
{ r=a/b; }
else
{System.out.println("Resultado no determinado en N");
}
return r;
}
public double dimetuprecio()
{ return precio; }
UNIVERSIDAD PRIVADA TELESUP
21
// EL METODO CONSTRUCTOR 1
// Permite el ingreso de los estados solo a 2 de
// las propiedades del objeto instanciado
//Este método ocurrirá al método de la instancia
public Calculadora(String ma,double p) {
marca=ma;
precio=p;
total+=precio; // Es un acumulador, (es variable estática, su valor se mantiene en toda la clase)
cuenta++; // Es un contador, (es variable estática, su valor se mantiene en toda la clase)
}
// EL METODO CONSTRUCTOR 2 - Permite el ingreso de
los
// estados solo a 3 de las propiedades del objeto
// instanciado
//Este método ocurrirá al método de la instancia
public Calculadora(String ma,double p, String mo) {
marca=ma;
precio=p;
modelo=mo;
total+=precio; // Es un acumulador, (es variable estática, su valor se mantiene en toda la clase)
cuenta++; // Es un contador, (es variable estática, su valor se mantiene en toda la clase)
}
// EL METODO CONSTRUCTOR 3 - Permite solo el
// instanciamiento
//Este método ocurrirá al método de la instancia
public Calculadora() {
total+=precio; // Es un acumulador, (es variable estática, su valor se mantiene en toda la clase)
cuenta++; // Es un contador, (es variable estática, su valor se mantiene en toda la clase)
}
public static void main(String args[])
{
UNIVERSIDAD PRIVADA TELESUP
22
//Creación de los objetos instanciados
//En cada instancia está invocándose a los métodos constructores
Calculadora c1=new Calculadora("CASIO",25.45); //Usa el constructor 1
Calculadora c2=new Calculadora("CITIZEN",32.99,"RS23"); //Usa el constructor 2
Calculadora c3=new Calculadora(); //Usa el constructor 3
//Mostramos el valor guardado en cada una de las variables estáticas
System.out.println("Totall de los 3 precios de las calculadoras : "+ Calculadora.total);
System.out.println("Cantidad de calculadoras : "+ Calculadora.cuenta);
}
} //Fin de la clase
Métodos Estáticos: Son aquellos métodos que pertenecen directamente a la clase y
que para acceder a ellos no se requiere de una instancia, se puede acceder a estos
métodos directamente a través del nombre de la clase.
Ejemplo del uso de métodos estáticos en la Clase Calculadora:
En este ejemplo se están creando dos métodos estáticos:
totalizar() : Método utilizado para devolver la cantidad acumulada de todos los precios
promediar() : Método utilizado para promediar todos los precios de los objetos
instanciados
package Ejemplo1; //Nombre del paquete
public class Calculadora {
// DEFINICION DE PROPIEDADES
public String marca;
public double precio;
public String modelo;
//DECLARACION DE VARIABLES ESTATICAS : Ámbito en toda la clase
// comparten el mismo valor para todos los obj. instanciados
public static double total;
public static double cuenta;
UNIVERSIDAD PRIVADA TELESUP
23
//CREACIÓN DEL METODO ESTATICO
public static double totalizar() {
return total;
}
//CREACIÓN DEL METODO ESTATICO
public static double promediar() {
double p;
p=total/cuenta;
return p;
}
public double sumar(double a, double b)
{ double r;
r=a+b;
return r; //Retorna el resultado
}
public double restar(double a, double b)
{ double r;
r=a-b;
return r;
}
public double multiplicar(double a, double b)
{ double r;
r=a*b;
return r;
}
UNIVERSIDAD PRIVADA TELESUP
24
public double dividir(double a, double b)
{double r=0;
if(b!=0)
{ r=a/b; }
else
{System.out.println("Resultado no determinado en N");
}
return r;
}
public double dimetuprecio()
{ return precio; }
// EL METODO CONSTRUCTOR 1
// Permite el ingreso de los estados solo a 2 de
// las propiedades del objeto instanciado
public Calculadora(String ma,double p) {
marca=ma;
precio=p;
total+=precio; // Es un acumulador, es igual que decir total=precio+total
cuenta++; // Es un contador, es igual que decir cuenta=cuenta+1
}
// EL METODO CONSTRUCTOR 2 - Permite el ingreso de los
// estados solo a 3 de las propiedades del objeto
// instanciado
public Calculadora(String ma,double p, String mo) {
marca=ma;
precio=p;
modelo=mo;
total+=precio; // Es un acumulador, es igual que decir total=precio+total
cuenta++; // Es un contador, es igual que decir cuenta=cuenta+1
}
UNIVERSIDAD PRIVADA TELESUP
25
// EL METODO CONSTRUCTOR 3 - Permite solo el
// instanciamiento
public Calculadora() {
total+=precio; // Es un acumulador, es igual que decir total=precio+total
cuenta++; // Es un contador, es igual que decir cuenta=cuenta+1
}
public static void main(String args[])
{
//Creación de los objetos instanciados
Calculadora c1=new Calculadora("CASIO",25.45); //Usa el constructor 1
Calculadora c2=new Calculadora("CITIZEN",32.99,"RS23"); //Usa el constructor 2
Calculadora c3=new Calculadora(); //Usa el constructor 3
//INVOCACION DE LOS METODOS ESTATICOS
System.out.println("El total del costo de las tres calculadoras es : " + Calculadora.totalizar());
System.out.println("El promedio del costo de las tres calculadoras es : " + Calculadora.promediar());
}
} //Fin de la clase
Uso de constantes:
Las constantes son también variables estáticas que al ser declaradas reciben un valor,
y luego de esto, no permiten que dicho valor sea modificado en tiempo de ejecución.
Ejemplo:
public static final double IGV=0.19;
public static final String RAZONSOCIAL=”TecniSystem SRL”;
UNIVERSIDAD PRIVADA TELESUP
26
Aplicando la POO en JAVA
A continuación explicaremos a través de ejemplos 5 maneras diferentes de
plantear un mismo caso en la programación orientada a objetos.
a. Primera Forma: Usando métodos con argumentos de
entrada
b. Segunda Forma: Usando métodos sin
argumentos de entrada
c. Tercera Forma: Usando métodos sin retorno
d. Cuarta Forma: Usando un solo método en la clase.
e. Quinta Forma: Usando métodos estáticos
f. Sexta Forma: Usando métodos y variables estáticas
Desarrollo de una caso práctico
Enunciado: Calcular el promedio de un alumno y determinar su situación académica.
1RA FORMA: Usando métodos con argumentos de entrada.
Lógica de Negocios – Paquete model
package model;
public class Alumno {
//Propiedades de la clase
public String nombres;
public String apellidos;
public String direccion;
//Metodos de la clase : Usamos argumentos de entrada para el proceso
public double calcularPromedio(double pc1,
double ep, double pc2, double ptp, double ef){
return (pc1+2*ep+2*pc2+2*ptp+3*ef)/10;
}
public String determinarSituacionAcad(double p){
String sa="";
if (p>=10.5) {
sa="Aprobado";
} else {
sa="Desaprobado";
}
return sa;
}
//Método constructor
public Alumno(){
}
}
UNIVERSIDAD PRIVADA TELESUP
27
Lógica de Presentación – Carpeta View
<%@page import="model.Alumno"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo 1</title>
</head>
<body>
<h1>Demo 1</h1>
<hr>
<%
//Instancia del Objeto
Alumno obj1=new Alumno();
//Entrada de datos
double pc1=5;
double ep=12;
double pc2=14;
double ptp=8;
double ef=7;
//Invocación a los métodos y pasamos los argumentos necesarios
double p=obj1.calcularPromedio(pc1, ep, pc2, ptp, ef);
String sa=obj1.determinarSituacionAcad(p);
//Mostrar resultados
out.println("Promedio final "+p+"<br>");
out.println("Situacion academica "+sa);
%>
</body>
</html>
2da forma: Usando métodos sin argumentos de entrada
Lógica de Negocios – Paquete model
package model;
public class Alumno {
//Propiedades de la clase
public String nombres;
public String apellidos;
public String direccion;
//Propiedades de entrada de datos
public double pc1,ep,pc2,ptp,ef;
public double p;
//Métodos de la clase, ya no usamos argumentos de entrada, en su lugar
UNIVERSIDAD PRIVADA TELESUP
28
//hemos creado propiedades de entrada public double calcularPromedio(){ return (pc1+2*ep+2*pc2+2*ptp+3*ef)/10; } public String determinarSituacionAcad(){ String sa=""; if (p>=10.5) { sa="Aprobado"; } else { sa="Desaprobado"; } return sa; } //Metodo constructor public Alumno(){ } }
Lógica de Presentación – Carpeta View
<%@page import="model.Alumno"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Demo 2</title> </head> <body> <h1>Demo2</h1> <hr> <% //Instancia del Objeto (Nacimiento del objeto) Alumno obj1=new Alumno(); //Entrada de datos (Directo a las propiedades) – Cargamos el objeto obj1.pc1=5; obj1.ep=12; obj1.pc2=14; obj1.ptp=8; obj1.ef=7; //Invocación a los métodos obj1.p=obj1.calcularPromedio(); //La rpta es guardada en una propiedad String sa=obj1.determinarSituacionAcad(); //Mostrar resultados out.println("Promedio final "+obj1.p+"<br>"); //Mostramos la propiedad out.println("Situacion academica "+sa); %> </body> </html>
UNIVERSIDAD PRIVADA TELESUP
29
3ra forma: Usando métodos sin valor de retorno
Lógica de Negocios – Paquete model
package model; public class Alumno { //Propiedades de la clase public String nombres; public String apellidos; public String direccion; //Propiedades de entrada de datos public double pc1,ep,pc2,ptp,ef; //propiedad de entrada y salida public double p; //Propiedades de salida public String sa;
//Métodos – sin retorno de respta – La respta la guardamos en una propiedad
public void calcularPromedio(){ this.p=(pc1+2*ep+2*pc2+2*ptp+3*ef)/10; } public void determinarSituacionAcad(){ if (this.p>=10.5) { this.sa="Aprobado"; } else { this.sa="Desaprobado"; } } //Metodo constructor public Alumno(){ } }
Lógica de Presentación – Carpeta View
<%@page import="model.Alumno"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo 3</title>
</head>
<body>
<h1>Demo3</h1>
<hr>
<%
//Instancia del Objeto
Alumno obj1=new Alumno();
UNIVERSIDAD PRIVADA TELESUP
30
//Entrada de datos (Directo a las propiedades)
obj1.pc1=5;
obj1.ep=12;
obj1.pc2=14;
obj1.ptp=8;
obj1.ef=7;
//Invocación a los métodos
obj1.calcularPromedio();//La rpta se guarda internamente en una propiedad
obj1.determinarSituacionAcad();
//Mostrar resultados
out.println("Promedio final "+obj1.p+"<br>"); //Mostramos la propiedad
out.println("Situacion academica "+obj1.sa);
%>
</body>
</html>
4ta forma: Usando un solo método en la clase. Fusionamos todos los métodos. Las
diversas respuestas se guardan en propiedades.
Lógica de Negocios – Paquete model
package model; public class Alumno {
//Propiedades de la clase public String nombres; public String apellidos; public String direccion;
//Propiedades de entrada de datos
public double pc1,ep,pc2,ptp,ef; //propiedad de entrada y salida
public double p; //Propiedades de salida
public String sa;
//Metodos de la clase public void procesar(){
this.p=(pc1+2*ep+2*pc2+2*ptp+3*ef)/10;
if (this.p>=10.5) { this.sa="Aprobado";
} else { this.sa="Desaprobado";
} }
//Metodo constructor public Alumno(){
} }
UNIVERSIDAD PRIVADA TELESUP
31
Lógica de Presentación – Carpeta View
<%@page import="model.Alumno"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo 3</title>
</head>
<body>
<h1>Demo3</h1>
<hr>
<%
//Instancia del Objeto
Alumno obj1=new Alumno();
//Entrada de datos (Directo a las propiedades)
obj1.pc1=5;
obj1.ep=12;
obj1.pc2=14;
obj1.ptp=8;
obj1.ef=7;
//Invocación a los métodos
obj1.calcularPromedio();//La rpta se guarda internamente en una propiedad
obj1.determinarSituacionAcad();
//Mostrar resultados
out.println("Promedio final "+obj1.p+"<br>"); //Mostramos la propiedad
out.println("Situacion academica "+obj1.sa);
%>
</body>
</html>
5ta forma: usando métodos estáticos.
Método Estático: Es un método que se declara a nivel de la clase, no requiere de una
instancia para ser invocado, los métodos estáticos pueden ser invocados a partir del
nombre de la clase.
.
Lógica de Negocios – Paquete model
package model;
public class Alumno {
//Propiedades de la clase
public String nombres;
public String apellidos;
public String direccion;
UNIVERSIDAD PRIVADA TELESUP
32
//Metodos de la clase
public static double calcularPromedio(double pc1,
double ep,double pc2,
double ptp,double ef){
return (pc1+2*ep+2*pc2+2*ptp+3*ef)/10;
}
public static String determinarSituacionAcad(double p){
String sa="";
if (p>=10.5) {
sa="Aprobado";
} else {
sa="Desaprobado";
}
return sa;
}
//Metodo constructor
public Alumno(){
}
}
Lógica de Presentación – Carpeta View
<%@page import="model.Alumno"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo 5</title>
</head>
<body>
<h1>Demo5</h1>
<hr>
<%
//Entrada de datos a variables
double pc1=5;
double ep=12;
UNIVERSIDAD PRIVADA TELESUP
33
double pc2=14;
double ptp=8;
double ef=7;
//Invocación a los métodos – Desde el nombre de la clase
//No se requiere instancia
double p=Alumno.calcularPromedio(pc1,ep,pc2,ptp,ef);
String sa=Alumno.determinarSituacionAcad(p);
//Mostrar resultados
out.println("Promedio final "+p+"<br>");
out.println("Situacion academica "+sa);
%>
</body>
</html>
6ta forma: usando métodos y variables estáticos.
Variable Estática: Este tipo de variables son variables declaradas a nivel de una
clase, el valor de esta se mantiene a nivel de la clase, a diferencia de una propiedad
cuyo valor está asociado a un objeto instanciado, en cada objeto instanciado, la misma
propiedad tiene valores diferentes.
Lógica de Negocios – Paquete model
package model;
public class Alumno {
//Propiedades de la clase
public String nombres;
public String apellidos;
public String direccion;
//variables estaticas de entrada
public static double pc1,ep,pc2,ptp,ef;
public static double p;
//Metodos de la clase
public static double calcularPromedio(){
return (pc1+2*ep+2*pc2+2*ptp+3*ef)/10;
}
public static String determinarSituacionAcad(){
UNIVERSIDAD PRIVADA TELESUP
34
String sa="";
if (p>=10.5) {
sa="Aprobado";
} else {
sa="Desaprobado";
}
return sa;
}
//Metodo constructor
public Alumno(){
}
}
Lógica de Presentación – Carpeta View
<%@page import="model.Alumno"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo 6</title>
</head>
<body>
<h1>Demo6</h1>
<hr>
<%
//No se requiere instanciada
//Entrada de datos a variables estaticas
Alumno.pc1=5;
Alumno.ep=12;
Alumno.pc2=14;
Alumno.ptp=8;
Alumno.ef=7;
//Invocaciòn a los mètodos
Alumno.p=Alumno.calcularPromedio();
String sa=Alumno.determinarSituacionAcad();
//Mostrar resultados
out.println("Promedio final "+Alumno.p+"<br>");
out.println("Situacion academica "+sa);
%>
</body>
</html>
UNIVERSIDAD PRIVADA TELESUP
35
TEMA 2
Reconocer las utilidades adecuadas de la herencia y polimorfismo.
Competencia:
Herencia y
Polimorfismo
UNIVERSIDAD PRIVADA TELESUP
36
Tema 02: Herencia y Polimorfismo
HERENCIA DE CLASES
La herencia permite que se pueda definir nuevas clases basadas en clases existentes,
lo cual facilita re-utilizar código previamente
desarrollado. Si una clase deriva de otra (extends),
ésta hereda todas sus propiedades y métodos. La
clase derivada puede añadir nuevas variables y
métodos y/o redefinir las variables y métodos
heredados.
Java permite múltiples niveles de herencia, No obstante, no permite que una clase
derive de varias (no es posible la herencia múltiple). Se pueden crear tantas clases
derivadas de una misma clase como se quiera. Resumen: Creamos una nueva clase a
partir de la Clase Padre. La Clase Hijo hereda métodos y Atributos de la Clase Padre.
Adicionalmente Podemos añadir otros métodos o atributos a la clase hijo.
PPaaddrree
La Clase Hijo Extiende de la
Clase Padre
HHiijjoo
UNIVERSIDAD PRIVADA TELESUP
37
Para indicar que una clase deriva de otra se utiliza
la palabra extends, como por ejemplo:
public class Alumno extends Persona
{ ... }
En el ejemplo anterior, se está creando la clase Alumno la
cual extiende (hereda) de la clase Persona. Por tanto la
clase Alumno habrá heredado las propiedades y métodos de
la clase Persona.
Todas las clases de Java creadas por el programador tienen una super-clase.
Cuando no se indica explícitamente una super-clase con la palabra extends, la clase
deriva de java.lang.Object, que es la clase raíz de toda la jerarquía de clases de
Java. Como consecuencia, todas las clases tienen algunos métodos que han
heredado de Object.
Ventajas y precaucaciones de su uso La principal ventaja del uso de herencia de clases es la reutilización de los métodos de
clases base, lo cual impide que se repita el mismo código muchas veces dentro del
desarrollo de una aplicación, y por otro lado favorece el mantenimiento de los
programas, porque cualquier cambio que se realice en una clase base inmediatamente
replica para todas las subclases que extienden de esta, lo cual ahorra el tiempo a la
labor de la programación.
Al diseñar nuestras clases es fundamental
que primero se diseñe adecuadamente un
modelo inicial, utilizando metodologías
basadas en el análisis y diseño de sistemas
orientado a objetos, de no ser así nuestro
diseño de clases con sus respectivas
herencias podría ser inconsistente e
inarticulado.
UNIVERSIDAD PRIVADA TELESUP
38
Ejercicio Práctico:
Crear un conjunto de clases que represente los procesos en el sistema de personal,
luego instancie la clase Alumno presencial e invoque los métodos y muestre las
respuestas conseguidas
El siguiente diagrama ilustra el modelo de clases que desarrollaremos en la lógica de
negocios.
Lógica de negocios
Ámbitos de Alcance
Es el mecanismo que permite definir el tipo de nivel de acceso a la información de los
objetos, (clases, métodos y propiedades).
En Java los niveles de encapsulamiento están dados de la siguiente forma:
public, private, protected y package. De esta forma se puede controlar el acceso
hacia las clases, métodos y propiedades y evitar un uso inadecuado.
UNIVERSIDAD PRIVADA TELESUP
39
Veamos cómo funcionan estos diversos
niveles de acceso en el siguiente caso
práctico:
1. Creamos dos paquetes: Paquete m y paquete n
2. Dentro del paquete m, tenemos dos clases; La
clase A y la Clase B y
3. En el paquete n, tenemos también dos clases: La
clase C (es una clase que extiende de la clase B), y la clase D.
Ahora, ubiquémonos en la clase B, y veamos en el siguiente cuadro, los
diferentes tipos de acceso de esta clase hacia las demás clases del
mismo paquete y de los demás.
Concepto y niveles de acceso en java:
UNIVERSIDAD PRIVADA TELESUP
40
Explicación:
Si el nivel de encapsulamiento para la clase B es
public, esta clase será accesible a todas las
clases de su propio paquete y de los demás.
Si el nivel de encapsulamiento para la clase B es
private, esta clase no será accesible para ninguna
otra clase, ni del mismo paquete, ni de otros. Si el
nivel de encapsulamiento para la clase B es
protected, esta clase será accesible a todas las clases de su propio paquete y
solo a las clases heredadas de otros paquetes.
Si el nivel de encapsulamiento para la clase B es package o default, esta clase
será accesible a todas las clases de su propio paquete únicamente.
POLIMORFISMO:
Las interfaces
En Java una interfaz es un prototipo de clase que define la funcionalidad de un objeto
pero no lo implementa.
Características de una interfaz:
Los métodos de una interfaz deben ser
abstractos.
No representa a un objeto sino a un Grupo de
Objetos. Por lo tanto no usan constructores, ni
métodos estáticos, ni atributos de Objeto.
(Excepto variables constantes de tipo FINAL)
En este nivel no podemos garantizar como lo
hace, pero si sabemos qué hace.
Interfaz en Java
Se debe reemplazar la palabra class por interface.
UNIVERSIDAD PRIVADA TELESUP
41
Ejemplo: A continuación estamos creando una interfaz de nombre Reproducible.
public interface Reproducible
{
// Aquí deben indicarse los métodos abstractos
// con los que se trabajarán
}
Métodos abstractos
Son utilizados dentro de una interfaz, solo muestran la funcionalidad del objeto, pero
no incluyen la lógica del procedimiento (no hacen nada por ellos mismos).
Ejemplo:
public void play();
Herencia en interfaces
• Para darle un uso práctico a la interfaz: Debemos crear una clase que herede de
dicha interfaz, en la cual se detallará la funcionalidad de los métodos declarados en
la interfaz.
• ¿Cómo realizar dicha herencia?
public class MP3 implements Reproducible
{
// Aquí debe implementarse el método play, al cual
// se hizo mención de manera abstracta en la
interfaz
}
Este es un método abstracto, no usa llaves
(No tiene implementación)
No tienen definido el Cómo, pero si el Qué
UNIVERSIDAD PRIVADA TELESUP
42
Ventaja del uso de las interfaces
• Se utiliza las interfaces cuando en el desarrollo de una aplicación, aún no
sabemos la lógica de los métodos, pero si conocemos cuales serán las
funcionalidades importantes.
• Nos permite ocultar el código fuente de los métodos de nuestras clases, puesto
que solo al cliente tendríamos que suministrarle la interfaz y su ejecutable,
mientras que la lógica de nuestros métodos lo almacenaríamos en un servidor de
acceso restringido.
• Una clase puede implementar más de
una interface, representando una forma
alternativa de la herencia múltiple. A su
vez, una interface puede derivar de otra
o incluso de varias interfaces, en cuyo
caso incorpora todos los métodos de las
interfaces de las que deriva.
UNIVERSIDAD PRIVADA TELESUP
43
TEMA 3
Describir objetivamente las estructuras de datos dinámicos.
Competencia:
Estructuras de Datos
Dinámicas
UNIVERSIDAD PRIVADA TELESUP
44
Tema 03: Estructuras de Datos Dinámicas (Java Collection Framework).
DEFINICIÓN Y CARACTERÍSTICAS
Resumiendo, son aquellas cuyo tamaño
(longitud, número de elementos...) varía en
tiempo de ejecución. Las más famosas son:
Listas simplemente enlazadas (con y sin
cabecera), Listas doblemente enlazadas (con
y sin cabecera), Pilas, Colas, Árboles y
Grafos.
Su tamaño y forma es variable (o puede serlo) a lo largo de un programa, por lo que se
crean y destruyen en tiempo de ejecución. Esto permite dimensionar la estructura de
datos de una forma precisa: se va asignando memoria en tiempo de ejecución según
se va necesitando.
En java tenemos muchas clases que manejan diferentes estructuras dinámicas,
entre las que podemos mencionar:
Vector
Enumeration
HashTable
Stack
Set
List
ArrayList
Dictonary
Collection
SortedSet
LinkedList
UNIVERSIDAD PRIVADA TELESUP
45
HashTables
Es una estructura de datos dinámica que almacena un
grupo de objetos, cada elemento almacenado en el
HashTable debe contar un key (Código único que
identifique de manera singular a dicho elemento dentro
de la estructura). Esta estructura es de tipo LIFO (Last
Input – First Output), es decir el último en entrar es el
primero en salir, al momento de almacenarse dentro de
la estructura.
Crear un HashTable:
HashTable lista1=new HashTable(); //Crea una HashTable con longitud 0
HashTable lista2=new HashTable(10); //Crea un HashTable con longitud inicial 10
HashTable lista3=new HashTable(100);//Crea un Hashtable con longitud inicial 100
Métodos de la clase HashTable:
UNIVERSIDAD PRIVADA TELESUP
46
Nota: Para trabajar con la estructura Hashtable es necesario importar lo siguiente:
Caso Practico 1
Realizar un programa demostrativo en consola en muestre como crear y
visualizar un Hashtable.
package dinamicas2;
import java.util.*;
public class Demo {
public static void main(String[] args) {
//Crear un hashTable
Hashtable lista=new Hashtable();
//Almacenar datos dentro del Hashtable, se debe colocar un key (llave)
lista.put(1,20.0);
lista.put(2,12.5);
lista.put(3,10.0);
lista.put(4,14.3);
//recorrer los elementos
Enumeration e=lista.elements();
Double dato=null;
while(e.hasMoreElements()){
dato=(Double) e.nextElement();
System.out.println(dato.doubleValue());
}
//Crear un hashTable con datos de tipo Character
Hashtable lista2=new Hashtable();
lista2.put(1,'c');
lista2.put(2,'a');
lista2.put(3,'s');
lista2.put(4,'a');
//recorrer los elementos
Enumeration e2=lista2.elements();
Character dato2=null;
while(e2.hasMoreElements()){
dato2=(Character) e2.nextElement();
System.out.println(dato2.charValue());
}
UNIVERSIDAD PRIVADA TELESUP
47
//Crear un hashTable con distintos tipos de datos
Integer sueldo=new Integer(600);
String apellidos="Alva";
Double descuento=new Double(58.25);
Hashtable lista3=new Hashtable();
lista3.put("1",apellidos); lista3.put("2",sueldo);
lista3.put("3",descuento);
Enumeration e3=lista3.element s();
Object obj=null;
while(e3.hasMoreElements()){
obj=e3.nextElement();
System.out.println(obj.toString());
}
}
}
Caso Práctico 2: Realizar una aplicación visual que nos permita realizar
operaciones de edición con los elementos de un Hashtable.
UNIVERSIDAD PRIVADA TELESUP
48
Declaración global a nivel de la clase
public class frmIngreso extends javax.swing.JFrame {
Hashtable lista=new Hashtable();
int c=0;
Codificación de la caja de texto txtape (evento actionperformanced)
private void txtapeActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
c++;
String ape=txtape.getText();
txtape.setText(ape);
lista.put(String.valueOf(c),ape);
txtape.setText("");
txtape.requestFocus();
}
Codificación del botón Mostrar
private void btnmostrarActionPerformed(java.awt.event.ActionEvent evt) {
Enumeration e = lista.elements();
Enumeration e2=lista.keys();
String cad = "";
String l="";
while( e2.hasMoreElements() && e.hasMoreElements() ){
c++;
cad+=(String)e.nextElement()+ "\t "+(String)e2.nextElement()+"\n";
txtlista1.setText(cad);
}
}
Codificación del botón Eliminar
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String cod;
cod=JOptionPane.showInputDialog("Ingrese codigo","0");
lista.remove(cod);
volveragenerar();
btnmostrarActionPerformed(evt);
}
UNIVERSIDAD PRIVADA TELESUP
49
Codificación del botón Modificar
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
String cod;
cod=JOptionPane.showInputDialog("Ingrese codigo","0");
String dato=JOptionPane.showInputDialog("Ingrese nuevo dato");
lista.put(cod,dato);
btnmostrarActionPerformed(evt);
}
Codificación del botón Buscar
private void btnBuscarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String cod;
cod=JOptionPane.showInputDialog("Ingrese codigo ");
if(lista.containsKey(cod)){
JOptionPane.showMessageDialog(null, "El dato fue encontrado");
}
else{
JOptionPane.showMessageDialog(null, "El dato no fue encontrado");
}
}
La Clase Vector
• La clase Vector permite crear un arreglo dinámico que almacena objetos.
• En un objeto de tipo vector se almacenan objetos únicamente (es decir, variables de tipos
de datos no primitivos o de clases bases).
• Para almacenar valores de tipo de datos primitivos, se debe utilizar un arreglo estático o
hacer casting de los valores a su correspondiente representación de objetos.
• Esta clase tiene muchos métodos implementados que facilitan el trabajo con arreglos:
búsquedas, eliminación, inserción, expansión entre otras.
• Un objeto de tipo vector, se puede redimensionar en tiempo de ejecución, si las celdas que
definen se han ocupado.
• Para ello, existe un atributo o propiedad que le indica al compilar, en cuántas posiciones se
puede redimensionar el vector, cuando ya haya ocupado su capacidad máxima.
UNIVERSIDAD PRIVADA TELESUP
50
Creación de un Vector:
Vector v=new Vector (20,5);
Crea un vector con un tamaño inicial de 20 elementos y
con la posibilidad de incrementar su tamaño de 5 en 5.
Vector v=new Vector (20);
Crea un vector con un tamaño inicial de 20 elementos y
con la posibilidad de incrementar su tamaño de 20 en 20.
Vector v=new Vector ();
Crea un vector con un tamaño inicial de 10 elementos y con la posibilidad de incrementar su
tamaño de 10 en 10.
Métodos de la clase Vector
Vector( )
Constructor: crea un vector inicialmente vacío
void addElement(Object obj)
Inserta el objeto especificado al final del vector
void setElementAt(Object obj, int índice)
Inserta el objeto especificado en el vector en la posición específicada
Object remove(int índice)
Elimina el objeto que se encuentra en la posición especificada
boolean removeElement(Object obj)
Elimina la primera ocurrencia del objeto especificado en el vector
void removeElementAt(int índice)
Elimina el objeto especificado en el índice del vector
void clear( )
Elimina todos los objetos del vector
boolean contains(Object obj)
Regresa verdadero si el objeto dado pertenece al vector
int indexOf(Object obj)
Retorna el índice del objeto especificado. Regresa -1 si no fue encontrado el objeto
Object elementAt(int indíce)
Regresa el objeto del índice específicado
boolean isEmpty( )
Regresa verdadero si el vector no contiene elementos
int size( )
Regresa el número de elementos en el vector
UNIVERSIDAD PRIVADA TELESUP
51
Recorrer los elementos de un Vector
Utilizando el indice de elemento:
for(int i=0; i<v.size(); i++) { System.out.print(v.elementAt(i)+"\t"); } Utilizando la interface Enumeraction: Enumeration enum=v.elements(); while(enum.hasMoreElements()) { System.out.print(enum.nextElement()+"\t"); }
Caso Práctico
Elaborar una aplicación visual que almacene los datos de n alumnos (Código,
Apellidos, Asignatura, Nota1, Nota2 y Nota3) en una estructura Vector y luego que los
muestre en un JTable. Mostrar en el listado el promedio y la situación académica de
cada alumno.
Formulario 1 (Ingreso de datos):
Formulario 2 (Listado de Datos)
UNIVERSIDAD PRIVADA TELESUP
52
Codificación del formulario1
Declaración Global a nivel de Formulario public class frmData extends javax.swing.JFrame {
Vector v=new Vector(1);
Codificación del botón Grabar private void btngrabarActionPerformed(java.awt.event.ActionEvent evt) {
Alumnos obj=new Alumnos();
//Guardar datos en el objeto
obj.setCodigo(txtcod.getText());
obj.setApellidos(txtape.getText());
obj.setAsignatura(txtasi.getText());
obj.setNota1(Double.parseDouble(txtn1.getText()));
obj.setNota2(Double.parseDouble(txtn2.getText()));
obj.setNota3(Double.parseDouble(txtn3.getText()));
obj.calcularPromedio();
obj.hallarSitAcad();
v.addElement(obj); //Insertarmos al obj dentro del vector
limpiarcajas();
}
Codificación del botón VerReporte private void btnreporteActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
frmReporte fr=new frmReporte();
fr.setData(v);
fr.show();
}
UNIVERSIDAD PRIVADA TELESUP
53
Método limpiarcajas
public void limpiarcajas(){ txtcod.setText(""); txtape.setText(""); txtasi.setText(""); txtn1.setText(""); txtn2.setText(""); txtn3.setText(""); txtcod.requestFocus(); }
Codificación del formulario2
Declaración Global (A nivel de Formulario)
Vector cabecera=new Vector(1);
Vector data=new Vector(1);
Codificación del combo (Evento ItemStateChanged)
private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
// TODO add your handling code here:
//Conseguir el valor seleccionado
String sa = (String) jComboBox1.getSelectedItem();
if(sa.equals("Aprobado")){
mostraraprobados();
}
else{
mostrarDesaprobados();
}
}
Método mostraraprobados void mostraraprobados(){
Enumeration e = data.elements();
Vector ndata = new Vector();
Vector nfila = null;
while (e.hasMoreElements()) {
Vector fila = new Vector(1);
fila = (Vector) e.nextElement();
nfila = new Vector();
String pro=fila.elementAt(6).toString();
double pr=Double.parseDouble(pro);
if (pr >= 10.5) {
for (int i = 0; i < fila.size(); i++) {
nfila.addElement(fila.elementAt(i));
} //fin del for que recorre fila
ndata.addElement(nfila);
} //fin del if
} //fin del while que recorre a data
DefaultTableModel dm = new DefaultTableModel(ndata, cabecera);
jTable1.setModel(dm);
}
UNIVERSIDAD PRIVADA TELESUP
54
Método mostrarDesaprobados void mostrarDesaprobados(){
Enumeration e = data.elements();
Vector ndata = new Vector();
Vector nfila = null;
while (e.hasMoreElements()) {
Vector fila = new Vector(1);
fila = (Vector) e.nextElement();
nfila = new Vector();
String pro=fila.elementAt(6).toString();
double pr=Double.parseDouble(pro);
if (pr < 10.5) {
for (int i = 0; i < fila.size(); i++) {
nfila.addElement(fila.elementAt(i));
} //fin del for que recorre fila
ndata.addElement(nfila);
} //fin del if
} //fin del while que recorre a data
DefaultTableModel dm = new DefaultTableModel(ndata, cabecera);
jTable1.setModel(dm);
}
Método setData void setData(Vector v){
cabecera.addElement("Codigo");
cabecera.addElement("Apellidos");
cabecera.addElement("Asignatura");
cabecera.addElement("Nota1");
cabecera.addElement("Nota2");
cabecera.addElement("Nota3");
cabecera.addElement("Promedio");
cabecera.addElement("Sit Academ");
//recorrer el vector
Enumeration e=v.elements();
Vector fila;
while(e.hasMoreElements()){
Alumnos obj=(Alumnos)e.nextElement();
fila=new Vector(1);
fila.addElement(obj.getCodigo());
fila.addElement(obj.getApellidos());
fila.addElement(obj.getAsignatura());
fila.addElement(obj.getN1());
fila.addElement(obj.getN2());
fila.addElement(obj.getN3());
fila.addElement(obj.prom);
fila.addElement(obj.sitacad);
data.addElement(fila);
}
DefaultTableModel dm=new DefaultTableModel(data,cabecera);
jTable1.setModel(dm);
}
UNIVERSIDAD PRIVADA TELESUP
55
La Clase ArrayList
Las aplicaciones frecuentemente necesitan
almacenar un grupo de datos en un sólo objeto.
Los arrays sirven bien para este propósito, pero
algunas veces necesitamos incrementar o reducir
dinámicamente el número de elementos del array,
o hacer que contenga distintos tipos de datos.
Esto es común entre las aplicaciones como las tiendas online. Un cliente añade una
mercancía a su carro de la compra, y detrás de la escena, los ítems son almacenados
y eliminados automáticamente. Para esta clase de grupos de datos crecientes y
menguantes, podemos usar la reciente clase ArrayList del paquete java.util.
Creación de un ArrayList:
ArrayList al=new ArrayList();
Crea un array dinámico con un tamaño inicial 0, se va
incrementando o decrementando automáticamente.
ArrayList al=new ArrayList(5);
Crea un array dinámico con un tamaño inicial 5, se va
incrementando o decrementando automáticamente.
Métodos de la clase ArrayList
UNIVERSIDAD PRIVADA TELESUP
56
Recorrer los elementos de un ArrayList
Utilizando el indice de elemento:
Iterator i=al.iterator();
while(i.hasNext())
{
System.out.print(i.next()+"\t");
}
Caso Práctico:
Realizar una aplicación Visual Java que realice las principales operaciones de
edición de datos en un ArrayList.
UNIVERSIDAD PRIVADA TELESUP
57
Codificación a nivel de Clase (Declaración Global)
public class frmArrayList extends javax.swing.JFrame {
ArrayList lista=new ArrayList();
Codificación de la caja de texto txtdato
private void txtdatoActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String dato;
dato=txtdato.getText();
lista.add(dato); //Agrega el dato al ArrayList
txtdato.setText(""); //Limpiar la caja
txtdato.requestFocus(); //Enviar el cursor a la caja
visualizar();
}
Codificación del Método visualizar()
private void visualizar() {
int c = 0;
Iterator i = lista.iterator();
String cad = "";
while (i.hasNext()) {
cad += "[" + c + "]" + " " + i.next() + "\n";
c++;
}
txtlista.setText(cad);
}
Codificación del botón Modificar private void
btnmodificarActionPerformed(java.awt.event.ActionEvent
evt) {
// TODO add your handling code here:
String pos=JOptionPane.showInputDialog("Indique la
posicion");
String dato=JOptionPane.showInputDialog("Indique el
dato");
int p=Integer.parseInt(pos);
lista.set(p,dato);
visualizar();
}
UNIVERSIDAD PRIVADA TELESUP
58
Codificación del botón Eliminar
private void btneliminarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int p=Integer.parseInt(JOptionPane.showInputDialog("Ingrese posicion"));
lista.remove(p);
visualizar();
}
Codificación del botón Buscar
private void btnbuscarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String dato=JOptionPane.showInputDialog("Ingrese dato a buscar");
if(lista.contains(dato)){
JOptionPane.showMessageDialog(null, "El dato fue encontrado");
}
else {
JOptionPane.showMessageDialog(null, "El dato no fue encontrado");
}
}
Codificación del botón Ordenar
private void btnordenarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Collections.sort(lista);
visualizar();
}
Codificación del botón Sortear
private void btnordenar1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Collections.shuffle(lista);
visualizar();
JOptionPane.showMessageDialog(null, "El ganador es: "+lista.get(3));
}
UNIVERSIDAD PRIVADA TELESUP
59
TEMA 4
Analizar el manejo y uso adecuado de las sesiones.
Competencia:
Manejo
y Uso de Sesiones
UNIVERSIDAD PRIVADA TELESUP
60
Tema 04: Manejo y Uso de Sesiones
¿QUÉ ES UNA SESSION WEB?
Es una instancia de trabajo del servidor web que corresponde a un usuario o
cliente que se conecta.
¿Cuándo se da inicio a una sesión web?
• Cuando el usuario accede al sitio web a
través de la URL.
¿Cuando finaliza una sesión web?
• Cuando se abandona el sitio web
• Cuando se alcanza un tiempo de inactividad
que es previamente establecido, en este caso
la sesión es automáticamente eliminada. Si el usuario siguiera navegando se
crearía una nueva sesión.
• Se ha cerrado la sesión o reiniciado el servidor.
UNIVERSIDAD PRIVADA TELESUP
61
Variable de Session
Una variable de sesión nos permite almacenar un
dato y mantenerlo disponible para cualquier página
de nuestra sesión web. Es comparable a una
variable global que estaría disponible para cualquier
página de nuestra aplicación.
¿Cómo crear una variable de Session?
session.setAttribute("usu",usuario);
¿Cómo acceder a los datos de una variable de Session?
(desde otra pagina o la misma página)
String usuario=“”;
usuario=(String)session.getAttribute("usu");
Manejo de Excepciones
Durante el desarrollo de nuestros programas se pueden presentar diversos tipos de
errores, los cuales se clasifican de la siguiente forma:
a. Errores de Compilación: Son aquellos errores que se presentan en el momento de
la compilación nuestro programa, el compilador informa el número de línea donde
se produjo el error. Este tipo de error se produce generalmente cuando no
cumplimos rigurosamente las reglas de sintaxis del Lenguaje de Programación.
Algunos IDEs tiene el atributo Intelligent Sense con el cual automáticamente
subrayan la línea de error mientras se escribe el código fuente.
b. Errores de Lógica: Este error se percibe cuando
los resultados emitidos por nuestro programa son
incorrectos e imprecisos, la razón de este tipo de
error se debe al mal planteamiento de la lógica
del programador.
c. Errores en Tiempo de Ejecución: Este error se
presenta imprevistamente durante el tiempo de
ejecución (run-time) de nuestro programa, cuando éste no soporta una instrucción,
y como resultado se cuelga o cierra. Estos tipos de errores deben ser controlados
por la misma aplicación, y no deberían ocasionar que la ejecución colapse.
UNIVERSIDAD PRIVADA TELESUP
62
Precisamente las excepciones o Exceptions en Java
controlan este último tipo de errores.
Manejo de excepciones
A diferencia de otros lenguajes de programación
orientados a objetos como C/C++, Java incorpora en el
propio lenguaje la gestión de errores en tiempo de
ejecución.
¿Cómo lo hace? Veamos:
¿Qué es una Exception?
En el lenguaje Java, una Exception es un objeto que se genera automáticamente
cuando se produce un error de ejecución, una excepción representa al error en sí,
contiene información del error producido. Algunas excepciones son fatales y provocan
que se deba finalizar la ejecución del programa. En este caso conviene terminar
ordenadamente y dar un mensaje explicando el tipo de error que se ha producido.
Otras, como por ejemplo, al no encontrar un fichero en el que hay que leer o escribir
algo, pueden ser recuperables. En este caso el programa debe dar al usuario la
oportunidad de corregir el error (indicando una nueva localización del fichero no
encontrado).
Excepciones Estándar de Java: Los errores se representan mediante dos tipos de
clases derivadas de la clase Throwable: Error y Exception. La siguiente figura
muestra parcialmente la jerarquía de clases relacionadas con Throwable:
UNIVERSIDAD PRIVADA TELESUP
63
La clase Error está relacionada con errores de compilación, del sistema o de la
JVM. De ordinario estos errores son irrecuperables y no dependen del
programador ni debe preocuparse de capturarlos y tratarlos.
La clase Exception tiene más interés. Dentro de ella se puede distinguir muchas
clases derivadas que clasifican los diferentes tipos de errores que se pueden
producir en Java. Ejemplo de algunas Excepciones:
NullPointerException : Exception producida cuando se hace referencia a una
posición de una estructura de datos que no apunta a ningún dato.
IndexOutBoundException: Exception producida cuando se hace referencia a un
índice que sobrepasa la longitud de la estructura de datos.
NegativeArraySizeException: Exception que se produce cuando se hace referencia a
un número de índice negativo.
EOFException: Exception que se produce cuando el puntero ha avanzado una
posición posterior al último registro de una tabla.
Todas las excepciones por heredar de Throwable usan los métodos siguientes:
1. String getMessage() Extrae el mensaje asociado con la excepción.
2. String toString() Devuelve un String que describe la excepción.
3. void printStackTrace() Indica el método donde se lanzó la excepción.
Un buen programa debe gestionar correctamente todas o la mayor parte de los
errores que se pueden producir. Java para este fin utiliza la estructura try … catch y
los Exceptions.
Estructura try … catch
Cuando en un método se produce una situación anómala
es necesario lanzar una excepción, la cual se desarrolla
con la siguiente secuencia:
1. Se crea un objeto Exception de la clase adecuada.
2. Se lanza la excepción con la sentencia throw seguida del objeto Exception creado.
Esta excepción deberá ser capturada (catch) y gestionada, para este fin Java nos
brinda la estructura try… catch.
UNIVERSIDAD PRIVADA TELESUP
64
Ejemplo 1:
try
{
String cad="Universidad Privada Telesup";
int n=0;
String nn=JOptionPane.showInputDialog("Ingrese
la posición ");
n=Integer.parseInt(nn);
char cc=cad.charAt(n);
JOptionPane.showMessageDialog(null,"El carácter es: "+cc);
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(null,ex.getMessage());
}
Explicación del ejemplo 1:
La zona del try, incluye al código que está siendo controlado por posibles errores de
ejecución. La zona del catch es la zona que atrapa al objeto Exception, en el caso de
producirse un error; al producirse el error, se interrumpe la ejecución de la zona try y el
control del programa se direcciona hacia la zona del try y visualizará un mensaje con
la descripción del error.
La estructura try … catch puede utilizar varios bloques catch,
en los cuales puede atrapar diversos tipos de Exceptions
(errores), estos deben ser colocados desde lo más
específico a lo más genérico. Esto permite personalizar la
acción a realizar según el tipo de error producido. Veamos
un segundo ejemplo:
UNIVERSIDAD PRIVADA TELESUP
65
Ejemplo 2:
try
{ String cad="Universidad Privada Telesup"; int n=0;
String nn=JOptionPane.showInputDialog("Ingrese la posición "); n=Integer.parseInt(nn); char cc=cad.charAt(n); JOptionPane.showMessageDialog(null,"El caracter es: "+cc); } catch (StringIndexOutOfBoundsException ex1) {
JOptionPane.showMessageDialog(null,"Error: La posición esta fuera del rango de la cadena.");
} catch (NumberFormatException ex2) { JOptionPane.showMessageDialog(null,"Error: El valor que Ud. ingresó no corresponde a un número."); } catch (Exception ex) { JOptionPane.showMessageDialog(null,ex.getMessage()); } } Explicación del ejemplo 2: En este caso existen 3 bloques catch, cada uno de ellos
atrapa un diferente tipo de error, según sea el caso. Nunca se realizará más de un
bloque catch, solo se realizará el bloque que corresponda al error producido, los
primeros dos bloques corresponden a errores especifico, el ultimo es un Exception
genérico que corresponde a cualquier otro tipo de error. La cláusula finally: Esta
cláusula es opcional y se coloca al final de la estructura, lo que se programe en este
bloque se realizará de todos modos sea que se haya producido un error o no.
Ejemplo 3:
try { String cad="Universidad Privada Telesup"; int n=0; String nn=JOptionPane.showInputDialog("Ingrese la posición "); n=Integer.parseInt(nn); char cc=cad.charAt(n); JOptionPane.showMessageDialog(null,"El caracter es: "+cc); } catch (StringIndexOutOfBoundsException ex1) { JOptionPane.showMessageDialog(null,"Error: La posición esta fuera del rango de la cadena."); } catch (NumberFormatException ex2)
UNIVERSIDAD PRIVADA TELESUP
66
{ JOptionPane.showMessageDialog(null,"Error: El valor que Ud. ingresó no corresponde a un número."); } catch (Exception ex) { JOptionPane.showMessageDialog(null,ex.getMessage()); } finally { JOptionPane.showMessageDialog(“Programa finalizado…”); } }
Clausula throws: Esta cláusula se puede acompañar en la declaración de un método,
esto quiere decir que si dentro del método se produce un Exception (error), entonces
dicho Exception será disparado hacia fuera (hacia el lugar desde donde se invocó al
método, esta zona necesariamente debe estar dentro de un try … catch … ), tal como
se muestra en el siguiente ejemplo:
Ejemplo 4
public class Demo {
public Demo() {
} public void mostrar() throws Exception { String cad="Universidad Privada Telesup"; int n=0; String nn=JOptionPane.showInputDialog("Ingrese la posición "); n=Integer.parseInt(nn); char cc=cad.charAt(n); JOptionPane.showMessageDialog(null,"El carácter es: "+cc); }
public static void main(String args[]) { try { Demo obj=new Demo(); obj.mostrar(); } catch (Exception ex1) { JOptionPane.showMessageDialog(null,"Error: La posición esta fuera del rango de la cadena."); } } }
UNIVERSIDAD PRIVADA TELESUP
67
1. Cree una aplicación web Java aplicando la POO utilizando las 3
formas aprendidas en clase. (1ra. Forma: Usando métodos con
parámetros de entrada; 2da. Forma: Usando propiedades para los
datos de entrada; 3ra. Forma: Usando propiedades para los datos
de entrada y salida).
Enunciado:
Luego de ingresar la cantidad de horas trabajadas y el costo de
pago por hora, calcular el salario mensual de un trabajador,
sabiendo que dicho cálculo se genera en base a las horas
mensuales trabajadas por el precio especificado por hora. Si se
pasan de 192 horas mensuales trabajadas, las horas
extraordinarias se pagarán a razón de 1.5 veces la hora ordinaria.
Tenga en cuenta que todos los trabajadores obtienen una
bonificación del 20% del salario mensual siempre y en cuando
hayan laborado más de 100 horas al mes.
Entradas: Horas Trabajadas y Costo Hora
Salidas: Salario Mensual, Bonificación y Total a Percibir.
Lecturas Recomendadas
ESTRUCTURAS DE DATOS
http://docencia.etsit.urjc.es/moodle_antiguo/file.php/90/Tema_2_-
_Algoritmos_sobre_grafos_-_Estructuras_de_datos.pdf
PROGRAMACIÓN ORIENTADA A OBJETOS (POO) EN JAVA I: INTRODUCCIÓN http://eii.ucv.cl/pers/guidi/cursos/ti/Java-POO-1-Introduccion.pdf
Actividades y Ejercicios
UNIVERSIDAD PRIVADA TELESUP
68
Autoevaluación
1) Es una plantilla o patrón a partir de la cual se crean muchos otros objetos
similares.
a. El método.
b. La clase.
c. El sistema.
d. El algoritmo.
e. El lenguaje de programación.
2) Son las características descriptivas de una clase:
a. El diagrama de flujo.
b. Las propiedades o atributos.
c. Métodos.
d. Instancias.
e. Variables.
3) Los métodos responden a la pregunta:
a. ¿Qué es lo que es capaz de hacer la clase?
b. ¿Cuáles son los atributos de la clase?
c. ¿Cuántas variables tiene la clase?
d. ¿La clase es visible para todos los usuarios?
e. ¿Hereda alguna propiedad de otra clase?
4) Son objetos creados a partir de una clase:
a. Las variables.
b. Las capsulas.
c. Las constantes.
d. Las consultas.
e. Los Objetos instanciados.
5) Son copias de una clase:
a. Los triggers.
b. Los Objetos instanciados.
c. Las capas.
d. Las condiciones.
e. Los paquetes.
UNIVERSIDAD PRIVADA TELESUP
69
6) Para acceder a una propiedad o método, debemos especificar el objeto
instanciado, luego colocaremos un ______ y posteriormente el nombre de la
propiedad o método que se ha heredado de su clase base.
a. Punto.
b. Punto y coma.
c. Paréntesis.
d. Corchetes.
e. Guion.
7) Es un método especial dentro de la clase, que lleva el nombre de la misma
clase.
a. Método array.
b. Método pasedouble.
c. Método constructor.
d. Método joptionpane.
e. Método get.
8) Es una carpeta de java, dentro del cual podemos almacenar muchas clases,
los paquetes en Java sirven para organizar nuestras clases, cada IDE tiene
una forma distinta de crear paquetes.
a. Paquete.
b. Clase.
c. Sentencia.
d. Constructor.
e. CSS
9) Permite que se pueda definir nuevas clases basadas en clases existentes, lo
cual facilita re-utilizar código previamente desarrollado:
a. La clase.
b. La Propiedad.
c. La herencia.
d. El constructor.
e. El accionador.
10) En java tenemos muchas clases que manejan diferentes estructuras
dinámicas, entre las que no se puede mencionar:
a. Enumeration
b. HashTable
c. Stack
d. Set
e. Option Pane.
UNIVERSIDAD PRIVADA TELESUP
70
Resumen
UUNNIIDDAADD DDEE AAPPRREENNDDIIZZAAJJEE II::
En el diseño de la JCF las interfaces son muy importantes porque son ellas las que
determinan las capacidades de las clases que las implementan. Dos clases que
implementan la misma interfaz se pueden utilizar exactamente de la misma forma. Por
ejemplo, las clases ArrayList y LinkedList disponen exactamente de los mismos
métodos y se pueden utilizar de la misma forma.
La principal ventaja del uso de herencia de clases es la reutilización de los métodos de
clases base, lo cual impide que se repita el mismo código muchas veces dentro del
desarrollo de una aplicación, y por otro lado favorece el mantenimiento de los
programas, porque cualquier cambio que se realice en una clase base inmediatamente
replica para todas las subclases que extienden de esta, lo cual ahorra el tiempo a la
labor de la programación.
HashTables: Es una estructura de datos dinámica que almacena un grupo de objetos,
cada elemento almacenado en el HashTable debe contar un key (Código único que
identifique de manera singular a dicho elemento dentro de la estructura).
Uno de los errores que se suele cometer es el de Compilación; los cuales son aquellos
errores que se presentan en el momento de la compilación nuestro programa, el
compilador informa el número de línea donde se produjo el error. Este tipo de error se
produce generalmente cuando no cumplimos rigurosamente las reglas de sintaxis del
lenguaje de programación.
UNIVERSIDAD PRIVADA TELESUP
71
UNIVERSIDAD PRIVADA TELESUP
72
Introducción
a) Presentación y contextualización:
La conectividad de la base de datos de Java (JDBC, Java Database Connectivity)
es un marco de programación para los desarrolladores de Java que escriben los
programas que tienen acceso a la información guardada en bases de datos, hojas
de cálculo, y archivos "planos". JDBC se utiliza comúnmente para conectar un
programa del usuario con una base de datos por “detrás de la escena”, sin
importar qué software de administración o manejo de base de datos se utilice para
controlarlo.
b) Competencia:
Comprende las principales funciones de las tecnologías Java (Java DataBase
Connectivity.
c) Capacidades: 1. Utiliza adecuadamente las interfaces JDBC.
2. Reconoce y describe objetivamente cada una de las clases de las interfaces
JDBC.
3. Conoce el proceso de presentación adecuada de los contenidos de una tabla.
4. Describe las propiedades y funcionalidades de la Interface Preparedstament y
Callablestament.
d) Actitudes: Pone en práctica las recomendaciones relacionados a Java DataBase
Connectivity.
Muestra tolerancia ante las dificultades relacionadas a la tecnología JDBC.
e) Presentación de Ideas básicas y contenidos esenciales de la Unidad: La Unidad de Aprendizaje 02: Tecnología JDBC (Java DataBase Connectivity),
comprende el desarrollo de los siguientes temas:
TEMA 01: Interfaces JDBC.
TEMA 02: Las Interfaces y Clases del JDBC.
TEMA 03: Presentar el Contenido de una Ta.
TEMA 04: La Interface Preparedstament y Callablest
UNIVERSIDAD PRIVADA TELESUP
73
TEMA 1
Competencia:
Interfaces JDBC
Utilizar adecuadamente las interfaces JDBC.
UNIVERSIDAD PRIVADA TELESUP
74
Desarrollo de los Temas
Tema 01: Interfaces JDBC
INTRODUCCIÓN
Java Database Connectivity (JDBC) es una interfase de
acceso a bases de datos estándar SQL que proporciona
un acceso uniforme a una gran variedad de bases de
datos relacionales. JDBC también proporciona una base
común para la construcción de herramientas y utilidades
de alto nivel. El paquete actual de JDK incluye JDBC y el
puente JDBC-ODBC. Estos paquetes son para su uso con JDK 1.x.
DEFINICIÓN DEL JDBC
JDBC es el API para la ejecución de sentencias SQL. (Como punto de interés JDBC
es una marca registrada y no un acrónimo, no obstante a menudo es conocido como
“Java Database Connectivity”). Consiste en un conjunto de clases e interfases escritas
en el lenguaje de programación Java. JDBC suministra un API estándar para los
desarrolladores y hace posible escribir aplicaciones de base de datos usando un API
puro Java.
Usando JDBC es fácil enviar sentencias SQL virtualmente a cualquier sistema de base
de datos. En otras palabras, con el API JDBC, no es necesario escribir un programa
que acceda a una base de datos Sybase, otro para acceder a Oracle y otro para
acceder a Informix. Un único programa escrito usando el API JDBC y el programa será
capaz de enviar sentencias SQL a la base de datos apropiada. Y, con una aplicación
escrita en el lenguaje de programación Java, tampoco es necesario escribir diferentes
aplicaciones para ejecutar en diferentes plataformas. La combinación de Java y JDBC
permite al programador escribir una sola vez y ejecutarlo en cualquier entorno. Java,
siendo robusto, seguro, fácil de usar, fácil de entender, y descargable
automáticamente desde la red, es un lenguaje base excelente para aplicaciones de
base de datos.
UNIVERSIDAD PRIVADA TELESUP
75
FUNCIONES DEL JDBC
1. Establecer una conexión con una base de datos
2. Enviar una consulta SQL a la base de datos
3. Procesar los resultados de la consulta.
El API JDBC del desarrollador de aplicaciones consta de dos partes, por un lado está
el paquete java.sql, que contiene las clases e interfaces que permiten acceder a la
funcionalidad básica del API JDBC. Este paquete forma parte de la edición estándar
de la plataforma Java (J2SE), desde la versión 1.1 de ésta. Esta separata se centra en
la funcionalidad de este paquete.
CARACTERÍSTICAS Y DRIVERS DEL JDBC
Los Driver, también llamados Manejadores, son un conjunto de clases que
implementan las clases e interfaces del API JDBC necesarias para que una aplicación
Java pueda conectarse con una BD. Cuando los desarrolladores de una BD desean
que esta pueda ser accesible mediante JDBC éstos deben implementar un manejador
para esa base de datos; la misión del manejador será traducir comandos estándar del
API JDBC al protocolo nativo de esa base de datos. Cada base de datos emplea un
protocolo diferente de comunicación, protocolos que normalmente son propietarios. El
uso de un manejador, una capa intermedia entre el código del desarrollador y la base
de datos, permite independizar el código Java que accede a la BD del sistema de BD
concreto a la que estamos accediendo, ya que en nuestro código Java emplearemos
comandos estándar, y estos comandos serán traducidos por el manejador a comandos
propietarios de cada sistema de BD concreto.
Si queremos cambiar el sistema de BD que empleamos lo único
que deberemos hacer es reemplazar el antiguo manejador por el
nuevo, y seremos capaces de conectarnos la nueva BD. Para
garantizar que un manejador respeta el API JDBC existe un conjunto de
pruebas que debe pasar el manejador para poderse considerar “JDBC CompliantTM”,
estas pruebas (disponibles en http://java.sun.com/products/jdbc/download.html) nos
garantizan que un manejador ha sido desarrollado siguiendo el API JDBC.
En http://servlet.java.sun.com/products/jdbc/drivers se puede encontrar manejadores
para prácticamente cualquier base de datos.
UNIVERSIDAD PRIVADA TELESUP
76
Tipos de manejadores:
Hay 4 tipos de manejadores JDBC, que difieren en si, usan o no tecnología Java Pura,
en su rendimiento y en la flexibilidad para cambiar de base de datos. Veamos cuales
son:
a. Puente JDBC-ODBC (tipo1)
ODBC es un API estándar semejante a JDBC, que permite que lenguajes como
C++ accedan de un modo estándar a distintos sistemas de BD. Un manejador tipo
puente JDBC-ODBC delega todo el trabajo sobre un manejador ODBC, que es
quien realmente se comunica con la BD. El puente JDBC-ODBC permite la
conexión desde Java a BD que no proveen manejadores JDBC. Fue muy útil
cuando se creó el API JDBC, ya que muchas BD no disponían de manejadores
JDBC, pero si de manejadores ODBC.
Empelado el puente JDBC-ODBC podía accederse a estas bases de datos
empleando el API JDBC. Este tipo de manejador tiene dos desventajas: por un lado
depende de código nativo, ya que el manejador ODBC no ha sido desarrollado en
Java. Esto compromete la portabilidad de nuestro desarrollo. Por otro lado al
emplear este tipo de manejador nuestra aplicación llama al gestor de manejadores
JDBC, quien a su vez llama al manejador JDBC (puente JDBC-ODBC), quien llama
al manejador ODBC, que es el que finalmente llama a la base de datos. Hay
muchos puntos donde potencialmente puede producirse un fallo, lo cual hace que
estos manejadores muchas veces sean bastante inestables.
UNIVERSIDAD PRIVADA TELESUP
77
El puente forma parte del jdk de SUN, esta en el paquete sun.jdbc.odbc. Inicialmente
este tipo de manejador fue bastante útil por aliviar la carencia de manejadores JDBC.
Hoy en día es el menos recomendado por limitar la portabilidad de la aplicación, al
requerir código nativo, y por emplear tantas capas para la comunicación con la base
de datos, lo que a veces hace que incrementa la inestabilidad de estos manejadores.
b. Manejador de API nativo (tipo2)
Se basa en una librería escrita en código nativo para acceder a la base de datos. El
manejador traduce las llamadas JDBC a llamadas al código de la librería nativa,
siendo el código nativo el que se comunica con las bases de datos. La librería
nativa es proporcionada por los desarrolladores de la BD. Estos manejadores son
más eficientes y tienen menos puntos de fallo que el puente JDBC-ODBC ya que
hay menos capas entre el código de la aplicación y la base de datos. Sin embargo
siguen teniendo el problema de pérdida de portabilidad por emplear código nativo.
c. Manejador de JDBC-Net (tipo3)
El manejador se comunica con un servidor intermedio que se encuentra entre el
cliente y la base de datos. El servidor intermediario se encarga de traducir las al
API JDBC al protocolo específico de la base de datos. No se requiere ningún tipo
de código nativo en el cliente, por lo que la portabilidad de la aplicación está
garantizada: el manejador es tecnología 100% Java. Además si el intermediario es
capaz de traducir las llamadas JDBC a protocolos específicos de diferentes
sistemas de BD podremos emplear un mismo manejador para comunicarnos con
diferentes bases de datos.
UNIVERSIDAD PRIVADA TELESUP
78
Esto lo convierte en el manejador más flexible de todos. No obstante se trata de un
driver complejo, ya que requiere la presencia de un midelware, una capa
intermedia entre el cliente y la ase de datos, por lo que no es muy común emplearlo
en arquitecturas simples, sino más bien en arquitecturas sofisticadas donde
muchas veces entran en juego varias bases de datos distintas. API JDBC
d. Manejador de Protocolo Nativo (tipo4)
El manejador traduce directamente las llamadas al API JDBC al protocolo nativo de
la base de datos. Es el manejador que tiene mejor rendimiento, pero está más
ligado a la base de datos que empleemos que el manejador tipo JDBC-Net, donde
el uso del servidor intermedio nos da una gran flexibilidad a la hora de cambiar de
base de datos. Este tipo de manejadores también emplea tecnología 100% Java.
UNIVERSIDAD PRIVADA TELESUP
79
TEMA 2
Competencia:
Las Interfaces y
Clases del JDBC
Reconocer y describir objetivamente cada una de las clases de las interfaces JDBC.
UNIVERSIDAD PRIVADA TELESUP
80
Tema 02: Las Interfaces y Clases del JDBC
JDBC incluye un conjunto de interfaces y clases de que permiten el manejo de base
de datos en Java, esta tecnología esta basada fundamentalmente en las siguientes
interfaces:
a. Driver
b. DriverManager
c. Connection
d. Statement
e. PreparedStatement
f. CallableStatement
g. ResultSet
REGISTRO DE UN MANEJADOR
Registrar un manejador no es más que cargar en memoria
una clase que implementa el interfaz Driver, clase
proporcionada por los desarrolladores de la base de datos.
Existen tres formas de registrar un Driver:
1. Empleando el cargador de clases. Para ello empleamos,
al igual que para cargar cualquier otra clase, el método forName(String clase) de la
clase Class.
Class.forName("com.mysql.Driver");
2. Instanciando la clase que implementa el interfaz Driver. De este modo tendremos
una referencia al Driver, pudiendo establecer la conexión directamente con él sin
necesidad de emplear la clase DriverManager. La sintaxis es la misma que para
instaciar cualquier otra clase:
Driver driverPraMySQL = new org.gjt.mm.mysql.Driver();
3. Definir la propiedad jdbc.drivers. Podemos hacerlo de dos modos diferentes:
a. Definiendo la propiedad jdbc.drivers en nuestra máquina virtual. La sintaxis es
jdbc.drivers=nombreManejador1: nombreManejador2:…
jdbc.drivers=gjt.mm.mysql.Driver:oracle.jdbc.driver.OracleDriver;
b. Emplear la opción –D al invocar a la máquina virtual. Para ellos debemos
arrancar nuestra aplicación con el comando java: -
Djdbc.drivers= nombreManejador1: nombreManejador2:…
java -Djdbc.drivers=gjt.mm.mysql.Driver:oracle.jdbc.driver.OracleDriver;
UNIVERSIDAD PRIVADA TELESUP
81
INTERFAZ DRIVER
Aunque es vital para establecer la conexión con la base de datos en la práctica el
desarrollador de aplicaciones puede olvidarse de esta interfaz. Es responsabilidad del
desarrollador del manejador proveer una clase que la implemente esta interfaz, y será
responsabilidad del DriverManager llamar al método connect de los drivers registrados
para intentar establecer la conexión con la base de datos. No obstante es posible crear
un objeto tipo Driver, instanciando la clase desarrollada por el desarrollador del
manejador, e invocar directamente a su método connect, obteniendo una conexión con
la base de datos sin necesidad de emplear la clase DriverManager. De este modo
tenemos más control sobre el Driver que estamos empleando en la conexión, cuando
hemos registrado más de un driver, ya que no nos arriesgamos a que se establezca
conexión con la BD con un driver distinto al que nosotros deseamos usar.
CLASE DRIVERMANAGER
Como su nombre indica, esta clase es la gestora de los diversos drivers (manejadores)
que existan en nuestra aplicación. Es posible que sea necesario que en una misma
aplicación se tenga varios manejadores para acceder a varias bases de datos.
Los métodos que más nos interesan de esta clase son:
static Connection getConnection(String url);
static Connection getConnection(String url, String user, String password).
Estos métodos intentan establecer conexión con la base de datos que le indiquemos
en el campo url, empleando para ellos todos los manejadores que hemos registrado.
La diferencia entre un método y el otro, obviamente, es que en uno sólo se especifica
la base de datos a la que nos queremos conectar, mientras que en el otro se indica
también el nombre de usuario de la base de datos y su password. Más adelante
explicaremos que es el objeto Connection que devuelven estos métodos.
Lo que hace la clase DriverManager para intentar establecer conexión con la base de
datos es invocar al método connect de la interface Driver, interface que como veremos
deben implementar todos los manejadores. Realiza esta operación con todos los
manejadores que tiene registrados, si el manejador devuelve null significa que no se
ha podido conectar con la base de datos, y el gestor intenta de nuevo conectarse con
otro manejador. Si consigue conectarse con un manejador no sigue intentándolo con el
resto de los manejadores registrados, y si no consigue establecer la conexión con
ningún manejador lanza una excepción tipo SQLException.
UNIVERSIDAD PRIVADA TELESUP
82
Sintaxis de los URL de JDBC
Los URL (Uniform Resource Locator) de JDBC identifican una base de datos, y un
protocolo de conexión a esta, de un modo unívoco. Toda URL de JDBC consta
siempre de tres partes:
protocolo:subprotocolo:subnombre.
Ejemplo:
"jdbc:odbc:usuarios"
Veamos cada una de las partes del URL:
1. Protocolo de la conexión. Siempre es jdbc.
2. Subprotocolo de la conexión. Identifica el tipo
de mecanismo de conexión que emplearemos
para acceder a la base de datos. Es
imprescindible especificarlo para que el
DriverManager pueda saber que tipo de
manejador debe emplear para crear la
conexión. En el URL ejemplo el subprotocolo empleado para la conexión a la base
de datos será ODBC, por lo que el DriverManager intentará establecer la conexión
con todos los manejadores registrados que sean de tipo 1, puente JDBC-ODBC.
UNIVERSIDAD PRIVADA TELESUP
83
3. Subnombre, identifica la base de datos con la que queremos establecer una
conexión. El subnombre es “usuarios”; será el sistema ODBC quien proporcione, a
partir de ese nombre, el resto de la información necesaria para establecer la
conexión con la base de datos.
Sin embargo si empleamos otro protocolo puede ser necesario incluir la dirección
de red del servidor como subnombre. Por ejemplo:
protocolo:subprotocolo://servidor:puerto/subnombre
"jdbc:microsoft:sqlserver://localhost:1433;pubsSQL;selectMethod=cursor”
Así por ejemplo la URL: jdbc:bdnet://javahispano.org:4040/usuarios emplearía el
protocolo jdbc y un manejador de tipo JDBC-Net para conectarse a la hipotética base
de datos “usuarios” a través del puerto 4040 de la máquina javahispano.org.
Métodos de la Clase DriverManager
Todos los métodos que encontramos en esta clase son estáticos (No requieren
instancia para poder utilizarlo) y se comentan brevemente a continuación:
Método Descripción
Connection getConnection(String url) Establece una conexión con la base de datos
identificada por la URL de JDBC que se pasa por
parámetros.
Connection getConnection(String url,
Properties info)
Establece una conexión con la base de datos
identificada por la URL de JDBC que se pasa por
parámetros.
Connection getConnection(String url,
String usuario, String contraseña)
Establece una conexión con la base de datos pero en
su segundo parámetro especifica propiedades que
posee el driver, como puede ser la base de datos, el
usuario, la contraseña, etc. Estas propiedades se
organizan en pares propiedad/valor.
void println(String mensaje) Escribe un mensaje en el flujo de actividad actual
void setLoginTimeout(int segundos) Establece el tiempo de espera que el driver utilizará
para realizar una conexión.
INTERFAZ CONNECTION
Representa una conexión con la base de datos. Permite crear objetos que representan
consultas que se ejecutarán en la base de datos, y permite acceder a información
sobre la base de datos y las posibilidades del manejador JDBC. En esta tabla
recogemos los principales métodos de la interfaz Connection. Sobre muchos de ellos
volveremos a hablar más adelante.
UNIVERSIDAD PRIVADA TELESUP
84
Métodos de la Interfaz Connection
Método Descripción
void close() Cierra una conexión, liberando todos los recursos
asociados a la misma.
boolean isClosed() Devuelve verdadero si la conexión está cerrada
boolean isReadOnly() Devuelve true si la conexión es de sólo lectura
PreparedStatement
prepareStatement(String sql)
Crea un objeto PreparedStatement que va a permitir
enviar y ejecutar sentencias SQL parametrizadas a
la base de datos correspondiente.
PreparedStatement
prepareStatement(String sql, int
tipoResultSet, int tipoConcurrencia)
Igual que el método anterior, pero permite
especificar las características del ResultSet que se
obtendrá a la hora de ejecutar el objeto
PreparedStatement correspondiente.
void setReadOnly(boolean soloLectura) Establece si una conexión posee el modo de solo
lectura o no, dependiendo del argumento de tipo
booleano.
void commit() Hace permanentes los cambios que se realizaron
desde el ultimo commit o rollback.
Statement createStatement() Crea un objeto de tipo Statement.
bolean getAutoCommit() Indica si está en modo auto-commit.
DatabaseMetaData getMetaData()
Devuelve un objeto tipo DatabaseMetaData con
meta información a cerca de la base de datos
contra la cual se ha abierto esta conexión..
CallableStatement prepareCall(String sql)
Crea un objeto CallableStatement para ejecutar
procedimientos almacenados SQL en la BD.
PreparedStatement prepareStatement(String
sql)
Crea un objeto PreparedStatement para ejecutar
consultas SQL parametrizadas en la BD.
void rollback()
Deshace todos los cambios realizados desde la
última vez que se ejecutó commit o rollback
void close() Cierra una conexión, liberando todos los recursos
asociados a la misma.
Statement createStatement(int
tipoResultSet, int tipoConcurrencia)
Crea también una sentencia SQL pero generará en
su ejecución un objeto ResultSet con unas
características determinadas.
boolean isClosed() Devuelve verdadero si la conexión está cerrada
boolean isReadOnly() Devuelve true si la conexión es de sólo lectura
PreparedStatement
prepareStatement(String sql)
Crea un objeto PreparedStatement que va a permitir
enviar y ejecutar sentencias SQL parametrizadas a
la base de datos correspondiente.
PreparedStatement
prepareStatement(String sql, int
tipoResultSet, int tipoConcurrencia)
Igual que el método anterior, pero permite
especificar las características del ResultSet que se
obtendrá a la hora de ejecutar el objeto
PreparedStatement correspondiente.
void setReadOnly(boolean soloLectura) Establece si una conexión posee el modo de solo
lectura o no, dependiendo del argumento de tipo
booleano.
UNIVERSIDAD PRIVADA TELESUP
85
ENVIÓ DE SENTENCIAS SQL
JDBC suministra tres clases para el envío de sentencias SQL. Estas clases son los
siguientes:
1. Statement – Creada por el método createStatement. Un objeto Statement se usa para
enviar sentencias SQL simples.
2. PreparedStatement – Creada por el método prepareStatement- Un objeto
PreparedStatement se usa para sentencias SQL que toman uno o más parámetros
como argumentos de entrada (parámetros IN). PreparedStatement tiene un grupo de
métodos que fijan los valores de los parámetros IN, los cuales son enviados a la base
de datos cuando se procesa la sentencia SQL. Instancias de PreparedStatement
extienden Statement y por tanto heredan los métodos de Statement. Un objeto
PreparedStatement es potencialmente más eficiente que un objeto Statement porque
este ha sido precompilado y almacenado para su uso futuro.
3. CallableStatement – Creado por el método prepareCall. Los objetos
CallableStatement se usan para ejecutar procedimientos almacenados SQL –
un grupo de sentencias SQL que son llamados mediante un nombre, algo
parecido a una función - . Un objeto CallableStatement hereda métodos para el
manejo de los parámetros IN de PreparedStatement, y añade métodos para el
manejo de los parámetros OUT e INOUT.
INTERFACE STATEMENT
Esta interfaz permite enviar instrucciones SQL a la base de datos. Podemos obtener
un objeto que implemente esta interfaz a partir del método Statement
createStatement() de la interfaz Connection. Para enviar una consulta tipo SELECT se
emplea el método executeQuery(String sql). Este método devuelve un objeto tipo
ResultSet. Para enviar una instrucción tipo DELETE, UPDATE, INSERT o una
instrucción DDL (Data Definition Language) se emplea executeUpdate(String sql).
Mediante el método execute(String sql) podemos ejecutar cualquiera de los
comandos anteriores.
Un objeto Statement se usa para enviar sentencias SQL a la
base de datos. Actualmente hay tres tipos de objetos Statement,
todos los cuales actúan como contenedores para la ejecución de
sentencias en una conexión dada: Statement, PreparedStatement que hereda de
Statement y CallableStatement que hereda de PreparedStatement.
UNIVERSIDAD PRIVADA TELESUP
86
Estas están especializadas para enviar tipos particulares de sentencias SQL, Un
objeto Statement se usa para ejecutar una sentencia SQL simple sin parámetros. Un
objeto PreparedStatement se usa para ejecutar sentencias SQL precompiladas con o
sin parámetros IN; y un objeto CallableStatement se usa para ejecutar un
procedimiento almacenados de base de datos. La interfase Statement suministra
métodos básicos para ejecutar sentencias y devolver resultados. La interfase
PreparedStatement añade métodos para trabajar con los parámetros IN; y la interfase
CallableStatement añade métodos para trabajar con parameters OUT.
Creación de objetos Statement
Una vez establecida la conexión con una base de datos particular, esta conexión
puede usarse para enviar sentencias SQL. Un objeto Statement se crea mediante el
método de Connection createStatement, como podemos ver en el siguiente fragmento
de código.
Connection con = DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();
La sentencia SQL que será enviada a la base de datos es alimentada como un
argumento a uno de los métodos de ejecución del objeto Statement. Por ejemplo:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");
Ejecución de sentencias usando objetos Statement.
La interfase Statement nos suministra tres métodos diferentes para ejecutar
sentencias SQL, executeQuery, executeUpdate y execute. El método a usar esta
determinado por el producto de la sentencia SQL El método executeQuery esta
diseñado para sentencias que producen como resultado un único resultSet tal como
las sentencias SELECT. El método executeUpdate se usa para ejecutar sentencias
INSERT, UPDATE ó DELETE así como sentencias SQL DDL (Data Definition
Language) como CREATE TABLE o DROP TABLE.
El efecto de una sentencia INSERT, UPDATE o DELETE es una modificación de una o
más columnas en cero o más filas de una tabla. El valor devuelto de executeUpdate es
un entero que indica el número de filas que han sido afectadas (referido como update
count). Para sentencias tales como CREATE TABLE o DROP TABLE, que no operan
sobre filas, le valor devuelto por executeUpdate es siempre cero.
UNIVERSIDAD PRIVADA TELESUP
87
El método execute se usa para ejecutar sentencias que devuelven más de un
ResultSet, más que un update count o una combinación de ambos. Todos los métodos
que ejecutan sentencias cierran los objetos ResultSet abiertos como resultado de las
llamadas a Statement. Esto quiere decir que es necesario completar el proceso con el
actual objeto ResultSet antes de reejecutar una sentencia Statement. Debe notarse
que la interfase PreparedStatement, que hereda los métodos de la interfase
Statement, tiene sus propias versiones de los métodos executeQuery, executeUpdate
y execute. Los objetos Statement en si mismos no contienen una sentencia SQL, por
tanto debe suministrarse como un argumento a los métodos Statement.execute. Los
objetos PreparedStatement no suministran una sentencia SQL como argumento a
estos métodos puesto que ya tienen la sentencia precompilada. Los objetos
CallableStatement heredan las formas de estos métodos de PreparedStatement. Usar
un parametro de query con las versiones de los métodos de PreparedStatement o
CallableStatement producirá una SQLException.
Realización de Statement
Cuando una conexión está en modo auto-commit, las sentencias ejecutadas son
„comitadas‟ o rechazadas cuando se completan. Una sentencia se considera completa
cuando ha sido ejecutada y se han devuelto todos los resultados. Para el método
executeQuery, que devuelve un único ResultSet, la sentencia se completa cuando
todas las filas del objeto ResultSet se han devuelto. Para el método executeUpdate,
un sentencia se completa cuando se ejecuta. En los raros casos en que se llama al
método execute, de cualquier modo, no se completa hasta que los ResultSets o
update counts que se generan han sido devueltos.
Algunos DBMS tratan cada sentencia en un
procedimiento almacenado como sentencias
separadas. Otros tratan el procedimiento entero
como una sentencia compuesta. Esta diferencia
se convierte en importante cuando está activo el modo auto-commit porque afecta
cuando se llama al método commit. En el primer caso, cada sentencia individual es
commitada. En el segundo, se commiten todas juntas.
UNIVERSIDAD PRIVADA TELESUP
88
Cerrar objetos Statement
Los objetos Statement se cerrarán automáticamente por el colector de basura de Java
(garbage collector). No obstante se recomienda como una buena práctica de
programación que se cierren explícitamente cuando no sean ya necesarios. Esto libera
recursos DBMS inmediatamente y ayuda a evitar potenciales problemas de memoria.
INTERFAZ RESULTSET
Esta interfaz representa un conjunto de datos que son el resultado de una consulta
SQL. La clase posee una serie de métodos XXX getXXX(int columna) y XXX
getXXX(String columna) que permiten acceder a los resultados de la consulta (para la
sintaxis correcta de estos métodos acudir al javadoc de la interfaz ResultSet). Para
acceder a los distintos registros empleamos un puntero, que inicialmente apunta justo
antes de la primera fila. Para desplazar el puntero empleamos el método next().
Un ResultSet contiene todas las filas que satisfacen las condiciones de una sentencia
SQL y proporciona el acceso a los datos de estas filas mediante un conjunto de
métodos get que permiten el acceso a las diferentes columnas de la filas. El método
ResultSet.next se usa para moverse a la siguiente fila del ResultSet, convirtiendo a
ésta en la fila actual. El formato general de un ResultSet es una tabla con cabeceras
de columna y los valores correspondientes devueltos por la „query‟. Por ejemplo, si la
„query‟ es SELECT a, b, c FROM Table1, el resultado tendrá una forma semejante a:
a b c
-------- --------- --------
12345 Cupertino CA
83472 Redmond WA
83492 Boston MA
UNIVERSIDAD PRIVADA TELESUP
89
ESTABLECIENDO UNA CONEXIÓN JDBC
Pasos necesarios para Establecer una Conexión JDBC
1. Importar las clases del paquete java.sql
Para utilizar esta tecnología, debemos importar las clases del paquete: java.sql
De la siguiente manera:
package comercial;
import java.sql.*;
public class GestionBD {
// Contenido de la clase
}
2. Registrar el Driver a utilizar en la clase DriverManager: Pasar el nombre del
paquete donde se encuentra el JDBC
package comercial;
import java.sql.*;
public class GestionBD {
public static void main(String[] args) {
Statement stmt=null; // Declara el Objeto Statement
Connection cn=null; // Declara el Objeto Connection
ResultSet rs=null; // Declara el Objeto ResultSet
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Registrar el
Driver
}
catch(Exception e) {
System.out.println("Error al Cargar el Driver");
} }}
3. Abrir la conexión
La forma común de establecer una conexión con una base de
datos es llamar al método getConnection() de la clase DriverManager, a este
método se le debe pasar como parámetro la URL de JDBC que identifica a la base
de datos con la que queremos realizar la conexión. La ejecución de este método
devolverá un objeto Connection que representará la conexión con la base de datos.
La sintaxis general para realizar una conexión es la siguiente:
Connection cn=DriverManager.getConnection(url);
Importación necesaria para trabajar con JDBC
UNIVERSIDAD PRIVADA TELESUP
90
Ejemplo:
package comercial;
import java.sql.*;
public class GestionBD {
public static void main(String[] args) {
Statement stmt=null; // Declara el Objeto Statement
Connection cn=null; // Declara el Objeto Connection
ResultSet rs=null; // Declara el Objeto ResultSet
String url="jdbc:odbc:datos"; // Se define la cadena de conexión
// (nombre del ODBC:datos)
String usuario="";
String password="";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
cn=DriverManager.getConnection(url,usuario,password);
}
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
} } }
4. Definir el objeto Statement para el manejo de comandos. (Se requiere que la
conexión está abierta)
Ejemplo:
package comercial;
import java.sql.*;
public class GestionBD {
public static void main(String[] args) {
Statement stmt=null; // Declara el Objeto Statement
Connection cn=null; // Declara el Objeto Connection
ResultSet rs=null; // Declara el Objeto ResultSet
String url="jdbc:odbc:datos"; // Se define la cadena de conexión (nombre del
// ODBC:datos)
String usuario="";
String password="";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
cn=DriverManager.getConnection(url,usuario,password);
stmt=cn.createStatement(); // Se crea el comando
}
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
} } }
Abrir conexión
Crear el objeto comando
UNIVERSIDAD PRIVADA TELESUP
91
5. Crear el esquema de datos (Objeto ResultSet) : A partir de la ejecución del
comando Select.
package comercial;
import java.sql.*;
public class GestionBD {
public static void main(String[] args) {
Statement stmt=null; // Declara el Objeto Statement
Connection cn=null; // Declara el Objeto Connection
ResultSet rs=null; // Declara el Objeto ResultSet
String url="jdbc:odbc:datos"; // Se define la cadena de conexión // (nombre del
ODBC:datos)
String usuario="";
String password="";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
cn=DriverManager.getConnection(url,usuario,password);
stmt=cn.createStatement(); // Se crea el comando
rs=stmt.executeQuery("select * from Clientes");
}
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
} } }
6. Visualizar el contenido del esquema de datos
package comercial;
import java.sql.*;
public class GestionBD {
public static void main(String[] args) {
Statement stmt=null; // Declara el Objeto Statement
Connection cn=null; // Declara el Objeto Connection
ResultSet rs=null; // Declara el Objeto ResultSet
String url="jdbc:odbc:datos"; // Se define la cadena de conexión (nombre del
ODBC:datos)
String usuario="";
String password="";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
cn=DriverManager.getConnection(url,usuario,password);
stmt=cn.createStatement(); // Se crea el comando
rs=stmt.executeQuery("select * from Clientes");
while(rs.next()) // método avance al siguiente y devuelve true
{
Crear el esquema de Datos
UNIVERSIDAD PRIVADA TELESUP
92
System.out.print(rs.getString("Codcli")+"\t");
System.out.print(rs.getString("Apecli")+"\t");
System.out.print(rs.getString("Nomcli")+"\t");
System.out.print(rs.getString("Dircli")+"\t");
System.out.println(""); } }
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
} } }
7. Cerrar la conexión y el esquema de datos. Ejemplo completo:
package comercial;
import java.sql.*;
public class GestionBD {
public static void main(String[] args) {
Statement stmt=null; // Declara el Objeto Statement
Connection cn=null; // Declara el Objeto Connection
ResultSet rs=null; // Declara el Objeto ResultSet
String url="jdbc:odbc:datos"; // Se define la cadena de conexión (nombre del
ODBC:datos)
String usuario="";
String password="";
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
cn=DriverManager.getConnection(url,usuario,password);
stmt=cn.createStatement(); // Se crea el comando
rs=stmt.executeQuery("select * from Clientes");
while(rs.next()) // método avance al siguiente y devuelve true
{
System.out.print(rs.getString("Codcli")+"\t");
System.out.print(rs.getString("Apecli")+"\t");
System.out.print(rs.getString("Nomcli")+"\t");
System.out.print(rs.getString("Dircli")+"\t");
System.out.println("");
}
rs.close();
cn.close();
}
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
} } }
Visualiza el
contenido del
esquema de datos.
Se puede utilizar.
Cierra la conexión y el
esquema de datos.
UNIVERSIDAD PRIVADA TELESUP
93
EJECUTANDO SENTENCIAS SQL
La Interfaz Statement
Este tipo de interfaz nos permite definir un tipo de comando MDL de SQL (select,
insert, update, delete) y ejecutarlo.
Los métodos más importantes de la interfaz Statement son:
Método Descripción
void cancel() Cancela el objeto Statement, abortando la sentencia
SQL correspondiente.
void close() Cierra el objeto Statement liberando todos los
recursos asociados de forma inmediata.
boolean execute(String sql) Ejecuta la sentencia SQL que se pasa por parámetro
ResultSet
executeQuery(String sql)
Ejecuta una sentencia SQL que devuelve un
conjunto de resultados, representando por el objeto
ResultSet.
int executeUpdate(String sql) Ejecuta la sentencia SQL que se pasa por parámetro
y debe ser del tipo INSERT, UPDATE o DELETE
Connection getConnection() Devuelve el objeto Connection a partir del que se ha
creado el objeto Statement
Creando un objeto Statement
Una vez que se ha establecido una conexión a una base de datos determinada, esta
conexión se puede utilizar para enviar sentencias SQL a la base de datos. Un objeto
Statement se crea con el método createStatement() de la clase Connection, como se
puede observar en el fragmento de código que se muestra a continuación:
Connection cn=DriverManager.getConnection(url,”pepe”,”xxx”);
Statement st=cn.createStatement();
No olvidemos que si se trata de un comando Select que se desea ejecutar,
invocaremos al método executeQuery. Ejemplo:
Connection cn=DriverManager.getConnection(url,”pepe”,”xxx”);
Statement st=cn.createStatement();
rs=st.executeQuery(“Select * from clientes”);
Si se trata de los comandos insert, update, delete y otros que modifican los datos de
una tabla, utilizaremos el método executeUpdate. Ejemplo:
Connection cn=DriverManager.getConnection(url,”pepe”,”xxx”);
Statement st=cn.createStatement();
st.executeQuery(“insert into Clientes values (“„001‟,‟Garcia Díaz‟,‟Carla‟”);
UNIVERSIDAD PRIVADA TELESUP
94
MANIPULANDO RESULTADOS
La Interfaz Resultset
Es necesario usar un objeto que almacena todos los datos del resultado de una
consulta, este objeto se llama ResultSet. JDBC devuelve los resultados en un objeto
ResultSet, por eso necesitamos declarar un ejemplar de la clase ResultSet para
contener los resultados. el siguiente código presenta el objeto ResultSet: rs y le asigna
el resultado de una consulta anterior.
ResultSet rs=st.executeQuery(“Select codcli,apecli,nomcli from Clientes”);
El ResultSet es una estructura similar a la tabla de datos con la diferencia que nos es
física, sino de tipo virtual, se creará en la memoria del Servidor y desde allí se tomarán
los datos para mostrarlos posteriormente en el cliente.
MÉTODOS DEL RESULTSET
Nombre del Método Descripción
previous() Envía el puntero a la fila anterior del objeto ResultSet. (Devuelve
true si encuentra la fila anterior)
next() Envía el puntero a la fila siguiente del objeto ResultSet. (Devuelve
true si encuentra la fila siguiente)
first() Envía el puntero a la primera fila del objeto ResultSet. (Devuelve
true si se encuentra primera fila)
last() Envía el puntero a la última fila del objeto ResultSet. (Devuelve
true si se encuentra última fila)
isFirst() Devuelve verdadero, si el puntero se encuentra en la primera fila
getString() Captura un dato de tipo String del esquema de datos
getInt() Captura un dato de tipo int del esquema de datos
getDate() Captura un dato de tipo Date del esquema de datos
getBoolean() Captura un dato de tipo boolean del esquema de datos
getDouble() Captura un dato de tipo double del esquema de datos
getLong() Captura un dato de tipo long del esquema de datos
EL MÉTODO NEXT
El método next mueve al puntero o cursor a la siguiente fila y hace que esa fila
(llamada fila actual) sea con la que podamos operar. Como el cursor inicialmente se
posiciona justo encima de la primera fila de un objeto ResultSet, primero debemos
llamar al método next para mover el cursor a la primera fila y convertirla en al fila
actual. Sucesivas invocaciones del método next moverán el cursor de línea en línea
hacia adelante. Existen otros métodos con los cuales podemos mover el puntero de la
tabla o consultar sobre la posición actual del puntero (En la tabla anterior, aparece la
lista de métodos que mueven el puntero de la tabla).
UNIVERSIDAD PRIVADA TELESUP
95
CONSEGUIR LOS DATOS DEL RESULTSET
Método getXXX
(XXX representa al tipo de dato, ejemplo: getDouble(), getString(), getLong(), etc)
Los métodos getXXX del tipo apropiado se utilizan para recuperar el valor de cada
columna. Por ejemplo:
rs.getString(1); //Recupera el dato de la primera columna de la fila actual
rs.getString(“CODCLI”); //Recupera el dato de la campo “CODCLI” de la fila actual
Nota: - La primera columna del ResultSet corresponde al número 1
- Podemos referirnos a un dato del ResultSet mediante su número o nombre de
columna.
Para conseguir otros tipos de datos contamos con los siguientes métodos:
getByte
getShort
getInt
getLong
getFloat
getDouble
getBigDecimal
getBoolean
getString
getBytes
getDate
getTime
El ResultSet generado tiene la siguiente estructura:
CodCli ApeCli NomCli DirCli DisCli
0001 Vargas Machuca Luís Alex Av. Tupac Amaru 1254 Comas
0002 García López Jorge Antonio Jr. Amazonas 258 Lima
0003 Sánchez Rojas Randy Av. José Pardo 365 Lince
0004 Salinas Montalvo Carla Jr. Bolívar 2245 Breña
0006 Ore Palomino Julio Cesar Barranco San Pedro
0007 Montalvo Luís San Martín de Porres Av. Perú Cdra 28
0008 Villanueva Freíd Los Olivos Av. Palmeras
0009 Palma López Elian San Juan Av. Las Flores Parad
0010 Lozano Aguirre Víctor Comas Tupac Amaru Km. 16
rs(1) rs(2) rs(3) rs(4) rs(5)
UNIVERSIDAD PRIVADA TELESUP
96
CONEXIÓN CON MÚLTIPLES ORÍGENES DE BASE DE DATOS
Las conexiones JDBC, tal como estudiamos en la semana anterior, nos permiten
conectarnos con diferentes orígenes de datos, lo único que tenemos que hacer es:
Utilizar el driver provisto por el fabricante de la base de datos, la cual implementa la
funcionalidad del JDBC para dicho gestor de Base de Datos. Lo único que variará en
el código fuente es la forma de conexión, mientras que todo lo demás se mantendrá
igual. Veamos algunos ejemplos:
a. Conexión con una base de datos mysql. Nombre de la base de datos: Comercial;
nombre de la tabla: Clientes
Previamente se requiere que el driver de mysql se inserte en el directorio de
librerias externas de Java, situado en la siguiente ruta:
C:\Archivos de programa\Java\jdk1.6.0\jre\lib\ext
Nota: El driver de mysql, se puede descargar de la página de mysql en Internet
(link: Download). El archivo a descargar debe ser un archivo de extensión JAR.
Para nuestro caso, este archivo se llama: mysql-connector-java-5.0.8-bin.jar
(Este nombre puede cambiar de acuerdo al nombre de la versión)
UNIVERSIDAD PRIVADA TELESUP
97
Código fuente de la conexión JDBC con una base de Datos con MySQL
package ConexionMysql;
import java.sql.*;
public class Conexion {
public Conexion() {
}
public static void main(String[] args) {
Statement stmt=null; // Declara el Objeto Statement
Connection cn=null; // Declara el Objeto Connection
ResultSet rs=null; // Declara el Objeto ResultSet
String usuario="root";
String password="telesup";
String host="localhost";
String puerto="3306";
String basededatos="Comercial";
String driver="com.mysql.jdbc.Driver";
String urljdbc = "jdbc:mysql://" + host + ":" + puerto + "/" + basededatos;
try {
Class.forName(driver).newInstance();
cn=DriverManager.getConnection(urljdbc,usuario,password);
stmt=cn.createStatement(); // Se crea el comando
rs=stmt.executeQuery("select * from Clientes");
while(rs.next()) // método avance al siguiente y devuelve true
{
System.out.print(rs.getString("Codcli")+"\t");
System.out.print(rs.getString("Apecli")+"\t");
System.out.print(rs.getString("Nomcli")+"\t");
System.out.print(rs.getString("Dircli")+"\t");
System.out.println("");
}
rs.close();
cn.close();
}
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
} }}
UNIVERSIDAD PRIVADA TELESUP
98
Ejecución de la clase anterior:
Contenido de la tabla Clientes de Mysql desde PHPMyAdmin
UNIVERSIDAD PRIVADA TELESUP
99
TEMA 3
Competencia:
Presentar el Contenido de
una Tabla
Conocer el proceso de presentación adecuada de los contenidos de una tabla.
UNIVERSIDAD PRIVADA TELESUP
100
Tema 03: Presentar el Contenido de una Tabla
Para presentar el contenido de una tabla en una página JSP, se deben realizar los
siguientes pasos:
a. Crear un proyecto Web y copiar hacia este proyecto las clases que nos
permitirán realizar las operaciones con la base de datos.
Crearemos dentro de la categoría Source Package, los paquetes Ds y Model.
Dentro de la categoría WebPages insertaremos una carpeta View para la lógica
de presentación.
UNIVERSIDAD PRIVADA TELESUP
101
b. Importar las clases
<%@page import="Ds.*"%>
<%@page import="Model.*"%>
<%@page import="java.sql.*"%>
c. Instanciar la clase GestionBD y preparar el esquema de datos
<%
GestionBD gbd=new GestionBD();
gbd.conectar();
String cad;
cad="Select * from empleado order by chr_emplcodigo";
ResultSet rs=gbd.ejecutarConsulta(cad);
%>
d. Mostrar los datos del esquema de datos
<% while(rs.next()) { %>
<tr height="20">
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
<td><%=rs.getString(3)%></td>
<td><%=rs.getString(4)%></td>
<td><%=rs.getString(5)%></td>
<td><%=rs.getString(6)%></td>
<td><%=rs.getString(7)%></td>
<td><%=rs.getString(8)%></td>
</tr>
<% } %>
PAGINAR EL CONTENIDO DE UNA TABLA
<%@ page contentType="text/html; charset=iso-8859-1" language="java"
import="java.sql.*, java.util.*,java.lang.*,java.util.*, java.text.*,java.io.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
UNIVERSIDAD PRIVADA TELESUP
102
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="javascript" type="text/javascript">
//CUANDO LE DA CLIC EN SIGUIENTE SE MANDA A LLAMAR ESTA FUNCION
function otraVez(){
document.form1.submit(); }
</script>
<style type="text/css">
BODY {
scrollbar-face-color: #ADD6FE;
scrollbar-highlight-color: #FFFFFF;
scrollbar-shadow-color: #EDEDED;
scrollbar-3dlight-color: #EEEAEE;
scrollbar-arrow-color: #446699;
scrollbar-track-color: #f5f5f5;
scrollbar-darkshadow-color: #98AAB1;
margin-left: 0px;
margin-top: 0px;
.Estilo7 {color: #990000; font-size: 13px; font-family: Arial, Helvetica, sans-serif; font-
weight: bold;}
.Estilo8 {color:#FFFFFF; font-size: 13px; font-family: Arial, Helvetica, sans-serif; font-
weight: bold;}
.Estilo9 {color:#000000; font-size: 12px; font-family: Arial, Helvetica, sans-serif;}
.Estilo10 {color:#0066CC; font-size: 12px; font-family: Arial, Helvetica, sans-serif; font-
weight: bold;}
a:link {
text-decoration: none;
color: #FFFFFF; }
a:visited {
text-decoration: none;
color: #FFFFFF; }
a:hover {
text-decoration: underline; }
a:active {
text-decoration: none; }
UNIVERSIDAD PRIVADA TELESUP
103
</style>
</head>
<%
ResultSet rs1= null;
Statement stmt1 = null;
Connection con1 = null;
String user="";
String pw="";
String url="";
String driverSQL="";
try{
funciones_jsp f = new funciones_jsp();
int total_reg=0;
//-------------- CREACION DE ARREGLO DE LISTA -------------------------------------------
ArrayList lista_fol = new ArrayList();
//- SI ESTA EL ARREGLO VACIO LO LLENA CON LA INFORMACION SOLICITADA -
//-------------- SE REALIZA LA CONSULTA DE SQL ---------------------------------------------
if (lista_fol.isEmpty()){
url = f.urlMttoSQL();
driverSQL = f.driverSQL();
user = f.usuarioSQL();
pw = f.claveSQL();
Class.forName(driverSQL);
con1 = DriverManager.getConnection(url,user,pw);
stmt1 = con1.createStatement();
rs1=stmt1.executeQuery("SELECT folio FROM t_servicios WHERE
tipo='ACLARACION' ORDER BY fecha DESC");
//-------------- BORRO EL CONTENIDO DE LA LISTA --------------------------------------------
lista_fol.clear();
//-------------- SE LLENA LA LISTA CON EL RESULTSET (rs1) -----------------------------
//------- VARIABLE total_reg CONTIENE LA CANTIDAD TOTAL DE REGISTROS -----
while (rs1.next()){
lista_fol.add(new Integer (rs1.getInt("folio")));
total_reg=total_reg+1;
}//while
}//if
%>
<body>
<form name="form1" method="post" action="">
<table width="497" border="0" align="center" cellpadding="2" cellspacing="0"
bordercolor="#CCCCCC">
<tr bgcolor="#3399FF" class="Estilo8">
<td width="104" bgcolor="#0066CC"><div align="center">Folio</div></td>
<td width="255" bgcolor="#0066CC"><div align="center">Mostrar</div></td>
UNIVERSIDAD PRIVADA TELESUP
104
<td width="104" bgcolor="#0066CC"><div align="center">Fecha</div></td>
</tr>
<%
//----------- OBTENGO LOS REGISTROS QUE SE HAN MOSTRADO -----------------------
-------------------//----------- LA PRIMERA VEZ QUE SE EJECUTA LA PAGINA
reg_actual=0 -----------------------------
String reg_actual=request.getParameter("reg_actual"); if (reg_actual==null ||
reg_actual.equals("")) reg_actual="0";
int regActual=Integer.parseInt(reg_actual);
//----------- CANTIDAD DE REGISTROS A PAGINAR 17 (n-1)-----------------------------------
--------------int paginacion=16;
//----------- VARIABLE "HASTA" CONTROLA LA CANTIDAD DE REGISTROS QUE SE
MOSTRANRAN EN PANTALLA ------------
int hasta=regActual+paginacion;
if (hasta>=(total_reg-1)){
hasta=total_reg-1; }
int fol=0;
//----------- MUESTRA EL CONTENIDO DEL ARREGLO DE LISTA EN PANTALLA -----
if (!lista_fol.isEmpty()){
if (hasta<=total_reg){
int renglon=1; //---- VARIABLE PARA DEFINIR EL COLOR DEL RENGLON
for (int i=regActual; i<=hasta; i++){ //---- VACIO EL ARREGLO DE LISTA
Integer fl = ((Integer)lista_fol.get(i));
fol = fl.intValue();
if(renglon % 2 == 0){ // ---- SI ES PAR EL COLOR DEL RENGLON ES BLANCO, SI
NO ES AZUL CLARO
%> <tr class="Estilo9">
<td><%=i+1%>-<%=fol%> </td>
<td> </td>
<td> </td>
</tr>
<% } else { // ---- SI ES IMPAR EL COLOR DEL RENGLON ES AZUL CLARO
%> <tr class="Estilo9">
<td bgcolor="#EFF3FB"><%=i+1%>-<%=fol%> </td>
<td bgcolor="#EFF3FB"> </td>
<td bgcolor="#EFF3FB"> </td>
</tr>
<% }
renglon=renglon+1; //---- INCREMENTO LA VARIABLE
}//for
regActual=hasta+1;//---- CANTIDAD DE REGISTROS QUE SE MUESTRAN EN CADA
CICLO
}//if }
UNIVERSIDAD PRIVADA TELESUP
105
%> <tr bgcolor="#3399FF" class="Estilo8">
<% if (regActual<=21){ //---- NO MUESTRA LA LEYENDA ANTERIOR
%> <td bgcolor="#0066CC"> </td>
<% } else { //---- MUESTRA LA LEYENDA ANTERIOR
%> <td bgcolor="#0066CC"><div align="right"><a href="javascript:history.back()"
class="Estilo8">Anterior</a></div></td>
<% }
%> <td bgcolor="#0066CC"><div align="center"><%=regActual%> registros de
<%=total_reg%></div></td>
<% if (total_reg!=regActual){ //---- MUESTRA LA LEYENDA SIGUIENTE Y LE DA UN
SUBMIT A LA PAGINA EJECUTANDO LA FUNCION OTRAVEZ
%> <td bgcolor="#0066CC"><a href="javaScript:otraVez()"
class="Estilo8">Siguiente</a> </td>
<% } else{ //---- NO MUESTRA LA LEYENDA SIGUIENTE
%> <td bgcolor="#0066CC"> </td>
<% }
%> </tr>
</table>
<!--CAMPO DE TEXTO REG_ACTUAL CONTIENE LOS REGISTROS QUE SE HAN
MOSTRADO -->
<input name="reg_actual" type="text" id="reg_actual" value="<%=regActual%>">
<% } catch (Exception e) {
%> <table width="585" border="0" align="center">
<tr>
<td width="240" class="Estilo7"> </td>
<td width="241" class="Estilo7"> </td>
</tr>
<tr>
<td class="Estilo7"> </td>
<td class="Estilo7"><div align="right"><a href="javascript:history.back()"><img
src="../imagenes/btnregresar.gif" width="81" height="16" border="0"></a></div></td>
</tr>
<tr>
<td class="Estilo7"> </td>
<td class="Estilo7"> </td>
</tr>
<tr>
<td colspan="2" class="Estilo7"><div align="center">Se genero un error consulte a su
Administrador</div></td>
</tr>
<tr>
<td colspan="2" class="Estilo7"><div align="center">Gracias<%=e%></div></td>
</tr>
</table>
UNIVERSIDAD PRIVADA TELESUP
106
v<% } finally {
if (con1!=null) {
rs1.close();
rs1=null;
stmt1.close();
stmt1=null;
con1.close();
con1=null;
}//if
}//finally
%>
</form>
</body>
</html>
MANTENIMIENTO DE DATOS
A continuación presentaremos el código fuente de las páginas que nos permitirán
realizar las operaciones de mantenimiento de datos.
Listado de Datos
CLIENTES.JSP
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="MiSistema.*"%>
<html>
<head><title>Mantenimiento de Clientes</title></head>
<body bgcolor=beige>
<center>
<h1>Listado de Clientes</h1>
</center>
<hr>
<PRE>
<form NAME="FrmClientes" action="insertarcli.jsp" METHOD="Post">
Apellidos: <input type=text name="txtapecli">
Nombres: <input type=text name="txtnomcli">
Direccion: <input type=text name="txtdircli">
Distrito: <input type=text name="txtdiscli">
</PRE>
<input type="submit" name="btnInsertar" value="Insertar">
<input type="reset" name="btnLimpiar" value="Limpiar">
</form>
<%
UNIVERSIDAD PRIVADA TELESUP
107
GestionBD gd=new GestionBD();
ResultSet rs=null;
gd.conectar();
rs=gd.ejecutarConsulta("Select * from Clientes");
int i=0;
%>
<center>
<table border=0 cellpadding='2'>
<tr>
<th bgcolor="#828EFF"></TH>
<th bgcolor="#828EFF">CODIGO</TH>
<th bgcolor="#828EFF" width='20%'>APELLIDOS</TH>
<th bgcolor="#828EFF" width='20%'>NOMBRES</TH>
<th bgcolor="#828EFF" width='40%'>DIRECCION</TH>
<th bgcolor="#828EFF" width='55%'>DISTRITO</TH>
<th bgcolor="#828EFF"></TH>
</tr>
<form method=get action=eliminar2.jsp>
<%
String codigo="";
while (rs.next())
{ i+=1;
codigo=rs.getString(1);
if(i%2==0)
{%>
<tr>
<td>
<input type=checkbox name=marca value=<%=codigo%>>
</td>
<td align=center bgcolor="#DDFFFC"><A HREF=ficha.jsp?codi=<%=codigo%>>
<%=rs.getString(1)%></A>
</td>
<td bgcolor="#DDFFFC" width='20%'>
<%=rs.getString(2)%>
</td>
<td bgcolor="#DDFFFC" width='20%'>
<%=rs.getString(3)%>
</td>
<td bgcolor="#DDFFFC" width='40%'>
<%=rs.getString(4)%>
</td>
<td bgcolor="#DDFFFC" width='55%'>
<%=rs.getString(5)%>
</td>
UNIVERSIDAD PRIVADA TELESUP
108
<td>
<A HREF=eliminar.jsp?cod=<%=codigo%>>Eliminar</A>
</td>
</tr>
<%}
else { %>
<tr>
<td>
<input type=checkbox name=marca value=<%=codigo%>>
</td>
<td align=center bgcolor="#8BC8E4"><A HREF=ficha.jsp?codi=<%=codigo%>>
<%=rs.getString(1)%></A>
</td>
<td bgcolor="#8BC8E4" width='20%'>
<%=rs.getString(2)%>
</td>
<td bgcolor="#8BC8E4" width='20%'>
<%=rs.getString(3)%>
</td>
<td bgcolor="#8BC8E4" width='40%'>
<%=rs.getString(4)%>
</td>
<td bgcolor="#8BC8E4" width='55%'>
<%=rs.getString(5)%>
</td>
<td>
<A HREF=eliminar.jsp?cod=<%=codigo%>>Eliminar</A>
</td>
</tr>
<% }
} %>
</table>
</center>
<input type="submit" name="btnEliminar2" value="Eliminar">
</form>
</body>
</html>
INSERTAR CLIENTES
insertarcli.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="MiSistema.*"%>
<html>
UNIVERSIDAD PRIVADA TELESUP
109
<head><title>JSP Page</title></head>
<body>
<% GestionBD gd=new GestionBD();
gd.conectar();
String cod=gd.generarcodigo();
String ape=request.getParameter("txtapecli");
String nom=request.getParameter("txtnomcli");
String dir=request.getParameter("txtdircli");
String dis=request.getParameter("txtdiscli");
gd.insertar(cod,ape,nom,dir,dis);
response.sendRedirect("http://localhost:8084/SISTEMAWEB/clientes.jsp");
%>
</body>
</html>
ELIMINAR CLIENTES
Eliminar.JSP
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="MiSistema.*"%>
<%
GestionBD gd=new GestionBD();
gd.conectar();
String cod=request.getParameter("cod");
gd.eliminar(cod);
response.sendRedirect("http://localhost:8084/SISTEMAWEB/clientes.jsp");
%>
<html>
<head><title>JSP Page</title></head>
<body>
<%-- <jsp:useBean id="beanInstanceName" scope="session"
class="beanPackage.BeanClassName" /> --%>
<%-- <jsp:getProperty name="beanInstanceName" property="propertyName" /> --%>
</body>
</html>
MODIFICAR CLIENTES
Ficha.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="MiSistema.*"%>
<%
UNIVERSIDAD PRIVADA TELESUP
110
GestionBD gd=new GestionBD();
ResultSet rs=null;
gd.conectar();
String cod=request.getParameter("codi");
rs=gd.buscar(cod);
rs.next();
%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>Ficha</h1>
<hr>
<PRE>
<form NAME="FrmFicha" action="grabar.jsp" METHOD="Post">
Codigo: <input type=text name="txtcodcli" value=<%=rs.getString(1)%>><br>
Apellidos: <input type=text name="txtapecli" value='<%=rs.getString(2)%>'><br>
Nombres: <input type=text name="txtnomcli" value='<%=rs.getString(3)%>'><br>
Direccion: <input type=text name="txtdircli" size=40
value='<%=rs.getString(4)%>'><br>
Distrito: <input type=text name="txtdiscli" value='<%=rs.getString(5)%>'><br>
</PRE>
<input type="submit" name="btnGrabar" value="Grabar">
<input type="reset" name="btnLimpiar" value="Limpiar">
</form>
GRABAR MODIFICACIONES
Grabar.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="MiSistema.*"%>
<% GestionBD gd=new GestionBD();
gd.conectar();
String cod=request.getParameter("txtcodcli");
String ape=request.getParameter("txtapecli");
String nom=request.getParameter("txtnomcli");
String dir=request.getParameter("txtdircli");
String dis=request.getParameter("txtdiscli");
gd.modificar(cod,ape,nom,dir,dis);
response.sendRedirect("http://localhost:8084/SISTEMAWEB/clientes.jsp");
%>
<html>
<head><title>JSP Page</title></head>
</body>
</html>
UNIVERSIDAD PRIVADA TELESUP
111
TEMA 4
Competencia:
La Interface
Preparedstament y Callablest
Describir las propiedades y funcionalidades de la Interface Preparedstament y Callablestament.
UNIVERSIDAD PRIVADA TELESUP
112
Tema 04: La Interface Preparedstament y Callablest
Algunas veces es más conveniente o eficiente utilizar objetos PreparedStatement
para enviar sentencias SQL a la base de datos. Este tipo especial de sentencias se
deriva de una clase más general, Statement, que ya conocemos.
Cuándo utilizar un Objeto PreparedStatement
Si queremos ejecutar muchas veces un objeto Statement, reduciremos el tiempo de
ejecución si utilizamos un objeto PreparedStatement, en su lugar. La característica
principal de un objeto PreparedStatement es que, al contrario que un objeto
Statement, se le entrega una sentencia SQL cuando se crea. La ventaja de esto es
que en la mayoría de los casos, esta sentencia SQL se enviará al controlador de la
base de datos inmediatamente, donde será compilado. Como resultado, el objeto
PreparedStatement no sólo contiene una sentencia SQL, sino una sentencia SQL que
ha sido precompilada. Esto significa que cuando se ejecuta la PreparedStatement, el
controlador de base de datos puede ejecutarla sin tener que compilarla primero.
Aunque los objetos PreparedStatement se pueden utilizar con sentencias SQL sin
parámetros, probablemente nosotros utilizaremos más frecuentemente sentencias con
parámetros. La ventaja de utilizar sentencias SQL que utilizan parámetros es que
podemos utilizar la misma sentencia y suministrar distintos valores cada vez que la
ejecutemos. Veremos un ejemplo de esto en las páginas siguientes.
Crear un Objeto PreparedStatement
Al igual que los objetos Statement, creamos un
objeto PreparedStatement con un objeto
Connection. Utilizando nuestra conexión cn abierta
en ejemplos anteriores, podríamos escribir lo
siguiente instrucción para crear un objeto
PreparedStatement que tome dos parámetros de entrada.
PreparedStatement ps=cn.prepareStatement("UPDATE PRODUCTOS SET
STOCKPRO = ? WHERE NOMPRO LIKE ?");
UNIVERSIDAD PRIVADA TELESUP
113
La variable ps contiene la sentencia SQL, "UPDATE PRODUCTOS SET STOCPRO =
? WHERE NOMPRO LIKE ?", que también ha sido, en la mayoría de los casos,
enviada al controlador de la base de datos, y ha sido precompilado.
Suministrar Valores para los Parámetros de un PreparedStatement
Necesitamos suministrar los valores que se utilizarán en los lugares donde están las
marcas de interrogación, si hay alguno, antes de ejecutar un objeto
PreparedStatement. Podemos hacer esto llamando a uno de los métodos setXXX
definidos en la clase PreparedStatement. Si el valor que queremos sustituir por una
marca de interrogación es un int de Java, podemos llamar al método setInt. Si el valor
que queremos sustituir es un String de Java, podemos llamar al método setString,
etc. En general, hay un método setXXX para cada tipo Java. Utilizando el objeto ps
del ejemplo anterior, la siguiente línea de código selecciona la primera marca de
interrogación para un int de Java, con un valor de 75.
ps.setInt(1, 75);
Cómo podríamos asumir a partir de este ejemplo, el primer argumento de un método
setXXX indica la marca de interrogación que queremos seleccionar, y el segundo
argumento el valor que queremos ponerle. El siguiente ejemplo selecciona la segunda
marca de interrogación con el string "Arroz".
ps.setString(2, "Arroz");
Después de que estos valores hayan sido asignados para sus dos parámetros, la
sentencia SQL de ps será equivalente a la sentencia SQL que hay en el string cad del
siguiente ejemplo. Por lo tanto, los dos fragmentos siguientes de código hacen lo
mismo.
Código 1
String cad="UPDATE PRODUCTOS SET STOCKPRO=75 WHERE NOMPRO LIKE
'Arroz'";
stmt.executeUpdate(cad);
Código 2
PreparedStatement ps=cn.prepareStatement("UPDATE PRODUCTOS SET
STOCKPRO=? WHERE NOMPRO LIKE ?");
ps.setInt(1, 75);
ps.setString(2, "Arroz");
ps.executeUpdate().
UNIVERSIDAD PRIVADA TELESUP
114
Mirando esto ejemplos podríamos preguntarnos por qué utilizar un objeto
PreparedStatement con parámetros en vez de una simple sentencia, ya que la
sentencia simple implica menos pasos. Si actualizáramos la columna STOCKPRO
sólo una o dos veces, no sería necesario utilizar una sentencia SQL con parámetros.
Si por otro lado, tuviéramos que actualizarla frecuentemente, podría ser más fácil
utilizar un objeto PreparedStatement, especialmente en situaciones cuando la
utilizamos con un bucle while para seleccionar un parámetro a una sucesión de
valores. Veremos este ejemplo más adelante en esta sección.
Una vez que a un parámetro se ha asignado un valor, el valor permanece hasta que lo
resetee otro valor o se llame al método clearParameters. Utilizando el objeto
PreparedStatement: ps, el siguiente fragmento de código reutiliza una sentencia
prepared después de resetar el valor de uno de sus parámetros, dejando el otro igual.
Utilizar una Bucle para asignar Valores
Normalmente se codifica más sencillo utilizando un bucle for o while para asignar
valores de los parámetros de entrada. El siguiente fragmento de código demuestra la
utilización de un bucle for para asignar los parámetros en un objeto
PreparedStatement: ps. El array stocks contiene las cantidades del stock de los
productos. Estas cantidades corresponden con los nombres de los productos listados
en el array productos, por eso la primera cantidad de stocks (175) se aplica al primer
nombre de productos ("Arroz"), la segunda cantidad de stocks (150) se aplica al
segundo nombre de productos ("Azúcar"), etc. Este fragmento de código demuestra la
actualización de la columna STOCKPRO para todos los Nombre de Productos de la
tabla PRODUCTOS.
PreparedStatement ps;
String cad="update PRODUCTOS set STOCPRO=? where NOMPRO like ?";
ps=con.prepareStatement(cad);
int[] stocks={175, 150, 60, 155, 90};
String[] productos={"Arroz","Azúcar","Aceite","Mantequilla","Leche"};
int len=stocks.length;
for(int i=0;i<len;i++)
{ ps.setInt(1, stocks[i]);
ps.setString(2, productos[i]);
ps.executeUpdate();
}
UNIVERSIDAD PRIVADA TELESUP
115
Cuando el propietario quiere actualizar los nuevos stocks de la semana siguiente,
puede utilizar el mismo código como una plantilla. Todo lo que tiene que hacer es
introducir las nuevas cantidades en el orden apropiado en el array stocks. Los
nombres de los productos permanecen constantes, por eso no necesitan cambiarse.
(En una aplicación real, los valores probablemente serán introducidos por el usuario en
vez de hacerlos a través de un array).
Valores de retorno del método executeUpdate
Siempre que executeQuery devuelve un objeto ResultSet que contiene los resultados
de una petición al controlador de la base datos, el valor devuelto por executeUpdate
es un int que indica cuántas líneas de la tabla fueron actualizadas. Por ejemplo, el
siguiente código muestra el valor de retorno de executeUpdate asignado a la variable
n.
ps.setInt(1, 50);
ps.setString(2, "Arroz");
int n=ps.executeUpdate(); //n recepciona la cantidad de filas que fueron
actualizadas
La tabla PRODUCTOS se ha actualizado poniendo el valor 50 en la columna
STOCPRO de la fila correspondiente a Arroz. La actualización afecta sólo a una línea
de la tabla, por eso n es igual a 1.
Cuando el método executeUpdate es utilizado para ejecutar una sentencia DDL,
como la creación de una tabla, devuelve el int: 0. Consecuentemente, en el siguiente
fragmento de código, que ejecuta la sentencia DDL utilizada para crear la tabla
PRODUCTOS, n tendrá el valor 0.
String comando=”Create Tables categorías(codcat char(3), nomcat varchar(25));
int n = executeUpdate(comando); // n = 0
Observa que cuando el valor devuelto por executeUpdate sea 0, puede significar dos
cosas: (1) la sentencia ejecutada no ha actualizado ninguna fila, o (2) la sentencia
ejecutada fue una sentencia DDL.
LA INTERFACE CALLABLESTATEMENT
Ejecución de Procedimientos Almacenados
Antes de explicar detalladamente el uso de la interfaz CallableStatment, analicemos
brevemente: ¿Qué son los procedimientos almacenados?
UNIVERSIDAD PRIVADA TELESUP
116
¿QUÉ ES UN PROCEDIMIENTO ALMACENADO?
Un procedimiento almacenado (stored procedure en inglés) es un programa (o
procedimiento) el cual es almacenado físicamente en una base de datos. Su
implementación varía de un manejador de bases de datos a otro. Un procedimiento
almacenado es un elemento de base de datos reutilizable almacenado que realiza
alguna operación en la base de datos. Un procedimiento almacenado contiene código
SQL que puede, entre otras cosas, insertar, actualizar o eliminar registros. Los
procedimientos almacenados también pueden alterar la estructura de la base de datos.
Por ejemplo, puede utilizar un procedimiento almacenado para añadir una columna de
tabla o incluir borrar una tabla. Un procedimiento almacenado también
puede llamar a otro procedimiento almacenado, así como aceptar
entradas y devolver múltiples valores al procedimiento llamado en
forma de parámetros de salida. Habitualmente los procedimientos
almacenados se escriben en un lenguaje de bases de datos propietario.
VENTAJAS DEL TRABAJO CON PROCEDIMIENTOS ALMACENADOS
Seguridad: Cuando llamamos a un procedimiento almacenado, este deberá
realizar todas las comprobaciones pertinentes de seguridad y seleccionará la
información lo más precisamente posible, para enviar de vuelta la información justa
y necesaria y que por la red corra el mínimo de información, consiguiendo así un
aumento del rendimiento de la red considerable.
Rendimiento: el SGBD, en este caso MySQL, es capaz de trabajar más rápido con
los datos que cualquier lenguaje del lado del servidor, y llevará a cabo las tareas
con más eficiencia. Solo realizamos una conexión al servidor y este ya es capaz
de realizar todas las comprobaciones sin tener que volver a establecer una
conexión. Esto es muy importante, una vez leí que cada conexión con la BD puede
tardar hasta medios segundo, imagínate en un ambiente de producción con muchas
visitas como puede perjudicar esto a nuestra aplicación…Otra ventaja es la
posibilidad de separar la carga del servidor, ya que si disponemos de un servidor
de base de datos externo estaremos descargando al servidor web de la carga de
procesamiento de los datos.
Reutilización: el procedimiento almacenado podrá ser invocado desde cualquier
parte del programa, y no tendremos que volver a armar la consulta a la BD cada
qué vez que queramos obtener unos datos.
UNIVERSIDAD PRIVADA TELESUP
117
CALLABLESTATEMENT
Un objeto CallableStatement es una interface JDBC utilizado para llamar o ejecutar
procedimientos almacenados de la base de datos desde una aplicación Java.
Antes de usar CallableStatement debemos saber si nuestro Gestor de Base de Datos
soporta y usa procedimientos almacenados, para este propósito el método
supportsStoredProcedures devolverá true si la DBMS soporta llamadas a
procedimientos almacenados y el método getProcedures devolverá una descripción
de los procedimientos almacenados disponibles.
CALLABLESTATEMENT hereda los métodos de Statement, los cuales tratan
sentencias SQL en general, y también hereda los métodos de PreparedStatement, que
tratan los parámetros IN. Todos los métodos definidos para CallableStatement tratan
los parámetros OUT o los aspectos de salida de los parámetros INOUT: registro de los
tipos JDBC (tipos genéricos SQL) de los parámetros OUT, recuperación de valores
desde ellos o chequear si el valor devuelto es un JDBC NULL.
Crear objetos CallableStatement
Los objetos CallableStatement se crean con el método prepareCall de Connection. El
siguiente ejemplo crea una instancia de CallableStatement que contiene una llamada
al procedimiento almacenado getTestData, con dos argumentos y no devuelve
resultados.
CallableStatement cs = cn.prepareCall("{call getTestData(?, ?)}");
Los los encajes „?‟ son parámetros IN, OUT ó INOUT dependiendo del procedimiento
getTestData.
Parámetros IN y OUT
El paso de valor para cualquier parámetro IN de un objeto CallableStatement se
realiza mediante los métodos setXXX heredados de PreparedStatement. El tipo de el
valor a pasar se determina por el método setXXX a usar (setFloat para pasar un valor
float, setString para pasar un valor String y así por estilo).
Si el procedimiento almacenado devuelve parámetros
OUT, el tipo JDBC de cada parámetro OUT debe ser
registrado antes de que el objeto CallableStatement sea
ejecutado. El registro del tipo JDBC se realiza mediante el
método registerOutParameters. Después que la sentencia ha sido ejecutada, los
métodos getXXX de CallableStatement recuperan los valores de los parámetros.
UNIVERSIDAD PRIVADA TELESUP
118
Para ilustrar esto, el siguiente ejemplo registra los parámetros OUT, ejecuta el
procedimiento almacenado llamado por cs y recupera los valores devueltos en los
parámetros OUT. El método getInt recupera un int del primer parámetro, y getDouble
recupera un doublé del segundo parámetro OUT:
CallableStatement cs = con.prepareCall("{call getTestData(?, ?)}");
cs.registerOutParameter(1, java.sql.Types.TINYINT);
cs.registerOutParameter(2, java.sql.Types.DECIMAL);
cs.executeQuery(); //Ejecuta el procedimiento almacenado
byte x = cs.getint(1); //Recupera el valor del 1er parámetro de salida
double n = cs.getDouble(2); //Recupera el 2do parámetro de salida
Parámetros INOUT
Son parámetros que suministran entradas así como aceptan salidas. Estos requieren
llamar a los métodos apropiados setXXX (heredados de PreparedStatement) además
de llamar al método registerOutParameter. Los métodos setXXX fijan los valores como
parámetros de entrada y registerOutParameter registra sus tipos JDBC como
parámetros de salida. El método setXXX suministra un valor Java que el driver
convierte en un valor JDBC antes de enviarlo a la base de datos.
El tipo JDBC del valor IN y el tipo JDBC para suministrado al método
registerOutParameter debe ser el mismo. Luego, para recuperar el valor de salida, se
usa el método apropiado getXXX. Por ejemplo, un parámetro cuyo tipo Java es byte
debería usar el método setByte para asignar el valor de entrada, debería suplir un
TINYINT como tipo JDBC para registerOutParameter, y debería usar getByte para
recuperar el valor de salida El siguiente ejemplo asume que existe un procedimiento
almacenado reviseTotal con un único parámetro INOUT. El método setByte fija el
valor del parámetro a 25 que es el que el driver enviará a la base de datos como un
JDBC TINYINT. Después registerOutParameter registrará el parámetro como un JDBC
TINYINT. Luego que el procedimiento sea ejecutado se devolverá un nuevo JDBC
TINYINT y el método getByte lo recuperará como un nuevo valor byte Java.
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1);
UNIVERSIDAD PRIVADA TELESUP
119
Recuperar parámetros OUT después de resultados
Dadas las limitaciones impuestas por algunas DBMS, se recomienda en aras de la
máxima portabilidad, que todos los resultados generados por la ejecución de un objeto
CallableStatement deberían recuperarse antes que los parámetros OUT usando los
métodos CallableStatement.getXXX. Si un objeto CallableStatement devuelve
múltiples objetos ResultSet (mediante una llamada al método execute), todos los
resultados deben recuperarse antes que los parámetros OUT. En este caso, debe
asegurarse de que todos los resultados han sido accedidos, los métodos de Statement
getResultSet, getUpdateCount y getMoreResults necesitan ser llamados hasta que no
haya más resultados. Después de hecho esto, los valores de los parámetros OUT
pueden ser recuperados mediante los métodos CallableStatement.getXXX.
Recuperar valores NULL en parámetros OUT
El valor devuelto en un parámetro OUT puede ser JDBC NULL. Cuando esto ocurre, le
valor JDBC NULL se convertirá de forma que el valor devuelto por el método getXXX
sea null, 0 o false dependiendo del tipo del método getXXX usado. Como con los
objetos ResultSet, la única manera de saber si un valor de 0 o false fue originalmente
NULL JDBC es testear el método wasNull, que devuelve true si el último valor leído
por un método getXXX fue JDBC NULL y false en caso contrario.
Métodos de CallableStatement
Registro de los parámetros: registerOutParameter()
public abstract void registerOutParameter( int indiceParametro, int tipoSQL [, int
decimales] ) throws SQLException
Debe llamarse antes de ejecutar la orden precompilada para registrar los tipos SQL de
cada uno de los parámetros de salida.
Parámetros nulos: wasNull()
public abstract boolean wasNull() throws SQLException
Devuelve true si el valor previamente leído con un método getXXX() era realmente
nulo.
Obtención de valores: getXXX()
public abstract tipoJava getXXX(int indiceParametro) throws SQLException
Obtienen el valor SQL contenido en el parámetro como un tipoJava, o un null si se
trataba de un valor NULL de SQL.
UNIVERSIDAD PRIVADA TELESUP
120
Método getXXX() tipo Java tipo SQL Resultado para un SQL NULL
GetString String CHAR, VARCHAR o
LONGVARCHAR
Null
getBoolean Boolean BIT false
GetByte Byte TINYINT cero
GetShort Short SMALLINT cero
GetInt Int INTEGER cero
GetLong Long BIGINT cero
GetFloat Float FLOAT cero
getDouble Doublé DOUBLE cero
getBigDecimal* BigDecimal NUMERIC Null
GetBytes byte[] BINARY o
VARBINARY
Null
GetDate Date DATE Null
GetTime Time TIME Null
getTimestamp Timestamp TIMESTAMP Null
Caso Práctico
Realizar una aplicación Java que utilizando procedimientos almacenados consulte que
cuentas corresponde a una sucursal de un banco,
Código de Búsqueda
Este código crea un CallableStatement para ejecutar el procedimiento almacenado
usp_filtra_ctas_sucur que usa un parámetro de entrada, con el método setString
ingresamos el valor del primer parámetro de entrada y luego ejecutamos el
procedimiento almacenado con el método executeQuery, porque se trata de un
comando Select
UNIVERSIDAD PRIVADA TELESUP
121
gbd.conectar();
CallableStatement cs=null;
cs=gbd.cn.prepareCall("{call usp_filtra_ctas_sucur(?)}");
cs.setString(1,((String)jComboBox1.getSelectedItem()).substring(0,3));
ResultSet rs=cs.executeQuery();
CÓDIGO DEL PROCEDIMIENTO ALMACENADO
USP_FILTRA_CTAS_SUCUR
DELIMITER $$
DROP PROCEDURE IF EXISTS `Eurekabank`.`usp_filtra_ctas_sucur`$$
CREATE PROCEDURE `usp_filtra_ctas_sucur`(IN codsucu char(3))
BEGIN
select * from cuenta where chr_sucucodigo=codsucu;
END$$
DELIMITER;
EJECUCIÓN DE PROCEDIMIENTOS ALMACENADOS
Un procedimiento almacenado luego de ser creado en Mysql, puede ser ejecutado de
la siguiente forma:
call usp_filtra_ctas_sucur(„001‟);
Desde Java, para ejecutar un procedimiento almacenado debemos:
CallableStatement cs=null;
cs=cn.prepareCall("{call usp_filtra_ctas_sucur(?)}"); cs.setString(1,”002”);
ResultSet rs=cs.executeQuery();
UNIVERSIDAD PRIVADA TELESUP
122
1. Modifique el programa de mantenimiento de datos y adáptelo
para que trabaje con Procedimientos almacenados.
Envíalo a través de "Procedimientos Almacenados".
Lecturas Recomendadas
INTRODUCCIÓN AL JDBC
http://eisc.univalle.edu.co/materias/BD/IntroduccionAlJDBC.pdf
JAVA DATABASE CONNECTIVITY
http://es.wikipedia.org/wiki/Java_Database_Connectivity
Actividades y Ejercicios
UNIVERSIDAD PRIVADA TELESUP
123
Autoevaluación
1) Los Driver, también llamados ___________, son un conjunto de clases que
implementan las clases e interfaces del API JDBC:
a. Manejadores.
b. Sybase.
c. Hacer los algoritmos de nuestro proyecto.
d. Propiedades.
e. Consolas.
2) ¿Cuántos tipos de manejadores JDBC hay?
a. Dos.
b. Tres.
c. Cuatro.
d. Ocho.
e. Siete.
3) Registrar un _____________ no es más que cargar en memoria una clase que
implementa el interfaz Driver.
a. Statement.
b. Callable.
c. Manejador.
d. Protocolo.
e. Subprotocolo.
4) ¿Cual es una función del JDBC?
a. Detener la función de la base de datos.
b. Establecer una conexión con dos tablas.
c. Decodificar los datos.
d. Procesar los resultados de la consulta.
e. Funciona como un compilador de un lenguaje de programación.
5) Toda URL de JDBC consta siempre de _____ partes.
a. Cuatro
b. Seis
c. Ocho
d. .Diez
e. Tres
UNIVERSIDAD PRIVADA TELESUP
124
6) Todos los métodos que encontramos en esta clase son estáticos:
a. Clase DriverManager.
b. Clase Connection.
c. Clase Statement.
d. Clase PreparedStatement.
e. Clase ResultSet.
7) El Procedimiento almacenado es conocido también como:
a. DriverManager.
b. RequestParameter.
c. Callablestament.
d. PreparedStatement.
e. Stored procedure.
8) Es un elemento de base de datos reutilizable almacenado que realiza alguna
operación en la base de datos:
a. Sentencia.
b. Constante.
c. Variable.
d. Procedimiento almacenado.
e. Clase heredada.
9) Es una interface JDBC utilizado para llamar o ejecutar procedimientos
almacenados de la base de datos desde una aplicación Java.
a. getProcedures.
b. Statement.
c. PreparedStatement.
d. ResultSet.
e. supportsStoredProcedures.
10) Los objetos Statement se cerrarán automáticamente por el:
a. ResultSet.
b. garbage collector.
c. Connection.
d. DriverManager.getConnection.
e. boolean execute.
UNIVERSIDAD PRIVADA TELESUP
125
Resumen
UUNNIIDDAADD DDEE AAPPRREENNDDIIZZAAJJEE iiii::
Con el API JDBC, no es necesario escribir un programa que acceda a una base de
datos Sybase, otro para acceder a Oracle y otro para acceder a Informix. Un único
programa escrito usando el API JDBC y el programa será capaz de enviar sentencias
SQL a la base de datos apropiada. Y, con una aplicación escrita en el lenguaje de
programación Java, tampoco es necesario escribir diferentes aplicaciones para
ejecutar en diferentes plataformas.
Lo que hace la clase DriverManager para intentar establecer conexión con la base de
datos es invocar al método connect de la interface Driver, interface que como veremos
deben implementar todos los manejadores. Realiza esta operación con todos los
manejadores que tiene registrados, si el manejador devuelve null significa que no se
ha podido conectar con la base de datos, y el gestor intenta de nuevo conectarse con
otro manejador.
La característica principal de un objeto PreparedStatement es que, al contrario que un
objeto Statement, se le entrega una sentencia SQL cuando se crea. La ventaja de
esto es que en la mayoría de los casos, esta sentencia SQL se enviará al controlador
de la base de datos inmediatamente, donde será compilado.
Un procedimiento almacenado es un elemento de base de datos reutilizable
almacenado que realiza alguna operación en la base de datos. Un procedimiento
almacenado contiene código SQL que puede, entre otras cosas, insertar, actualizar o
eliminar registros. Los procedimientos almacenados también pueden alterar la
estructura de la base de datos.
UNIVERSIDAD PRIVADA TELESUP
126
UNIVERSIDAD PRIVADA TELESUP
127
Introducción
a) Presentación y contextualización
El modelo–vista–controlador (MVC) es un patrón de arquitectura de software que
separa los datos y la lógica de negocio de una aplicación de la interfaz de usuario y
el módulo encargado de gestionar los eventos y las comunicaciones.
b) Competencia
Conoce las propiedades y funcionalidades del patrón de diseño MVC (Model –
View - Controller).
c) Capacidades
1. Conoce las características y funciones de Servlet.
2. Reconoce los principales pasos para crear un servlet.
3. Analiza el modelo vista controlador (Model – View - Controller).
4. Utiliza objetivamente la consulta de datos (Model – View - Controller).
d) Actitudes
Promueve el uso adecuado de los patrones del (Model – View - Controller).
Cumple cada uno de los pasos para crear un Servlet.
e) Presentación de Ideas básicas y contenido esenciales de la Unidad:
La Unidad de Aprendizaje 03: Patrón de Diseño MVC (Model – View - Controller),
comprende el desarrollo de los siguientes temas:
TEMA 01: Servlet
TEMA 02: Pasos para Crear un Servlet
TEMA 03: Modelo Vista Controlador (MVC).
TEMA 04: Consulta de Datos – MVC.
UNIVERSIDAD PRIVADA TELESUP
128
TEMA 1
Conocer las características y funciones de Servlet.
Competencia:
Servlet
UNIVERSIDAD PRIVADA TELESUP
129
Desarrollo de los Temas
Tema 01: Servlet
Los servlets son objetos que corren
dentro del contexto de un contenedor de
servlets (ej: Tomcat) y extienden su
funcionalidad. También podrían correr
dentro de un servidor de aplicaciones
(ej: OC4J Oracle) que además de
contenedor para servlet tendrá
contenedor para objetos más avanzados como son los EJB (Tomcat sólo es un
contenedor de servlets).
La palabra servlet deriva de otra anterior, applet, que se refería a pequeños programas
escritos en Java que se ejecutan en el contexto de un navegador web. Por
contraposición, un servlet es un programa que se ejecuta en un servidor. El uso más
común de los servlets es generar páginas web de forma dinámica a partir de los
parámetros de la petición que envíe el navegador web. Los servlets forman parte de
JEE (Java Enterprise Edition), que es una ampliación de JSE (Java Standard Edition).
Un servlet es un objeto Java que implementa la
interfaz javax.servlet.Servlet o hereda alguna de
las clases más convenientes para un protocolo
específico (ej: javax.servlet.HttpServlet). Al
implementar esta interfaz el servlet es capaz de
interpretar los objetos de tipo HttpServletRequest
y HttpServletResponse quienes contienen la
información de la página que invocó al servlet. Los Servlets son la respuesta de la
tecnología Java a la programación CGI.
UNIVERSIDAD PRIVADA TELESUP
130
Son programas que se ejecutan en un servidor Web y construyen páginas Web.
Construir páginas Web al vuelo es útil (y comúnmente usado) por un número de
razones:
La página Web está basada en datos enviados por el usuario. Por ejemplo,
las páginas de resultados de los motores de búsqueda se generan de esta
forma, y los programas que procesan pedidos desde sites de comercio
electrónico también.
Los datos cambian frecuentemente. Por ejemplo, un informe sobre el tiempo o
páginas de cabeceras de noticias podrían construir la página dinámicamente,
quizás devolviendo una página previamente construida y luego actualizándola.
Las páginas Web que usan información desde bases de datos corporativas u
otras fuentes. Por ejemplo, usaríamos esto para hacer una página Web en una
tienda on-line que liste los precios actuales y el número de artículos en stock.
UNIVERSIDAD PRIVADA TELESUP
131
Modelo response/request
Aquí tenemos un servlet básico que maneja
peticiones GET. Las peticiones GET, para
aquellos que no estemos familiarizados con
HTTP, son peticiones hechas por el navegador
cuando el usuario escribe una URL en la línea
de direcciones, sigue un enlace desde una página Web, o rellena un formulario que no
especifica un METHOD. Los Servlets también pueden manejar peticiones POST muy
fácilmente, que son generadas cuando alguien crea un formulario HTML que
especifica METHOD="POST".
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Use "request" to read incoming HTTP headers (e.g.
cookies)
// and HTML form data (e.g. data the user entered and
submitted)
// Use "response" to specify the HTTP response line and
headers
// (e.g. specifying the content type, setting cookies).
PrintWriter out = response.getWriter();
// Use "out" to send content to browser
}
}
UNIVERSIDAD PRIVADA TELESUP
132
Para ser un servlet, esta debe extender de
HttpServlet y sobreescribir doGet o doPost (o
ambos), dependiendo de si los datos están siendo
enviados mediante GET o POST. Estos métodos
toman dos argumentos: un HttpServletRequest y un HttpServletResponse.
El HttpServletRequest tiene métodos que nos
permiten encontrar información entrante como
datos de un FORM, cabeceras de petición HTTP,
etc. El HttpServletResponse tiene métodos que
nos permiten especificar líneas de respuesta HTTP
(200, 404, etc.), cabeceras de respuesta (Content-
Type, Set-Cookie, etc.), y, todavía más importante,
nos permiten obtener un PrintWriter usado para
envíar la salida de vuelta al cliente. Para servlets
sencillos, la mayoría del esfuerzo se gasta en
sentencias println que generan la página deseada.
UNIVERSIDAD PRIVADA TELESUP
133
Observamos que doGet y doPost lanzan dos
excepciones, por eso es necesario incluirlas en la
declaración. También observamos que tenemos que
importar las clases de los paquetes java.io (para
PrintWriter, etc.), javax.servlet (para HttpServlet,
etc.), y javax.servlet.http (para HttpServletRequest y
HttpServletResponse). Finalmente, observamos que doGet y doPost son llamados por
el método service, y algunas veces queremos sobreescribir directamente el método
service, por ejemplo, para un servlet que maneje tanto peticiones GET como POST.
Ciclo de vida de un servlet
1. Un Servlet es una clase extendida de la superclase
HttpServlet
2. Recepciona datos provenientes del usuario con
los métodos doPost() y doGet()
3. Los datos de entrada son procesados con el
método processRequest()
4. Se utiliza el objeto out para direccionar las
respuestas hacia el navegador del cliente.
UNIVERSIDAD PRIVADA TELESUP
134
TEMA 2
Reconocer los principales pasos para crear un servlet.
Competencia:
Pasos
para Crear un Servlet
UNIVERSIDAD PRIVADA TELESUP
135
Tema 02: Pasos para Crear un Servlet
PRERREQUISITO:
Debemos tener instalado cualquiera de los siguientes
servidores webs: Apache Tomcat, GlassFish o
GlassFish Prelude (Para verificar si dichos servidores se
encuentran instalados, podemos acudir en Netbeans a:
Menu Tools / Servers).
Nota: Es importante que ninguno de estos servidores use un puerto que ya está
siendo utilizado, porque esto generaría conflicto y por tanto imposibilitaría que el
proyecto web se ejecute.
1. Crear un proyecto Web, acuda a Menu File / New Project
2. Seleccione Java Web / Web Application
3. Botón Siguiente
4. Ingrese el nombre del proyecto web / Botón Next
UNIVERSIDAD PRIVADA TELESUP
136
5. Escoger el servidor web con el que desea trabajar.
6. Nota: Si no encuentra servidores disponibles, debe volver a instalar Netbeans
de modo personalizado y agregar un servidor
7. Haga click en el botón Next
UNIVERSIDAD PRIVADA TELESUP
137
8. Haga click en el botón Finish
9. Antes de crear un servlet, debemos crear un paquete. Click derecho sobre la
categoría Web Pages / Escoger New / Java Package
10. Ingresar el nombre del paquete, para nuestro caso será: Servlets / Luego
Finish
11. Crear el servlet dentro del paquete, click derecho sobre el paquete y escoger
New / Servlet
UNIVERSIDAD PRIVADA TELESUP
138
12. Ingresar el nombre del Servlet: Demo / Botón Next
13. Luego haga click en el botón Finish
UNIVERSIDAD PRIVADA TELESUP
139
14. A continuación aparecerá el código fuente de la clase Servlet. El método
processRequest es el método principal de la clase Servlet que responde a la
peticiones del usuario (request) y escribe (response) resultados finales en el
navegador del cliente. Descomentamos las líneas que contienen código HTML y
podemos agregar algunas líneas nuestras.
A continuación agregamos algunas líneas nuestras:
UNIVERSIDAD PRIVADA TELESUP
140
16. Para ejecutar el Servlet, presionamos la teclas Shif F6 / Confirmemos la
ventana siguiente, haciendo click en el botón OK
La ejecución de nuestro Servlet, es la siguiente:
Importante:
En Netbeans debemos indicar el nombre del navegador que utilizaremos para
visualizar la ejecución de nuestros Servlets, acudir a Menu Tools / Options /
Categoría General / Web Browser: Internet Explorer.
UNIVERSIDAD PRIVADA TELESUP
141
Manejar datos de formularios
En cambio, una de las mejores características de los servlets Java es que todos estos
análisis de formularios son manejados automáticamente. Simplemente llamamos al
método getParameter de HttpServletRequest, y suministramos el nombre del
parámetro como un argumento. Observa que los nombres de parámetros son
sensibles a la mayúsculas. Hacemos esto exactamente igual que cuando los datos son
enviados mediante GET o como si los enviáramos mediante POST.
El valor de retorno es un String correspondiente al
valor de la primera ocurrencia del parámetro. Se
devuelve un String vacío si el parámetro existe
pero no tiene valor, y se devuelve null si no existe
dicho parámetro. Si el parámetro pudiera tener
más de un valor, como en el ejemplo anterior,
deberíamos llamar a getParameterValues en vez
de a getParameter. Este devuelve un array de strings. Finalmente, aunque en
aplicaciones reales nuestros servlets probablemente tengan un conjunto específico de
nombres de parámetros por los que buscar. Usamos getParameterNames para esto,
que devuelve una Enumeración, cada entrada puede ser forzada a String y usada en
una llamada a getParameter.
UNIVERSIDAD PRIVADA TELESUP
142
Ejemplo: Un Servlet que lee tres parámetros enviados por un formulario
Aquí hay un sencillo ejemplo que lee
tres parámetros llamados param1,
param2, y param3, listando sus
valores en una lista marcada.
Observamos que, aunque tenemos
que especificar selecciones de
respuesta (content type, status line,
otras cabeceras HTTP) antes de empezar a generar el contenido, no es necesario que
leamos los parámetros de petición en un orden particular.
También observamos que podemos crear fácilmente servlets que puedan manejar
datos GET y POST, simplemente haciendo que su método doPost llame a doGet o
sobreescribiendo service (que llama a doGet, doPost, doHead, etc.). Esta es una
buena práctica estándard, ya que requiere muy poco trabajo extra y permite flexibilidad
en el lado del cliente. Si hemos usado la aproximación CGI tradicional cuando leemos
los datos POST mediante la entrada estándard.
Deberíamos observar que hay una forma similar con los Servlets llamando primero a
getReader o getInputStream sobre HttpServletRequest.
Esto es una mala idea para parámetros normales, pero
podría usarse para ficheros descargados o datos
POST que están siendo enviados por clientes
personales en vez de formularios HTML. Observa, sin
embargo, que si leemos los datos POST de esta
manera, podrían no ser encontrados por getParameter.
UNIVERSIDAD PRIVADA TELESUP
143
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ThreeParams extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading Three Request Parameters";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY>\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<UL>\n" +
" <LI>param1: "
+ request.getParameter("param1") + "\n" +
" <LI>param2: "
+ request.getParameter("param2") + "\n" +
" <LI>param3: "
+ request.getParameter("param3") + "\n" +
"</UL>\n" +
"</BODY></HTML>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Salida de los 3 parámetros
UNIVERSIDAD PRIVADA TELESUP
144
Ejemplo: Listar todos los Datos del Formulario
Aquí hay un ejemplo que busca todos los nombres de
parámetros que fueron enviados y los pone en una
tabla. Ilumina los parámetros que tienen valor cero así
como aquellos que tienen múltiples valores. Primero
busca todos los nombres de parámetros mediante el
método getParameterNames de HttpServletRequest. Esto devuelve una Enumeration.
Luego, pasa por la Enumeration de la forma estándard, usando hasMoreElements
para determinar cuándo parar y usando nextElement para obtener cada entrada.
Como nextElement devuelve un Object, fuerza el resultado a String y los pasa a
getParameterValues, obteniendo un array de Strings. Si este array sólo tiene una
entrada y sólo contiene un string vacío, el parámetro no tiene valores, y el servlet
genera una entrada "No Value" en itálica. Si el array tiene más de una entrada, el
parámetro tiene múltiples valores, y se muestran en una lista bulleteada. De otra
forma, el único valor principal se sítua en la tabla.
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ShowParameters extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading All Request Parameters"; out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<TABLE BORDER=1 ALIGN=CENTER>\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Parameter Name<TH>Parameter Value(s)"); Enumeration paramNames = request.getParameterNames();
UNIVERSIDAD PRIVADA TELESUP
145
while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement();
out.println("<TR><TD>" + paramName + "\n<TD>"); String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length == 1) { String paramValue = paramValues[0];
if (paramValue.length() == 0) out.print("<I>No Value</I>");
else out.print(paramValue);
} else { out.println("<UL>");
for(int i=0; i<paramValues.length; i++) { out.println("<LI>" + paramValues[i]);
} out.println("</UL>");
} }
out.println("</TABLE>\n</BODY></HTML>"); }
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response);
} }
Usa POST para enviar los datos (como deberían hacerlo todos los formularios que tienen entradas PASSWORD), demostrando el valor de que los servlets incluyan tanto doGet como
doPost. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>A Sample FORM using POST</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">A Sample FORM using POST</H1>
<FORM ACTION="/servlet/hall.ShowParameters"
METHOD="POST">
Item Number:
<INPUT TYPE="TEXT" NAME="itemNum"><BR>
UNIVERSIDAD PRIVADA TELESUP
146
Quantity: <INPUT TYPE="TEXT" NAME="quantity"><BR>
Price Each:
<INPUT TYPE="TEXT" NAME="price" VALUE="$"><BR>
<HR>
First Name:
<INPUT TYPE="TEXT" NAME="firstName"><BR>
Last Name:
<INPUT TYPE="TEXT" NAME="lastName"><BR>
Middle Initial:
<INPUT TYPE="TEXT" NAME="initial"><BR>
Shipping Address:
<TEXTAREA NAME="address" ROWS=3 COLS=40></TEXTAREA><BR>
Credit Card:<BR>
<INPUT TYPE="RADIO" NAME="cardType"
VALUE="Visa">Visa<BR>
<INPUT TYPE="RADIO" NAME="cardType"
VALUE="Master Card">Master Card<BR>
<INPUT TYPE="RADIO" NAME="cardType"
VALUE="Amex">American Express<BR> <INPUT TYPE="RADIO" NAME="cardType"
VALUE="Discover">Discover<BR>
<INPUT TYPE="RADIO" NAME="cardType"
VALUE="Java SmartCard">Java SmartCard<BR>
Credit Card Number:
<INPUT TYPE="PASSWORD" NAME="cardNum"><BR>
Repeat Credit Card Number:
<INPUT TYPE="PASSWORD" NAME="cardNum"><BR><BR>
<CENTER>
<INPUT TYPE="SUBMIT" VALUE="Submit Order">
</CENTER>
</FORM>
</BODY> </HTML>
UNIVERSIDAD PRIVADA TELESUP
147
Resultados del envío
Ejemplo: Imprimir todas las Cabeceras: Aquí tenemos un
servelt que simplemente crea una tabla con todas las cabeceras
recibidas, junto con sus valores asociados. También imprime
los tres componentes de la línea de petición principal
(método, URI y protocolo).
UNIVERSIDAD PRIVADA TELESUP
148
ShowRequestHeaders.java
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ShowRequestHeaders extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Servlet Example: Showing Request Headers";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<B>Request Method: </B>" +
request.getMethod() + "<BR>\n" +
"<B>Request URI: </B>" +
request.getRequestURI() + "<BR>\n" +
"<B>Request Protocol: </B>" +
request.getProtocol() + "<BR><BR>\n" +
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
"<TH>Header Name<TH>Header Value");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
out.println("<TR><TD>" + headerName);
out.println(" <TD>" + request.getHeader(headerName));
}
out.println("</TABLE>\n</BODY></HTML>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
UNIVERSIDAD PRIVADA TELESUP
149
TEMA 3
Analizar el modelo vista controlador (Model – View - Controller).
Competencia:
Modelo Vista Controlador
(MVC)
UNIVERSIDAD PRIVADA TELESUP
150
Tema 03: Modelo Vista Controlador (MVC)
Es un estilo de arquitectura de software que separa los
datos de una aplicación, la interfaz de usuario, y la lógica de
control en tres componentes distintos. El estilo de llamada y
retorno MVC, se ve frecuentemente en aplicaciones web,
donde la vista es la página HTML y el código que provee de
datos dinámicos a la página. El modelo es el Sistema de
Gestión de Base de Datos y la Lógica de negocio, y el controlador es el responsable
de recibir los eventos de entrada desde la vista.
Descripción del patrón
Modelo: Esta es la representación específica de la información con la cual el
sistema opera. En resumen, el modelo se limita a la lógica de negocio afines con el
sistema modelado.
Vista: Este presenta el modelo en un formato adecuado para interactuar,
usualmente la interfaz de usuario.
Controlador: Este responde a eventos, usualmente acciones del usuario, e invoca
peticiones al modelo y, probablemente, a la vista.
La unión entre capa de presentación y
capa de negocio conocido en el
paradigma de la Programación por capas
representaría la integración entre Vista y
su correspondiente Controlador de
eventos y acceso a datos, MVC no
pretende discriminar entre capa de
negocio y capa de presentación pero si
pretende separar la capa visual gráfica de su correspondiente programación y acceso
a datos, algo que mejora el desarrollo y mantenimiento de la Vista y el Controlador en
paralelo, ya que ambos cumplen ciclos de vida muy distintos entre sí.
UNIVERSIDAD PRIVADA TELESUP
151
Aunque se pueden encontrar diferentes implementaciones
de MVC, el flujo que sigue el control generalmente es el
siguiente:
1. El usuario interactúa con la interfaz de usuario de
alguna forma (por ejemplo, el usuario pulsa un botón,
enlace, etc.)
2. El controlador recibe (por parte de los objetos de la
interfaz-vista) la notificación de la acción solicitada
por el usuario. El controlador gestiona el evento que llega, frecuentemente a
través de un gestor de eventos (handler) o callback.
3. El controlador accede al modelo, actualizándolo, posiblemente modificándolo de
forma adecuada a la acción solicitada por el usuario (por ejemplo, el controlador
actualiza el carro de la compra del usuario). Los controladores complejos están a
menudo estructurados usando un patrón de comando que encapsula las
acciones y simplifica su extensión.
4. El controlador delega a los objetos de la vista la tarea de desplegar la interfaz de
usuario. La vista obtiene sus datos del modelo para generar la interfaz apropiada
para el usuario donde se refleja los cambios en el modelo (por ejemplo, produce
un listado del contenido del carro de la compra).
5. El modelo no debe tener conocimiento
directo sobre la vista. Un objeto vista puede
registrarse con el modelo y esperar a los
cambios, pero aun así el modelo en sí mismo
sigue sin saber nada de la vista. El
controlador no pasa objetos de dominio (el
modelo) a la vista aunque puede dar la orden
a la vista para que se actualice. Nota: En
algunas implementaciones la vista no tiene acceso directo al modelo, dejando
que el controlador envíe los datos del modelo a la vista.
6. La interfaz de usuario espera nuevas interacciones del usuario, comenzando el
ciclo nuevamente.
UNIVERSIDAD PRIVADA TELESUP
152
CASO PRÁCTICO
VIEW
Main.jsp
<%--
Document : main
Created on : 25/09/2011, 05:16:12 PM
Author : PC61
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.sql.ResultSet"%>
<%
ResultSet rsE=null;
//habiltar el uso de sesiones
HttpSession s=request.getSession();
//repurar los datos
if(s.getAttribute("sempleados")!=null){ //Si la session tiene datos
rsE=(ResultSet)s.getAttribute("sempleados");
} else {
response.sendRedirect("/SistemaWeb/view/index.jsp");
}
%>
<%
String cod="";String appat="";String apmat="";String nom="";String dni="";String ciu="";String
dir="";String usu="";String cla="";
//Capturar datos enviados a la pagina
String ope="";
if(request.getParameter("ope")!=null){
ope=request.getParameter("ope");
}
if(request.getParameter("cod")!=null){
cod=request.getParameter("cod");
}
if(request.getParameter("appat")!=null){
appat=request.getParameter("appat");
}
if(request.getParameter("apmat")!=null){
apmat=request.getParameter("apmat");
}
UNIVERSIDAD PRIVADA TELESUP
153
if(request.getParameter("nom")!=null){
nom=request.getParameter("nom");
}
if(request.getParameter("dni")!=null){
dni=request.getParameter("dni");
}
if(request.getParameter("dir")!=null){
dir=request.getParameter("dir");
}
if(request.getParameter("ciu")!=null){
ciu=request.getParameter("ciu");
}
if(request.getParameter("usu")!=null){
usu=request.getParameter("usu");
}
if(request.getParameter("cla")!=null){
cla=request.getParameter("cla");
}
//Recuperar los datos de la session
HttpSession se=request.getSession();
ResultSet rs=null;
if(se.getAttribute("datos")!=null){
rs=(ResultSet)se.getAttribute("datos"); //Casting / lo convertimos a ResultSet
}
String error="";
if(se.getAttribute("error")!=null){
error=(String)se.getAttribute("error"); //Casting / lo convertimos a ResultSet
se.removeValue("error");
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
<style type="text/css">
<!--
.Estilo1 {
color: #FF0000;
font-weight: bold;
font-size: 16px;
}
-->
UNIVERSIDAD PRIVADA TELESUP
154
</style>
</head>
<link rel="stylesheet" type="text/css" href="../css/estilo.css">
<script language="javascript">
function listado(){
location.href="/SistemaWeb/EmpleadoController";
}
function insertar(){
location.href="main.jsp?ope=1";
}
function buscar(){
location.href="main.jsp?ope=4";
}
</script>
<body>
<h1>Mantenimiento de Empleados </h1>
<p></p>
<% if(!error.equals("")){ %>
<div class="Estilo1" id="error">
<div align="center"><%=error%></div>
</div>
<% } %>
<table width="200" border="1">
<tr>
<td width="96"><input name="btnlistado" type="submit" class="boton" id="btnlistado" value="Ver
Listado" onClick="listado()"></td>
<td width="54"><input name="btninsertar" type="button" class="boton" id="btninsertar"
value="Insertar" onClick="insertar()"></td>
<td width="10"><input name="btnbuscar" type="button" class="boton" id="btnbuscar" value="Buscar"
onClick="buscar()"></td>
<td width="12"> </td>
</tr>
</table>
<% if(ope.equals("4")){ %>
<form name="form3" method="post" action="/SistemaWeb/EmpleadoController">
<table width="767" border="1">
<tr>
<td width="65">Buscar por </td>
<td width="181"><select name="cbocampo" id="cbocampo">
<option>Seleccione Campo</option>
<option value="chr_emplcodigo">Codigo</option>
<option value="ape">Apellidos y Nombre</option>
<option value="chr_empldni">DNI</option>
</select> </td>
<td width="73">con el dato </td>
<td width="300"><input name="txtdato" type="text" id="txtdato" size="50"></td>
<td width="114"><input name="btnbuscar" type="submit" class="boton" id="btnbuscar"
value="Buscar">
UNIVERSIDAD PRIVADA TELESUP
155
<input name="ope" type="hidden" id="ope" value="4"></td>
</tr>
</table>
</form>
<% } %>
<% if(rs!=null){ %>
<form name="form1" method="post" action="/SistemaWeb/EmpleadoController">
<% //if(rs.isFirst()){ %>
<table width="1185" border="1">
<tr>
<th width="39" scope="col"><a href="#" class="sinborde" onClick='submit()'><img
src="../icons/eliminar2.png" width="24" height="26"></a></th>
<th width="58" scope="col">Codigo</th>
<th width="150" scope="col">Apellido Paterno </th>
<th width="155" scope="col">Apellido Materno </th>
<th width="78" scope="col">Nombres</th>
<th width="79" scope="col">DNI</th>
<th width="73" scope="col">Ciudad</th>
<th width="145" scope="col">Direccion</th>
<th width="113" scope="col">Login</th>
<th width="141" scope="col">Password
<input name="ope" type="hidden" id="ope" value="3"></th>
</tr>
<%
while(rs.next()) {
cod=rs.getString(1);appat=rs.getString(2);apmat=rs.getString(3);nom=rs.getString(4);dni=rs.getString(7);
ciu=rs.getString(5);dir=rs.getString(6);usu=rs.getString(8);cla=rs.getString(9);
%>
<tr>
<td><div align="center">
<input name="chkeli" type="checkbox" id="chkeli" value="<%=cod%>">
</div></td>
<td><a
href="main.jsp?ope=2&cod=<%=cod%>&appat=<%=appat%>&apmat=<%=apmat%>&nom=<%=nom%>
&dir=<%=dir%>&ciu=<%=ciu%>&dni=<%=dni%>&usu=<%=usu%>&cla=<%=cla%>"><%=cod%></a></td>
<td><%=appat%></td>
<td><%=apmat%></td>
<td><%=nom%></td> <td><%=dni%></td> <td><%=ciu%></td> <td><%=dir%></td> <td><%=usu%></td> <td><%=cla%></td>
</tr> <% } %> </table>
<% //} %> </form>
<%}
UNIVERSIDAD PRIVADA TELESUP
156
if(ope.equals("1")) { //Si se escogió Insertar %>
<form name="form2" method="post" action="/SistemaWeb/EmpleadoController"> <table width="319" border="1" align="center">
<tr> <th colspan="2" scope="col">Insertar Registro
<input name="ope" type="hidden" id="ope" value="1"></th> </tr> <tr>
<td width="120">Apellido Paterno </td> <td width="183"><input name="txtappat" type="text" id="txtappat"></td>
</tr> <tr>
<td>Apellido Materno </td> <td><input name="txtapmat" type="text" id="txtapmat"></td>
</tr> <tr>
<td>Nombres</td> <td><input name="txtnom" type="text" id="txtnom"></td>
</tr> <tr>
<td>Dirección</td> <td><input name="txtdir" type="text" id="txtdir"></td>
</tr> <tr>
<td>Ciudad</td> <td><input name="txtciu" type="text" id="txtciu"></td>
</tr> <tr>
<td>DNI</td> <td><input name="txtdni" type="text" id="txtdni"></td>
</tr> <tr>
<td>Usuario</td> <td><input name="txtusu" type="text" id="txtusu"></td>
</tr>
<tr> <td colspan="2"><div align="center">
<input name="btngrabar" type="submit" class="boton" id="btngrabar" value="Grabar"> </div></td>
</tr> <tr>
<td> </td> <td> </td>
</tr> </table>
</form>
<% } %>
<% if(ope.equals("2")){ %>
<form name="form2" method="post" action="/SistemaWeb/EmpleadoController">
<table width="319" border="1" align="center">
<tr>
<th colspan="2" scope="col">Modificar Registro
UNIVERSIDAD PRIVADA TELESUP
157
<input name="ope" type="hidden" id="ope" value="2">
<input name="cod" type="hidden" id="cod" value="<%=cod%>"></th>
</tr>
<tr>
<td width="120">Apellido Paterno </td>
<td width="183"><input name="txtappat" type="text" id="txtappat" value=<%=appat%>></td>
</tr>
<tr>
<td>Apellido Materno </td>
<td><input name="txtapmat" type="text" id="txtapmat" value="<%=apmat%>"></td>
</tr>
<tr>
<td>Nombres</td> <td><input name="txtnom" type="text" id="txtnom" value="<%=nom%>"></td>
</tr> <tr>
<td>Dirección</td> <td><input name="txtdir" type="text" id="txtdir" value="<%=dir%>"></td>
</tr> <tr>
<td>Ciudad</td> <td><input name="txtciu" type="text" id="txtciu" value="<%=ciu%>"></td>
</tr> <tr>
<td>DNI</td> <td><input name="txtdni" type="text" id="txtdni" value="<%=dni%>"></td>
</tr> <tr>
<td>Usuario</td> <td><input name="txtusu" type="text" id="txtusu" value="<%=usu%>"></td>
</tr> <tr>
<td>Clave</td> <td><input name="txtcla" type="text" id="txtcla" value="<%=cla%>"></td>
</tr> <tr>
<td colspan="2"><div align="center"> <input name="btngrabar" type="submit" class="boton" id="btngrabar" value="Grabar">
</div></td> </tr> <tr>
<td> </td>
<td> </td>
</tr>
</table>
</form>
<% } %>
<p> </p>
</body>
</html>
UNIVERSIDAD PRIVADA TELESUP
158
Controller
EmpleadoController.java [Servlet]
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package controller; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import model.*; import java.sql.*; import javax.servlet.http.HttpSession; /** * * @author PC61 */ @WebServlet(name="EmpleadoController", urlPatterns={"/EmpleadoController"}) public class EmpleadoController extends HttpServlet { /** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession se=request.getSession(); //Habilitamos una sesion de trabajo try { //Declarar objetos ResultSet rs=null; //Captura de datos int ope=0; if(request.getParameter("ope")!=null){ ope=Integer.parseInt(request.getParameter("ope")); } String campo="";String dato=""; if(ope==4){ //Operacion buscar if(request.getParameter("cbocampo")!=null){ campo=request.getParameter("cbocampo"); } if(request.getParameter("txtdato")!=null){
UNIVERSIDAD PRIVADA TELESUP
159
dato=request.getParameter("txtdato"); } }
String[] cods=new String[100]; if(ope==3){ //si la operacion es eliminar
//Atrapa todos los valores del check y los envia a un arreglo cods cods=request.getParameterValues("chkeli");
} String appat="";
if(request.getParameter("txtappat")!=null){ appat=request.getParameter("txtappat");
}
String apmat=""; if(request.getParameter("txtapmat")!=null){ apmat=request.getParameter("txtapmat");
}
String nombre=""; if(request.getParameter("txtnom")!=null){ nombre=request.getParameter("txtnom");
}
String dir=""; if(request.getParameter("txtdir")!=null){ dir=request.getParameter("txtdir");
} String ciu="";
if(request.getParameter("txtciu")!=null){ ciu=request.getParameter("txtciu");
} String dni="";
if(request.getParameter("txtdni")!=null){ dni=request.getParameter("txtdni");
} String usu="";
if(request.getParameter("txtusu")!=null){ usu=request.getParameter("txtusu");
} String cla="";String cod="";
if(ope==2){ //Si la operacion es Modificar if(request.getParameter("txtcla")!=null){
cla=request.getParameter("txtcla"); }
if(request.getParameter("cod")!=null){ cod=request.getParameter("cod");
} }
//Instancia de la clase model EmpleadoModel em=new EmpleadoModel();
//Proceso
switch(ope){ case 1: {
if(em.validarExistencia(dni)==false){
UNIVERSIDAD PRIVADA TELESUP
160
em.insertar(appat,apmat,nombre,dir,ciu,dni,usu); } else { throw new Exception("ERROR: No se pudo ingresar este registro, existe un usuario con este numero de DNI..."); } } break; case 2: { em.modificar(cod,appat,apmat,nombre,dir,ciu,dni,usu,cla);}break; case 3: { em.eliminar(cods); } break; case 4: { rs=em.buscar(campo,dato); } break; default: { rs=em.mostrarListado(); } break; } //Guardar los datos se.setAttribute("datos", rs); } catch(Exception ex){ se.setAttribute("error", ex.getMessage()); } //response.sendRedirect("/view/main.jsp"); out.println("<script language='javascript'>"); out.println("location.href='/SistemaWeb/view/main.jsp';"); out.println("</script>"); out.close(); } // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> /** * Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> }
UNIVERSIDAD PRIVADA TELESUP
161
Model
EmpleadoModel.java
package model; import ds.*;
import java.sql.*;
public class EmpleadoModel { public ResultSet buscar(String campo,String dato) throws Exception {
String sql=""; if(campo.equals("ape")) {
sql="Select * from empleado where concat(vch_emplpaterno,' ',vch_emplmaterno,' ',vch_emplnombre) like '%"+dato+"%'";
} else{
sql="Select * from empleado where "+campo+"='"+dato+"'"; }
GestionBD gbd=GestionBD.getInstancia(); //Conseguir la instancia de GestionBD (OCURRE LA CONEXION)
ResultSet rs=gbd.ejecutarConsulta(sql); System.out.println(sql);
return rs; }
public boolean validarExistencia(String dni) throws Exception { String sql="Select * from empleado where chr_empldni=?";
GestionBD gbd=GestionBD.getInstancia(); //Conseguir la instancia de GestionBD (OCURRE LA CONEXION)
PreparedStatement ps=gbd.cn.prepareStatement(sql); ps.setString(1, dni);
ResultSet rs=ps.executeQuery(); rs.next(); // Me posiciono en el primer registro
boolean r=false; if(rs.isFirst()){ //Si estoy en el primer registro r=true; //Si existe un registro con este dni
} return r;
} public void eliminar(String[] cods) throws Exception {
GestionBD gbd=GestionBD.getInstancia(); //Conseguir la instancia de GestionBD (OCURRE LA CONEXION)
for(int i=0;i<cods.length;i++){ String sql="update empleado set estado='0' where chr_emplcodigo=?";
PreparedStatement ps=gbd.cn.prepareStatement(sql); ps.setString(1, cods[i]);
ps.executeUpdate(); } }
public void modificar(String cod,String appat,String apmat,String nombre,String dir,String ciu,String dni,String usu,String cla) throws Exception {
UNIVERSIDAD PRIVADA TELESUP
162
String sql="update empleado set vch_emplpaterno=?,vch_emplmaterno=?,vch_emplnombre=?,vch_emplciudad=?,vch_empldireccion=?,chr_empldni=?,vch_emplusuario=?,vch_emplclave=? where chr_emplcodigo=?"; GestionBD gbd=GestionBD.getInstancia(); //Conseguir la instancia de GestionBD (OCURRE LA CONEXION) PreparedStatement ps=gbd.cn.prepareStatement(sql); ps.setString(1, appat); ps.setString(2, apmat); ps.setString(3, nombre); ps.setString(4, ciu); ps.setString(5, dir); ps.setString(6, dni); ps.setString(7, usu); ps.setString(8,cla); ps.setString(9,cod); ps.executeUpdate(); } public String generarCodigo() throws Exception { String sql="{call usp_CrearCodigoEmp(?)}"; GestionBD gbd=GestionBD.getInstancia(); //Conseguir la instancia de GestionBD (OCURRE LA CONEXION) CallableStatement cs=gbd.cn.prepareCall(sql); cs.registerOutParameter(1,Types.CHAR); cs.executeQuery(); return cs.getString(1); } public String generarContrasena(){ //String letrasma="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //String letrasmi="abcdefghijklmnopqrstuvwyxz"; //String num="0123456789"; //String especiales="@#&%$()-_"; String caracteres="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz0123456789@#&%$()-_"; //Generar numero al azar 1 //int b=(int)(Math.random()*25); //int c=(int)(Math.random()*9); //int d=(int)(Math.random()*8); String acu=""; for(int i=1;i<=15;i++){ int a=(int)(Math.random()*69); acu=acu+caracteres.charAt(a); } return acu; } public void insertar(String appat,String apmat,String nombre,String dir,String ciu,String dni,String usu) throws Exception { String sql="insert into empleado values(?,?,?,?,?,?,?,?,?,?)";
UNIVERSIDAD PRIVADA TELESUP
163
GestionBD gbd=GestionBD.getInstancia(); //Conseguir la instancia de GestionBD (OCURRE LA
CONEXION)
PreparedStatement ps=gbd.cn.prepareStatement(sql);
String cod=this.generarCodigo();
ps.setString(1, cod);
ps.setString(2, appat);
ps.setString(3, apmat);
ps.setString(4, nombre);
ps.setString(5, ciu);
ps.setString(6, dir);
ps.setString(7, dni);
ps.setString(8, usu);
String clave=this.generarContrasena();
//System.out.println("MENSAJE "+cod+" "+appat+" "+apmat+" "+nombre+" "+ciu+" "+dir+"
"+usu+" "+clave);
ps.setString(9, clave);
ps.setString(10,"1");
ps.executeUpdate();
}
public ResultSet mostrarListado() throws Exception {
String sql="Select * from empleado where estado='1'";
GestionBD gbd=GestionBD.getInstancia(); //Conseguir la instancia de GestionBD (OCURRE LA
CONEXION)
ResultSet rs=gbd.ejecutarConsulta(sql);
return rs;
}
}
UNIVERSIDAD PRIVADA TELESUP
164
Ds [Lógica de Datos]
package ds; import java.sql.*;
public class GestionBD {
private static GestionBD instancia=null; //Variable estática public Connection cn=null; //Objeto Connection
private Statement st=null;
//Metodo estatico - Consigue una nueva instancia si es que la instancia no existe //Si la instancia existiera devuelve la que existe. (Se optimiza el uso de la memoria)
public static GestionBD getInstancia() throws Exception { if(instancia==null){
instancia=new GestionBD(); }
return instancia; }
//Metodo constructor - ocurre automaticamente cada vez que se instancia public GestionBD() throws Exception {
//registrar el driver JDBC String usuario="root";
String password="telesup"; String servidor="localhost";
String puerto="3306"; String basedatos="Eurekabank";
String url="jdbc:mysql://"+servidor+":"+puerto+"/"+basedatos; Class.forName("com.mysql.jdbc.Driver");
//2da fase - Establecer la conexion con la base de datos cn=DriverManager.getConnection(url,usuario,password);
} //Este metodo ejecutará los comandos select
public ResultSet ejecutarConsulta(String sql) throws Exception { st=cn.createStatement();
ResultSet rs=null; rs=st.executeQuery(sql);
return rs; }
//Este método ejecutará los comandos de actualización public void ejecutarActualizacion(String sql) throws Exception {
st=cn.createStatement(); st.executeUpdate(sql);
} }
UNIVERSIDAD PRIVADA TELESUP
165
TEMA 4
Utilizar objetivamente la consulta de datos (Model – View - Controller).
Competencia:
Consulta de Datos –
MVC
UNIVERSIDAD PRIVADA TELESUP
166
Tema 04: Consulta de Datos - MVC CASO PRÁCTICO
Crear un buscador de productos que permita buscar por: Categorías,
Marcas o por nombre de productos. Crear una página de acceso que
nos permita ingresar a la página anterior con login y contraseña.
Los usuarios autorizados para el ingreso deben estar almacenados
en la tabla Usuarios. Utilizar el patrón de diseño MVC para la
realización de las dos aplicaciones anteriores.
Desarrollo
Codigo Fuente del paquete Ds (LOGICA DE DATOS)
GestionBD.java
package Ds;
import java.sql.*;
public class GestionBD {
//Objeto Singleton (instancia) - Almacena la instancia Unica
private static GestionBD instancia=null;
private Connection cn=null;
//Metodo Singleton (consigue la instancia única)
public static GestionBD getInstancia() throws Exception {
if(instancia==null){ //Aun no existe instancia?
instancia=new GestionBD();
}
return instancia;
}
// método constructor - activa la conexion de la BD
public GestionBD() throws Exception {
String usuario="root";
String password="telesup";
String servidor="localhost";
String puerto="3306";
String basedatos="comercial";
String url="jdbc:mysql://"+servidor+":"+puerto+"/"+basedatos;
//Registrar el Driver
Class.forName("com.mysql.jdbc.Driver");
//Abrir la conexion
UNIVERSIDAD PRIVADA TELESUP
167
cn=DriverManager.getConnection(url,usuario,password);
}
public ResultSet ejecutarConsulta(String sql)
throws Exception {
//crear el Statament
Statement st=null;
st=cn.createStatement();
//Crear el esquema de Datos
ResultSet rs=null;
rs=st.executeQuery(sql);
return rs;
}
}
Código Fuente del paquete MODEL (LOGICA DE NEGOCIOS)
ProductoModel.java
package model;
import Ds.*;
import java.sql.*;
public class ProductoModel {
public ResultSet generarListaNombres(String codcat, String mar) throws Exception{
String sql="";
sql="select nompro from productos where codcat='"+codcat+
"' and marpro='"+mar+"'";
ResultSet rs=null;
GestionBD ds=new GestionBD();
rs=ds.ejecutarConsulta(sql);
return rs;
}
UNIVERSIDAD PRIVADA TELESUP
168
public ResultSet generarListaMarcas(String codcat) throws Exception{ String sql="";
sql="select distinct marpro from productos where codcat='"+codcat+"'"; ResultSet rs=null;
GestionBD ds=new GestionBD(); rs=ds.ejecutarConsulta(sql);
return rs; }
public ResultSet generarListaCategorias() throws Exception { String sql="";
sql="SELECT DISTINCT P.CODCAT,C.NOMCAT FROM PRODUCTOS P,"+ "CATEGORIA C WHERE P.CODCAT=C.CODCAT";
ResultSet rs=null; GestionBD ds=new GestionBD(); //Instanciado y conectado
rs=ds.ejecutarConsulta(sql); return rs;
}
public ResultSet consultarProductos(String cat,String mar, String nom) throws Exception { String sql="";
ResultSet rs=null;
if(cat.trim().equals("") && mar.trim().equals("")){ sql="select * from productos where nompro='"+nom+"'";
}
else if(mar.trim().equals("") && nom.trim().equals("")){ sql="select * from productos where codcat='"+cat+"'";
}
else if(cat.trim().equals("") && nom.trim().equals("")){
sql="select * from productos where marpro='"+mar+"'";
}
else if(cat.trim().equals("")){
sql="select * from productos where marpro='"+mar+
"' and nompro='"+nom+"'";
}
else if(mar.trim().equals("")){
sql="select * from productos where codcat='"+cat+
"' and nompro='"+nom+"'";
}
else if(nom.trim().equals("")){
UNIVERSIDAD PRIVADA TELESUP
169
sql="select * from productos where codcat='"+cat+ "' and marpro='"+mar+"'";
} else{
sql="select * from productos where codcat='"+cat+ "' and marpro='"+mar+"' and nompro='"+nom+"'";
}
GestionBD ds=GestionBD.getInstancia(); rs=ds.ejecutarConsulta(sql);
if(rs==null){
//Genera un error throw new Exception("Lo sentimos no se encontraron regisros");
} return rs;
}
public ProductoModel() { } }
UsuarioModel.java
package model; import java.sql.*;
import Ds.GestionBD;
public class UsuarioModel { public boolean validarAcceso(String usu, String cla) throws Exception {
String sql=""; boolean rpta=false; ResultSet rs=null;
sql="select * from usuario where login='"+usu+"' and " + "password='"+cla+"'";
GestionBD ds=GestionBD.getInstancia(); rs=ds.ejecutarConsulta(sql);
rs.next();
if(!rs.isFirst()){ //Si no existen datos? throw new Exception("El usuario no existe"); //error
} return true; //Devuelve verdadero
} /** Creates a new instance of UsuarioModel */
public UsuarioModel() { } }
UNIVERSIDAD PRIVADA TELESUP
170
Código Fuente del paquete CONTROLLER ConsultaController.java (SERVLET)
package controller;
import java.io.*; import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*; import java.sql.*; import model.*;
import Ds.*;
public class ConsultaController extends HttpServlet {
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request
* @param response servlet response */
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();
//Habilitar la session HttpSession sv=request.getSession(); //Capturar los datos String vcodcat=""; if(request.getParameter("cbocat")!=null){ vcodcat=request.getParameter("cbocat"); sv.setAttribute("scodcat",vcodcat); }
String vmarca="";
if(request.getParameter("cbomar")!=null){ vmarca=request.getParameter("cbomar");
sv.setAttribute("smarca",vmarca); }
String vnom=""; if(request.getParameter("cbonom")!=null){ vnom=request.getParameter("cbonom");
sv.setAttribute("snom",vnom); }
ResultSet rsmarcas=null; ResultSet rsnombres=null;
ResultSet rsdata=null;
ProductoModel pm=new ProductoModel();
UNIVERSIDAD PRIVADA TELESUP
171
try {
rsmarcas=pm.generarListaMarcas(vcodcat);
rsnombres=pm.generarListaNombres(vcodcat,vmarca);
rsdata=pm.consultarProductos(vcodcat,vmarca,vnom);
//Enviar hacia una variable de sesion la data generada
sv.setAttribute("datamarcas",rsmarcas);
sv.setAttribute("datanombres",rsnombres);
sv.setAttribute("data",rsdata);
} catch (Exception e) {
sv.setAttribute("error",e.getMessage());
}
//redireccionar al view
out.println("<script language=javascript>");
out.println("location.href='/MVC2/view/Consulta.jsp';");
out.println("</script>");
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the
left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
UNIVERSIDAD PRIVADA TELESUP
172
AccesoController.java (SERVLET)
package controller; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; import model.*; public class AccesoController extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();
//Habilitar sesiones
HttpSession sv=request.getSession();
//Recepcionar datos String usu="";
if(request.getParameter("txtusu")!=null){ usu=request.getParameter("txtusu");
}
String cla=""; if(request.getParameter("txtcla")!=null){
cla=request.getParameter("txtcla"); }
ResultSet rs=null; try {
//Atedemos el proceso UsuarioModel um=new UsuarioModel(); //Instancia
boolean rpta=false;
rpta=um.validarAcceso(usu,cla); out.println("Respuesta "+rpta);
if(rpta){ out.println("<script language='javascript'>");
out.println("location.href='/MVC2/view/Consulta.jsp';"); out.println("</script>");
//Preparar la data para el combo ProductoModel pm=new ProductoModel();
rs=pm.generarListaCategorias(); } else{
out.println("<script language='javascript'>"); out.println("location.href='/MVC2/view/Acceso.jsp';");
out.println("</script>");
UNIVERSIDAD PRIVADA TELESUP
173
}
} catch (Exception e) {
//Enviamos la informacion del error a una variable de sesion
sv.setAttribute("error",e.getMessage());
out.println("<script language='javascript'>");
out.println("location.href='/MVC2/view/Acceso.jsp';");
out.println("</script>");
}
//Guardar datos en variables de sesion
sv.setAttribute("datacat",rs);
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
UNIVERSIDAD PRIVADA TELESUP
174
Código Fuente del paquete VIEW
Consulta.jsp
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%> <%
//atrapar valores //Recuperar la data
HttpSession sv=request.getSession();
String vcodcat=""; if(((String)sv.getAttribute("scodcat"))!=null){ vcodcat=(String)sv.getAttribute("scodcat");
}
String vmar=""; if(((String)sv.getAttribute("smarca"))!=null){
vmar=(String)sv.getAttribute("smarca"); }
String vnom=""; if(((String)sv.getAttribute("snom"))!=null){
vnom=(String)sv.getAttribute("snom"); }
ResultSet rsnombres=null; if(((ResultSet)sv.getAttribute("datanombres"))!=null){
rsnombres=(ResultSet)sv.getAttribute("datanombres"); }
ResultSet rsmarcas=null;
if(((ResultSet)sv.getAttribute("datamarcas"))!=null){
rsmarcas=(ResultSet)sv.getAttribute("datamarcas");
}
ResultSet rscat=null;
if(((ResultSet)sv.getAttribute("datacat"))!=null){
rscat=(ResultSet)sv.getAttribute("datacat");
}
ResultSet rsdata=null;
if(((ResultSet)sv.getAttribute("data"))!=null){
rsdata=(ResultSet)sv.getAttribute("data");
}
%>
<html>
UNIVERSIDAD PRIVADA TELESUP
175
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<link rel="stylesheet" type="text/css" href="../css/estilo.css">
<body>
<h1>Consulta de Productos </h1>
<form name="form1" method="post" action="/MVC2/ConsultaController">
<table width="391" border="1">
<tr>
<td width="60">Categoria</td>
<td width="170">
<select name="cbocat" class="combo" id="cbocat" onchange="submit()">
<option value="">Seleccione Categoria</option>
<%
rscat.first();
while(rscat.next()){
String cod=rscat.getString(1);
if(vcodcat.equals(cod)) { %>
<option value=<%=cod%> selected><%=rscat.getString(2)%></option>
<% } else { %>
<option value=<%=cod%>><%=rscat.getString(2)%></option>
<% } //fin del if
} //fin del while
%>
</select>
</td>
<td width="139"> </td>
</tr>
<tr>
<td>Marca</td>
<td> <select name="cbomar" class="combo" id="cbomar" onchange="submit()">
<option value="">Seleccione Marca</option> <%
if(rsmarcas!=null){ rsmarcas.first();
while(rsmarcas.next()){ String vm=rsmarcas.getString(1);
if(vm.equals(vmar)) { %> <option value='<%=vm%>' selected><%=vm%></option>
<% } else { %> <option value='<%=vm%>'><%=vm%></option>
<% } //fin del if
UNIVERSIDAD PRIVADA TELESUP
176
} //fin del while
} //fin del if
%>
</select>
</td>
<td> </td>
</tr>
<tr>
<td>Nombre</td>
<td>
<select name="cbonom" class="combo" id="cbonom" onchange="submit()">
<option value="">Seleccione Nombre</option>
<%
if(rsnombres!=null){
rsnombres.first();
while(rsnombres.next()){
String vn=rsnombres.getString(1);
if(vn.equals(vnom)) { %>
<option value='<%=vn%>' selected><%=vn%></option>
<% } else { %>
<option value='<%=vn%>'><%=vn%></option>
<% } //fin del if
} //fin del while
} //fin del if
%>
</select>
</td>
UNIVERSIDAD PRIVADA TELESUP
177
<td><input name="btnbuscar" type="submit" class="boton" id="btnbuscar"
value="Buscar"></td>
</tr>
</table>
</form>
<% if(rsdata!=null) { %>
<div id="datos">
<table width="690" border="1">
<tr>
<th width="58" scope="col">Codpro</th>
<th width="150" scope="col">Nombre</th>
<th width="170" scope="col">Descripcion</th>
<th width="69" scope="col">Marca</th>
<th width="125" scope="col">Precio Unitario </th>
<th width="78" scope="col">Stock</th>
</tr>
<% while(rsdata.next()) { %>
<tr>
<td><%=rsdata.getString(1)%></td>
<td><%=rsdata.getString(2)%></td>
<td><%=rsdata.getString(3)%></td>
<td><%=rsdata.getString(4)%></td>
<td><%=rsdata.getDouble(5)%></td>
<td><%=rsdata.getString(6)%></td>
</tr>
<% } %>
</table>
</div>
<% } %>
<p> </p>
</body>
</html>
UNIVERSIDAD PRIVADA TELESUP
178
Acceso.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%
//recuperar la data de las sesiones
HttpSession sv=request.getSession(); //Habilitar las sesiones
String error="";
if((String)sv.getAttribute("error")!=null){
error=(String)sv.getAttribute("error");
}
%>
<!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=UTF-8">
<title>JSP Page</title>
<style type="text/css">
<!--
.Estilo1 {
color: #FF0000;
font-weight: bold;
font-size: 14px;
}
-->
</style>
</head>
<link rel="stylesheet" type="text/css" href="../css/estilo.css">
<body>
<h1>Acceso a Datos
</h1>
<form name="form1" method="post" action="/MVC2/AccesoController">
<table width="200" border="1">
<tr>
<th height="26" colspan="2" scope="col"><strong>INTRANET</strong></th>
</tr>
UNIVERSIDAD PRIVADA TELESUP
179
<tr>
<td width="50">Usuario</td>
<td width="134"><input name="txtusu" type="text"
id="txtusu"></td>
</tr>
<tr>
<td>Clave</td>
<td><input name="txtcla" type="password"
id="txtcla"></td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input name="btningresar" type="submit" class="boton" id="btningresar" value="Ingresar">
</div></td>
</tr>
</table>
</form>
<% if(error!="") { %>
<div id="error">
<div align="center"
class="Estilo1"><%=error%></div>
</div>
<% } %>
<p> </p>
</body>
</html>
UNIVERSIDAD PRIVADA TELESUP
180
1. Cree un buscador de productos que permita buscar por: Precio y
marca de productos.
Envíalo a través de "Buscador".
Lecturas Recomendadas
SERVLET
http://www.javaya.com.ar/detalleconcepto.php?codigo=136&inicio=60
DESCRIPCIÓN DEL PATRÓN MVC http://www.desarrolloweb.com/wiki/mvc-modelo-vista-controlador.html
Actividades y Ejercicios
UNIVERSIDAD PRIVADA TELESUP
181
Autoevaluación
1) La palabra servlet deriva de otra anterior, ______ , que se refería a pequeños
programas escritos en Java que se ejecutan en el contexto de un navegador web.
a. Apple
b. Applet
c. Mac
d. Windows
e. String
2) Los Servlets son la respuesta de la tecnología Java a la programación: a. CGI
b. Visual++
c. FoxPro
d. Php
e. DDoS
3) ¿Cuántas partes tiene el ciclo de vida de un Servlets?
a. Seis
b. Cuatro
c. Dos
d. Ocho
e. Cinco
4) Específica de la información con la cual el sistema opera. a. Conector.
b. Database.
c. Controlador.
d. Modelo.
e. Vista.
5) Las peticiones GET, son peticiones hechas por el navegador cuando el
usuario escribe _________ en la línea de direcciones.
a. Una URL
b. Un comando.
c. Algún código.
d. Un usuario.
e. Códigos de servidor.
UNIVERSIDAD PRIVADA TELESUP
182
6) Tiene métodos que nos permiten encontrar información entrante como datos
de un FORM, cabeceras de petición HTTP, etc.
a. HttpServletRequest
b. HttpServletResponse
c. javax.servlet.http
d. PrintWriter
e. ServletException
7) Es un objeto Java que implementa la interfaz javax.servlet. Servlet o hereda
alguna de las clases más convenientes para un protocolo específico.
a. El Servlet.
b. La Interface.
c. El Compilador de lenguaje.
d. La base de datos.
e. El servidor.
8) Tomcat sólo es un contenedor de:
a. Apache.
b. Servidores.
c. Conectores.
d. Bases de datos.
e. Servlets.
9) El uso más común de los servlets es generar páginas web de forma dinámica
a partir de los parámetros de la petición que envíe el navegador web. Los
servlets forman parte de:
a. SCWCD
b. JSE
c. JOO
d. JNE
e. JEE
10) Una de las mejores características de los servlets Java es que todos estos
análisis de formularios son manejados:
a. Manualmente.
b. Automáticamente.
c. Por condiciones.
d. Iniciando el sistema.
e. Ejecutando una función.
UNIVERSIDAD PRIVADA TELESUP
183
Resumen
UUNNIIDDAADD DDEE AAPPRREENNDDIIZZAAJJEE IIIIII::
Un servlet es un objeto Java que implementa la interfaz javax.servlet.Servlet o hereda
alguna de las clases más convenientes para un protocolo específico (ej:
javax.servlet.HttpServlet). Al implementar esta interfaz el servlet es capaz de
interpretar los objetos de tipo HttpServletRequest y HttpServletResponse quienes
contienen la información de la página que invocó al servlet.
El valor de retorno es un String correspondiente al valor de la primera ocurrencia del
parámetro. Se devuelve un String vacío si el parámetro existe pero no tiene valor, y se
devuelve null si no existe dicho parámetro. Si el parámetro pudiera tener más de un
valor, como en el ejemplo anterior, deberíamos llamar a getParameterValues en vez
de a getParameter.
La unión entre capa de presentación y capa de negocio conocido en el paradigma de
la Programación por capas representaría la integración entre vista y su
correspondiente controlador de eventos y acceso a datos, MVC no pretende
discriminar entre capa de negocio y capa de presentación pero si pretende separar la
capa visual gráfica de su correspondiente programación y acceso a datos, algo que
mejora el desarrollo y mantenimiento de la Vista y el Controlador en paralelo, ya que
ambos cumplen ciclos de vida muy distintos entre sí.
Un objeto vista puede registrarse con el modelo y esperar a los cambios, pero aun así
el modelo en sí mismo sigue sin saber nada de la vista. El controlador no pasa objetos
de dominio (el modelo) a la vista aunque puede dar la orden a la vista para que se
actualice. Nota: En algunas implementaciones la vista no tiene acceso directo al
modelo, dejando que el controlador envíe los datos del modelo a la vista.
UNIVERSIDAD PRIVADA TELESUP
184
UNIVERSIDAD PRIVADA TELESUP
185
Introducción
a) Presentación y contextualización:
En esta unidad el alumno conocerá los diversos componentes en el desarrollo de
las aplicaciones, también podrá conocer los programas de más uso y adecuados
para el desarrollo eficiente de las aplicaciones de interés tales como; JQUERY,
Jfreechart, etc
b) Competencia:
Identifica las propiedades de las bibliotecas más utilizadas y realizar gráficos
utilizando Jfreechart.
c) Capacidades: 1. Reconoce el uso adecuado del reporteador IText.
2. Emplea JFreeChart adecuadamente para la elaboración de gráficos.
3. Conoce los procesos adecuados para la creación de gráficos con base de
datos.
4. Describe las características y funcionalidades de JQUERY.
d) Actitudes: Incentiva la investigación de los componentes en el desarrollo de aplicaciones.
Promueve la práctica constante de los procesos de programación de gráficos.
e) Presentación de Ideas básicas y contenidos esenciales de la Unidad: La Unidad de Aprendizaje 04: Uso de Otros Componentes en el Desarrollo de
Aplicaciones, comprende el desarrollo de los siguientes temas:
TEMA 01: Uso del Reporteador IText.
TEMA 02: JFreeChart.
TEMA 03: Gráfico con Base de Datos.
TEMA 04: jQuery
UNIVERSIDAD PRIVADA TELESUP
186
TEMA 1
Competencia:
Uso del Reporteador
IText
Reconocer el uso adecuado del reporteador IText.
UNIVERSIDAD PRIVADA TELESUP
187
Desarrollo de los Temas
Tema 01: Uso del Reporteador IText
iText es una librería escrita en java por Bruno Lowagie y otros,
que permite a los desarrolladores generar dinámicamente
documento en formato PDF, ofrece ventajas como:
El documento puede contener entradas escrita por el
usuario a través de variables.
El contenido puede ser personalizado
El documento puede ser ejecutado desde un entorno Web o Desktop
Se puede generar un documento a partir de archivos XML o Bases de datos
Agregar firmas digitales al PDF
Dividir, concatenar y manipular páginas del PDF
Puede obtener esta librería desde su página oficial en:
http://itextpdf.com
A continuación haremos un ejemplo donde utilizaremos los párrafos, tablas y veremos
cómo insertar una imagen además de agregarle una fuente en específico.
Primeramente recuerde tener a la mano la librería de iText en este caso he utilizado la
versión 5.0,2:
import java.io.*;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.Font;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.BaseColor;
import javax.swing.JOptionPane;
UNIVERSIDAD PRIVADA TELESUP
188
public class docItext {
public void generarPDF()throws Exception{
/*Primero definimos todas las cadenas del encabezado del documento y los demas datos a
utilizar*/
String encabezado="Geniz Software - Http://ajdgeniz.wordpress.com"+"\n"+ "Esta es una
frase que estara en el encabezado del documento"+"\n"+"\n"+"\n"+"\n" +"\n"+"\n"+"\n";
/*colocaremos tambien la fecha de creacion*/
java.util.Date date = new java.util.Date();
/*Fuente utilizada para formatear el encabezado en este caso sera arial 12 en negrita*/
Font fuente= new Font(Font.getFamily("ARIAL"), 12, Font.BOLD);
/*Definimos un texto que se incluira antes de la tabla*/
String choro="Mi primer documento en iText\n" + "Este es un documento elaborado con
iText 5.0 por Geniz"+"\n" + "No olviden visitar mis demas tutoriales y codigos fuentes
en http://ajdgeniz.worpdress.com" +"\n"+"\n"+"\n"+"\n";
/*Tambien haremos una tabla a partir de un par de arreglos en otro caso podria haber
sido un resultset de una base de datos*/
String[] columna1={ "id1","id2","id3","id4","id5"};
String[] columna2={ "valor1","valor2","valor3","valor4","valor5"};
/*Ahora almacenaremos la imagen que ira en la parte superior y la alineamos a la
izquierda*/
Image imagen=Image.getInstance(("logo.png"));
imagen.setAlignment(Image.LEFT | Image.TEXTWRAP);
/*Ahora que ya tenemos el contenido del documento empezaremos a estructurarlo*/
try{
/*Primero pasaremos nuestras cadenas a elementos de iText*/
/*definimos una frase que sera el string encabezado y le aplicamos la fuente*/
Paragraph linea = new Paragraph(encabezado,fuente);
/*Definimos un parrafo*/
Phrase para=new Phrase(choro);
/*Pasamos la fecha a un String y la agregamos a un parrafo*/
Paragraph fecha=new Paragraph(String.valueOf(date)+"\n"+"\n");
/*Ahora definimos la tabla donde el arguemento recibido indica el número de columnas y
la propiedad setWidthPercentage permite indicarle que ocupe todo el ancho de la página*/
PdfPTable tabla=new PdfPTable(2);
tabla.setWidthPercentage(100);
UNIVERSIDAD PRIVADA TELESUP
189
/*Ahora que ya tenemos todos los elementos es hora de agregarlos al documento, para ello
primeramente definimos un documento e indicando el tamaño*/
Document documento = new Document(PageSize.LETTER);
/*Definimos el nombre del archivo de salida con extension .PDF*/
String file="Hola.pdf";
/*a traves del siguiente metodo (getInstance)y un flujo de salida del paquete .io
asociamos el documento de iText con el archivo de java*/
PdfWriter.getInstance(documento, new FileOutputStream(file));
/*Definimos las celdas que seran los encabezados de la tabla*/
PdfPCell celda1 =new PdfPCell (new Paragraph("Columna1-
ID",FontFactory.getFont("arial",10,Font.BOLD,BaseColor.RED)));;
PdfPCell celda2 =new PdfPCell (new Paragraph("Columna2-
Valor",FontFactory.getFont("arial",10,Font.BOLD,BaseColor.RED)));
/*Abrimos el documento y agregamos los elementos en el orden que deben aparecer*/
documento.open();
documento.add(imagen);
documento.add(linea);
documento.add(para);
documento.add(fecha);
tabla.addCell(celda1);
tabla.addCell(celda2);
/*Ahora a traves de un for insertaremos el contenido del arreglo en la tabla*/
for(int i=0;i<columna1.length;i++){
tabla.addCell(columna1[i]);
tabla.addCell(columna2[i]); }
documento.add(tabla);
/*Cerramos el documento*/
documento.close();
/* LaunchApplication.execute(file);
//Ignoren esta linea de codigo es una de mis clases para pruebas*/
}catch(DocumentException e){ JOptionPane.showMessageDialog(null,e.getMessage(),"Error",
JOptionPane.ERROR_MESSAGE);
return;
}
catch(IOException e){
JOptionPane.showMessageDialog(null,e.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
return;
}}
public static void main(String[]args)throws Exception{
/*invocamos al metodo generarPDF*/
docItext app=new docItext();
app.generarPDF();
}}
UNIVERSIDAD PRIVADA TELESUP
190
TEMA 2
Competencia:
JFreeChart
Emplear JFreeChart adecuadamente para la elaboración de gráficos.
UNIVERSIDAD PRIVADA TELESUP
191
Tema 02: JFreeChart
El Proyecto JFreeChart que vio la luz en el año 2000 es una librería de
código abierto (Open Source) para Java, que permite crear diagramas
de forma práctica y sencilla. Con JFreeChart podremos hacer
diferentes tipos de gráficos que van desde los tipos comunes tales
como gráficos circulares , gráficos de barras , áreas , gráficos de línea
, histogramas, diagramas de Gantt y más específicos y menos
frecuentemente utilizados como tipos Candlestick , Viento y Wafer Map
.
Configuración en NetBeans
Para poder trabajar con los gráficos que ofrece el JfreeChart necesitamos 2 librerías
básicamente:
Nos creamos un proyecto web de ahí nos vamos a la carpeta library – add Jar/Folder y
agregamos esas librerías.
UNIVERSIDAD PRIVADA TELESUP
192
Implementación de Grafico en JSP
Ahora nos vamos a la página JSP y programaremos
Se necesita importar las librerías del jfreechart para hacer el grafico.
<%@page import="org.jfree.data.general.*" %>
En esta importacion debemos de poner la librería que se necesita según el tipo de
reporte
UNIVERSIDAD PRIVADA TELESUP
193
En el código fuente que observamos se aprecia que se está llenando 3 valores (3
categorías cada uno con un valor numérico y justamente ese valor definirá los
tamaños del gráfico)
El resultado sería:
Ahora si queremos el mismo grafico pero en barras la programación seria:
UNIVERSIDAD PRIVADA TELESUP
194
Hay que notar que la programación es casi la misma.
El resultado seria
UNIVERSIDAD PRIVADA TELESUP
195
TEMA 3
Competencia:
Gráfico con Base de Datos
Conocer los procesos adecuados para la creación de gráficos con base de datos.
UNIVERSIDAD PRIVADA TELESUP
196
Tema 03: Gráfico con Base de Datos
Si se quiere un gráfico de barras pero con base de datos el único cambio que
deberíamos de hacer es el siguiente:
Lo cambiamos de la siguiente manera
UNIVERSIDAD PRIVADA TELESUP
197
No debemos de olvidar de hacer una importación al SQL.
<%@page import="java.sql.*" %>,
el resto del código fuente es el mismo.
El resultado sería el siguiente:
UNIVERSIDAD PRIVADA TELESUP
198
TEMA 4
Competencia:
jQuery
Describir las características y funcionalidades de JQUERY.
UNIVERSIDAD PRIVADA TELESUP
199
Tema 04: JQUERY
JQuery es un framework de javascript, que nos va a permitir interactuar con los
elementos HTML de una manera muy cómoda y simplificando mucho nuestro trabajo.
Además jQuery, tiene una implementación propia de la tecnología AJAX, lo que nos va
a servir para que la comunicación entre JSP y jQuery sea mucho más atractiva.
Comunicar JSP con jQuery, no nos supone ningún problema, es una acción directa. El
problema viene a la hora de tratar de comunicar jQuery con JSP. La explicación es
muy sencilla y reside en la diferencia sutil pero tremendamente importante, que hay
entre estas dos tecnologías.
jQuery es una tecnología que se ejecuta en el lado del cliente, en su navegador y por
tanto cualquier variable que definamos con jQuery va a pertenecer al ámbito del cliente
y nuestro servidor no tiene porqué conocerla. Sin embargo, cualquier código que
escribamos en JSP, se va a ejecutar en el lado del servidor. Por tanto, cuando el
cliente solicite nuestra página JSP, nuestro contenedor (Tomcat, JBoss,..) compilará el
código JSP que nosotros hayamos incluido en la página, creará el código HTML
correspondiente y lo enviará al cliente.
Implementación de una página JSP con JQuery
Primero necesitamos la librería JQuery que es una librería que está hecha en
javaScript
La bajamos de internet de esta dirección: http://jquery.com/
UNIVERSIDAD PRIVADA TELESUP
200
Una vez que hemos bajado el archivo lo descomprimimos y lo guardamos en una
carpeta, en este caso la carpeta se llamara “librería”,
Ahora nos creamos un proyecto web y
copiamos esa carpeta “librería” en la carpeta
web
Una vez que tenemos las librerías de Jquery
desarrollaremos algunos ejemplos:
Ejemplo 1: ThickBox
Se tendrá un pagina donde se mostrara un link al hacer click se mostrara otra
pagina encima poniendo de un color oscuro la pagina de atrás
UNIVERSIDAD PRIVADA TELESUP
201
Se necesita importar las librerías:
<script type="text/javascript" src="libreria/jquery.js"></script>
<script type="text/javascript" src="libreria/ui/thickbox.js"></script>
Se necesita estas 2 librerías que la tenemos en la carpeta “librerías”. Notemos que
cuando se hace el hipervínculo tenemos lo siguiente: <a href="listado.jsp>"
class="thickbox">
Esto hace que salga el efecto que queremos
El resultado seria
Cuando se haga clic en “ver datos” se llamara a otra página llamada “Listado”
UNIVERSIDAD PRIVADA TELESUP
202
Ejemplo 2 : datepicker
Se tendrá una página donde se ingresara una fecha en una caja de texto y al
hacer click en la caja de texto se mostrara un calendario.
El resultado seria
UNIVERSIDAD PRIVADA TELESUP
203
Ahora si queremos ver el calendario más atractivo podríamos ponerle un estilo
“css”
Notemos la referencia:
<link type="text/css" href="libreria/themes/base/ui.all.css" rel="stylesheet" />
Además que se debería de crear un div
<div class="demo">
El resultado sería:
UNIVERSIDAD PRIVADA TELESUP
204
1. Realice un gráfico empleando JFreeChart. Ponga en práctica
todas las recomendaciones que se brindan en el presente
material.
Envíalo a través de "JFreeChart".
2. En un documento en Word realice un informe sobre jQuery,
remarcando sus ventajas y desventajas frente a otras
bibliotecas.
Envíalo a través de "jQuery".
Lecturas Recomendadas
¿QUÉ ES JQUERY?, ¿QUÉ PUEDO HACER CON JQUERY?
http://www.elektrainformatica.com.ar/blog/item/110-jquery-que-es-y-como-se-
usa?.html
GRÁFICOS EN JAVA CON JFREECHART http://lineadecodigo.com/java/graficos-en-java-con-jfreechart/
Actividades y Ejercicios
UNIVERSIDAD PRIVADA TELESUP
205
Autoevaluación
1) El Proyecto JFreeChart que vio la luz en el año:
a. 1980.
b. 1994.
c. 2000.
d. 2010.
e. 2012.
2) El Proyecto JFreeChart es una librería de código:
a. Libre.
b. BSD.
c. LINUX.
d. GNU.
e. GPL.
3) Es un framework de javascript, que nos va a permitir interactuar con los
elementos HTML de una manera muy cómoda y simplificando mucho nuestro
trabajo.
a. AJAX.
b. Jquery.
c. Imprentln.
d. String.
e. Boolean.
4) jQuery, tiene una implementación propia de la tecnología:
a. Visual.
b. JSP.
c. AJAX.
d. Adobe.
e. FOXPRO.
5) Cualquier código que escribamos en JSP, se va a ejecutar en el lado del:
a. Ordenador.
b. Administrador.
c. Usuario.
d. Puerto.
e. Servidor.
UNIVERSIDAD PRIVADA TELESUP
206
6) Cuando el cliente solicite nuestra página JSP, nuestro contenedor (Tomcat,
JBoss,..) compilará el código JSP que nosotros hayamos incluido en la
página, creará el código ______ correspondiente y lo enviará al cliente.
a. HTML.
b. JSP.
c. JEE.
d. Java.
e. ASP.
7) Es una librería escrita en java por ____________ y otros, que permite a los
desarrolladores generar dinámicamente documento en formato PDF.
a. Kate y Kelsey.
b. Liquid Robotics.
c. James Gosling.
d. Bruno Lowagie.
e. Raj Reddy.
8) iText no ofrece ventajas como:
a. El contenido puede ser personalizado.
b. El documento puede ser ejecutado desde un entorno Web o Desktop.
c. Se puede generar un documento a partir de archivos XML o Bases de datos.
d. Eliminar firmas digitales al PDF.
e. Dividir, concatenar y manipular páginas del PDF.
9) La librería JQuery que es una librería que está hecha en:
a. CSS.
b. JavaScript.
c. HTML.
d. C++
e. JOO.
10) Para poder trabajar con los gráficos que ofrece el JfreeChart, cuantas
librerías necesitamos básicamente.
a. Cinco.
b. Doce.
c. Cuatro.
d. Ocho.
e. Dos.
UNIVERSIDAD PRIVADA TELESUP
207
Resumen
UUNNIIDDAADD DDEE AAPPRREENNDDIIZZAAJJEE iivv::
JFreeChart es un marco de software open source para el lenguaje de programación
Java, el cual permite la creación de gráficos1 complejos de forma simple. JFreeChart
también trabaja con GNU Classpath, una implementación en software libre de la
norma estándar de biblioteca de clases para el lenguaje de programación Java.
JFreeChart es compatible con una serie de gráficas diferentes, incluyendo cuadros
combinados.
Una aplicación sin gráficas es muy sosa... y normalmente nuestros clientes lo
agradecen. Hay muchas librerías de pago y gratuitas para realizar esta labor. Vamos a
mostraros como crear una gráfica simple con una de las librerías más extendidas.
Hemos elegido en este caso JFreeChart y vamos a mostrar distintas posibilidades de
uso.
Cuando se piensa el porqué se desarrolla sistemas de información en una
organización, la respuesta parece bastante obvia, para registrar y controlar los
movimientos y transacciones que se van generando con el correr del tiempo, sin
embargo existe aún un motivo más importante y no tan obvio, es que la información
puede usarse para respaldar la toma de decisiones.
jQuery es una biblioteca de JavaScript, creada inicialmente por John Resig, que
permite simplificar la manera de interactuar con los documentos HTML, manipular el
árbol DOM, manejar eventos, desarrollar animaciones y agregar interacción con la
técnica AJAX a páginas web. Fue presentada el 14 de enero de 2006 en el BarCamp
NYC. jQuery es la biblioteca de JavaScript más utilizada.
UNIVERSIDAD PRIVADA TELESUP
208
Glosario
JFREECHART: Es un marco de software open source para el lenguaje de
programación Java, el cual permite la creación de gráficos complejos de forma
simple.
NETBEANS: Es un entorno de desarrollo integrado libre, hecho principalmente para
el lenguaje de programación Java. Existe además un número importante de
módulos para extenderlo. NetBeans IDE2 es un producto libre y gratuito sin
restricciones de uso.
HISTOGRAMAS: Es una representación gráfica de una variable en forma de barras,
donde la superficie de cada barra es proporcional a la frecuencia de los valores
representados, ya sea en forma diferencial o acumulada.
JAVA: Es una tecnología que se usa para el desarrollo de aplicaciones que
convierten a la Web en un elemento más interesante y útil. Java no es lo mismo
que javascript, que se trata de una tecnología sencilla que se usa para crear
páginas web y solamente se ejecuta en el explorador.
FRAMEWORK: Es una estructura conceptual y tecnológica de soporte definido,
normalmente con artefactos o módulos de software concretos, que puede servir de
base para la organización y desarrollo de software. Típicamente, puede incluir
soporte de programas, bibliotecas, y un lenguaje interpretado, entre otras
herramientas, para así ayudar a desarrollar y unir los diferentes componentes de
un proyecto.
SOFTWARE: Se conoce como software al equipamiento lógico o soporte lógico de
un sistema informático, que comprende el conjunto de los componentes lógicos
necesarios que hacen posible la realización de tareas específicas, en
contraposición a los componentes físicos que son llamados hardware.
JAVASCRIPT: JavaScript (abreviado comúnmente "JS") es un lenguaje de
programación interpretado, dialecto del estándar ECMAScript. Se define como
orientado a objetos, basado en prototipos, imperativo, débilmente tipado y
dinámico.
JQUERY: Es una biblioteca de JavaScript, creada inicialmente por John Resig, que
permite simplificar la manera de interactuar con los documentos HTML, manipular
el árbol DOM, manejar eventos, desarrollar animaciones y agregar interacción con
la técnica AJAX a páginas web.
PATRÓN MVC: El patrón de arquitectura MVC (Modelo Vista Controlador) es un
patrón que define la organización independiente del Modelo (Objetos de Negocio),
la Vista (interfaz con el usuario u otro sistema) y el Controlador (controlador del
workflow de la aplicación).
UNIVERSIDAD PRIVADA TELESUP
209
Fuentes de Información
BIBLIOGRÁFICAS:
SANTOS DOMINGUEZ, Sebastián, Modelo vista controlador, Editorial Barzas
Año: 2011.
MARQUEZ SÁNCHEZ, Kelly, Patron MVC. Editorial: Luna S.l. 2010.
MINERA GUERRA, Alejandro, Guía de desarrollo web. Ediciones Centro Web,
2010.
VÁSQUEZ MATTOS, Cinthia. Java aplicación. Editorial: Mc Grill Inc, 2009.
ELECTRÓNICAS:
Java Database Connectivity
http://es.wikipedia.org/wiki/Java_Database_Connectivity
Descripción del patrón MVC
http://www.desarrolloweb.com/wiki/mvc-modelo-vista-controlador.html
Modelo–vista–controlador
http://es.wikipedia.org/wiki/Modelo%E2%80%93vista%E2%80%93controlador
Desarrollo de software basado en componentes
http://www.slideshare.net/ulicruz/desarrollo-de-software-basado-en-componentes
UNIVERSIDAD PRIVADA TELESUP
210
Solucionario
UNIDAD DE
APRENDIZAJE 2:
1. A
2. C
3. C
4. D
5. E
6. A
7. E
8. D
9. C
10. B
UNIDAD DE
APRENDIZAJE 3:
1. B
2. A
3. B
4. D
5. A
6. A
7. A
8. E
9. E
10. B
UNIDAD DE
APRENDIZAJE 4:
1. C
2. A
3. B
4. C
5. E
6. A
7. D
8. D
9. B
10. E
UNIDAD DE
APRENDIZAJE 1
1. B
2. B
3. A
4. E
5. B
6. A
7. C
8. A
9. C
10. E