Vous êtes sur la page 1sur 210

UNIVERSIDAD PRIVADA TELESUP

UNIVERSIDAD PRIVADA TELESUP

Prefacio:

La asignatura es de naturaleza

terico prctico,

orientada al desarrollo del estudiante, con un avanzado


nivel de habilidades en programacin orientada al
desarrollo de aplicaciones para la web, aplicando
apropiadamente varios componentes y tecnologa Java.

Definiendo; Una aplicacin web es una aplicacin a la


que se accede a travs de internet u otras redes
similares como intranet, que no requiere instalacin para
los usuarios. Es decir, es una aplicacin 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 informacin que contienen.

Comprende cuatro Unidades de Aprendizaje:


Unidad I: Fundamentos de la Tecnologa Java.
Unidad II: Tecnologa JDBC (Java DataBase Connectivity).
Unidad III: Patrn de Diseo MVC (Model View - Controller).
Unidad IV: Uso de Otros Componentes en el Desarrollo de Aplicaciones.

UNIVERSIDAD PRIVADA TELESUP

Estructura de los Contenidos

Fundamentos
de la Tecnologa
Java

Fundamentos de
POO en JAVA

Herencia y
Polimorfismo

Estructuras de
Datos Dinmicas
(Java Collection

Tecnologa JDBC
(Java Database
Connectivity)

Patron de
Diseo MVC
(Model View Controller).

Interfaces JDBC.

Servlet.
Uso del
Reporteador
ITEXT.

Las Interfaces y
Clases del JDBC.

Presentar el
Contenido de una
Tabla.

Pasos para Crear


un Servlet

Modelo Vista
Controlador
(MVC).

Framework).

Manejo y Uso de
Sesiones

Uso de Otros
Componentes en
el Desarrollo de
Aplicaciones

La Interface
Preparedstament y
Callablestament.

Consulta de Datos
MVC.

Jfreechart.

Grfico con Base


de Datos.

JQUERY.

La competencia que el estudiante debe lograr al final de


la asignatura es:
Conocer programas y componentes sistemticos para el
desarrollo de las aplicaciones web, cumpliendo los
procesos adecuados que se recomiendan en el presente
material.

UNIVERSIDAD PRIVADA TELESUP

ndice del Contenido

I. PREFACIO
II. DESARROLLO DE LOS CONTENIDOS
UNIDAD DE APRENDIZAJE 1: FUNDAMENTOS DE LA TECNOLOGIA JAVA
1.
Introduccin
a. Presentacin y contextualizacin
b. Competencia (logro)
c. Capacidades
d. Actitudes
e. Ideas bsicas 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 Dinmicas (Java Collection Framework).
d. Tema 04: Manejo y Uso de Sesiones
3.
Lecturas recomendadas
4.
Actividades
5.
Autoevaluacin
6.
Resumen
UNIDAD DE APRENDIZAJE 2: TECNOLOGA JDBC (JAVA DATABASE CONNECTIVITY)
1.
Introduccin
a. Presentacin y contextualizacin
b. Competencia (logro)
c. Capacidades
d. Actitudes
e. Ideas bsicas 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.
Autoevaluacin
6.
Resumen
UNIDAD DE APRENDIZAJE 3: PATRON DE DISEO MVC (MODEL VIEW - CONTROLLER).
1.
Introduccin
a. Presentacin y contextualizacin
b. Competencia (logro)
c. Capacidades
d. Actitudes
e. Ideas bsicas 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.
Autoevaluacin
6.
Resumen
UNIDAD DE APRENDIZAJE 4: USO DE OTROS COMPONENTES EN EL DESARROLLO DE
APLICACIONES
1.
Introduccin
a. Presentacin y contextualizacin
b. Competencia
c. Capacidades
d. Actitudes
e. Ideas bsicas y contenido
2.
Desarrollo de los temas
a. Tema 01: Uso del Reporteador ITEXT.
b. Tema 02: Jfreechart.
c. Tema 03: Grfico con Base de Datos.
d. Tema 04: JQUERY.
3.
Lecturas recomendadas
4.
Actividades
5.
Autoevaluacin
6.
Resumen
III. GLOSARIO
IV. FUENTES DE INFORMACIN
V. SOLUCIONARIO

02
03 - 210
05-70
06
06
06
06
06
06
07-66
07
35
43
59
67
67
68
70
71-125
72
72
72
72
72
72
73-121
73
79
99
111
122
122
123
125
126-183
127
127
127
127
127
127
128-179
128
134
149
165
180
180
181
183
184-207
185
185
185
185
185
185
186-203
186
190
195
198
204
204
205
207
208
209
210

UNIVERSIDAD PRIVADA TELESUP

UNIVERSIDAD PRIVADA TELESUP

Introduccin

a) Presentacin y contextualizacin
Java es la base para prcticamente todos los tipos de aplicaciones de red,
adems del estndar global para desarrollar y distribuir aplicaciones mviles y
embebidas, juegos, contenido basado en web y software de empresa. Con ms 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 pginas web dinmicas, con accesos a bases de datos, utilizando
XML, con cualquier tipo de conexin 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 dinmicos.
4. Analiza el manejo y uso adecuado de las sesiones.

d) Actitudes
Pone en prctica cada uno de los procesos recomendados por Java.
Incentiva el cumplimiento de las estructuras de los datos dinmicos.

e) Presentacin de Ideas bsicas y contenido esenciales de la Unidad:


La Unidad de Aprendizaje 01: Fundamentos de la Tecnologa 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 Dinmicas
(JAVA COLLECTION FRAMEWORK).
TEMA 04: Manejo y Uso de Sesiones

UNIVERSIDAD PRIVADA TELESUP

Fundamentos
de POO en
JAVA

TEMA 1

Competencia:
Conocer los principales fundamentos
funciones de POO en Java.

UNIVERSIDAD PRIVADA TELESUP

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 patrn a partir de la
cual se crean muchos otros objetos similares,
tambin se podra definir a una clase como la
agrupacin

de

objetos

que

poseen

caractersticas comunes.

Ejemplos:

Si Ud. tuviera que dibujar 30 mapas del Per Cmo los podra hacer de un
modo muy rpido? Tendra que conseguir un molde o plantilla y a partir de ste
podra crear los 30 mapas de un modo fcil y rpido. En este ejemplo el Molde o
Patrn sera la Clase y cada uno de los mapas reproducidos vendran ser los
Objetos instanciados.

Qu clases puedes distinguir dentro de tu aula? En el aula existe la clase


Alumnos, cada alumno vendra ser un objeto que se origina de esta clase. Otras
clases podran ser: Carpetas, tiles, etc.

Como podemos darnos cuenta, los conceptos de la POO estn en la vida diaria, y son
estos conceptos los que se aplican al momento de programar aplicaciones
informticas.

Propiedades de la clase
Las propiedades o atributos son las caractersticas
descriptivas de una clase. Cuando definimos una
propiedad especificamos su nombre y su tipo de dato.

UNIVERSIDAD PRIVADA TELESUP

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)

Mtodos en las clases


Son las funcionalidades, acciones o habilidades de la clase. Los mtodos son
funciones que estn asociadas a un objeto. Los mtodos responden a la pregunta:

Qu es lo que es capaz de hacer la clase?


Los nombres de los mtodos generalmente estn asociados a una accin o verbos. Al
final del nombre de los mtodos siempre se utilizarn parntesis dentro de los cuales
muchas veces es necesario enviar algunos datos, para que puedan realizarse los
procesos.

Ejemplos:
La clase Alumnos contiene los siguientes mtodos:
Estudiar ()
Hablar ()
DecirSuEdad( )
La clase plumones contiene los siguientes mtodos:
pintar()
escribir()
La clase calculadora contiene los siguientes mtodos:
Sumar(4,5)
Restar(3,2)
Multiplicar(4,3)
Multiplicar(4,2)

UNIVERSIDAD PRIVADA TELESUP

Nota:
-

Algunos mtodos reciben entre los parntesis: datos, los cuales sirven al mtodo
para realizar su tarea. Estos datos son conocidos como argumentos del mtodo.

Algunos mtodos retornan un dato como resultado de la accin, por ejemplo el


mtodo sumar(4,5) de la clase Calculadora, luego de realizar su accin 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 accin de crear un objeto a partir de una clase
se

llama

instanciar.

Todo

objeto

instanciado

hereda

automticamente las propiedades y mtodos de su clase base.


Estados en objetos
Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando
tenemos una Fraccin, 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 mtodo, debemos especificar el objeto instanciado,


luego colocaremos un punto y posteriormente el nombre de la propiedad o mtodo que
se ha heredado de su clase base. Ejemplo:
obj.apellidos=Torres;
obj.nombres=Edwin;

Ejemplos prcticos
A continuacin, mostraremos algunos ejemplos de clases con sus respectivas
propiedades y mtodos.

10

UNIVERSIDAD PRIVADA TELESUP

Clase reloj
Propiedades: Marca, Modelo, Precio, Tipo
Mtodos: mostrarlaHora(), mostrarlaFecha(), fijarAlarma(),
iniciarCronometro()
Clase triangulo
Propiedades: Color, TipodeBorde, TipodeTriangulo
Mtodos: calcularArea(), calcularSemiPermetro()
Clase BoletadeNota
Propiedades: NroBoleta, FechadeEmision, Apellidos, Nombres
Mtodos: calcularPromedioporAsignatura(), calcularPromedioPonderado().

Con el siguiente grfico, puedes tener un resumen de lo tratado en la presente unidad:

11

UNIVERSIDAD PRIVADA TELESUP

Programacin orientada a objetos en java


Creacin 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 debern 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

12

UNIVERSIDAD PRIVADA TELESUP

Mtodos de la clase
Se debern crear dentro de la clase, cada mtodo 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 mtodos usan parntesis para recibir algunos datos
(argumentos) desde el exterior.

Ejemplo:
Dato que devuelve

Argumentos de Entrada

public double sumar(double a, double b)


{

double r;
r=a+b;
return r;

Nombre del mtodo

Ejemplo: La clase con sus Propiedades y mtodos:


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;
}

13

UNIVERSIDAD PRIVADA TELESUP

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

Mtodos constructores
Un mtodo constructor es un mtodo especial dentro de la clase, que lleva el nombre
de la misma clase. Pueden existir uno o varios mtodos constructores. Su funcin 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 Mtodos Constructores


Nota: Si una clase posee varios mtodos 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
}

14

UNIVERSIDAD PRIVADA TELESUP

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

15

UNIVERSIDAD PRIVADA TELESUP

El mtodo esttico main


Este mtodo es el Mtodo principal de la clase, es aquel que es invocado cuando
ejecutamos la clase, si una clase no cuenta con el mtodo 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 tambin que al instanciar un objeto, este hereda
automticamente propiedades y mtodos 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;
}

16

UNIVERSIDAD PRIVADA TELESUP

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[])
{
//Creacin de diferentes objetos instanciados
//Se utilizar para cada instanciamiento a un mtodo constructor diferente
//Puede utilizarse cualquier mtodo 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 mtodos 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));

17

UNIVERSIDAD PRIVADA TELESUP

//Usando la propiedades y mtodos 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 mtodos 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

Invocacin 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.
Proyecto
Paquete 1
Paquete 2

Aqu tenemos dos paquetes,


dentro de cada paquete
tenemos una clase.

Cuando una clase es creada dentro de un paquete, debe llevar en la primera lnea: el
nombre del paquete.
package Ejemplo1;

//Nombre del paquete

public class Calculadora {


.
.

Aqu va el contenido de la
clase Calculadora

.
}

18

UNIVERSIDAD PRIVADA TELESUP

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[])
{
//Creacin 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));
}
}

Creacin de variables y mtodos estticos


Variables Estticas: 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 travs del nombre de la
clase. Las variables estticas conservan un mismo valor para toda la clase y no
cuentan con estados (datos) diferentes en cada objeto instanciado.

Ejemplo del uso de variables estticas en la Clase


Calculadora: En este ejemplo se estn creando dos
variables

estticas:

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 estticas en cada una de los mtodos 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 {

19

UNIVERSIDAD PRIVADA TELESUP

// 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; }

20

UNIVERSIDAD PRIVADA TELESUP

// EL METODO CONSTRUCTOR 1
// Permite el ingreso de los estados solo a 2 de
// las propiedades del objeto instanciado
//Este mtodo ocurrir al mtodo de la instancia
public Calculadora(String ma,double p) {
marca=ma;
precio=p;
total+=precio; // Es un acumulador, (es variable esttica, su valor se mantiene en toda la clase)
cuenta++;

// Es un contador, (es variable esttica, 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 mtodo ocurrir al mtodo de la instancia
public Calculadora(String ma,double p, String mo) {
marca=ma;
precio=p;
modelo=mo;
total+=precio; // Es un acumulador, (es variable esttica, su valor se mantiene en toda la clase)
cuenta++;

// Es un contador, (es variable esttica, su valor se mantiene en toda la clase)

// EL METODO CONSTRUCTOR 3 - Permite solo el


// instanciamiento
//Este mtodo ocurrir al mtodo de la instancia
public Calculadora() {
total+=precio; // Es un acumulador, (es variable esttica, su valor se mantiene en toda la clase)
cuenta++;

// Es un contador, (es variable esttica, su valor se mantiene en toda la clase)

}
public static void main(String args[])
{

21

UNIVERSIDAD PRIVADA TELESUP

//Creacin de los objetos instanciados


//En cada instancia est invocndose a los mtodos 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 estticas
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

Mtodos Estticos: Son aquellos mtodos que pertenecen directamente a la clase y


que para acceder a ellos no se requiere de una instancia, se puede acceder a estos
mtodos directamente a travs del nombre de la clase.
Ejemplo del uso de mtodos estticos en la Clase Calculadora:
En este ejemplo se estn creando dos mtodos estticos:
totalizar() : Mtodo utilizado para devolver la cantidad acumulada de todos los precios
promediar() : Mtodo 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;

22

UNIVERSIDAD PRIVADA TELESUP

//CREACIN DEL METODO ESTATICO


public static double totalizar() {
return total;
}
//CREACIN 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;
}

23

UNIVERSIDAD PRIVADA TELESUP

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

24

UNIVERSIDAD PRIVADA TELESUP

// 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[])


{
//Creacin 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 tambin variables estticas que al ser declaradas reciben un valor,
y luego de esto, no permiten que dicho valor sea modificado en tiempo de ejecucin.
Ejemplo:
public static final double IGV=0.19;
public static final String RAZONSOCIAL=TecniSystem SRL;

25

UNIVERSIDAD PRIVADA TELESUP

Aplicando la POO en JAVA


A continuacin explicaremos a travs de ejemplos 5 maneras diferentes de
plantear un mismo caso en la programacin orientada a objetos.
a.

Primera Forma: Usando mtodos con argumentos de


entrada

b.

Segunda Forma: Usando mtodos sin


argumentos de entrada

c.

Tercera Forma: Usando mtodos sin retorno

d.

Cuarta Forma: Usando un solo mtodo en la clase.

e.

Quinta Forma: Usando mtodos estticos

f.

Sexta Forma: Usando mtodos y variables estticas

Desarrollo de una caso prctico


Enunciado: Calcular el promedio de un alumno y determinar su situacin acadmica.
1RA FORMA: Usando mtodos con argumentos de entrada.
Lgica 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;
}
//Mtodo constructor
public Alumno(){
}
}

26

UNIVERSIDAD PRIVADA TELESUP

Lgica de Presentacin 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;
//Invocacin a los mtodos 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 mtodos sin argumentos de entrada


Lgica 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;
//Mtodos de la clase, ya no usamos argumentos de entrada, en su lugar

27

UNIVERSIDAD PRIVADA TELESUP

//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(){
}
}
Lgica de Presentacin 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;
//Invocacin a los mtodos
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>

28

UNIVERSIDAD PRIVADA TELESUP

3ra forma: Usando mtodos sin valor de retorno


Lgica 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;
//Mtodos 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(){
}
}

Lgica de Presentacin 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();

29

UNIVERSIDAD PRIVADA TELESUP

//Entrada de datos (Directo a las propiedades)


obj1.pc1=5;
obj1.ep=12;
obj1.pc2=14;
obj1.ptp=8;
obj1.ef=7;
//Invocacin a los mtodos
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 mtodo en la clase. Fusionamos todos los mtodos. Las
diversas respuestas se guardan en propiedades.
Lgica 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(){
}
}

30

UNIVERSIDAD PRIVADA TELESUP

Lgica de Presentacin 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;
//Invocacin a los mtodos
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 mtodos estticos.


Mtodo Esttico: Es un mtodo que se declara a nivel de la clase, no requiere de una
instancia para ser invocado, los mtodos estticos pueden ser invocados a partir del
nombre de la clase.
.
Lgica de Negocios Paquete model
package model;
public class Alumno {
//Propiedades de la clase
public String nombres;
public String apellidos;
public String direccion;

31

UNIVERSIDAD PRIVADA TELESUP

//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(){
}
}

Lgica de Presentacin 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;

32

UNIVERSIDAD PRIVADA TELESUP

double pc2=14;
double ptp=8;
double ef=7;
//Invocacin a los mtodos 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 mtodos y variables estticos.


Variable Esttica: 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.

Lgica 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(){

33

UNIVERSIDAD PRIVADA TELESUP

String sa="";
if (p>=10.5) {
sa="Aprobado";
} else {
sa="Desaprobado";
}
return sa;
}
//Metodo constructor
public Alumno(){
}
}

Lgica de Presentacin 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;
//Invocacin a los mtodos
Alumno.p=Alumno.calcularPromedio();
String sa=Alumno.determinarSituacionAcad();
//Mostrar resultados
out.println("Promedio final "+Alumno.p+"<br>");
out.println("Situacion academica "+sa);
%>
</body>
</html>

34

UNIVERSIDAD PRIVADA TELESUP

Herencia
y

TEMA 2

Polimorfismo
Competencia:
Reconocer las utilidades adecuadas de la
herencia y polimorfismo.

35

UNIVERSIDAD PRIVADA TELESUP

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

cdigo

previamente

desarrollado. Si una clase deriva de otra (extends),


sta hereda todas sus propiedades y mtodos. La
clase derivada puede aadir nuevas variables y
mtodos y/o redefinir las variables y mtodos
heredados.

Java permite mltiples niveles de herencia, No obstante, no permite que una clase
derive de varias (no es posible la herencia mltiple). 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 mtodos y Atributos de la Clase Padre.
Adicionalmente Podemos aadir otros mtodos o atributos a la clase hijo.

Padre

La Clase Hijo Extiende de la


Clase Padre

Hijo

36

UNIVERSIDAD PRIVADA TELESUP

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 mtodos de
la clase Persona.

Todas las clases de Java creadas por el programador tienen una super-clase.
Cuando no se indica explcitamente una super-clase con la palabra extends, la clase
deriva de java.lang.Object, que es la clase raz de toda la jerarqua de clases de
Java. Como consecuencia, todas las clases tienen algunos mtodos que han
heredado de Object.

Ventajas y precaucaciones de su uso


La principal ventaja del uso de herencia de clases es la reutilizacin de los mtodos de
clases base, lo cual impide que se repita el mismo cdigo muchas veces dentro del
desarrollo de una aplicacin, 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 programacin.

Al disear nuestras clases es fundamental


que primero se disee adecuadamente un
modelo inicial, utilizando metodologas
basadas en el anlisis y diseo de sistemas
orientado a objetos, de no ser as nuestro
diseo de clases con sus respectivas
herencias podra ser inconsistente e
inarticulado.

37

UNIVERSIDAD PRIVADA TELESUP

Ejercicio Prctico:
Crear un conjunto de clases que represente los procesos en el sistema de personal,
luego instancie la clase Alumno presencial e invoque los mtodos y muestre las
respuestas conseguidas
El siguiente diagrama ilustra el modelo de clases que desarrollaremos en la lgica de
negocios.

Lgica de negocios
mbitos de Alcance
Es el mecanismo que permite definir el tipo de nivel de acceso a la informacin de los
objetos, (clases, mtodos y propiedades).
En Java los niveles de encapsulamiento estn dados de la siguiente forma:
public, private, protected y package. De esta forma se puede controlar el acceso
hacia las clases, mtodos y propiedades y evitar un uso inadecuado .

38

UNIVERSIDAD PRIVADA TELESUP

Veamos cmo funcionan estos diversos


niveles de acceso en el siguiente caso
prctico:
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 tambin dos clases: La
clase C (es una clase que extiende de la clase B), y la clase D.

Ahora, ubiqumonos en la clase B, y veamos en el siguiente cuadro, los


diferentes tipos de acceso de esta clase hacia las dems clases del
mismo paquete y de los dems.

Concepto y niveles de acceso en java:

39

UNIVERSIDAD PRIVADA TELESUP

Explicacin:

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 dems.

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.

Caractersticas de una interfaz:


Los mtodos de una interfaz deben ser
abstractos.
No representa a un objeto sino a un Grupo de
Objetos. Por lo tanto no usan constructores, ni
mtodos estticos, 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.

40

UNIVERSIDAD PRIVADA TELESUP

Ejemplo: A continuacin estamos creando una interfaz de nombre Reproducible.


public interface Reproducible
{
// Aqu deben indicarse los mtodos abstractos
// con los que se trabajarn
}

Mtodos abstractos
Son utilizados dentro de una interfaz, solo muestran la funcionalidad del objeto, pero
no incluyen la lgica del procedimiento (no hacen nada por ellos mismos).

Ejemplo:
public void play();

Este es un mtodo abstracto, no usa llaves


(No tiene implementacin)
No tienen definido el Cmo, pero si el Qu

Herencia en interfaces
Para darle un uso prctico a la interfaz: Debemos crear una clase que herede de
dicha interfaz, en la cual se detallar la funcionalidad de los mtodos declarados en
la interfaz.
Cmo realizar dicha herencia?
public class MP3 implements Reproducible
{
// Aqu debe implementarse el mtodo play, al cual
// se hizo mencin de manera abstracta en la
interfaz
}

41

UNIVERSIDAD PRIVADA TELESUP

Ventaja del uso de las interfaces

Se utiliza las interfaces cuando en el desarrollo de una aplicacin, an no


sabemos la lgica de los mtodos, pero si conocemos cuales sern las
funcionalidades importantes.

Nos permite ocultar el cdigo fuente de los mtodos de nuestras clases, puesto
que solo al cliente tendramos que suministrarle la interfaz y su ejecutable,
mientras que la lgica de nuestros mtodos lo almacenaramos en un servidor de
acceso restringido.

Una clase puede implementar ms de


una interface, representando una forma
alternativa de la herencia mltiple. A su
vez, una interface puede derivar de otra
o incluso de varias interfaces, en cuyo
caso incorpora todos los mtodos de las
interfaces de las que deriva.

42

UNIVERSIDAD PRIVADA TELESUP

Estructuras
de Datos
Dinmicas

TEMA 3

Competencia:
Describir objetivamente las estructuras de
datos dinmicos.

43

UNIVERSIDAD PRIVADA TELESUP

Tema 03: Estructuras de Datos Dinmicas


(Java Collection Framework).

DEFINICIN Y CARACTERSTICAS
Resumiendo, son aquellas cuyo tamao
(longitud, nmero de elementos...) vara en
tiempo de ejecucin. Las ms famosas son:
Listas simplemente enlazadas (con y sin
cabecera), Listas doblemente enlazadas (con
y sin cabecera), Pilas, Colas, rboles y
Grafos.

Su tamao y forma es variable (o puede serlo) a lo largo de un programa, por lo que se


crean y destruyen en tiempo de ejecucin. Esto permite dimensionar la estructura de
datos de una forma precisa: se va asignando memoria en tiempo de ejecucin segn
se va necesitando.

En java tenemos muchas clases que manejan diferentes estructuras dinmicas,


entre las que podemos mencionar:
Vector
Enumeration
HashTable
Stack
Set
List
ArrayList
Dictonary
Collection
SortedSet
LinkedList

44

UNIVERSIDAD PRIVADA TELESUP

HashTables
Es una estructura de datos dinmica que almacena un
grupo de objetos, cada elemento almacenado en el
HashTable debe contar un key (Cdigo 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

Mtodos de la clase HashTable:

45

UNIVERSIDAD PRIVADA TELESUP

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());
}

46

UNIVERSIDAD PRIVADA TELESUP

//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
Object obj=null;

s();

while(e3.hasMoreElements()){
obj=e3.nextElement();
System.out.println(obj.toString());
}
}
}

Caso Prctico 2: Realizar una aplicacin visual que nos permita realizar
operaciones de edicin con los elementos de un Hashtable.

47

UNIVERSIDAD PRIVADA TELESUP

Declaracin global a nivel de la clase

public class frmIngreso extends javax.swing.JFrame {


Hashtable lista=new Hashtable();
int c=0;
Codificacin 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();
}

Codificacin del botn 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);
}
}

Codificacin del botn 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);
}

48

UNIVERSIDAD PRIVADA TELESUP

Codificacin del botn 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);
}

Codificacin del botn 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 dinmico 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 esttico o
hacer casting de los valores a su correspondiente representacin de objetos.

Esta clase tiene muchos mtodos implementados que facilitan el trabajo con arreglos:
bsquedas, eliminacin, insercin, expansin entre otras.

Un objeto de tipo vector, se puede redimensionar en tiempo de ejecucin, si las celdas que
definen se han ocupado.

Para ello, existe un atributo o propiedad que le indica al compilar, en cuntas posiciones se
puede redimensionar el vector, cuando ya haya ocupado su capacidad mxima.

49

UNIVERSIDAD PRIVADA TELESUP

Creacin de un Vector:

Vector v=new Vector (20,5);


Crea un vector con un tamao inicial de 20 elementos y
con la posibilidad de incrementar su tamao de 5 en 5.
Vector v=new Vector (20);
Crea un vector con un tamao inicial de 20 elementos y
con la posibilidad de incrementar su tamao de 20 en 20.
Vector v=new Vector ();
Crea un vector con un tamao inicial de 10 elementos y con la posibilidad de incrementar su
tamao de 10 en 10.
Mtodos de la clase Vector

Vector( )
Constructor: crea un vector inicialmente vaco
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 posicin especficada
Object remove(int ndice)
Elimina el objeto que se encuentra en la posicin 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 indce)
Regresa el objeto del ndice especficado
boolean isEmpty( )
Regresa verdadero si el vector no contiene elementos
int size( )
Regresa el nmero de elementos en el vector

50

UNIVERSIDAD PRIVADA TELESUP

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 Prctico
Elaborar una aplicacin visual que almacene los datos de n alumnos (Cdigo,
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 situacin acadmica de
cada alumno.

Formulario 1 (Ingreso de datos):

Formulario 2 (Listado de Datos)

51

UNIVERSIDAD PRIVADA TELESUP

Codificacin del formulario1


Declaracin Global a nivel de Formulario
public class frmData extends javax.swing.JFrame {
Vector v=new Vector(1);

Codificacin del botn 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();
}

Codificacin del botn VerReporte


private void btnreporteActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
frmReporte fr=new frmReporte();
fr.setData(v);
fr.show();
}

52

UNIVERSIDAD PRIVADA TELESUP

Mtodo limpiarcajas
public void limpiarcajas(){
txtcod.setText("");
txtape.setText("");
txtasi.setText("");
txtn1.setText("");
txtn2.setText("");
txtn3.setText("");
txtcod.requestFocus();
}

Codificacin del formulario2


Declaracin Global (A nivel de Formulario)
Vector cabecera=new Vector(1);
Vector data=new Vector(1);
Codificacin 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();
}
}

Mtodo 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);

53

UNIVERSIDAD PRIVADA TELESUP

Mtodo 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);

Mtodo 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);
}

54

UNIVERSIDAD PRIVADA TELESUP

La Clase ArrayList
Las

aplicaciones

frecuentemente

necesitan

almacenar un grupo de datos en un slo objeto.


Los arrays sirven bien para este propsito, pero
algunas veces necesitamos incrementar o reducir
dinmicamente el nmero de elementos del array,
o hacer que contenga distintos tipos de datos.

Esto es comn entre las aplicaciones como las tiendas online. Un cliente aade una
mercanca a su carro de la compra, y detrs de la escena, los tems son almacenados
y eliminados automticamente. Para esta clase de grupos de datos crecientes y
menguantes, podemos usar la reciente clase ArrayList del paquete java.util.

Creacin de un ArrayList:
ArrayList al=new ArrayList();
Crea un array dinmico con un tamao inicial 0, se va
incrementando o decrementando automticamente.
ArrayList al=new ArrayList(5);
Crea un array dinmico con un tamao inicial 5, se va
incrementando o decrementando automticamente.

Mtodos de la clase ArrayList

55

UNIVERSIDAD PRIVADA TELESUP

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 Prctico:
Realizar una aplicacin Visual Java que realice las principales operaciones de
edicin de datos en un ArrayList.

56

UNIVERSIDAD PRIVADA TELESUP

Codificacin a nivel de Clase (Declaracin Global)


public class frmArrayList extends javax.swing.JFrame {
ArrayList lista=new ArrayList();
Codificacin 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();
}

Codificacin del Mtodo 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);
}

Codificacin del botn 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();
}

57

UNIVERSIDAD PRIVADA TELESUP

Codificacin del botn 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();
}

Codificacin del botn 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");
}
}

Codificacin del botn Ordenar


private void btnordenarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Collections.sort(lista);
visualizar();
}

Codificacin del botn 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));
}

58

UNIVERSIDAD PRIVADA TELESUP

Manejo
y Uso de
Sesiones

TEMA 4

Competencia:
Analizar el manejo y uso adecuado de las
sesiones.

59

UNIVERSIDAD PRIVADA TELESUP

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.

Cundo se da inicio a una sesin web?

Cuando el usuario accede al sitio web a


travs de la URL.

Cuando finaliza una sesin web?

Cuando se abandona el sitio web

Cuando se alcanza un tiempo de inactividad


que es previamente establecido, en este caso
la sesin es automticamente eliminada. Si el usuario siguiera navegando se
creara una nueva sesin.

Se ha cerrado la sesin o reiniciado el servidor.

60

UNIVERSIDAD PRIVADA TELESUP

Variable de Session
Una variable de sesin nos permite almacenar un
dato y mantenerlo disponible para cualquier pgina
de nuestra sesin web. Es comparable a una
variable global que estara disponible para cualquier
pgina de nuestra aplicacin.
Cmo crear una variable de Session?
session.setAttribute("usu",usuario);
Cmo acceder a los datos de una variable de Session?
(desde otra pagina o la misma pgina)
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 Compilacin: Son aquellos errores que se presentan en el momento de
la compilacin nuestro programa, el compilador informa el nmero de lnea donde
se produjo el error. Este tipo de error se produce generalmente cuando no
cumplimos rigurosamente las reglas de sintaxis del Lenguaje de Programacin.
Algunos IDEs tiene el atributo Intelligent Sense con el cual automticamente
subrayan la lnea de error mientras se escribe el cdigo fuente.

b. Errores de Lgica: Este error se percibe cuando


los resultados emitidos por nuestro programa son
incorrectos e imprecisos, la razn de este tipo de
error se debe al mal planteamiento de la lgica
del programador.
c. Errores en Tiempo de Ejecucin: Este error se
presenta imprevistamente durante el tiempo de
ejecucin (run-time) de nuestro programa, cuando ste no soporta una instruccin,
y como resultado se cuelga o cierra. Estos tipos de errores deben ser controlados
por la misma aplicacin, y no deberan ocasionar que la ejecucin colapse.

61

UNIVERSIDAD PRIVADA TELESUP

Precisamente las excepciones o Exceptions en Java


controlan este ltimo tipo de errores.
Manejo de excepciones
A

diferencia

de

otros

lenguajes

de

programacin

orientados a objetos como C/C++, Java incorpora en el


propio lenguaje la gestin de errores en tiempo de
ejecucin.

Cmo lo hace? Veamos:


Qu es una Exception?
En el lenguaje Java, una Exception es un objeto que se genera automticamente
cuando se produce un error de ejecucin, una excepcin representa al error en s,
contiene informacin del error producido. Algunas excepciones son fatales y provocan
que se deba finalizar la ejecucin 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 localizacin del fichero no
encontrado).

Excepciones Estndar 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 jerarqua de clases relacionadas con Throwable:

62

UNIVERSIDAD PRIVADA TELESUP

La clase Error est relacionada con errores de compilacin, 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 ms inters. 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


posicin de una estructura de datos que no apunta a ningn 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 nmero de ndice negativo.
EOFException: Exception que se produce cuando el puntero ha avanzado una
posicin posterior al ltimo registro de una tabla.

Todas las excepciones por heredar de Throwable usan los mtodos siguientes:
1. String getMessage() Extrae el mensaje asociado con la excepcin.
2. String toString() Devuelve un String que describe la excepcin.
3. void printStackTrace() Indica el mtodo donde se lanz la excepcin.
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 mtodo se produce una situacin anmala
es necesario lanzar una excepcin, la cual se desarrolla
con la siguiente secuencia:
1. Se crea un objeto Exception de la clase adecuada.
2. Se lanza la excepcin con la sentencia throw seguida del objeto Exception creado.
Esta excepcin deber ser capturada (catch) y gestionada, para este fin Java nos
brinda la estructura try catch.

63

UNIVERSIDAD PRIVADA TELESUP

Ejemplo 1:
try
{
String cad="Universidad Privada Telesup";
int n=0;
String

nn=JOptionPane.showInputDialog("Ingrese

la posicin ");
n=Integer.parseInt(nn);
char cc=cad.charAt(n);
JOptionPane.showMessageDialog(null,"El carcter es: "+cc);
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(null,ex.getMessage());
}

Explicacin del ejemplo 1:


La zona del try, incluye al cdigo que est siendo controlado por posibles errores de
ejecucin. 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 ejecucin de la zona try y el
control del programa se direcciona hacia la zona del try y visualizar un mensaje con
la descripcin 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 ms
especfico a lo ms genrico. Esto permite personalizar la
accin a realizar segn el tipo de error producido. Veamos
un segundo ejemplo:

64

UNIVERSIDAD PRIVADA TELESUP

Ejemplo 2:
try
{
String cad="Universidad Privada Telesup";
int n=0;
String nn=JOptionPane.showInputDialog("Ingrese la posicin ");
n=Integer.parseInt(nn);
char cc=cad.charAt(n);
JOptionPane.showMessageDialog(null,"El caracter es: "+cc);
}
catch (StringIndexOutOfBoundsException ex1)
{
JOptionPane.showMessageDialog(null,"Error: La posicin esta fuera del
rango de la cadena.");
}
catch (NumberFormatException ex2)
{
JOptionPane.showMessageDialog(null,"Error: El valor que Ud. ingres no corresponde a un nmero.");
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(null,ex.getMessage());
}

}
Explicacin del ejemplo 2: En este caso existen 3 bloques catch, cada uno de ellos
atrapa un diferente tipo de error, segn sea el caso. Nunca se realizar ms 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
genrico que corresponde a cualquier otro tipo de error. La clusula finally: Esta
clusula 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 posicin ");
n=Integer.parseInt(nn);
char cc=cad.charAt(n);
JOptionPane.showMessageDialog(null,"El caracter es: "+cc);
}
catch (StringIndexOutOfBoundsException ex1)
{
JOptionPane.showMessageDialog(null,"Error: La posicin esta fuera del rango de la cadena.");
}
catch (NumberFormatException ex2)

65

UNIVERSIDAD PRIVADA TELESUP

{
JOptionPane.showMessageDialog(null,"Error: El valor que Ud. ingres no corresponde a un nmero.");
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(null,ex.getMessage());
}
finally
{
JOptionPane.showMessageDialog(Programa finalizado);
}
}

Clausula throws: Esta clusula se puede acompaar en la declaracin de un mtodo,


esto quiere decir que si dentro del mtodo se produce un Exception (error), entonces
dicho Exception ser disparado hacia fuera (hacia el lugar desde donde se invoc al
mtodo, 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 posicin ");
n=Integer.parseInt(nn);
char cc=cad.charAt(n);
JOptionPane.showMessageDialog(null,"El carcter es: "+cc);
}

public static void main(String args[])


{
try
{
Demo obj=new Demo();
obj.mostrar();
}
catch (Exception ex1)
{
JOptionPane.showMessageDialog(null,"Error: La posicin esta fuera del rango de la
cadena.");
}
}
}

66

UNIVERSIDAD PRIVADA TELESUP

Lecturas Recomendadas

ESTRUCTURAS DE DATOS
http://docencia.etsit.urjc.es/moodle_antiguo/file.php/90/Tema_2__Algoritmos_sobre_grafos_-_Estructuras_de_datos.pdf

PROGRAMACIN ORIENTADA A OBJETOS (POO) EN JAVA I: INTRODUCCIN


http://eii.ucv.cl/pers/guidi/cursos/ti/Java-POO-1-Introduccion.pdf

Actividades y Ejercicios

1. Cree una aplicacin web Java aplicando la POO utilizando las 3


formas aprendidas en clase. (1ra. Forma: Usando mtodos con
parmetros 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 clculo 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 pagarn a razn de 1.5 veces la hora ordinaria.
Tenga en cuenta que todos los trabajadores obtienen una
bonificacin del 20% del salario mensual siempre y en cuando
hayan laborado ms de 100 horas al mes.
Entradas: Horas Trabajadas y Costo Hora
Salidas: Salario Mensual, Bonificacin y Total a Percibir.

67

UNIVERSIDAD PRIVADA TELESUP

Autoevaluacin

1) Es una plantilla o patrn a partir de la cual se crean muchos otros objetos


similares.
a. El mtodo.
b. La clase.
c. El sistema.
d. El algoritmo.
e. El lenguaje de programacin.

2) Son las caractersticas descriptivas de una clase:


a. El diagrama de flujo.
b. Las propiedades o atributos.
c. Mtodos.
d. Instancias.
e. Variables.

3) Los mtodos responden a la pregunta:


a. Qu es lo que es capaz de hacer la clase?
b.
c.
d.
e.

Cules son los atributos de la clase?


Cuntas variables tiene la clase?
La clase es visible para todos los usuarios?
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.
c.
d.
e.

Los Objetos instanciados.


Las capas.
Las condiciones.
Los paquetes.

68

UNIVERSIDAD PRIVADA TELESUP

6) Para acceder a una propiedad o mtodo, debemos especificar el objeto


instanciado, luego colocaremos un ______ y posteriormente el nombre de la
propiedad o mtodo que se ha heredado de su clase base.
a. Punto.
b. Punto y coma.
c. Parntesis.
d. Corchetes.
e. Guion.
7) Es un mtodo especial dentro de la clase, que lleva el nombre de la misma
clase.
a. Mtodo array.
b. Mtodo pasedouble.
c. Mtodo constructor.
d. Mtodo joptionpane.
e. Mtodo 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 cdigo 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
dinmicas, entre las que no se puede mencionar:
a. Enumeration
b. HashTable
c. Stack
d. Set
e. Option Pane.

69

UNIVERSIDAD PRIVADA TELESUP

Resumen

UNIDAD DE APRENDIZAJE I:

En el diseo 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
mtodos y se pueden utilizar de la misma forma.

La principal ventaja del uso de herencia de clases es la reutilizacin de los mtodos de


clases base, lo cual impide que se repita el mismo cdigo muchas veces dentro del
desarrollo de una aplicacin, 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 programacin.

HashTables: Es una estructura de datos dinmica que almacena un grupo de objetos,


cada elemento almacenado en el HashTable debe contar un key (Cdigo nico que
identifique de manera singular a dicho elemento dentro de la estructura).

Uno de los errores que se suele cometer es el de Compilacin; los cuales son aquellos
errores que se presentan en el momento de la compilacin nuestro programa, el
compilador informa el nmero de lnea donde se produjo el error. Este tipo de error se
produce generalmente cuando no cumplimos rigurosamente las reglas de sintaxis del
lenguaje de programacin.

70

UNIVERSIDAD PRIVADA TELESUP

71

UNIVERSIDAD PRIVADA TELESUP

Introduccin

a) Presentacin y contextualizacin:
La conectividad de la base de datos de Java (JDBC, Java Database Connectivity)
es un marco de programacin para los desarrolladores de Java que escriben los
programas que tienen acceso a la informacin guardada en bases de datos, hojas
de clculo, y archivos "planos". JDBC se utiliza comnmente para conectar un
programa del usuario con una base de datos por detrs de la escena, sin
importar qu software de administracin o manejo de base de datos se utilice para
controlarlo.

b) Competencia:
Comprende las principales funciones de las tecnologas 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 presentacin adecuada de los contenidos de una tabla.
4. Describe las propiedades y funcionalidades de la Interface Preparedstament y
Callablestament.

d) Actitudes:
Pone en prctica las recomendaciones relacionados a Java DataBase
Connectivity.
Muestra tolerancia ante las dificultades relacionadas a la tecnologa JDBC.

e) Presentacin de Ideas bsicas y contenidos esenciales de la Unidad:


La Unidad de Aprendizaje 02: Tecnologa 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

72

UNIVERSIDAD PRIVADA TELESUP

Interfaces
JDBC

TEMA 1

Competencia:
Utilizar adecuadamente las interfaces JDBC.

73

UNIVERSIDAD PRIVADA TELESUP

Desarrollo de los Temas

Tema 01: Interfaces JDBC

INTRODUCCIN
Java Database Connectivity (JDBC) es una interfase de
acceso a bases de datos estndar SQL que proporciona
un acceso uniforme a una gran variedad de bases de
datos relacionales. JDBC tambin proporciona una base
comn para la construccin 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.

DEFINICIN DEL JDBC


JDBC es el API para la ejecucin de sentencias SQL. (Como punto de inters JDBC
es una marca registrada y no un acrnimo, no obstante a menudo es conocido como
Java Database Connectivity). Consiste en un conjunto de clases e interfases escritas
en el lenguaje de programacin Java. JDBC suministra un API estndar para los
desarrolladores y hace posible escribir aplicaciones de base de datos usando un API
puro Java.

Usando JDBC es fcil 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 aplicacin
escrita en el lenguaje de programacin Java, tampoco es necesario escribir diferentes
aplicaciones para ejecutar en diferentes plataformas. La combinacin de Java y JDBC
permite al programador escribir una sola vez y ejecutarlo en cualquier entorno. Java,
siendo

robusto,

seguro,

fcil

de

usar,

fcil

de

entender,

descargable

automticamente desde la red, es un lenguaje base excelente para aplicaciones de


base de datos.

74

UNIVERSIDAD PRIVADA TELESUP

FUNCIONES DEL JDBC


1. Establecer una conexin 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 bsica del API JDBC. Este paquete forma parte de la edicin estndar
de la plataforma Java (J2SE), desde la versin 1.1 de sta. Esta separata se centra en
la funcionalidad de este paquete.

CARACTERSTICAS Y DRIVERS DEL JDBC


Los Driver, tambin llamados Manejadores, son un conjunto de clases que
implementan las clases e interfaces del API JDBC necesarias para que una aplicacin
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 misin del manejador ser traducir comandos estndar del
API JDBC al protocolo nativo de esa base de datos. Cada base de datos emplea un
protocolo diferente de comunicacin, protocolos que normalmente son propietarios. El
uso de un manejador, una capa intermedia entre el cdigo del desarrollador y la base
de datos, permite independizar el cdigo Java que accede a la BD del sistema de BD
concreto a la que estamos accediendo, ya que en nuestro cdigo Java emplearemos
comandos estndar, y estos comandos sern 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 prcticamente cualquier base de datos.

75

UNIVERSIDAD PRIVADA TELESUP

Tipos de manejadores:
Hay 4 tipos de manejadores JDBC, que difieren en si, usan o no tecnologa 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 estndar semejante a JDBC, que permite que lenguajes como
C++ accedan de un modo estndar 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
conexin desde Java a BD que no proveen manejadores JDBC. Fue muy til
cuando se cre el API JDBC, ya que muchas BD no disponan de manejadores
JDBC, pero si de manejadores ODBC.

Empelado el puente JDBC-ODBC poda accederse a estas bases de datos


empleando el API JDBC. Este tipo de manejador tiene dos desventajas: por un lado
depende de cdigo 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 aplicacin 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.

76

UNIVERSIDAD PRIVADA TELESUP

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 da es el menos recomendado por limitar la portabilidad de la aplicacin, al
requerir cdigo nativo, y por emplear tantas capas para la comunicacin 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 librera escrita en cdigo nativo para acceder a la base de datos. El
manejador traduce las llamadas JDBC a llamadas al cdigo de la librera nativa,
siendo el cdigo nativo el que se comunica con las bases de datos. La librera
nativa es proporcionada por los desarrolladores de la BD. Estos manejadores son
ms eficientes y tienen menos puntos de fallo que el puente JDBC-ODBC ya que
hay menos capas entre el cdigo de la aplicacin y la base de datos. Sin embargo
siguen teniendo el problema de prdida de portabilidad por emplear cdigo 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 especfico de la base de datos. No se requiere ningn tipo
de cdigo nativo en el cliente, por lo que la portabilidad de la aplicacin est
garantizada: el manejador es tecnologa 100% Java. Adems si el intermediario es
capaz de traducir las llamadas JDBC a protocolos especficos de diferentes
sistemas de BD podremos emplear un mismo manejador para comunicarnos con
diferentes bases de datos.

77

UNIVERSIDAD PRIVADA TELESUP

Esto lo convierte en el manejador ms 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 comn emplearlo
en arquitecturas simples, sino ms 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 ms
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 tambin emplea tecnologa 100% Java.

78

UNIVERSIDAD PRIVADA TELESUP

Las
Interfaces y
Clases del
JDBC

TEMA 2

Competencia:
Reconocer y describir objetivamente cada
una de las clases de las interfaces JDBC.

79

UNIVERSIDAD PRIVADA TELESUP

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 tecnologa esta basada fundamentalmente en las siguientes
interfaces:
a. Driver

e. PreparedStatement

b. DriverManager

f.

c. Connection

g. ResultSet

CallableStatement

d. Statement

REGISTRO DE UN MANEJADOR
Registrar un manejador no es ms 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 mtodo 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 conexin 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 mquina virtual. La sintaxis es
jdbc.drivers=nombreManejador1: nombreManejador2:
jdbc.drivers=gjt.mm.mysql.Driver:oracle.jdbc.driver.OracleDriver;
b. Emplear la opcin D al invocar a la mquina virtual. Para ellos debemos
arrancar nuestra aplicacin con el comando java: Djdbc.drivers= nombreManejador1: nombreManejador2:
java -Djdbc.drivers=gjt.mm.mysql.Driver:oracle.jdbc.driver.OracleDriver;

80

UNIVERSIDAD PRIVADA TELESUP

INTERFAZ DRIVER
Aunque es vital para establecer la conexin con la base de datos en la prctica 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 mtodo connect de los drivers registrados
para intentar establecer la conexin 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 mtodo connect, obteniendo una conexin con
la base de datos sin necesidad de emplear la clase DriverManager. De este modo
tenemos ms control sobre el Driver que estamos empleando en la conexin, cuando
hemos registrado ms de un driver, ya que no nos arriesgamos a que se establezca
conexin 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 aplicacin. Es posible que sea necesario que en una misma
aplicacin se tenga varios manejadores para acceder a varias bases de datos.
Los mtodos que ms nos interesan de esta clase son:
static Connection getConnection(String url);
static Connection getConnection(String url, String user, String password).
Estos mtodos intentan establecer conexin 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 mtodo y el otro, obviamente, es que en uno slo se especifica
la base de datos a la que nos queremos conectar, mientras que en el otro se indica
tambin el nombre de usuario de la base de datos y su password. Ms adelante
explicaremos que es el objeto Connection que devuelven estos mtodos.
Lo que hace la clase DriverManager para intentar establecer conexin con la base de
datos es invocar al mtodo connect de la interface Driver, interface que como veremos
deben implementar todos los manejadores. Realiza esta operacin 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 intentndolo con el
resto de los manejadores registrados, y si no consigue establecer la conexin con
ningn manejador lanza una excepcin tipo SQLException.

81

UNIVERSIDAD PRIVADA TELESUP

Sintaxis de los URL de JDBC


Los URL (Uniform Resource Locator) de JDBC identifican una base de datos, y un
protocolo de conexin a esta, de un modo unvoco. 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 conexin. Siempre es jdbc.
2. Subprotocolo de la conexin. Identifica el tipo
de mecanismo de conexin 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
conexin. En el URL ejemplo el subprotocolo empleado para la conexin a la base
de datos ser ODBC, por lo que el DriverManager intentar establecer la conexin
con todos los manejadores registrados que sean de tipo 1, puente JDBC-ODBC.

82

UNIVERSIDAD PRIVADA TELESUP

3. Subnombre, identifica la base de datos con la que queremos establecer una


conexin. El subnombre es usuarios; ser el sistema ODBC quien proporcione, a
partir de ese nombre, el resto de la informacin necesaria para establecer la
conexin con la base de datos.
Sin embargo si empleamos otro protocolo puede ser necesario incluir la direccin
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 empleara el


protocolo jdbc y un manejador de tipo JDBC-Net para conectarse a la hipottica base
de datos usuarios a travs del puerto 4040 de la mquina javahispano.org.

Mtodos de la Clase DriverManager


Todos los mtodos que encontramos en esta clase son estticos (No requieren
instancia para poder utilizarlo) y se comentan brevemente a continuacin:

Mtodo
Connection getConnection(String url)

Connection getConnection(String url,


Properties info)
Connection getConnection(String url,
String usuario, String contrasea)

void println(String mensaje)


void setLoginTimeout(int segundos)

Descripcin
Establece una conexin con la base de datos
identificada por la URL de JDBC que se pasa por
parmetros.
Establece una conexin con la base de datos
identificada por la URL de JDBC que se pasa por
parmetros.
Establece una conexin con la base de datos pero en
su segundo parmetro especifica propiedades que
posee el driver, como puede ser la base de datos, el
usuario, la contrasea, etc. Estas propiedades se
organizan en pares propiedad/valor.
Escribe un mensaje en el flujo de actividad actual
Establece el tiempo de espera que el driver utilizar
para realizar una conexin.

INTERFAZ CONNECTION
Representa una conexin con la base de datos. Permite crear objetos que representan
consultas que se ejecutarn en la base de datos, y permite acceder a informacin
sobre la base de datos y las posibilidades del manejador JDBC. En esta tabla
recogemos los principales mtodos de la interfaz Connection. Sobre muchos de ellos
volveremos a hablar ms adelante.

83

UNIVERSIDAD PRIVADA TELESUP

Mtodo

Mtodos de la Interfaz Connection


Descripcin

void close()
boolean isClosed()
boolean isReadOnly()
PreparedStatement
prepareStatement(String sql)
PreparedStatement
prepareStatement(String sql, int
tipoResultSet, int tipoConcurrencia)
void setReadOnly(boolean soloLectura)

void commit()
Statement createStatement()
bolean getAutoCommit()
DatabaseMetaData getMetaData()

CallableStatement prepareCall(String sql)


PreparedStatement prepareStatement(String
sql)
void rollback()
void close()
Statement createStatement(int
tipoResultSet, int tipoConcurrencia)
boolean isClosed()
boolean isReadOnly()
PreparedStatement
prepareStatement(String sql)
PreparedStatement
prepareStatement(String sql, int
tipoResultSet, int tipoConcurrencia)
void setReadOnly(boolean soloLectura)

Cierra una conexin, liberando todos los recursos


asociados a la misma.
Devuelve verdadero si la conexin est cerrada
Devuelve true si la conexin es de slo lectura
Crea un objeto PreparedStatement que va a permitir
enviar y ejecutar sentencias SQL parametrizadas a
la base de datos correspondiente.
Igual que el mtodo anterior, pero permite
especificar las caractersticas del ResultSet que se
obtendr a la hora de ejecutar el objeto
PreparedStatement correspondiente.
Establece si una conexin posee el modo de solo
lectura o no, dependiendo del argumento de tipo
booleano.
Hace permanentes los cambios que se realizaron
desde el ultimo commit o rollback.
Crea un objeto de tipo Statement.
Indica si est en modo auto-commit.
Devuelve un objeto tipo DatabaseMetaData con
meta informacin a cerca de la base de datos
contra la cual se ha abierto esta conexin..
Crea un objeto CallableStatement para ejecutar
procedimientos almacenados SQL en la BD.
Crea un objeto PreparedStatement para ejecutar
consultas SQL parametrizadas en la BD.
Deshace todos los cambios realizados desde la
ltima vez que se ejecut commit o rollback
Cierra una conexin, liberando todos los recursos
asociados a la misma.
Crea tambin una sentencia SQL pero generar en
su ejecucin un objeto ResultSet con unas
caractersticas determinadas.
Devuelve verdadero si la conexin est cerrada
Devuelve true si la conexin es de slo lectura
Crea un objeto PreparedStatement que va a permitir
enviar y ejecutar sentencias SQL parametrizadas a
la base de datos correspondiente.
Igual que el mtodo anterior, pero permite
especificar las caractersticas del ResultSet que se
obtendr a la hora de ejecutar el objeto
PreparedStatement correspondiente.
Establece si una conexin posee el modo de solo
lectura o no, dependiendo del argumento de tipo
booleano.

84

UNIVERSIDAD PRIVADA TELESUP

ENVI DE SENTENCIAS SQL


JDBC suministra tres clases para el envo de sentencias SQL. Estas clases son los
siguientes:
1. Statement Creada por el mtodo createStatement. Un objeto Statement se usa para
enviar sentencias SQL simples.
2. PreparedStatement

Creada

por

el

mtodo

prepareStatement-

Un

objeto

PreparedStatement se usa para sentencias SQL que toman uno o ms parmetros


como argumentos de entrada (parmetros IN). PreparedStatement tiene un grupo de
mtodos que fijan los valores de los parmetros 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 mtodos de Statement. Un objeto
PreparedStatement es potencialmente ms eficiente que un objeto Statement porque
este ha sido precompilado y almacenado para su uso futuro.

3. CallableStatement Creado por el mtodo 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 funcin - . Un objeto CallableStatement hereda mtodos para el
manejo de los parmetros IN de PreparedStatement, y aade mtodos para el
manejo de los parmetros OUT e INOUT.

INTERFACE STATEMENT
Esta interfaz permite enviar instrucciones SQL a la base de datos. Podemos obtener
un

objeto

que

implemente

esta

interfaz

partir

del

mtodo

Statement

createStatement() de la interfaz Connection. Para enviar una consulta tipo SELECT se


emplea el mtodo executeQuery(String sql). Este mtodo devuelve un objeto tipo
ResultSet. Para enviar una instruccin tipo DELETE, UPDATE, INSERT o una
instruccin DDL (Data Definition Language) se emplea executeUpdate(String sql).
Mediante el mtodo 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 actan como contenedores para la ejecucin de
sentencias en una conexin dada: Statement, PreparedStatement que hereda de
Statement y CallableStatement que hereda de PreparedStatement.

85

UNIVERSIDAD PRIVADA TELESUP

Estas estn especializadas para enviar tipos particulares de sentencias SQL, Un


objeto Statement se usa para ejecutar una sentencia SQL simple sin parmetros. Un
objeto PreparedStatement se usa para ejecutar sentencias SQL precompiladas con o
sin parmetros IN; y un objeto CallableStatement se usa para ejecutar un
procedimiento almacenados de base de datos. La interfase Statement suministra
mtodos bsicos para ejecutar sentencias y devolver resultados. La interfase
PreparedStatement aade mtodos para trabajar con los parmetros IN; y la interfase
CallableStatement aade mtodos para trabajar con parameters OUT.

Creacin de objetos Statement


Una vez establecida la conexin con una base de datos particular, esta conexin
puede usarse para enviar sentencias SQL. Un objeto Statement se crea mediante el
mtodo de Connection createStatement, como podemos ver en el siguiente fragmento
de cdigo.
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 mtodos de ejecucin del objeto Statement. Por ejemplo:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

Ejecucin de sentencias usando objetos Statement.


La interfase Statement nos suministra tres mtodos diferentes para ejecutar
sentencias SQL, executeQuery, executeUpdate y execute. El mtodo a usar esta
determinado por el producto de la sentencia SQL El mtodo executeQuery esta
diseado para sentencias que producen como resultado un nico resultSet tal como
las sentencias SELECT. El mtodo 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 modificacin de una o
ms columnas en cero o ms filas de una tabla. El valor devuelto de executeUpdate es
un entero que indica el nmero 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.

86

UNIVERSIDAD PRIVADA TELESUP

El mtodo execute se usa para ejecutar sentencias que devuelven ms de un


ResultSet, ms que un update count o una combinacin de ambos. Todos los mtodos
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 mtodos de la interfase
Statement, tiene sus propias versiones de los mtodos executeQuery, executeUpdate
y execute. Los objetos Statement en si mismos no contienen una sentencia SQL, por
tanto debe suministrarse como un argumento a los mtodos Statement.execute. Los
objetos PreparedStatement no suministran una sentencia SQL como argumento a
estos mtodos puesto que ya tienen la sentencia precompilada. Los objetos
CallableStatement heredan las formas de estos mtodos de PreparedStatement. Usar
un parametro de query con las versiones de los mtodos de PreparedStatement o
CallableStatement producir una SQLException.

Realizacin de Statement
Cuando una conexin 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 mtodo
executeQuery, que devuelve un nico ResultSet, la sentencia se completa cuando
todas las filas del objeto ResultSet se han devuelto. Para el mtodo executeUpdate,
un sentencia se completa cuando se ejecuta. En los raros casos en que se llama al
mtodo 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 mtodo commit. En el primer caso, cada sentencia individual es
commitada. En el segundo, se commiten todas juntas.

87

UNIVERSIDAD PRIVADA TELESUP

Cerrar objetos Statement


Los objetos Statement se cerrarn automticamente por el colector de basura de Java
(garbage collector). No obstante se recomienda como una buena prctica de
programacin que se cierren explcitamente 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 mtodos XXX getXXX(int columna) y XXX
getXXX(String columna) que permiten acceder a los resultados de la consulta (para la
sintaxis correcta de estos mtodos 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 mtodo 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
mtodos get que permiten el acceso a las diferentes columnas de la filas. El mtodo
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
-------12345
83472
83492

b
--------Cupertino
Redmond
Boston

c
-------CA
WA
MA

88

UNIVERSIDAD PRIVADA TELESUP

ESTABLECIENDO UNA CONEXIN JDBC


Pasos necesarios para Establecer una Conexin JDBC
1. Importar las clases del paquete java.sql
Para utilizar esta tecnologa, debemos importar las clases del paquete: java.sql
De la siguiente manera:
package comercial;
import java.sql.*;
public class GestionBD {
// Contenido de la clase

Importacin necesaria para trabajar con JDBC

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"); //
Driver
}
catch(Exception e) {
System.out.println("Error al Cargar el Driver");
} }}

Registrar

el

3. Abrir la conexin
La forma comn de establecer una conexin con una base de
datos es llamar al mtodo getConnection() de la clase DriverManager, a este
mtodo se le debe pasar como parmetro la URL de JDBC que identifica a la base
de datos con la que queremos realizar la conexin. La ejecucin de este mtodo
devolver un objeto Connection que representar la conexin con la base de datos.
La sintaxis general para realizar una conexin es la siguiente:
Connection cn=DriverManager.getConnection(url);

89

UNIVERSIDAD PRIVADA TELESUP

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 conexin
// (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());
}} }

Abrir conexin

4. Definir el objeto Statement para el manejo de comandos. (Se requiere que la


conexin 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 conexin (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
Crear el objeto comando
}
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
}}}

90

UNIVERSIDAD PRIVADA TELESUP

5. Crear el esquema de datos (Objeto ResultSet) : A partir de la ejecucin 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 conexin // (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
Crear el esquema de Datos
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 conexin (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())
// mtodo avance al siguiente y devuelve true
{

91

UNIVERSIDAD PRIVADA TELESUP

Visualiza el
System.out.print(rs.getString("Codcli")+"\t");
contenido del
System.out.print(rs.getString("Apecli")+"\t");
esquema de datos.
System.out.print(rs.getString("Nomcli")+"\t");
Se puede utilizar.
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 conexin 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 conexin (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())
// mtodo 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("");
}
Cierra la conexin y el
rs.close();
esquema de datos.
cn.close();
}
catch(Exception e) {
System.out.println("Error el proceso acceso a la base de datos");
System.out.println(e.getMessage());
}} }

92

UNIVERSIDAD PRIVADA TELESUP

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 mtodos ms importantes de la interfaz Statement son:


Mtodo

void cancel()
void close()
boolean execute(String sql)
ResultSet
executeQuery(String sql)
int executeUpdate(String sql)
Connection getConnection()

Descripcin

Cancela el objeto Statement, abortando la sentencia


SQL correspondiente.
Cierra el objeto Statement liberando todos los
recursos asociados de forma inmediata.
Ejecuta la sentencia SQL que se pasa por parmetro
Ejecuta una sentencia SQL que devuelve un
conjunto de resultados, representando por el objeto
ResultSet.
Ejecuta la sentencia SQL que se pasa por parmetro
y debe ser del tipo INSERT, UPDATE o DELETE
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 conexin a una base de datos determinada, esta
conexin se puede utilizar para enviar sentencias SQL a la base de datos. Un objeto
Statement se crea con el mtodo createStatement() de la clase Connection, como se
puede observar en el fragmento de cdigo que se muestra a continuacin:
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 mtodo 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 mtodo executeUpdate. Ejemplo:
Connection cn=DriverManager.getConnection(url,pepe,xxx);
Statement st=cn.createStatement();
st.executeQuery(insert into Clientes values (001,Garcia Daz,Carla);

93

UNIVERSIDAD PRIVADA TELESUP

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 cdigo 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
fsica, sino de tipo virtual, se crear en la memoria del Servidor y desde all se tomarn
los datos para mostrarlos posteriormente en el cliente.

MTODOS DEL RESULTSET


Nombre del Mtodo
previous()
next()
first()
last()
isFirst()
getString()
getInt()
getDate()
getBoolean()
getDouble()
getLong()

Descripcin
Enva el puntero a la fila anterior del objeto ResultSet. (Devuelve
true si encuentra la fila anterior)
Enva el puntero a la fila siguiente del objeto ResultSet. (Devuelve
true si encuentra la fila siguiente)
Enva el puntero a la primera fila del objeto ResultSet. (Devuelve
true si se encuentra primera fila)
Enva el puntero a la ltima fila del objeto ResultSet. (Devuelve
true si se encuentra ltima fila)
Devuelve verdadero, si el puntero se encuentra en la primera fila
Captura un dato de tipo String del esquema de datos
Captura un dato de tipo int del esquema de datos
Captura un dato de tipo Date del esquema de datos
Captura un dato de tipo boolean del esquema de datos
Captura un dato de tipo double del esquema de datos
Captura un dato de tipo long del esquema de datos

EL MTODO NEXT
El mtodo 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 mtodo next para mover el cursor a la primera fila y convertirla en al fila
actual. Sucesivas invocaciones del mtodo next movern el cursor de lnea en lnea
hacia adelante. Existen otros mtodos con los cuales podemos mover el puntero de la
tabla o consultar sobre la posicin actual del puntero (En la tabla anterior, aparece la
lista de mtodos que mueven el puntero de la tabla).

94

UNIVERSIDAD PRIVADA TELESUP

CONSEGUIR LOS DATOS DEL RESULTSET


Mtodo getXXX
(XXX representa al tipo de dato, ejemplo: getDouble(), getString(), getLong(), etc)
Los mtodos 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 nmero 1


- Podemos referirnos a un dato del ResultSet mediante su nmero o nombre de
columna.
Para conseguir otros tipos de datos contamos con los siguientes mtodos:
getByte

getBigDecimal

getShort

getBoolean

getInt

getString

getLong

getBytes

getFloat

getDate

getDouble

getTime

El ResultSet generado tiene la siguiente estructura:


rs(1)

CodCli

rs(2)

ApeCli

rs(3)

rs(4)

NomCli

rs(5)

DirCli

DisCli

0001

Vargas Machuca Lus Alex

Av. Tupac Amaru 1254 Comas

0002

Garca Lpez

Jorge Antonio Jr. Amazonas 258

Lima

0003

Snchez Rojas

Randy

Av. Jos Pardo 365

Lince

0004

Salinas Montalvo Carla

Jr. Bolvar 2245

Brea

0006

Ore Palomino

Julio Cesar

Barranco

San Pedro

0007

Montalvo

Lus

San Martn de Porres

Av. Per Cdra 28

0008

Villanueva

Fred

Los Olivos

Av. Palmeras

0009

Palma Lpez

Elian

San Juan

Av. Las Flores Parad

0010

Lozano Aguirre

Vctor

Comas

Tupac Amaru Km. 16

95

UNIVERSIDAD PRIVADA TELESUP

CONEXIN CON MLTIPLES ORGENES DE BASE DE DATOS


Las conexiones JDBC, tal como estudiamos en la semana anterior, nos permiten
conectarnos con diferentes orgenes 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 cdigo fuente es la forma de conexin, mientras que todo lo dems se mantendr
igual. Veamos algunos ejemplos:

a. Conexin 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 pgina de mysql en Internet


(link: Download). El archivo a descargar debe ser un archivo de extensin 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 versin)

96

UNIVERSIDAD PRIVADA TELESUP

Cdigo fuente de la conexin 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())
// mtodo 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());
} }}

97

UNIVERSIDAD PRIVADA TELESUP

Ejecucin de la clase anterior:

Contenido de la tabla Clientes de Mysql desde PHPMyAdmin

98

UNIVERSIDAD PRIVADA TELESUP

Presentar el
Contenido de
una Tabla

TEMA 3

Competencia:
Conocer el proceso de presentacin
adecuada de los contenidos de una tabla.

99

UNIVERSIDAD PRIVADA TELESUP

Tema 03: Presentar el Contenido de una


Tabla

Para presentar el contenido de una tabla en una pgina JSP, se deben realizar los
siguientes pasos:
a.

Crear un proyecto Web y copiar hacia este proyecto las clases que nos
permitirn realizar las operaciones con la base de datos.
Crearemos dentro de la categora Source Package, los paquetes Ds y Model.
Dentro de la categora WebPages insertaremos una carpeta View para la lgica
de presentacin.

100

UNIVERSIDAD PRIVADA TELESUP

b.

Importar las clases

c.

<%@page import="Ds.*"%>
<%@page import="Model.*"%>
<%@page import="java.sql.*"%>
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">

101

UNIVERSIDAD PRIVADA TELESUP

<html>
<head>
<title>Documento sin ttulo</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; fontweight: bold;}
.Estilo8 {color:#FFFFFF; font-size: 13px; font-family: Arial, Helvetica, sans-serif; fontweight: 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; fontweight: 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; }

102

UNIVERSIDAD PRIVADA TELESUP

</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>

103

UNIVERSIDAD PRIVADA TELESUP

<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 }

104

UNIVERSIDAD PRIVADA TELESUP

%> <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>

105

UNIVERSIDAD PRIVADA TELESUP

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 continuacin presentaremos el cdigo fuente de las pginas que nos permitirn
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>
<%

106

UNIVERSIDAD PRIVADA TELESUP

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>

107

UNIVERSIDAD PRIVADA TELESUP

<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>

108

UNIVERSIDAD PRIVADA TELESUP

<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.*"%>
<%

109

UNIVERSIDAD PRIVADA TELESUP

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>

110

La

UNIVERSIDAD PRIVADA TELESUP

Interface TEMA 4
Preparedstament
y Callablest
Competencia:
Describir las propiedades y funcionalidades
de la Interface Preparedstament y
Callablestament.

111

UNIVERSIDAD PRIVADA TELESUP

Tema 04: La Interface Preparedstament y


Callablest
Algunas veces es ms 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 ms general, Statement, que ya conocemos.

Cundo utilizar un Objeto PreparedStatement


Si queremos ejecutar muchas veces un objeto Statement, reduciremos el tiempo de
ejecucin si utilizamos un objeto PreparedStatement, en su lugar. La caracterstica
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 mayora 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 slo 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
parmetros, probablemente nosotros utilizaremos ms frecuentemente sentencias con
parmetros. La ventaja de utilizar sentencias SQL que utilizan parmetros es que
podemos utilizar la misma sentencia y suministrar distintos valores cada vez que la
ejecutemos. Veremos un ejemplo de esto en las pginas siguientes.

Crear un Objeto PreparedStatement


Al igual que los objetos Statement, creamos un
objeto

PreparedStatement

con

un

objeto

Connection. Utilizando nuestra conexin cn abierta


en ejemplos anteriores, podramos escribir lo
siguiente

instruccin

para

crear

un

objeto

PreparedStatement que tome dos parmetros de entrada.


PreparedStatement

ps=cn.prepareStatement("UPDATE

PRODUCTOS

SET

STOCKPRO = ? WHERE NOMPRO LIKE ?");

112

UNIVERSIDAD PRIVADA TELESUP

La variable ps contiene la sentencia SQL, "UPDATE PRODUCTOS SET STOCPRO =


? WHERE NOMPRO LIKE ?", que tambin ha sido, en la mayora de los casos,
enviada al controlador de la base de datos, y ha sido precompilado.

Suministrar Valores para los Parmetros de un PreparedStatement


Necesitamos suministrar los valores que se utilizarn en los lugares donde estn las
marcas

de

interrogacin,

si

hay

alguno,

antes

de

ejecutar

un

objeto

PreparedStatement. Podemos hacer esto llamando a uno de los mtodos setXXX


definidos en la clase PreparedStatement. Si el valor que queremos sustituir por una
marca de interrogacin es un int de Java, podemos llamar al mtodo setInt. Si el valor
que queremos sustituir es un String de Java, podemos llamar al mtodo setString,
etc. En general, hay un mtodo setXXX para cada tipo Java. Utilizando el objeto ps
del ejemplo anterior, la siguiente lnea de cdigo selecciona la primera marca de
interrogacin para un int de Java, con un valor de 75.
ps.setInt(1, 75);

Cmo podramos asumir a partir de este ejemplo, el primer argumento de un mtodo


setXXX indica la marca de interrogacin que queremos seleccionar, y el segundo
argumento el valor que queremos ponerle. El siguiente ejemplo selecciona la segunda
marca de interrogacin con el string "Arroz".
ps.setString(2, "Arroz");
Despus de que estos valores hayan sido asignados para sus dos parmetros, 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 cdigo hacen lo
mismo.

Cdigo 1
String cad="UPDATE PRODUCTOS SET STOCKPRO=75 WHERE NOMPRO LIKE
'Arroz'";
stmt.executeUpdate(cad);

Cdigo 2
PreparedStatement
ps=cn.prepareStatement("UPDATE
STOCKPRO=? WHERE NOMPRO LIKE ?");
ps.setInt(1, 75);
ps.setString(2, "Arroz");
ps.executeUpdate().

PRODUCTOS

SET

113

UNIVERSIDAD PRIVADA TELESUP

Mirando esto ejemplos podramos preguntarnos por qu utilizar un objeto


PreparedStatement con parmetros en vez de una simple sentencia, ya que la
sentencia simple implica menos pasos. Si actualizramos la columna STOCKPRO
slo una o dos veces, no sera necesario utilizar una sentencia SQL con parmetros.
Si por otro lado, tuviramos que actualizarla frecuentemente, podra ser ms fcil
utilizar un objeto PreparedStatement, especialmente en situaciones cuando la
utilizamos con un bucle while para seleccionar un parmetro a una sucesin de
valores. Veremos este ejemplo ms adelante en esta seccin.
Una vez que a un parmetro se ha asignado un valor, el valor permanece hasta que lo
resetee otro valor o se llame al mtodo clearParameters. Utilizando el objeto
PreparedStatement: ps, el siguiente fragmento de cdigo reutiliza una sentencia
prepared despus de resetar el valor de uno de sus parmetros, dejando el otro igual.

Utilizar una Bucle para asignar Valores


Normalmente se codifica ms sencillo utilizando un bucle for o while para asignar
valores de los parmetros de entrada. El siguiente fragmento de cdigo demuestra la
utilizacin

de

un

bucle

for

para

asignar

los

parmetros

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 ("Azcar"), etc. Este fragmento de cdigo demuestra la
actualizacin 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","Azcar","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();
}

114

UNIVERSIDAD PRIVADA TELESUP

Cuando el propietario quiere actualizar los nuevos stocks de la semana siguiente,


puede utilizar el mismo cdigo 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 aplicacin real, los valores probablemente sern introducidos por el usuario en
vez de hacerlos a travs de un array).

Valores de retorno del mtodo executeUpdate


Siempre que executeQuery devuelve un objeto ResultSet que contiene los resultados
de una peticin al controlador de la base datos, el valor devuelto por executeUpdate
es un int que indica cuntas lneas de la tabla fueron actualizadas. Por ejemplo, el
siguiente cdigo 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 actualizacin afecta slo a una lnea
de la tabla, por eso n es igual a 1.
Cuando el mtodo executeUpdate es utilizado para ejecutar una sentencia DDL,
como la creacin de una tabla, devuelve el int: 0. Consecuentemente, en el siguiente
fragmento de cdigo, que ejecuta la sentencia DDL utilizada para crear la tabla
PRODUCTOS, n tendr el valor 0.
String comando=Create Tables categoras(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
Ejecucin de Procedimientos Almacenados
Antes de explicar detalladamente el uso de la interfaz CallableStatment, analicemos
brevemente: Qu son los procedimientos almacenados?

115

UNIVERSIDAD PRIVADA TELESUP

QU ES UN PROCEDIMIENTO ALMACENADO?
Un procedimiento almacenado (stored procedure en ingls) es un programa (o
procedimiento) el cual es almacenado fsicamente en una base de datos. Su
implementacin vara de un manejador de bases de datos a otro. Un procedimiento
almacenado es un elemento de base de datos reutilizable almacenado que realiza
alguna operacin en la base de datos. Un procedimiento almacenado contiene cdigo
SQL que puede, entre otras cosas, insertar, actualizar o eliminar registros. Los
procedimientos almacenados tambin pueden alterar la estructura de la base de datos.
Por ejemplo, puede utilizar un procedimiento almacenado para aadir una columna de
tabla o incluir borrar una tabla. Un procedimiento almacenado tambin
puede llamar a otro procedimiento almacenado, as como aceptar
entradas y devolver mltiples valores al procedimiento llamado en
forma de parmetros 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


informacin lo ms precisamente posible, para enviar de vuelta la informacin justa
y necesaria y que por la red corra el mnimo de informacin, consiguiendo as un
aumento del rendimiento de la red considerable.
Rendimiento: el SGBD, en este caso MySQL, es capaz de trabajar ms rpido con

los datos que cualquier lenguaje del lado del servidor, y llevar a cabo las tareas
con ms eficiencia. Solo realizamos una conexin al servidor y este ya es capaz
de realizar todas las comprobaciones sin tener que volver a establecer una
conexin. Esto es muy importante, una vez le que cada conexin con la BD puede
tardar hasta medios segundo, imagnate en un ambiente de produccin con muchas
visitas como puede perjudicar esto a nuestra aplicacinOtra 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.
Reutilizacin: 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.

116

UNIVERSIDAD PRIVADA TELESUP

CALLABLESTATEMENT
Un objeto CallableStatement es una interface JDBC utilizado para llamar o ejecutar
procedimientos almacenados de la base de datos desde una aplicacin Java.
Antes de usar CallableStatement debemos saber si nuestro Gestor de Base de Datos
soporta y usa procedimientos almacenados, para este propsito el mtodo
supportsStoredProcedures devolver true si la DBMS soporta llamadas a
procedimientos almacenados y el mtodo getProcedures devolver una descripcin
de los procedimientos almacenados disponibles.
CALLABLESTATEMENT hereda los mtodos de Statement, los cuales tratan
sentencias SQL en general, y tambin hereda los mtodos de PreparedStatement, que
tratan los parmetros IN. Todos los mtodos definidos para CallableStatement tratan
los parmetros OUT o los aspectos de salida de los parmetros INOUT: registro de los
tipos JDBC (tipos genricos SQL) de los parmetros OUT, recuperacin de valores
desde ellos o chequear si el valor devuelto es un JDBC NULL.

Crear objetos CallableStatement


Los objetos CallableStatement se crean con el mtodo 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 parmetros IN, OUT INOUT dependiendo del procedimiento
getTestData.

Parmetros IN y OUT
El paso de valor para cualquier parmetro IN de un objeto CallableStatement se
realiza mediante los mtodos setXXX heredados de PreparedStatement. El tipo de el
valor a pasar se determina por el mtodo setXXX a usar (setFloat para pasar un valor
float, setString para pasar un valor String y as por estilo).
Si el procedimiento almacenado devuelve parmetros
OUT, el tipo JDBC de cada parmetro OUT debe ser
registrado antes de que el objeto CallableStatement sea
ejecutado. El registro del tipo JDBC se realiza mediante el
mtodo registerOutParameters. Despus que la sentencia ha sido ejecutada, los
mtodos getXXX de CallableStatement recuperan los valores de los parmetros.

117

UNIVERSIDAD PRIVADA TELESUP

Para ilustrar esto, el siguiente ejemplo registra los parmetros OUT, ejecuta el
procedimiento almacenado llamado por cs y recupera los valores devueltos en los
parmetros OUT. El mtodo getInt recupera un int del primer parmetro, y getDouble
recupera un doubl del segundo parmetro 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 parmetro de salida
double n = cs.getDouble(2); //Recupera el 2do parmetro de salida

Parmetros INOUT
Son parmetros que suministran entradas as como aceptan salidas. Estos requieren
llamar a los mtodos apropiados setXXX (heredados de PreparedStatement) adems
de llamar al mtodo registerOutParameter. Los mtodos setXXX fijan los valores como
parmetros de entrada y registerOutParameter registra sus tipos JDBC como
parmetros de salida. El mtodo 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 mtodo
registerOutParameter debe ser el mismo. Luego, para recuperar el valor de salida, se
usa el mtodo apropiado getXXX. Por ejemplo, un parmetro cuyo tipo Java es byte
debera usar el mtodo setByte para asignar el valor de entrada, debera suplir un
TINYINT como tipo JDBC para registerOutParameter, y debera usar getByte para
recuperar el valor de salida El siguiente ejemplo asume que existe un procedimiento
almacenado reviseTotal con un nico parmetro INOUT. El mtodo setByte fija el
valor del parmetro a 25 que es el que el driver enviar a la base de datos como un
JDBC TINYINT. Despus registerOutParameter registrar el parmetro como un JDBC
TINYINT. Luego que el procedimiento sea ejecutado se devolver un nuevo JDBC
TINYINT y el mtodo 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);

118

UNIVERSIDAD PRIVADA TELESUP

Recuperar parmetros OUT despus de resultados


Dadas las limitaciones impuestas por algunas DBMS, se recomienda en aras de la
mxima portabilidad, que todos los resultados generados por la ejecucin de un objeto
CallableStatement deberan recuperarse antes que los parmetros OUT usando los
mtodos CallableStatement.getXXX. Si un objeto CallableStatement devuelve
mltiples objetos ResultSet (mediante una llamada al mtodo execute), todos los
resultados deben recuperarse antes que los parmetros OUT. En este caso, debe
asegurarse de que todos los resultados han sido accedidos, los mtodos de Statement
getResultSet, getUpdateCount y getMoreResults necesitan ser llamados hasta que no
haya ms resultados. Despus de hecho esto, los valores de los parmetros OUT
pueden ser recuperados mediante los mtodos CallableStatement.getXXX.

Recuperar valores NULL en parmetros OUT


El valor devuelto en un parmetro OUT puede ser JDBC NULL. Cuando esto ocurre, le
valor JDBC NULL se convertir de forma que el valor devuelto por el mtodo getXXX
sea null, 0 o false dependiendo del tipo del mtodo 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 mtodo wasNull, que devuelve true si el ltimo valor ledo
por un mtodo getXXX fue JDBC NULL y false en caso contrario.

Mtodos de CallableStatement
Registro de los parmetros: 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 parmetros de salida.
Parmetros nulos: wasNull()
public abstract boolean wasNull() throws SQLException
Devuelve true si el valor previamente ledo con un mtodo getXXX() era realmente
nulo.

Obtencin de valores: getXXX()


public abstract tipoJava getXXX(int indiceParametro) throws SQLException
Obtienen el valor SQL contenido en el parmetro como un tipoJava, o un null si se
trataba de un valor NULL de SQL.

119

UNIVERSIDAD PRIVADA TELESUP

Mtodo getXXX()

tipo Java

tipo SQL

Resultado para un SQL NULL

GetString

String

getBoolean
GetByte
GetShort
GetInt
GetLong
GetFloat
getDouble
getBigDecimal*
GetBytes

Boolean
Byte
Short
Int
Long
Float
Doubl
BigDecimal
byte[]

GetDate
GetTime
getTimestamp

Date
Time
Timestamp

CHAR, VARCHAR o Null


LONGVARCHAR
BIT
false
TINYINT
cero
SMALLINT
cero
INTEGER
cero
BIGINT
cero
FLOAT
cero
DOUBLE
cero
NUMERIC
Null
BINARY
o Null
VARBINARY
DATE
Null
TIME
Null
TIMESTAMP
Null

Caso Prctico
Realizar una aplicacin Java que utilizando procedimientos almacenados consulte que
cuentas corresponde a una sucursal de un banco,

Cdigo de Bsqueda
Este cdigo crea un CallableStatement para ejecutar el procedimiento almacenado
usp_filtra_ctas_sucur que usa un parmetro de entrada, con el mtodo setString
ingresamos el valor del primer parmetro de entrada y luego ejecutamos el
procedimiento almacenado con el mtodo executeQuery, porque se trata de un
comando Select

120

UNIVERSIDAD PRIVADA TELESUP

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();

CDIGO

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;

EJECUCIN 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();

121

UNIVERSIDAD PRIVADA TELESUP

Lecturas Recomendadas

INTRODUCCIN 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

1. Modifique el programa de mantenimiento de datos y adptelo


para que trabaje con Procedimientos almacenados.
Envalo a travs de "Procedimientos Almacenados".

122

UNIVERSIDAD PRIVADA TELESUP

Autoevaluacin

1) Los Driver, tambin 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) Cuntos tipos de manejadores JDBC hay?
a. Dos.
b. Tres.
c. Cuatro.
d. Ocho.
e. Siete.
3) Registrar un _____________ no es ms 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 funcin del JDBC?


a. Detener la funcin de la base de datos.
b. Establecer una conexin con dos tablas.
c. Decodificar los datos.
d. Procesar los resultados de la consulta.
e. Funciona como un compilador de un lenguaje de programacin.
5) Toda URL de JDBC consta siempre de _____ partes.
a. Cuatro
b. Seis
c. Ocho
d. .Diez
e. Tres

123

UNIVERSIDAD PRIVADA TELESUP

6) Todos los mtodos que encontramos en esta clase son estticos:


a. Clase DriverManager.
b. Clase Connection.
c. Clase Statement.
d. Clase PreparedStatement.
e. Clase ResultSet.

7) El Procedimiento almacenado es conocido tambin 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


operacin 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 aplicacin Java.


a. getProcedures.
b. Statement.
c. PreparedStatement.
d. ResultSet.
e. supportsStoredProcedures.

10) Los objetos Statement se cerrarn automticamente por el:


a. ResultSet.
b. garbage collector.
c. Connection.
d. DriverManager.getConnection.
e. boolean execute.

124

UNIVERSIDAD PRIVADA TELESUP

Resumen

UNIDAD DE APRENDIZAJE ii:

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 aplicacin escrita en el lenguaje de
programacin Java, tampoco es necesario escribir diferentes aplicaciones para
ejecutar en diferentes plataformas.

Lo que hace la clase DriverManager para intentar establecer conexin con la base de
datos es invocar al mtodo connect de la interface Driver, interface que como veremos
deben implementar todos los manejadores. Realiza esta operacin 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 caracterstica 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 mayora 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 operacin en la base de datos. Un procedimiento
almacenado contiene cdigo SQL que puede, entre otras cosas, insertar, actualizar o
eliminar registros. Los procedimientos almacenados tambin pueden alterar la
estructura de la base de datos.

125

UNIVERSIDAD PRIVADA TELESUP

126

UNIVERSIDAD PRIVADA TELESUP

Introduccin

a) Presentacin y contextualizacin
El modelovistacontrolador (MVC) es un patrn de arquitectura de software que
separa los datos y la lgica de negocio de una aplicacin de la interfaz de usuario y
el mdulo encargado de gestionar los eventos y las comunicaciones.

b) Competencia
Conoce las propiedades y funcionalidades del patrn de diseo MVC (Model
View - Controller).

c) Capacidades
1. Conoce las caractersticas 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) Presentacin de Ideas bsicas y contenido esenciales de la Unidad:


La Unidad de Aprendizaje 03: Patrn de Diseo 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.

127

UNIVERSIDAD PRIVADA TELESUP

Servlet

TEMA 1

Competencia:
Conocer las caractersticas y funciones de
Servlet.

128

UNIVERSIDAD PRIVADA TELESUP

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. Tambin podran correr
dentro de un servidor de aplicaciones
(ej: OC4J Oracle) que adems de
contenedor

para

servlet

tendr

contenedor para objetos ms avanzados como son los EJB (Tomcat slo es un
contenedor de servlets).

La palabra servlet deriva de otra anterior, applet, que se refera a pequeos programas
escritos en Java que se ejecutan en el contexto de un navegador web. Por
contraposicin, un servlet es un programa que se ejecuta en un servidor. El uso ms
comn de los servlets es generar pginas web de forma dinmica a partir de los
parmetros de la peticin que enve el navegador web. Los servlets forman parte de
JEE (Java Enterprise Edition), que es una ampliacin de JSE (Java Standard Edition).

Un servlet es un objeto Java que implementa la


interfaz javax.servlet.Servlet o hereda alguna de
las clases ms convenientes para un protocolo
especfico

(ej:

javax.servlet.HttpServlet).

Al

implementar esta interfaz el servlet es capaz de


interpretar los objetos de tipo HttpServletRequest
y HttpServletResponse quienes contienen la
informacin de la pgina que invoc al servlet. Los Servlets son la respuesta de la
tecnologa Java a la programacin CGI.

129

UNIVERSIDAD PRIVADA TELESUP

Son programas que se ejecutan en un servidor Web y construyen pginas Web.


Construir pginas Web al vuelo es til (y comnmente usado) por un nmero de
razones:

La pgina Web est basada en datos enviados por el usuario. Por ejemplo,
las pginas de resultados de los motores de bsqueda se generan de esta
forma, y los programas que procesan pedidos desde sites de comercio
electrnico tambin.

Los datos cambian frecuentemente. Por ejemplo, un informe sobre el tiempo o


pginas de cabeceras de noticias podran construir la pgina dinmicamente,
quizs devolviendo una pgina previamente construida y luego actualizndola.

Las pginas Web que usan informacin desde bases de datos corporativas u
otras fuentes. Por ejemplo, usaramos esto para hacer una pgina Web en una
tienda on-line que liste los precios actuales y el nmero de artculos en stock.

130

UNIVERSIDAD PRIVADA TELESUP

Modelo response/request
Aqu tenemos un servlet bsico 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 lnea
de direcciones, sigue un enlace desde una pgina Web, o rellena un formulario que no
especifica un METHOD. Los Servlets tambin pueden manejar peticiones POST muy
fcilmente, 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
}
}

131

UNIVERSIDAD PRIVADA TELESUP

Para

ser un servlet, esta

debe

extender de

HttpServlet y sobreescribir doGet o doPost (o


ambos), dependiendo de si los datos estn siendo
enviados mediante GET o POST. Estos mtodos
toman dos argumentos: un HttpServletRequest y un HttpServletResponse.

El HttpServletRequest tiene mtodos que nos


permiten encontrar informacin entrante como
datos de un FORM, cabeceras de peticin HTTP,
etc. El HttpServletResponse tiene mtodos que
nos permiten especificar lneas de respuesta HTTP
(200, 404, etc.), cabeceras de respuesta (ContentType, Set-Cookie, etc.), y, todava ms importante,
nos permiten obtener un PrintWriter usado para
envar la salida de vuelta al cliente. Para servlets
sencillos, la mayora del esfuerzo se gasta en
sentencias println que generan la pgina deseada.

132

UNIVERSIDAD PRIVADA TELESUP

Observamos que doGet y doPost lanzan dos


excepciones, por eso es necesario incluirlas en la
declaracin. Tambin 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 mtodo service, y algunas veces queremos sobreescribir directamente el mtodo
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 mtodos doPost() y doGet()
3. Los datos de entrada son procesados con el
mtodo processRequest()
4. Se utiliza el objeto out para direccionar las
respuestas hacia el navegador del cliente.

133

UNIVERSIDAD PRIVADA TELESUP

Pasos
para Crear un
Servlet

TEMA 2

Competencia:
Reconocer los principales pasos para crear
un servlet.

134

UNIVERSIDAD PRIVADA TELESUP

Tema 02: Pasos para Crear un Servlet


PRERREQUISITO:
Debemos tener instalado cualquiera de los siguientes
servidores

webs:

Apache

Tomcat,

GlassFish

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 generara conflicto y por tanto imposibilitara que el
proyecto web se ejecute.
1. Crear un proyecto Web, acuda a Menu File / New Project
2. Seleccione Java Web / Web Application

3. Botn Siguiente
4. Ingrese el nombre del proyecto web / Botn Next

135

UNIVERSIDAD PRIVADA TELESUP

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 botn Next

136

UNIVERSIDAD PRIVADA TELESUP

8. Haga click en el botn Finish


9. Antes de crear un servlet, debemos crear un paquete. Click derecho sobre la
categora 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

137

UNIVERSIDAD PRIVADA TELESUP

12. Ingresar el nombre del Servlet: Demo / Botn Next

13. Luego haga click en el botn Finish

138

UNIVERSIDAD PRIVADA TELESUP

14. A continuacin aparecer el cdigo fuente de la clase Servlet. El mtodo


processRequest es el mtodo 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 lneas que contienen cdigo HTML y
podemos agregar algunas lneas nuestras.

A continuacin agregamos algunas lneas nuestras:

139

UNIVERSIDAD PRIVADA TELESUP

16. Para ejecutar el Servlet, presionamos la teclas Shif F6 / Confirmemos la


ventana siguiente, haciendo click en el botn OK

La ejecucin de nuestro Servlet, es la siguiente:

Importante:
En Netbeans debemos indicar el nombre del navegador que utilizaremos para
visualizar la ejecucin de nuestros Servlets, acudir a Menu Tools / Options /
Categora General / Web Browser: Internet Explorer.

140

UNIVERSIDAD PRIVADA TELESUP

Manejar datos de formularios

En cambio, una de las mejores caractersticas de los servlets Java es que todos estos
anlisis de formularios son manejados automticamente. Simplemente llamamos al
mtodo getParameter de HttpServletRequest, y suministramos el nombre del
parmetro como un argumento. Observa que los nombres de parmetros son
sensibles a la maysculas. Hacemos esto exactamente igual que cuando los datos son
enviados mediante GET o como si los enviramos mediante POST.

El valor de retorno es un String correspondiente al


valor de la primera ocurrencia del parmetro. Se
devuelve un String vaco si el parmetro existe
pero no tiene valor, y se devuelve null si no existe
dicho parmetro. Si el parmetro pudiera tener
ms de un valor, como en el ejemplo anterior,
deberamos 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 especfico de
nombres de parmetros por los que buscar. Usamos getParameterNames para esto,
que devuelve una Enumeracin, cada entrada puede ser forzada a String y usada en
una llamada a getParameter.

141

UNIVERSIDAD PRIVADA TELESUP

Ejemplo: Un Servlet que lee tres parmetros enviados por un formulario


Aqu hay un sencillo ejemplo que lee
tres parmetros 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 parmetros de peticin en un orden particular.

Tambin observamos que podemos crear fcilmente servlets que puedan manejar
datos GET y POST, simplemente haciendo que su mtodo doPost llame a doGet o
sobreescribiendo service (que llama a doGet, doPost, doHead, etc.). Esta es una
buena prctica estndard, ya que requiere muy poco trabajo extra y permite flexibilidad
en el lado del cliente. Si hemos usado la aproximacin CGI tradicional cuando leemos
los datos POST mediante la entrada estndard.

Deberamos observar que hay una forma similar con los Servlets llamando primero a
getReader o getInputStream sobre HttpServletRequest.
Esto es una mala idea para parmetros normales, pero
podra usarse para ficheros descargados o datos
POST que estn siendo enviados por clientes
personales en vez de formularios HTML. Observa, sin
embargo, que si leemos los datos POST de esta
manera, podran no ser encontrados por getParameter.

142

UNIVERSIDAD PRIVADA TELESUP

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 parmetros

143

UNIVERSIDAD PRIVADA TELESUP

Ejemplo: Listar todos los Datos del Formulario


Aqu hay un ejemplo que busca todos los nombres de
parmetros que fueron enviados y los pone en una
tabla. Ilumina los parmetros que tienen valor cero as
como aquellos que tienen mltiples valores. Primero
busca todos los nombres de parmetros mediante el
mtodo getParameterNames de HttpServletRequest. Esto devuelve una Enumeration.
Luego, pasa por la Enumeration de la forma estndard, usando hasMoreElements
para determinar cundo 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 slo tiene una
entrada y slo contiene un string vaco, el parmetro no tiene valores, y el servlet
genera una entrada "No Value" en itlica. Si el array tiene ms de una entrada, el
parmetro tiene mltiples valores, y se muestran en una lista bulleteada. De otra
forma, el nico valor principal se stua 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();

144

UNIVERSIDAD PRIVADA TELESUP

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 deberan 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>

145

UNIVERSIDAD PRIVADA TELESUP

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>

146

UNIVERSIDAD PRIVADA TELESUP

Resultados del envo

Ejemplo: Imprimir todas las Cabeceras: Aqu tenemos un


servelt que simplemente crea una tabla con todas las cabeceras
recibidas, junto con sus valores asociados. Tambin imprime
los tres componentes de la lnea de peticin principal
(mtodo, URI y protocolo).

147

UNIVERSIDAD PRIVADA TELESUP

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);
}
}

148

UNIVERSIDAD PRIVADA TELESUP

Modelo Vista
Controlador
(MVC)

TEMA 3

Competencia:
Analizar el modelo vista controlador (Model
View - Controller).

149

UNIVERSIDAD PRIVADA TELESUP

Tema 03: Modelo Vista Controlador (MVC)


Es un estilo de arquitectura de software que separa los
datos de una aplicacin, la interfaz de usuario, y la lgica de
control en tres componentes distintos. El estilo de llamada y
retorno MVC, se ve frecuentemente en aplicaciones web,
donde la vista es la pgina HTML y el cdigo que provee de
datos dinmicos a la pgina. El modelo es el Sistema de
Gestin de Base de Datos y la Lgica de negocio, y el controlador es el responsable
de recibir los eventos de entrada desde la vista.

Descripcin del patrn

Modelo: Esta es la representacin especfica de la informacin con la cual el


sistema opera. En resumen, el modelo se limita a la lgica 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 unin entre capa de presentacin y


capa

de

negocio

conocido

en

el

paradigma de la Programacin por capas


representara la integracin entre Vista y
su

correspondiente

Controlador

de

eventos y acceso a datos, MVC no


pretende

discriminar

entre

capa

de

negocio y capa de presentacin pero si


pretende separar la capa visual grfica de su correspondiente programacin 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.

150

UNIVERSIDAD PRIVADA TELESUP

Aunque se pueden encontrar diferentes implementaciones


de MVC, el flujo que sigue el control generalmente es el
siguiente:
1. El usuario interacta con la interfaz de usuario de
alguna forma (por ejemplo, el usuario pulsa un botn,
enlace, etc.)
2. El controlador recibe (por parte de los objetos de la
interfaz-vista) la notificacin de la accin solicitada
por el usuario. El controlador gestiona el evento que llega, frecuentemente a
travs de un gestor de eventos (handler) o callback.

3. El controlador accede al modelo, actualizndolo, posiblemente modificndolo de


forma adecuada a la accin solicitada por el usuario (por ejemplo, el controlador
actualiza el carro de la compra del usuario). Los controladores complejos estn a
menudo estructurados usando un patrn de comando que encapsula las
acciones y simplifica su extensin.
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 enve los datos del modelo a la vista.
6. La interfaz de usuario espera nuevas interacciones del usuario, comenzando el
ciclo nuevamente.

151

UNIVERSIDAD PRIVADA TELESUP

CASO PRCTICO
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");
}

152

UNIVERSIDAD PRIVADA TELESUP

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;
}
-->

153

UNIVERSIDAD PRIVADA TELESUP

</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">&nbsp;</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">

154

UNIVERSIDAD PRIVADA TELESUP

<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>
<%}

155

UNIVERSIDAD PRIVADA TELESUP

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>Direccin</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>&nbsp;</td>
<td>&nbsp;</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

156

UNIVERSIDAD PRIVADA TELESUP

<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>Direccin</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>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
</form>
<% } %>
<p>&nbsp;</p>
</body>
</html>

157

UNIVERSIDAD PRIVADA TELESUP

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){

158

UNIVERSIDAD PRIVADA TELESUP

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){

159

UNIVERSIDAD PRIVADA TELESUP

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>
}

160

UNIVERSIDAD PRIVADA TELESUP

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 {

161

UNIVERSIDAD PRIVADA TELESUP

String sql="update empleado set


vch_emplpaterno=?,vch_emplmaterno=?,vch_emplnombre=?,vch_emplciudad=?,vch_empldir
eccion=?,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(?,?,?,?,?,?,?,?,?,?)";

162

UNIVERSIDAD PRIVADA TELESUP

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;
}
}

163

UNIVERSIDAD PRIVADA TELESUP

Ds [Lgica de Datos]
package ds;
import java.sql.*;
public class GestionBD {
private static GestionBD instancia=null; //Variable esttica
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 mtodo ejecutar los comandos de actualizacin
public void ejecutarActualizacion(String sql) throws Exception {
st=cn.createStatement();
st.executeUpdate(sql);
}
}

164

UNIVERSIDAD PRIVADA TELESUP

Consulta
de

Datos
MVC

TEMA 4

Competencia:
Utilizar objetivamente la consulta de datos
(Model View - Controller).

165

UNIVERSIDAD PRIVADA TELESUP

Tema 04: Consulta de Datos - MVC


CASO PRCTICO
Crear un buscador de productos que permita buscar por: Categoras,
Marcas o por nombre de productos. Crear una pgina de acceso que
nos permita ingresar a la pgina anterior con login y contrasea.
Los usuarios autorizados para el ingreso deben estar almacenados
en la tabla Usuarios. Utilizar el patrn de diseo MVC para la
realizacin 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;
}

// mtodo 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

166

UNIVERSIDAD PRIVADA TELESUP

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;
}
}

Cdigo 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;
}

167

UNIVERSIDAD PRIVADA TELESUP

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("")){

168

UNIVERSIDAD PRIVADA TELESUP

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() {
}
}

169

UNIVERSIDAD PRIVADA TELESUP

Cdigo 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();

170

UNIVERSIDAD PRIVADA TELESUP

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>
}

171

UNIVERSIDAD PRIVADA TELESUP

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>");

172

UNIVERSIDAD PRIVADA TELESUP

}
} 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>
}

173

UNIVERSIDAD PRIVADA TELESUP

Cdigo 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>

174

UNIVERSIDAD PRIVADA TELESUP

<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">&nbsp;</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

175

UNIVERSIDAD PRIVADA TELESUP

} //fin del while


} //fin del if
%>
</select>
</td>
<td>&nbsp;</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>

176

UNIVERSIDAD PRIVADA TELESUP

<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>&nbsp;</p>
</body>
</html>

177

UNIVERSIDAD PRIVADA TELESUP

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>

178

UNIVERSIDAD PRIVADA TELESUP

<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>&nbsp;</p>
</body>
</html>

179

UNIVERSIDAD PRIVADA TELESUP

Lecturas Recomendadas

SERVLET
http://www.javaya.com.ar/detalleconcepto.php?codigo=136&inicio=60

DESCRIPCIN DEL PATRN MVC


http://www.desarrolloweb.com/wiki/mvc-modelo-vista-controlador.html

Actividades y Ejercicios

1. Cree un buscador de productos que permita buscar por: Precio y


marca de productos.

Envalo a travs de "Buscador".

180

UNIVERSIDAD PRIVADA TELESUP

Autoevaluacin

1) La palabra servlet deriva de otra anterior, ______ , que se refera a pequeos


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 tecnologa Java a la programacin:
a. CGI
b. Visual++
c. FoxPro
d. Php
e. DDoS
3) Cuntas partes tiene el ciclo de vida de un Servlets?
a. Seis
b. Cuatro
c. Dos
d. Ocho
e. Cinco
4) Especfica de la informacin 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 lnea de direcciones.
a.
b.
c.
d.
e.

Una URL
Un comando.
Algn cdigo.
Un usuario.
Cdigos de servidor.

181

UNIVERSIDAD PRIVADA TELESUP

6) Tiene mtodos que nos permiten encontrar informacin entrante como datos
de un FORM, cabeceras de peticin HTTP, etc.
a.
b.
c.
d.
e.

HttpServletRequest
HttpServletResponse
javax.servlet.http
PrintWriter
ServletException

7) Es un objeto Java que implementa la interfaz javax.servlet. Servlet o hereda


alguna de las clases ms convenientes para un protocolo especfico.
a.
b.
c.
d.
e.

El Servlet.
La Interface.
El Compilador de lenguaje.
La base de datos.
El servidor.

8) Tomcat slo es un contenedor de:


a.
b.
c.
d.
e.

Apache.
Servidores.
Conectores.
Bases de datos.
Servlets.

9) El uso ms comn de los servlets es generar pginas web de forma dinmica


a partir de los parmetros de la peticin que enve el navegador web. Los
servlets forman parte de:
a.
b.
c.
d.
e.

SCWCD
JSE
JOO
JNE
JEE

10) Una de las mejores caractersticas de los servlets Java es que todos estos
anlisis de formularios son manejados:
a.
b.
c.
d.
e.

Manualmente.
Automticamente.
Por condiciones.
Iniciando el sistema.
Ejecutando una funcin.

182

UNIVERSIDAD PRIVADA TELESUP

Resumen

UNIDAD DE APRENDIZAJE III:

Un servlet es un objeto Java que implementa la interfaz javax.servlet.Servlet o hereda


alguna de las clases ms convenientes para un protocolo especfico (ej:
javax.servlet.HttpServlet). Al implementar esta interfaz el servlet es capaz de
interpretar los objetos de tipo HttpServletRequest y HttpServletResponse quienes
contienen la informacin de la pgina que invoc al servlet.

El valor de retorno es un String correspondiente al valor de la primera ocurrencia del


parmetro. Se devuelve un String vaco si el parmetro existe pero no tiene valor, y se
devuelve null si no existe dicho parmetro. Si el parmetro pudiera tener ms de un
valor, como en el ejemplo anterior, deberamos llamar a getParameterValues en vez
de a getParameter.

La unin entre capa de presentacin y capa de negocio conocido en el paradigma de


la

Programacin

por capas

representara

la

integracin

entre vista

y su

correspondiente controlador de eventos y acceso a datos, MVC no pretende


discriminar entre capa de negocio y capa de presentacin pero si pretende separar la
capa visual grfica de su correspondiente programacin 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 enve los datos del modelo a la vista.

183

UNIVERSIDAD PRIVADA TELESUP

184

UNIVERSIDAD PRIVADA TELESUP

Introduccin

a) Presentacin y contextualizacin:
En esta unidad el alumno conocer los diversos componentes en el desarrollo de
las aplicaciones, tambin podr conocer los programas de ms uso y adecuados
para el desarrollo eficiente de las aplicaciones de inters tales como; JQUERY,
Jfreechart, etc

b) Competencia:
Identifica las propiedades de las bibliotecas ms utilizadas y realizar grficos
utilizando Jfreechart.

c) Capacidades:
1. Reconoce el uso adecuado del reporteador IText.
2. Emplea JFreeChart adecuadamente para la elaboracin de grficos.
3. Conoce los procesos adecuados para la creacin de grficos con base de
datos.
4. Describe las caractersticas y funcionalidades de JQUERY.

d) Actitudes:
Incentiva la investigacin de los componentes en el desarrollo de aplicaciones.
Promueve la prctica constante de los procesos de programacin de grficos.

e) Presentacin de Ideas bsicas 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: Grfico con Base de Datos.
TEMA 04: jQuery

185

UNIVERSIDAD PRIVADA TELESUP

Uso del
Reporteador
IText

TEMA 1

Competencia:
Reconocer el uso adecuado del reporteador
IText.

186

UNIVERSIDAD PRIVADA TELESUP

Desarrollo de los Temas

Tema 01: Uso del Reporteador IText


iText es una librera escrita en java por Bruno Lowagie y otros,
que permite a los desarrolladores generar dinmicamente
documento en formato PDF, ofrece ventajas como:
El documento puede contener entradas escrita por el
usuario a travs 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 pginas del PDF

Puede obtener esta librera desde su pgina oficial en:


http://itextpdf.com
A continuacin haremos un ejemplo donde utilizaremos los prrafos, tablas y veremos
cmo insertar una imagen adems de agregarle una fuente en especfico.
Primeramente recuerde tener a la mano la librera de iText en este caso he utilizado la
versin 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;

187

UNIVERSIDAD PRIVADA TELESUP

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 nmero de columnas y
la propiedad setWidthPercentage permite indicarle que ocupe todo el ancho de la pgina*/
PdfPTable tabla=new PdfPTable(2);
tabla.setWidthPercentage(100);

188

UNIVERSIDAD PRIVADA TELESUP

/*Ahora que ya tenemos todos los elementos es hora de agregarlos al documento, para ello
primeramente definimos un documento e indicando el tamao*/
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("Columna1ID",FontFactory.getFont("arial",10,Font.BOLD,BaseColor.RED)));;
PdfPCell celda2 =new PdfPCell (new Paragraph("Columna2Valor",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();
}}

189

UNIVERSIDAD PRIVADA TELESUP

JFreeChart

TEMA 2

Competencia:
Emplear JFreeChart adecuadamente para la
elaboracin de grficos.

190

UNIVERSIDAD PRIVADA TELESUP

Tema 02: JFreeChart

El Proyecto JFreeChart que vio la luz en el ao 2000 es una librera de


cdigo abierto (Open Source) para Java, que permite crear diagramas
de forma prctica y sencilla. Con JFreeChart podremos hacer
diferentes tipos de grficos que van desde los tipos comunes tales
como grficos circulares , grficos de barras , reas , grficos de lnea
, histogramas, diagramas de Gantt y ms especficos y menos
frecuentemente utilizados como tipos Candlestick , Viento y Wafer Map
.

Configuracin en NetBeans
Para poder trabajar con los grficos que ofrece el JfreeChart necesitamos 2 libreras
bsicamente:

Nos creamos un proyecto web de ah nos vamos a la carpeta library add Jar/Folder y
agregamos esas libreras.

191

UNIVERSIDAD PRIVADA TELESUP

Implementacin de Grafico en JSP


Ahora nos vamos a la pgina JSP y programaremos

Se necesita importar las libreras del jfreechart para hacer el grafico.


<%@page import="org.jfree.data.general.*" %>
En esta importacion debemos de poner la librera que se necesita segn el tipo de
reporte

192

UNIVERSIDAD PRIVADA TELESUP

En el cdigo fuente que observamos se aprecia que se est llenando 3 valores (3


categoras cada uno con un valor numrico y justamente ese valor definir los
tamaos del grfico)

El resultado sera:

Ahora si queremos el mismo grafico pero en barras la programacin seria:

193

UNIVERSIDAD PRIVADA TELESUP

Hay que notar que la programacin es casi la misma.

El resultado seria

194

UNIVERSIDAD PRIVADA TELESUP

Grfico con
Base de Datos

TEMA 3

Competencia:
Conocer los procesos adecuados para la
creacin de grficos con base de datos.

195

UNIVERSIDAD PRIVADA TELESUP

Tema 03: Grfico con Base de Datos

Si se quiere un grfico de barras pero con base de datos el nico cambio que
deberamos de hacer es el siguiente:

Lo cambiamos de la siguiente manera

196

UNIVERSIDAD PRIVADA TELESUP

No debemos de olvidar de hacer una importacin al SQL.


<%@page import="java.sql.*" %>,
el resto del cdigo fuente es el mismo.

El resultado sera el siguiente:

197

UNIVERSIDAD PRIVADA TELESUP

jQuery

TEMA 4

Competencia:
Describir
las
caractersticas
funcionalidades de JQUERY.

198

UNIVERSIDAD PRIVADA TELESUP

Tema 04: JQUERY


JQuery es un framework de javascript, que nos va a permitir interactuar con los
elementos HTML de una manera muy cmoda y simplificando mucho nuestro trabajo.
Adems jQuery, tiene una implementacin propia de la tecnologa AJAX, lo que nos va
a servir para que la comunicacin entre JSP y jQuery sea mucho ms atractiva.
Comunicar JSP con jQuery, no nos supone ningn problema, es una accin directa. El
problema viene a la hora de tratar de comunicar jQuery con JSP. La explicacin es
muy sencilla y reside en la diferencia sutil pero tremendamente importante, que hay
entre estas dos tecnologas.

jQuery es una tecnologa 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 cdigo que
escribamos en JSP, se va a ejecutar en el lado del servidor. Por tanto, cuando el
cliente solicite nuestra pgina JSP, nuestro contenedor (Tomcat, JBoss,..) compilar el
cdigo JSP que nosotros hayamos incluido en la pgina, crear el cdigo HTML
correspondiente y lo enviar al cliente.

Implementacin de una pgina JSP con JQuery


Primero necesitamos la librera JQuery que es una librera que est hecha en
javaScript
La bajamos de internet de esta direccin: http://jquery.com/

199

UNIVERSIDAD PRIVADA TELESUP

Una vez que hemos bajado el archivo lo descomprimimos y lo guardamos en una


carpeta, en este caso la carpeta se llamara librera,

Ahora nos creamos un proyecto web y


copiamos esa carpeta librera en la carpeta
web

Una vez que tenemos las libreras 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 atrs

200

UNIVERSIDAD PRIVADA TELESUP

Se necesita importar las libreras:


<script type="text/javascript" src="libreria/jquery.js"></script>
<script type="text/javascript" src="libreria/ui/thickbox.js"></script>
Se necesita estas 2 libreras que la tenemos en la carpeta libreras. Notemos que
cuando se hace el hipervnculo

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 pgina llamada Listado

201

UNIVERSIDAD PRIVADA TELESUP

Ejemplo 2 : datepicker
Se tendr una pgina 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

202

UNIVERSIDAD PRIVADA TELESUP

Ahora si queremos ver el calendario ms atractivo podramos ponerle un estilo


css

Notemos la referencia:
<link type="text/css" href="libreria/themes/base/ui.all.css" rel="stylesheet" />
Adems que se debera de crear un div
<div class="demo">
El resultado sera:

203

UNIVERSIDAD PRIVADA TELESUP

Lecturas Recomendadas

QU ES JQUERY?, QU PUEDO HACER CON JQUERY?


http://www.elektrainformatica.com.ar/blog/item/110-jquery-que-es-y-como-seusa?.html

GRFICOS EN JAVA CON JFREECHART


http://lineadecodigo.com/java/graficos-en-java-con-jfreechart/

Actividades y Ejercicios

1. Realice un grfico empleando JFreeChart. Ponga en prctica


todas las recomendaciones que se brindan en el presente
material.
Envalo a travs de "JFreeChart".

2. En un documento en Word realice un informe sobre jQuery,


remarcando sus ventajas y desventajas frente a otras
bibliotecas.
Envalo a travs de "jQuery".

204

UNIVERSIDAD PRIVADA TELESUP

Autoevaluacin

1) El Proyecto JFreeChart que vio la luz en el ao:


a. 1980.
b. 1994.
c. 2000.
d. 2010.
e. 2012.
2) El Proyecto JFreeChart es una librera de cdigo:
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 cmoda y simplificando mucho nuestro
trabajo.
a. AJAX.
b. Jquery.
c. Imprentln.
d. String.
e. Boolean.

4) jQuery, tiene una implementacin propia de la tecnologa:


a. Visual.
b. JSP.
c. AJAX.
d. Adobe.
e. FOXPRO.
5) Cualquier cdigo que escribamos en JSP, se va a ejecutar en el lado del:
a. Ordenador.
b. Administrador.
c. Usuario.
d. Puerto.
e. Servidor.

205

UNIVERSIDAD PRIVADA TELESUP

6) Cuando el cliente solicite nuestra pgina JSP, nuestro contenedor (Tomcat,


JBoss,..) compilar el cdigo JSP que nosotros hayamos incluido en la
pgina, crear el cdigo ______ correspondiente y lo enviar al cliente.
a. HTML.
b. JSP.
c. JEE.
d. Java.
e. ASP.
7) Es una librera escrita en java por ____________ y otros, que permite a los
desarrolladores generar dinmicamente 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 pginas del PDF.

9) La librera JQuery que es una librera que est hecha en:


a. CSS.
b. JavaScript.
c. HTML.
d. C++
e. JOO.
10) Para poder trabajar con los grficos que ofrece el JfreeChart, cuantas
libreras necesitamos bsicamente.
a. Cinco.
b. Doce.
c. Cuatro.
d. Ocho.
e. Dos.

206

UNIVERSIDAD PRIVADA TELESUP

Resumen

UNIDAD DE APRENDIZAJE iv:

JFreeChart es un marco de software open source para el lenguaje de programacin


Java, el cual permite la creacin de grficos1 complejos de forma simple. JFreeChart
tambin trabaja con GNU Classpath, una implementacin en software libre de la
norma estndar de biblioteca de clases para el lenguaje de programacin Java.
JFreeChart es compatible con una serie de grficas diferentes, incluyendo cuadros
combinados.

Una aplicacin sin grficas es muy sosa... y normalmente nuestros clientes lo


agradecen. Hay muchas libreras de pago y gratuitas para realizar esta labor. Vamos a
mostraros como crear una grfica simple con una de las libreras ms extendidas.
Hemos elegido en este caso JFreeChart y vamos a mostrar distintas posibilidades de
uso.

Cuando se piensa el porqu se desarrolla sistemas de informacin en una


organizacin, 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 an un motivo ms importante y no tan obvio, es que la informacin
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 interaccin con la
tcnica AJAX a pginas web. Fue presentada el 14 de enero de 2006 en el BarCamp
NYC. jQuery es la biblioteca de JavaScript ms utilizada.

207

UNIVERSIDAD PRIVADA TELESUP

Glosario

JFREECHART: Es un marco de software open source para el lenguaje de


programacin Java, el cual permite la creacin de grficos complejos de forma
simple.
NETBEANS: Es un entorno de desarrollo integrado libre, hecho principalmente para
el lenguaje de programacin Java. Existe adems un nmero importante de
mdulos para extenderlo. NetBeans IDE2 es un producto libre y gratuito sin
restricciones de uso.
HISTOGRAMAS: Es una representacin grfica 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 tecnologa que se usa para el desarrollo de aplicaciones que
convierten a la Web en un elemento ms interesante y til. Java no es lo mismo
que javascript, que se trata de una tecnologa sencilla que se usa para crear
pginas web y solamente se ejecuta en el explorador.
FRAMEWORK: Es una estructura conceptual y tecnolgica de soporte definido,
normalmente con artefactos o mdulos de software concretos, que puede servir de
base para la organizacin y desarrollo de software. Tpicamente, 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 lgico o soporte lgico de
un sistema informtico, que comprende el conjunto de los componentes lgicos
necesarios que hacen posible la realizacin de tareas especficas, en
contraposicin a los componentes fsicos que son llamados hardware.
JAVASCRIPT: JavaScript (abreviado comnmente "JS") es un lenguaje de
programacin interpretado, dialecto del estndar ECMAScript. Se define como
orientado a objetos, basado en prototipos, imperativo, dbilmente tipado y
dinmico.
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 interaccin con
la tcnica AJAX a pginas web.
PATRN MVC: El patrn de arquitectura MVC (Modelo Vista Controlador) es un
patrn que define la organizacin independiente del Modelo (Objetos de Negocio),
la Vista (interfaz con el usuario u otro sistema) y el Controlador (controlador del
workflow de la aplicacin).

208

UNIVERSIDAD PRIVADA TELESUP

Fuentes de Informacin
BIBLIOGRFICAS:

SANTOS DOMINGUEZ, Sebastin, Modelo vista controlador, Editorial Barzas


Ao: 2011.

MARQUEZ SNCHEZ, Kelly, Patron MVC. Editorial: Luna S.l. 2010.

MINERA GUERRA, Alejandro, Gua de desarrollo web. Ediciones Centro Web,


2010.

VSQUEZ MATTOS, Cinthia. Java aplicacin. Editorial: Mc Grill Inc, 2009.

ELECTRNICAS:

Java Database Connectivity


http://es.wikipedia.org/wiki/Java_Database_Connectivity

Descripcin del patrn MVC


http://www.desarrolloweb.com/wiki/mvc-modelo-vista-controlador.html

Modelovistacontrolador
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

209

UNIVERSIDAD PRIVADA TELESUP

Solucionario

UNIDAD DE
APRENDIZAJE 1

1. B
2. B
3. A
4. E
5. B
6. A
7. C
8. A
9. C
10. E

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

UNIDAD DE

APRENDIZAJE 3:

APRENDIZAJE 4:

1. B

1. C

2. A

2. A

3. B

3. B

4. D

4. C

5. A

5. E

6. A

6. A

7. A

7. D

8. E

8. D

9. E

9. B

10. B

10. E

210