Professional Documents
Culture Documents
1. Introduccin a Java
1.1 Historia de Java
1.2 Examinando la Tecnologa de Java
1.2.1 Simple
1.2.2 Orientado a Objetos
1.2.3 Distribuido
1.2.4 Interpretado
1.2.5 Robusto
1.2.6 Seguro
1.2.7 De arquitectura neutral
1.2.8 Porttil
1.2.9 Alto rendimiento
1.2.10 Multitarea
1.2.11 Lenguaje Dinmico
2. Comenzar con Java 2 SDK
2.1 Obtener J2SE 1.4
2.2 Los requerimientos mnimos
2.3 Instalacin del J2SE 1.4
2.4 Variables de ambiente
2.5 Prueba de la instalacin
2.6 Tipos de programas en Java
2.7 Estructura de un programa
2.8 Como se crean aplicaciones Java con SDK
2.9 Como se crean applets Java con SDK
3. Elementos Bsicos del Lenguaje
3.1 Comentarios
3.2 Comentarios de javadoc
3.2.1 Un ejemplo de comentarios javadoc
3.3 Palabras reservadas
3.4 Tipos de variables en Java
3.5 Tipos de datos primitivos
3.5.1 Clases wrapper
3.6 Literales
3.7 Secuencias de escape de caracter
3.8 Inicializacin de variables
3.9 Sentencias y expresiones
3.10 Operadores y operandos
3.10.1 Jerarqua de operadores
3.10.2 Operadores aritmticos
3.10.3 Operadores relacionales
3.10.4 Operadores booleanos
3.10.5 Operadores de manipulacin de bits
3.10.6 Operadores de cadena
3.10.7 Operadores de asignacin
3.10.8 Operadores especiales
3.10.9 Modificadores
3.10.9.1 Modificadores de almacenamiento
3.10.9.2 Modificadores de accesibilidad
7. Manejo de excepciones
7.1 Modelo del manejo de excepciones
7.2 Lanzando excepciones try / catch
7.2.1 Ejemplos de try / catch
7.3 La clusula finally
7.3.1 Ejemplos de finally
7.4 Mtodos que lanzan excepciones
7.4.1 Como arrojar excepciones explcitamente
7.4.2 Ejemplos de mtodos que lanzan excepciones
7.5 Creacin de clases de excepcin personalizadas
7.6 Lectura de un volcado de Stack
8. Flujos
8.1 Qu es un Flujo?
8.2 Los flujos estndar
8.2.1 Algunos ejemplos de flujo estndar
8.3 Los flujos que ofrece java.io
8.4 Flujos de bytes
8.5 Gestin de excepciones de entrada / salida
8.6 Flujos de acceso a archivos
8.7 La clase File
8.7.1 Ejemplos de la clase File
8.8 La clase FileOutputStream
8.9 La clase DataOutputStream
8.10 La clase DataInputStream
8.11 Ejemplo de DataInputStream y DataOutputStream
9. Uso de paquetes
9.1 Qu es un paquete?
9.2 Creacin y uso de paquetes ( package / import )
9.3 Paquetes estndar de Java
Construccin de applets
Ciclo de vida de un applet
El tag Applet en HTML
Paso de parmetros a un applet desde HTML
Ejemplos con el mtodo getParameter()
Apndices
o
o
o
o
o
o
o
o
o
o
o
o
o
o
1. Introduccin a Java
El lenguaje de programacin Java es un poderoso y completo lenguaje de programacin
orientado a objetos desarrollado a principios de los aos 90 en Estados Unidos por Sun Soft Inc.,
una subsidiaria de la empresa fabricante de equipo de cmputo denominada Sun Microsystems,
Inc.
Los diseadores de Java tuvieron en mente crear " un lenguaje de programacin sencillo,
orientado a objetos, distribuido, interpretado, robusto, seguro, de arquitectura neutral, porttil,
de gran rendimiento, multitarea y dinmico ".
Java es un conjunto de objetos y herramientas que se utilizan con una sintaxis muy similar a la
del lenguaje C y C++ y que permiten utilizar los mismos cdigos fuente de programacin
distribuyndolos a travs de las redes de cmputo, operando de forma tal que son neutrales o
independientes a las diferentes arquitecturas de computadoras gracias a la implementacin del
concepto de mquina virtual, y que hay una para cada plataformas y sistemas
1.1 Historia de Java
En enero de 1991 la empresa Sun Microsystems comenz un proyecto con el nombre de Green.
El prposito del proyecto Green era descubrir un modo de controlar consolas de televisin, esas
cajas para acceder a la televisin por cable. Como el hardware de los dispositivos para el
consumidor siempre estaba cambiando, James Gosling, el "padre" de Java, pens que C++ no
era lo ms apropiado para dicho trabajo. Como resultado, se cre el lenguaje llamado Oak en
honor a un roble que se vea desde la ventana de su oficina. Este lenguaje era menos suceptible
a errores y no bloqueaba todo el sistema. Se ejecutaba inicialmente en un dispositivo de
tecnologa Hammer llamado *7 (star 7). Haciendo piruetas por toda la pantalla tctil estaba ese
pequeo personaje digital llamado Duke, un asistente que poda aparecer y realizar varias tareas
y que ms tarde se convertira en la mascota de Java.
Oak se us para solicitar un proyecto sobre un sistema operativo para consolas de televisn. La
solicitud no prosper y Sun rechaz una oferta de compra de Trip Hawkins ( que era el jefe
oficial ejecutivo de Gamemaker / 3DO), de modo que Sun tena ese desecho y no saba que
hacer con l. Por suerte, la revolucin de Internet haba comenzado con el lanzamiento de
Mosaic, el predecesor del navegador Web Netscape Navigator. En 1994 se le busca una nueva
utilidad a Oak para la Web y se crea el navegador llamado WebRunner ( anteriormente
renombrado HotJava) para exhibir la reciente tecnologa de lo que terminara convirtindose en
Java.
Por cierto , Oak se le cambio el nombre a Java , porque ya exista un lenguaje de programacin
denominado Oak, entonces , en una junta de emergencia donde se tenia que decidir un nuevo
nombre, y en esa junta estaban tomando caf - en algunas partes de EUA se denomina Java a
un caf de buena calidad - , entonces James Gosling y sus colegas decidieron darle ese nombre.
Para hacer pblico el lenguaje, en la conferencia SunWorld, John Gage de Sun y Marc Andreesen
de Nescape presentaron Java al mundo. Nestcape se comprometi a incorporar Java en la
siguiente versin de su navegador y al final del ao empresas como IBM, Oracle, Borland, Adobe,
Macromedia, Lotus, Spyglass e Intuit haban incorporando Java a sus productos. Incluso
Microsoft autoriz Java, comprometindose a incorporar Java a sus productos, sistemas
operativos y herramientas de desarrollo.
La versin original de Java era tan pequea que caba en un disquete. El intrprete del ncleo
tena casi 100 Kb. La biblioteca matemtica sumaba otros 20 Kb. El cdigo para la integracin
con bibliotecas C eran otros 50 Kb. La mayora de las bibliotecas de clase caban en 375 Kb,
dejando slo las bibliotecas de grficos especficas de plataforma que variaban en tamao. En
conjunto Java solamente tena alrrededor de 1 Mb de ROM y 1 Mb de RAM.
1.2.1 Simple
Java es simple porque elimina la complejidad de los lenguajes de programacin como el C y el
C++.
Java incorpora nuevas caractersticas como un recolector automtico de elementos no
utilizados y elimina aspectos confusos y poco utilizados del C++ como la sobrecarga de
operadores. Tambin por supuesto, elimina el manejo difcil y complejo de los apuntadores y su
aritmtica de apuntadores.
Incorpora un conjunto de caractersticas ya utilizadas en la historia de los lenguajes de
programacin como son:
Las clases que vienen de C++ y SmallTalk pero limitadas a herencia simple.
1.2.3 Distribuido
Java es distribuido porque adems de que puede acceder a objetos distribuidos en distintas
computadoras u equipos mediante protocolos estndar basados en TCP/IP como HTTP, con las
ltimas versiones de Java, se pueden invocar mtodos en un equipo remoto tan fcil e
invisiblemente como podra hacerse en su mismo equipo o espacio de ejecucin mediante
protocolos comunes como CORBA (que es una arquitectura intermediaria para solicitar objetos
comunes) y RMI (que son invocaciones a mtodos remotos), adems de los recin incorporados
servicios Web.
1.2.5 Robusto
La robustez es la fiabilidad de un programa. Java es fiable o robusto porque incorpora las
siguientes caractersticas:
Es un lenguaje "tipeado" o basado en tipos. El compilador y cargador de clases aseguran la
correccin de todas las llamadas de mtodo, lo que evita las diferencias implcitas entre tipos y
las incompatibilidades entre versiones.
No tiene apuntadores o punteros. En Java hay referencias en lugar de apuntadores, y no se
pueden mover una referencia para manipular directamente espacios de memoria. Esto evita que
la memoria se corrompe accidentalmente , como por ejemplo pasarse el final de una pila, etc.
Java tiene un colector automtico de basura (garbage collector). Los programadores pueden
olvidarse de liberar memoria y con Java ya no tienen que preocuparse por decidir las partes de
memoria que deben liberarse ya que el colector lo hace automticamente.
En Java se fomenta el uso de interfaces en lugar de clases. Las interfaces definen un conjunto de
comportamientos (mtodos). En lugar de pasar clases, se pasan interfaces, ocultando as las
implementaciones. Si la implementacin cambia como sucede a menudo, y no se tiene la nueva
clase que implementa la vieja interfaz, todo lo dems funcionar perfectamente.
1.2.6 Seguro
El sistema de Java tiene ciertas polticas que evitan se puedan codificar virus con este lenguaje.
Existen muchas restricciones, especialmente para los applets, que limitan lo que se puede y no
puede hacer con los recursos crticos de una computadora y poner los sistemas en riesgo.
Java no permite el manejo de apuntadores, y evita que un programa malicioso corrompa los
espacios de memoria.
En cuanto a la ejecucin de programas Java integra funciones de seguridad: el verificador de
cdigo de bit, el cargador de clases y el gestor de seguridad. Esto garantiza que el cdigo no
seguro realice operaciones seguras, como leer el disco duro. Otro aspecto de la seguridad
recientemente incorporado a Java tiene que ver con la autentificacin, autorizacin y encriptacin
para proteger la privacidad y asegurar la integridad de los datos.
10
Podra pensarse que los programas que hacen uso de ellas ya no funcionaran, pero no es as.
Los primeros cdigos de bytes de plataforma neutral seguirn funcionando despus de que
aparezcan nuevas bibliotecas, ya sea porque Sun presente una nueva versin de Java o porque
alguna otra compaa cree alguna biblioteca.
Mientras las partes de la biblioteca empleadas no desaparezcan, los programas seguirn
funcionando, incluso aunque se agreguen nuevos elementos a las bibliotecas. Adems gracias a
la preferencia de Java por las interfaces sobre las clases, como se mencion en la caracterstica
de robustez.
2. Comenzar con Java 2 SDK
Objetivo: El participante obtendr el software gratuito (freeware) Java 2 SDK, SE del sitio
de Sunsoft , transferir los archivos necesarios, los instalar y comprobar su instalacin
ejecutando un pequeo programa de Java. Conocer que en el lenguaje de programacin
con Java existen varios tipos de programas, su estructura y su creacin con las herramientas
SDK.
2.1 Obtener J2SE 1.4
Cmo obtener el Java SDK (SoftwareDevelopment Kit ) de la distribucin J2SE (
Java 2 Standar Edition)?
Aqu vamos a ver como podemos obtener el software de las herramientas de desarrollo de Java,
siguiendo unos pasos sencillos. La versin 1.4.X_XX de SDK (Kit de Desarrollo de Java) esta
disponible actualmente para las siguientes plataformas:
Windows
Linux
Solaris
Descargue el SDK para stas plataformas del sitio Web de Sun, en la siguiente direccin
http://java.sun.com
En esta otra direccin podrs bajarte la ltima versin del SDK:
http://java.sun.com/j2se/1.4.1/download.html
Elegir la versin ms actual del SDK 1.4.X_XX. Peridicamente, Sun publica reparaciones de
fallas que agregan un nuevo dgito al nmero, como cuando a Java 1.1 le sigue 1.1.1, 1.1.2,
1.2.0, 1.3.0, 1.4.0, 1.4.1_01, etctera. Obtener la versin ms reciente del SDK 1.4.1 disponible
para su plataforma.
2.2 Los requerimientos mnimos del J2SE1.4.1
Un microprocesador de 166 Mhz o mas rpido con por lo menos 32 megabytes de memoria RAM
que es requerida para ejecutar las aplicaciones basadas en grficos. Cuarenta y ocho megabytes
de RAM para ejecutar los applets dentro de un navegador usando el producto plug-in de Java.
Ejecutarlo con menos memoria puede causar swapping de disco lo cual afecta severamente el
desempeo. Programas muy grandes pueden requerir mas RAM para un desempeo adecuado.
Se recomienda tener 120 megabytes de espacio libre en disco antes de intentar instalar el
software de Java 2 SDK.
El SDK es un conjunto de herramientas y utileras que en resumen son:
11
ParaInstalar el Java 2 SDK en Windows haga doble clic en el archivo de instalacino usar el
comando Start | Run (Inicio | Ejecutar) del men de inicio de Windowspara encontrar y ejecutar
el archivo. Esimportante que instale todo el SDK ,tanto programas como documentacin desdela
12
carpeta ( directorio ) raz , C:\ u otra unidad como la D:\ o laE:\ . Al terminar lainstalacin el
rbol de carpetas y subcarpetas se ver similar a lo siguiente(ver figura 1)
Enel cuadro de dilogo que le pregunta si desea instalar el SDK, SE 1.4.1_02, sedespliega el
Asistente de configuracindel SDK (ver figura 2) .
Elasistente instalar tres componentes del SDK:
Archivos de programa Son losprogramas ejecutables necesarios para crear, compilar y verificar
el funcionamiento de sus proyectos deJava.
Archivosde biblioteca y encabezados Archivos usados nicamente por los programadoresque
hacen llamadas a cdigo nativo desde programas de Java.
Archivos de demostracin Son programasde Java 2, con versiones que puedeejecutar y
archivos fuente que puede examinar para aprender ms acerca dellenguaje.
Bibliotecas de clases o API's (Application Program Interface) .Que son las librerias de clases
llamadas paquetes creadas por losdesarrolladores del software de Java de la empresa Sun
Despusde haber instalado SDK, notar que hay varios archivos instalados en elsubdirectorio
\J2SDK141\lib la mayora conextensin.jar. Aunqueson archivos .jar, no debe descomprimirlos.
El SDK puede leer los archivos .jar en su formato de archivo eneste directorio.
Tu puedes escoger la unidad destino donde seva a instalar el software de Java 2 SDK SE
dndole clic al botn Browse... Eneste caso se seleccion la unidad E: y tambin puedes
cambiarle el nombre a lacarpeta destino, en lugar de poner el nombre que propone el instalador
que es; j2sdk1.4.1_02 le puedes poner otro, por ejemplo yo le puse j2sdk141 y es poreso que
en la figura 1 el rbol de carpetas y subcarpetas de la unidad E: muestra que el directorio para la
variable de ambienteJAVA_HOMEes E:\J2SDK141
13
14
notas, y modificarlas variables PATH y CLASSPATH como se explico antes y hay que inicializar
denuevo el sistema para que el sistema operativo de los valores nuevos a dichasvariables.
Para establecer las variables de ambiente PATH YCLASSPATH Microsoft Windows NT, 2000, y
XP
Hay que seguir los pasos siguientes (En windows XP puedevariar un poco pero son en esencia los
mismos pasos) :
Inicio->Configuracin ->Panel deControl ->Sistema ->Ventana de "Propiedades del Sistema";
ficha opestaa "Avanzado"; botn "Variables de entorno" ->Ventana de "Variables deentorno".
En la ventana Variables de entorno seencuentran las variables de usuario en la parte superior,
pulsando el botn"Nueva" aparece un cuadro de dialogo donde se debe introducir elNombre de
lavariabley elValor de la Variable
2.5Pruebade la instalacin.
Losusuarios de Windows pueden verificar su instalacin del SDK al usar el comandode MS-DOS
en la mayora de los sistemas. El indicador de MS-DOS tambin se le conoce como el indicador
de comandosdebido a que lo puede usar para escribir comandos que ejecuta el sistemaoperativo.
Escribalo siguiente en un indicador de comandos para verificar que su sistema puedaencontrar la
versin correcta del SDK en l:
Javaversion
B) Si est usando elSDK 1.4.1_02, en respuesta ud. debera ver el siguiente mensaje:
15
B)Cree una carpeta que se llame C:\j21curso. En ella guarde el archivo delprograma con el
nombre deHola.java. Es importante que el programa se llameexactamente igual al nombre de
la clase para que pueda compilarse, de locontrario habr un error. Cuando guardeel archivo
utilice comillas antes y despus del nombre para evitar que elprograma guarde el archivo con
su extensin .TXT, tal y como se ve en la (figura 4 ).
Siel compilador del SDK no despliega ningn mensaje de error quiere decir que secompilo con
xito. Esto quiere decirque se crear un archivoHola.classen el mismo directorio que
contieneHola.java.
16
Estearchivo .class es el cdigo de bytes ( byte code ) que puede ser ejecutado por la
mquinavirtual
C)Una vez que tenga un archivo .class, lo puede ejecutar mediante el intrprete decdigo de
bytes. EjecuteHola.classescribiendo lo suguiente:
JavaHola
La( figura 6) muestra la salida apropiada de la aplicacinHola junto con los comandos MS-DOS
que seutilizaron para llegar a ese punto.
Findel ejercicio.
2.6 Tipos de programas en Java
En Java se tienen varios tipos deprogramas que se caracterizan por la forma y lugar en que se
ejecutan. Hastaahora se distinguen:
a)
aplicaciones deconsola
b)
applets
c)
servlets
d)
beans
17
javadoc
paquete al que
pertenece esta
package utilerias.deoscar;
clase
Nombre de la
clase
/*
Comentarios
*/
Constructores
18
Mtodos accesorios y
Mtodos mutadores
o modificadores
( interface pblica )
mtodos de
implementacin
privada
fin de la clase
19
20
Figura. Cmo secran applets Java con SDK ( Software Development Kit )
21
Los de varias lneas al estilo del lenguaje C, los cuales estn entre diagonal y asterisco /* y
asterisco seguido de diagonal, */ . Todo lo que este dentro es considerado un comentario.
ejemplo:
/* Esto es un conjunto de
datos que informa al programador
para que puso tal o cual cosa */
En Java pueden anidarse estos comentarios /* */ pero el primer */ finalizar ambos
comentarios, lo que har que el resto del comentario que quede fuera sea tratado como cdigo
por el compilador.
Descripcin
@autor nombre
@deprecated texto
@exception
texto de la
@throws texto de la excepcin
excepcin
@return texto
@see referencia
@since texto
@serial
texto
@serialField texto con nombre de tipo
@serialData texto
@version texto
22
23
24
double
else
extends
final
finally
float
for
goto *
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
trasient *
try
void
volatile
while
Variables de Instancia.
Variables de una clase.
25
Clase
entero
entero
entero
entero
real
real
caracter
booleano
Tamao
8-bit
16-biy
32-bit
64-bit
32-bit
64-bit
16-bit (Cdigo Unicode)
1-bit
Java define adems otros tipos que no estn en la anterior clasificacin, estos tipos son
instancias de alguna clase en particular, ya sea de una clase que haya creado el programador o
una clase ya existente dentro de las bibliotecas API de Java.
El mbito de los valores de las variables de instancia se limita como su nombre lo indica a la
instancia misma.
En las variables de clase sus valores son para todas las instancias de la clase misma, esto es, su
valor es compartido por todas las instancias de la clase y su almacenamiento debe ser esttico y
se especifica con la palabra reservada static , si ud. programador de C , son parecidas a las
variables globales.
Por ultimo las variables locales a mtodos sus valores se circunscriben al mbito del mtodo al
que pertenecen.
El siguiente ejemplo muestra la diferencia entre las variables de clase, de instancia y locales
mtodos:
Si quieres obtener el cdigo clic con el botn derecho aqu Variables.zip
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: Variables.java
* Clase Variables: su propsito es ensearte
* el uso de las variables en Java
*/
19.
26
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: UsaVariables.java
* Clase UsoVariables: su propsito es ensearte
* el uso de las variables en Java
*/
class UsaVariables {
Variables x = new Variables();
Variables y = new Variables();
public static void main ( String args[] ) {
UsaVariables u = new UsaVariables();
escribeVar( u.x ,"x" ); escribeVar( u.y , "y" );
u.y.clase = 123;
u.x.instancia = 321; u.y.instancia = 567;
escribeVar( u.x ,"x" ); escribeVar( u.y , "y" );
System.out.println("Fin del programa");
}
static void escribeVar(Variables ejem, String id) {
System.out.print("Valor de las variables\n" +
id + ".clase = " + ejem.clase + "\n" +
id + ".instancia = " + ejem.instancia + "\n" +
id + ".local = " + ejem.metodoVar() + "\n" +
"=============================\n");
}
}
27
Podemos ver que en el listado del programa Variables.java tenemos definida en la lnea 12 una
variable de clase ( observe el uso de la palabra reservada static ) , en la lnea 13 una de
instancia y una local al mtodo en la lnea 16. Todas son de tipo int .
u.y.clase = 123;
En la lnea 19, se modifican los valores de las variables de instancia para x ( 321 ) y para y ( 567
), lo cual solo afecta respectivamente a esas variables de instancia
19.
Luego en la lnea 20, al volver a invocar al mtodo escribeVar() la salida ejemplifica la afectacin
de los valores de las variables tanto de clase , ambas con valor de 123 y las de instancia y con
123 y x con 321.
=============================
Valor de las variables
x.clase = 123
x.instancia = 321
x.local = 6
=============================
Valor de las variables
y.clase = 123
y.instancia = 567
y.local = 6
=============================
Fin del programa
La variable local sigue con su valor de 6 porque no se ve afectada con los cambios efectuados
debido a que su mbito esta dentro del mtodo al que pertenece.
3.5 Tipos de datos primitivos
28
Los tipos primitivos tienen un tratamiento especial porque son usados frecuentemente adems
porque la razn es que crear un objeto con new especialmente uno chico como una simple
variable no es muy eficiente porque new aloja objetos en el heap.
Para stos tipos Java hace lo mismo que C y C++ en lugar de crear la variable usando new una
variable automtica es creada la cual no es una referencia. La variable aloja el valor por si
mismo y lo coloca en el stack que es mucho ms eficiente.
Java determina el tamao de cada tipo primitivo. Estos tamaos no cambian de una arquitectura
de mquina a otra como en la mayora de los lenguajes. Esto es la razn por la cual los
programas en Java son muy portables. La siguiente tabla muestra esos tamaos que no
cambian:
Tipo
Tamao/Formato
(Nmeros enteros)
byte
8-bit complemento a 2
short
16-bit complemento a 2
int
32-bit complemento a 2
long
64-bit complemento a 2
(Nmeros reales)
float
32-bit IEEE 754
double 64-bit IEEE 754
(otros tipos)
char
16-bit Caracter
boolean true o false
Descripcin
Entero de un Byte
Entero corto
Entero
Entero largo
Coma flotante de precisin simple
Coma flotante de precisin doble
Un slo carcter
Un valor booleano (verdadero o falso)
La mayora de los tipos primitivos tienen clases Wrapper. Significa que un objeto no primitivo
en el heap puede ser creado para representar uno primitivo en el heap. Ejemplo:
char
c
Character C = new Character(c);
x;
29
En la siguiente tabla se muestra un resumen de los mtodos disponibles en las clases wraper
para las conversiones de tipo:
Conversiones
Operacin
Sintaxis
bolean to String
String s = Short.toString(theShort);
String s = Integer.toString(theNumber);
String s = Integer.toString(theNumber, base);
int to String
long to String
float to String
double to String
String to boolean
String to byte
String to short
String to int
String s = Integer.toBinaryString(theNumber);
String s = Intefer.toOctalString(theNumber);
String s = Integer.toHexString(theNumber);
String s = String.valueOf(theNumber), Strin s = ""+
theNumber;
String s = Long.toString(theLong);
String s = Long.toString(theLong , base);
String s = Long.toBinaryString(theLong);
String s = Long.toOctalString(theLong);
String s = Long.toHexString(theLong);
String s = String.valueOf(theLong);
String s = "" + theLong.
String s = Float.toString(theFloat);
String s = String.valueOf(theFloat);
String s = * theFloat;
String s = Double.toString(theDouble):
String s = "" + TheDouble.
booelan b= Boolean.getBoolean(theString);
byte b = Byte.parseByte(theString);
byte b = Byte.parseByte(theString , base);
short s = Short.parseShort(theString);
short s = Short.parseShort(theString , base);
int = Integer.parseInt(theString);
30
String to float
String to double
double d = Double.parseDouble(theString)
String to long
String to char
los
siguientes
programas
solo
haz
cliccon
/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 3 marzo 2004
* Archivo: TextRadix.java
* Clase TextRadix: su propsito es ensearte
* el uso de las clases wrapper en Java, en particular
* el uso de los mtodos de la clase Integer para
* la conversin entre bases numricas.
*/
public class TestRadix
{ public static void main(String[] args)
{ int n = 59;
System.out.println("Decimal:\t" + Integer.toString(n));
System.out.println("Binary: \t" + Integer.toBinaryString(n));
System.out.println("Octal: \t" + Integer.toOctalString(n));
System.out.println("Hexadecimal:\t" + Integer.toHexString(n));
System.out.println("Ternary:\t" + Integer.toString(n,3));
System.out.println("Dodecimal:\t" + Integer.toString(n,12));
System.out.println("Bigesimal:\t" + Integer.toString(n,20));
System.out.println("Character.MIN_RADIX = "
+ Character.MIN_RADIX);
System.out.println("Character.MAX_RADIX = "
+ Character.MAX_RADIX);
n = Integer.parseInt("d7b",16);
System.out.println("d7b (base 16) = " + n);
}
}
/* La salida es:
java TestRadix
Decimal: 59
Binary:
111011
Octal:
73
Hexadecimal:
3b
Ternary: 2012
Dodecimal:
4b
31
Bigesimal: 2j
Character.MIN_RADIX = 2
Character.MAX_RADIX = 36
d7b (base 16) = 3451
*/
En este segundo ejemplo se muestra el uso de los mtodos de la clase Integer como
toString(), parseInt(), decode(), etc., para conversin entre tipo primitivo int , y entre
objetos de la clase String e Integer.
public class TestInteger
{ public static void main(String[] args)
{ int n = 66;
System.out.println("int n = " + n);
Integer x = new Integer(n); // convierte int a Integer
System.out.println("Integer x = " + x);
String s = x.toString(); // convierte Integer a String
System.out.println("String s = " + s);
n = Integer.parseInt(s); // convierte String a int
System.out.println("int n = " + n);
s = Integer.toString(n); // convierte int a String
System.out.println("String s = " + s);
x = Integer.decode(s); // convierte String a Integer
System.out.println("Integer x = " + x);
n = x.intValue(); // convierte Integer a int
System.out.println("int n = " + n);
System.out.println("Integer.MIN_VALUE = "
+ Integer.MIN_VALUE);
System.out.println("Integer.MAX_VALUE = "
+ Integer.MAX_VALUE);
}
}
/* La salida es:
java TestInteger
int n = 66
Integer x = 66
String s = 66
int n = 66
String s = 66
Integer x = 66
int n = 66
Integer.MIN_VALUE = -2147483648
Integer.MAX_VALUE = 2147483647
*/
3.6 Literales
En Java hay una forma de especificar un valor determinado a una variable o constante, mediante
una literal, que es una expresin constante utilizada para expresar un valor. Cada tipo de dato
tiene su propio formato para especificar una literal, como se describe en la siguiente tabla:
Notaciones literales
Tipo
Formato
32
int
long
float
Aade f o F al final del trmino literal double y sustituye a d/D en caso de existir por
ejemplo: 3.14f , 3.14E+15F
double
Notacin cientfica como en 1.345e+10, donde el exponente puede expresarse con una e o
una E; puede encontrarse una d o D al final del elemento literal double
char
Un nico caracter o secuencia de escape entre comillas sencillas, por ejemplo: 'X', 'r'.
String
boolean
verdadero, falso
Null
nulo
Significado
\n
nueva lnea
\t
tabulador
\b
espacio en blanco
\r
retorno de carro
\f
formfeed
\\
\'
comilla simple
\"
comillas
\ddd
\xdd
\udddd
33
Cuando las variables son referencias a un objeto y no son instanciadas, se garantiza que su valor
tendr un valor constante Null ( nulo ).
Veamos el siguiente ejemplo:
Si quieres obtener el cdigo clic con el botn derecho aqu IniciaVariables.zip
/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: Miembros.java
* Clase Miembros: su propsito es ensearte
* el uso de las variables en Java, en particular
* con que valores son inicializadas por el
* compilador de Java. En esta clase se definen las
* variables que van a ser utilizadas por el programa
* IniciaVariables.java
*/
class Miembros {
boolean b;
char c;
byte bt;
short sh;
int i;
long l;
float f;
double d;
String s;
}
/**
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha: 2 marzo 2004
* Archivo: IniciaVariables.java
* Clase IniciaVariables: su propsito es ensearte
34
Se observa que las variables primitivas y las referencias a objetos tienen los valores iniciales
garantizados mencionados anteriormente.
35
final
String
CIC
=
new
Todo depende del estilo del programador y el compilador lo dejar pasar y tratar la(s) lnea(s)
como una sola sentencia.
Operadores aritmticos
Operadores relacionales
Operadores lgicos
Operadores de bits
Operadores de asignacin
Un operador es generalmente una relacin que hay entre uno , dos o ms operandos.
Un operando es una expresin, una variable, una constante, una literal, o un mtodo que
devuelva algn valor. Con los operadores y operandos formamos expresiones, y una expresin
es una frmula construida con combinaciones de constantes, variables, operadores, operandos
y nombres de mtodos .
Cada expresin al evaluarse toma un valor que se determina tomando en cuenta los tipos de las
variables y constantes implicadas adems de la ejecucin de las operaciones indicadas por los
operadores
(a+b)
36
expr++
Pos-incremento
a++
expr--
Pos-decremento
a--
++expr
Pre-incremento
++a
--expr
Pre-decremento
--a
+expr
Unitario mas
+a
-expr
Negacin
-a
Cortesa
~a
NOT
!a
new
Creacin
(parn)exp
Casta
r
4
8
9
10
11
new Clasname()
Creacin
(Classname)a
Forma
Multiplicacin
a*b
Divisin
a/b
Modulo
a%b
Adicin
a+b
Substraccin
a-b
<<
Desplazamiento a la izquierda
a<<b
>>
Desplazamiento a la derecha
Desplazamiento con relleno de
ceros a la derecha
a>>b
<<<
Unitario
Multiplicador
Aditivo
Desplazamiento
a<<<b
<
Menor que
a<b
>
Mayor que
a>b
<=
a<=b
>=
a>=b
instanceof
Classname
==
Igual
a==b
!=
No igual
a!=b
&
a&b
a^b
a|b
Relacional
Igualdad
AND bit a bit
XOR exclusivo bit
a bit
OR inclusivo bit a
bit
12
&&
AND lgico
a&&b
AND lgico
13
||
OR lgico
a||b
OR lgico
?:
a?b:c
Condicional
Asignacin simple
a=b
Asignacin
14
15
*=
Multiplicar y asignar
a*=b
37
/=
Dividir y asignar
a/=b
%=
Mdulo y asignar
a%=b
+=
Sumar y asignar
a+=b
-=
Substraer y asignar
a-=b
&=
AND y asignar
a&=b
|=
OR y asignar
a|=b
^=
XOR y asignar
a^=b
<<=
a<<=b
>>=
a>>=b
>>>=
a>>>=b
EjemplosOperadores.zip
/**
* Programa de Java que te ensea a utilizar los operadores
* aritmticos. Observa que la clase pertence al paquete
* operadores.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
38
* Archivo: OpAritmeticos.java
*/
package operadores;
public class OpAritmeticos {
double x,y;
public OpAritmeticos (double x, double y) {
this.x = x;
this.y = y;
}
public String opera1() {
String s = " x + y =" + (x + y) + "\n";
s += " x - y =" + (x - y) + "\n";
s += " x * y =" + (x * y) + "\n";
s += " x / y =" + (x / y) + "\n";
s += " +x =" + (+x) + "\n";
s += " -x =" + (-x) + "\n";
return s;
} // fin de opera1()
public void opera2() {
double x1, x2;
x1 = x;
x2 = x;
System.out.println("Valores iniciales de x1 y x2 son:\n" +
"x1 = "+ x1 + " x2 = " + x2);
System.out.println("Operadores aritmeticos de preincremento y posincremento
\n\n");
for ( int i=1; i <= 10; i++ )
System.out.println(" i = " + i +
" ++x1 = " + (++x1) +
" x2++ = " + (x2++) );
}// fin de opera2()
public void opera3() {
double y1, y2;
y1 = y;
y2 = y;
System.out.println("Valores iniciales de y1 y y2 son:\n" +
"y1 = "+ y1 + " y2 = " + y2);
System.out.println("Operadores aritmeticos de predecremento y posdecremento
\n\n");
for ( int i=1; i <= 10; i++ )
System.out.println(" i = " + i +
" --y1 = " + (--y1) +
" y2-- = " + (y2--) );
} // fin de opera3()
} // fin de la clase OpAritmeticos
/**
* Programa de Java que te ensea a utilizar los operadores
* aritmticos. Observa que la clase pertence al paquete
* estandar, y hace uso de la clase OpAritmeticos que se
* encuentra en la clase operadores.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
39
* Archivo: UsaOperadoresAritmeticos.java
*/
import operadores.OpAritmeticos;
class UsaOperadoresAritmeticos {
OpAritmeticos op = new OpAritmeticos( 10 , 20);
public static void main ( String[] args ) {
UsaOperadores usa = new UsaOperadores();
System.out.println(" Ejemplo de operadores \n" +
" Operadores arimeticos \n" +
usa.op.opera1() );
usa.op.opera2();
usa.op.opera3();
System.out.println("\n\n Fin del programa ");
} // fin del main()
}// fin de la clase UsaOperadoresAritmeticos
=
=
=
=
=
=
=
=
=
=
40
Uso
op1 > op2
op1 >= op2
op1 < op2
op1 <= op2
op1 == op2
op1 != op2
Devuelve verdadero si
op1 es mayor que op2
op1 es mayor o igual op2
op1 es menor que op2
op1 es menor o igual que op2
op1 y op2 son iguales
op1 y op2 no son iguales
Al igual que los operadores relacionales, el resultado de emplear estos operadores es un valor de
tipo lgico; true o false, que son literales constantes para los tipos de datos boolean, y es por
esto que tambin se le conocen como operadores lgicos.
Operador
&&
||
!
Uso
op1 && op2
op1 op2
op
Devuelve verdadero si
op1 y op2 son ambos verdaderos
op1 o op2 son true
op es falso
Uso
op1 >> op2
<<
>>>
&
|
^
~
Descripcin
Desplaza bits de op1
segn op2
Desplaza bits de op1
segn op2
Desplaza bits de op1
segn op2 (sin signo)
And a nivel de bits
Or a nivel de bits
Xor a nivel de bits
Complemento a nivel de
a la derecha
a la izquierda
a la derecha
bits
41
La asignacin es una operacin que tiene como efecto dar valores a una variable:
V=E
Donde V denota una variable y E una expresin, y se lee V se hace E, o hacer V igual a E o a V se le asigna
E. Hay que recordar que esto no es una igualdad relacional, ya que el operador de asignacin ( = ) no
tiene nada que ver con el operador ( == ). Es posible en Java al igual que en C y C++ las hacer las
"combinaciones taquigrficas" para realizar una operacin como por ejemplo la suma y la asignacin con
un solo operador ( += ). La siguiente tabla muestra estas combinaciones:
Operador
+=
-=
*=
/=
%=
&=
|=
^=
<<=
>>=
>>>=
Uso
op1 += op2
op1 -= op2
op1 *= op2
op1 /= op2
op1 %= op2
op1 &= op2
op1 = op2
op1 ^= op2
op1 <<= op2
op1 >>= op2
op1 >>>= op2
Descripcin
op1 = op1 + op2
op1 = op1 op2
op1 = op1 * op2
op1 = op1 / op2
op1 = op1 % op2
op1 = op1 & op2
op1 = op1 op2
op1 = op1 ^ op2
op1 = op1 << op2
op1 = op1 >> op2
op1 = op1 >>> op2
42
Hay algunos operadores especiales que son utilizados para convertir, crear o comprobar.
Para convertir tipos de datos
Hay que recordar que Java es un lenguaje fuertemente tipeado (no se pueden operar datos de
distinto tipo). En caso de operaciones donde as se requiera, existe la posibilidad de realizar una
conversin explcita de tipo (cast de C). De esta forma se convierte el contenido de una variable
(de un determinado tipo) al tipo que se exprese entre parntesis. Un ejemplo podra ser:
int a; long b; a = (int) b;
En las operaciones de asignacin cuando queremos hacer alguna conversin de tipo hay que
hacerlo de manera explcita, no funciona como en lenguaje C que hay conversiones implcitas.
Para crear objetos
La asignacin de objetos incluye el operador new, el cual es usado para invocar al constructor
de la clase del objeto que se quiere instanciar, ejemplo:
int num = 123;
Long unodostres = new Long ( num );
Para comprobar
El operador instanceof se utiliza para probar la clase de un objeto, ejemplo;
boolean burro;
Persona p;
Estudiante pepito; // Estudiante es una subclase de Persona
p = new Persona();
pepito = new Estudiante();
burro = p instanceof Persona; // p ser true
burro = p instanceof String;
// p ser false
Clases
Clases
de
miembro
Mtodo de
miembro
Variables de
miembro
Variables
locales
43
abstract
final
native
private
protected
public
static
strictfp
synchronized
transient
volatile
El modificador abstract
Cuando se aplica a una clase, el modificador abstract indica que la clase no se ha implementado
por completo y no se debe instanciar, esto es, puede haber un mtodo implementado y otros
no. Si se pone abstract a la declaracin de mtodo de un miembro, indicar que este se
implementar dentro de una subclase ( si no lo hace el compilador de Java se lo recordar ).
Como un mtodo abstracto no tiene ninguna implementacin, no se podr instanciar la clase,
por lo que se tendr que declarar esa clase como abstracta. Por defecto, las interfaces son
abstract.
El modificador static
Generalmente, cada instancia de una clase tiene su propia copia de cualquier variable de los
miembros. Tambin se puede designar una de esas variables a la propia clase,
independientemente de los objetos que posea. A este tipo de variables se las conoce como
miembros estticos y su declaracin se efectuar con el modificador static. Este tipo de
variables se suelen utilizar para registrar informacin sobre los distintas instancias de una clase.
La clase que se muestra a continuacin registra el nmero de instancias que utiliza de una
misma clase a travs de una variable esttica llamada cuentaInstancias;
public class MiClass {
pulic static int cuentaInstancias;
public MiClass ( ) {
// cada vez que se invoca al constructor,
// se aumenta una unidad al contador
cuentaInstancias++;
}
static {
cuentaInstancias = 0;
}
}
44
Obsrvese que para iniciar la variable esttica se ha utilizado un iniciador esttico. Los mtodos
tambin se pueden declarar como estticos. Por ejemplo, cuentaReset() es un mtodo esttico
que puede reiniciar la variable cuentaInstancias de MiClass.
public class Miclass {
public static int cuentaInstancias;
public MiClass ( ) {
// cada vez que se invoca al constructor,
// se aumenta una unidad al contador
cuentaInstancias++;
}
public static void cuentaReset( ) {
cuentaInstancias = 0;
}
static {
instanceCount = 0;
}
}
Al mtodo cuentaReset() se le puede invocar a travs de la clase MiClass o de uno de sus
instancias o ejemplares:
m = new MiClass ( ); // cuentaInstancia ser igual a 1 despus de la llamada
// del constructor
n = new MiClass ( ); // cuentaInstancia ser igual a 2 despus de la llamada
// del constructor
System.out.println(""+ MiClass.cuentaInstancias + " instancias han sido creadas);
m.cuentaReset ();
//reinicia el contador
MiClass.cuentaReset( ); // otra forma de reiniciar el contador
La clase System, que se encuentra dentro del paquete java.lang de la interfaz API, define sus
propios mtodos pblicos y variables como static. El acceso a la variables y funciones se
efecta a travs de la propia clase System. De hecho, su constructor es privado por lo que no
se podr crear ningn objeto System con el cdigo usual.
System MiSystem = new System( ); // esto es illegal
En vez de eso, para acceder a las variables y funciones de la clase System, se utiliza la propia
clase.
Recuerde uno de los ejemplos anteriores donde imprimamos informacin en la consola utilizando
el siguiente cdigo:
System.out.printin("Hola bienvenido a tu curso bsico de Java");
La variable out es esttica del tipo PrintStream. Se define en la propia interfaz de la siguiente
manera:
public final static PrintStream out;
Como la clase System define sus propias funciones como static, podemos llamar al mtodo
currentTimeMillis() para obtener el tiempo actual a travs de la siguiente expresin:
long timeNow = System.currentTimeMillis();
45
46
El modificador final
La mayora de los lenguajes de programacin tienen una forma de declarar una variable como
constantes (es decir, que no cambia), y es algo que tambin se cumple en Java. La palabra
reservada final indica que la variable local o del miembro no se puede modificar. Se suele
utilizar con las constantes simblicas. Puede hacer referencia a una constante por su nombre y
definir ese nombre en una nica localizacin de su cdigo. Si posteriormente necesita modificar
el valor en su cdigo, slo debe realizar el cambio en el punto donde defini la variable final.
Si se declara una variable como final, se tendr que reiniciar al mismo tiempo:
final int MAXIMO = 223;
o inicializarla con una asignacin que nunca cambiar:
final int MAXIMO;
MAXIMO = 223;
Por ejemplo, con variables de instancia, puede inicializar variables de instancia finales en cada
constructor.
Las funciones y clases de un miembro tambin se pueden declarar como finales. Un mtodo de
miembro final no se podr anular y una clase final no podr ser una subclase.
El modificador Strictfp
El modificador Strictfp se usa con clases y con mtodos. Si especificamos una clase como
Strictfp, indicar que todos los mtodos son Strictfp, donde "fp" significa punto flotante. Si
especificamos que un mtodo es Strictfp, todas las expresiones de ese mtodo deben seguir la
especificacin de punto flotante IEEE 754. Cuando un mtodo no es estricto, el sistema de
tiempo de ejecucin puede ser ms agresivo optimizando las operaciones de punto flotante,
buscando velocidad por encima de la predicibilidad.
Acceso
Cuando
por
no
se
omisin:
especifica
47
protected: Un miembro con el modificador protected se parece al acceso por omisin, pero
otorga cierto acceso privilegiado a las subclases de otros paquetes. Frecuentemente los
mtodos se crean para utilizarse dentro de la propia clase ( y no para su utilizacin general ).
Si se declaran como protected las podremos utilizar dentro de la clase y todas sus subclases.
public: El modificador public no restringe el acceso. Cualquier parte del cdigo puede
acceder a clases, mtodos y variables de miembros.
En la figura hay dos barras para cada modificador. La barra superior representa la capacidad
de heredar una variable o mtodo miembro. La segunda barra muestra la accesibilidad de un
miembro, as por ejemplo las variables y mtodos declarados protected tienen las siguientes
caractersticas:
Cualquier clase del mismo paquete podr acceder a ellas, pero en caso contrario no
sern accesibles.
Las siguientes tablas resumen los modificadores que pueden aparecer en las declaraciones de
clases, campos, variables locales, constructores y mtodos.
Modificadores de clase
Modificador
Significado
public
abstract
final
48
Modificadores de constructores
Modificador
Significado
public
protected
private
Significado
public
protected
private
static
transient
volatile
final
Es una variable final. Por lo tanto solo podr tener un valor y ste
no lo podr cambiar o no podr modificarse. Este modificador se
utiliza para especificar una constante.
Las constantes se
especifican, por lo general, como finales, estticas y pblicas.
friendly
private
protected
Significado
final
49
Significado
public
protected
private
static
transient
volatile
final
friendly
private protected
las dos
de este
ella los
podrn
Secuencial
Selectiva
Repetitiva
Hay que recordar que un programa propio es aquel que cumple las propiedades de tener un solo
50
punto de entrada y uno de salida, donde toda sentencia (instruccin) del algoritmo es accesible, esto
es, existe al menos un camino que va desde el inicio hasta el fin del algoritmo, se puede seguir y pasa
a travs de dicha sentencia y no tiene ciclos o bucles infinitos
4.1 Flujo secuencial
La estructura secuencial es trivial, esto es, una concatenacin de instrucciones o sentencias de
principio a fin
p = (a + b + c)/2 ,
51
return aux;
52
4.2.1 La sentencia if
El siguiente diagrama nos da la sintaxis de la instruccin if, de decisin simple, entre parntesis se
pone la expresin la cual debe dar un valor booleano true o false , ( en Java la expresin debe dar
un valor de verdad false o true, no es como en lenguaje C que la expresin puede dar cero y se toma
como falso y un valor diferente de cero como verdadero ), si es true la expresin es verdadera,
entonces se realiza el conjunto de sentencias, pero si es false se transfiere el control de flujo
despus de la llave que cierra el mbito del bloque if.
53
54
p,q;
return aux;
55
}
4.3 Selectiva doble
A continuacin vamos a analizar la estructura selectiva doble o tambin conocida como if - else .
Veamos el siguiente figura:
56
ex1,ex2,ex3;
57
return aux;
si es
58
59
DEPORTE
Natacin
Tenis
Golf
Esqu
Marcha
c,f;
60
61
62
n;
63
64
n;
65
66
Puede omitirse una , dos o las tres expresiones, y las variables contador de la expresin1 pueden
ser reales, esto es, de tipo float o double, y no solamente int, byte, char, long, etc,. As segn
sea el caso , los siguientes fragmentos de cdigo son equivalentes:
// caso 1
//caso
2 // caso 3
long i, sum = 0l;
long i= 1 , sum = 0l;
for( i=1 ; i <= limite ; long i = 1 , sum = 0l;
for( ; i <= limite ; i++ )
for( ; i <= limite ; )
i++ )
sum += i;
sum += i++;
sum += i;
// caso 4
long i = 1 , sum = 0l;
for( ; ; ) {
if ( i <= limite ) break;
sum += i++;
}
En los 4 casos el resultado es el mismo, pero es en el caso 4 es donde se omiten las tres expresiones
del for y en este la condicin lgica es un if con un break , el break como veremos es una
instruccin de control de flujo de Java el cual se utiliza para el rompimiento del control del flujo y
puede utilizarse en todos los ciclos y en los if y switch.
4.7.2 Ejemplos ciclo for
Haga el programa en Java que calcule e imprima la suma de los primeros N nmeros enteros
positivos pero con el ciclo for .
Diagrama de flujo de Solucin del problema 5.0. (con ciclo for)
67
import java.io.DataInputStream;
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Fecha: 15 mayo 2000
// Problema 5.0
class SigmaFor {
static long
n;
68
69
70
71
El programa debe manejar un men interactivo que tengan opciones para introducir datos
del teclado, introducir datos leyndolos de un archivo, ver datos por pantalla, guardar los datos y
resultados en un archivo, y en dicho men debe haber una opcin para salir y otra para continuar
A continuacin veremos una posible solucin al programa que simula un men de opciones para un
programa estadstico:
Cdigo de ejemplo de un men usando la estructura de control de flujo de seleccin mltiple switch.
Si quieres obtener elcdigo clic con el botn derecho aqu MisMenus.zip
import utilerias.Escri;
import java.io.*;
/**
* Programa de java que utiliza un men iteractivo
* implementado con la instruccin switch para un
* programa de estadistica que utilizar arreglos.
72
73
System.exit(1);
break;
default : Escri.benl(" selecciona solo el 1,2,3,4,5,0 nada mas");
break;
} // fin del switch
} // fin del while
} // fin del main()
} // fin de la clase MisMenus
Para este programa se utilizan los mtodos be y benl de la clase Escri y estn dentro de un
paquete de clases llamado utilerias y el cdigo esta a continuacin:
package utilerias;
/** Programa de java que utiliza metodos estticos
* utiles para escribir por pantalla
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Escri.java
* paquete: utilerias
* Fecha : 10/10/2003
*/
/** clase Escri
* es una clase utilitaria para escribir mensajes por la consola
* puede ser utilizada para cualquier aplicacin de consola
* con import utilerias.Escri;
* @see <A href="http://www.cic.ipn.mx/ute/ogonzalez/Cursos/javabas/index.htm>
* página del curso de Java de Oscarin </A>
*
*/
public class Escri {
/** mtodo esttico de clase be()
* firma: public static void be( String msj )
* propsito: Escribir la cadena msj con el mtodo print()
* @param msj es el mensaje que se va a escribir por pantalla
* @return void
*/
public static void be (String msj) {
System.out.print(msj);
}
/** mtodo esttico de clase benl()
* firma: public static void benl ( String msj )
* prosito: Escibir la cadena msj con el mtodo println()
* @param msj es el mensaje o a escribir por pantalla
* @return void
*/
public static void benl (String msj){
System.out.println(msj);
}
} // Fin de Escri
74
objetos de una clase o tipo determinado comparten los mismos comportamientos y atributos. Las
clases actan en forma muy parecida a una plantilla o molde para galletas en el sentido de que una
clase se utiliza para crear o instanciar objetos
75
Los atributos son caractersticas externas y visibles de una clase. El color de los ojos y del
cabello de una persona, son ejemplos de atributos.
Un objeto puede ejercer el comportamiento de otro objeto ejecutando una operacin sobre
este ltimo. Los trminos llamada a mtodo, llamada a funcin o paso de mensaje se utilizan en
lugar de realizar una operacin, cada una de estas acciones activa el comportamiento de un objeto
cuerpo
Donde:
modificadores es opcional y puede ser uno ms de las siguientes tres palabras reservadas:
{ public, abstract, final, synchronizable }
class es una palabra reservada que se utiliza para definir o declarar una clase
76
a otros
Creacin de Objetos. Todo en Java se trata como un objeto. Se puede manipular objetos a travs
de handles (referencias, identificadores)
El handle o referencia no necesariamente est conectado a un objeto. Ejemplo:
String s;
Solo es creado la referencia pero hay que inicializarlo:
String s = Curso de Java;
Para conectar un handle o referencia a un objeto se usa la palabra llave new que es un operador de
Java y significa mas o menos lo siguiente creame un nuevo objeto de ste tipo o, " crame una
nueva instancia o ejemplar de ste tipo" Ejemplo:
String s = new String(Curso de Java);
El caso de objetos de la clase String es especial, porque puede crearse o instanciarse un objeto de
esta clase sin el operador new, porque es una clase muy utilizada.
El efecto de crear un objeto con el operador new se traduce en la asignacin de memoria para ese
objeto en el heap de la RAM y como veremos mas adelante, en la invocacin o llamada al constructor
de la clase a la que pertenece el objeto.
5.2.1 Colector de basura
El recolector de basura ( garbage collecter ), es un proceso o hilo que corre en paralelo a la
ejecucin de un programa en Java el cual limpia todas las referencias de los objetos que ya no son
utilizados por el programa.
El concepto de tiempo de vida que una variable ocupa memoria es importante en la programacin, y
cuestiones como; Cunto tiempo durar una variable? y Cundo debe destruirse dicha variable?
que produce mucha confusin y errores en la programacin, Java simplifica ste trabajo por usted,
gracias al recolector de basura
Como Java es un lenguaje de programacin simple, el garbage collecter garantiza que ya nunca
tendr que preocuparse en destruir un objeto , y es por esto que en Java no existen mtodos
destructores como ocurre en C++.
El colector de basura reclama la memoria de todos los objetos que ya no van a ser usados, esto e, el
colector de basura solo libera memoria reservada con el operador new y no libera la "memoria
especial" que puede reservar un objeto. Veremos en la seccin siguiente que para liberar la
"memoria especial" Java provee un mtodo llamado finalize() que se puede definir para una clase.
5.2.2 El mtodo finalice()
77
Supongamos que un objeto aloja memoria "especial" sin usar el operador new. El colector de basura
solo sabe como liberar memoria alojada con new, as que no sabe como liberar esa memoria
"especial". Para solucionar esto Java provee el mtodo finalize() que puede ser definido en la clase.
En C++ a diferencia de Java, los objetos siempre son destruidos, en un programa libre de errores.
Pero en Java los objetos no siempre son limpiados con el colector de baura, ya que :
78
clase.
utilizan
[ modificadores ]
nombre-del-tipo nombre-de-variable;
Donde:
modificadores es opcional y puede ser uno ms de las siguientes siete palabras llave:
{ static, final, transient, volatile, public , protected, private }
Cabe sealar que el nico modificador que puede ponrsele a una variable local a un mtodo es el
modificador final.
nombre-del-tipo es uno de los ocho siguientes palabras llave ( pero tambin pueden ser el nombre
de una clase p.ej. String, Alumno, Date, etc. ):
{ boolean, byte, char, short, int, long, float, double }
nombre-de-variable
Mtodos
Los mtodos son algo parecido a las funciones del lenguaje C /C++, pero en Java no se permiten
colocar mtodos fuera de la definicin de clase . Con los mtodos implementamos el comportamiento
de los objetos. Hay varios tipos de mtodos:
Mtodos de instancia. Son miembros de la clase y son mtodos que pueden ser utilizados cuando
se crea un objeto de la clase a la que pertenecen, esto es, cuando se crea una instancia de la clase.
Mtodos de clase. Son miembros de la clase y son mtodos que pueden ser invocados sin
necesitar crear una instancia de la clase, y los identificamos fcilmente porque tienen el modificador.
Mtodos constructores. Como veremos ms adelante, son mtodos con el nombre de la clase y
que son invocados al instanciar un objeto o crear un ejemplar de la clase al que pertenecen con el
operador new.
La sintxis de una simple declaracin de un mtodo es:
cuerpo
79
Donde:
modificadores es opcional y puede ser uno ms de las siguientes ocho palabras llave:
{ static, abstract, final, native, synchronized, public , protected, private }
tipo-de-retorno es cualquier nombre de clase o una de los siguientes nueve palabras reservadas:
{ void, boolean, byte, char, short, int, long, float, double }
nombre-mtodo
Ejemplo:
public static void main(String args[]) throws IOException
{
/* aqu van las sentencias del cuerpo */
}
Vamos a aprovechar el ejemplo para definir un concepto importante conocido como firma del mtodo.
Firma de un mtodo: Es la definicin del mtodo, excluyendo el cuerpo, es algo parecido al
concepto de funcin prototipo del lenguaje C. En el ejemplo anterior, la firma del mtodo es:
public static void main(String args[]) throws IOException
El concepto es importante, porque la documentacin de las API's de Java vemos listadas, cientos de
miles de firmas de mtodos y las clases a los que pertenecen.
5.4 Mtodos
5.4 Mtodos sobrecargados
Cuando tenemos necesidad de que un mtodo en una clase tenga el mismo comportamiento para
distintos tipos de datos para sus argumentos , y no queremos cambiar el nombre del mtodo,
utilizamos la propiedad de sobrecarga de mtodos, ver siguiente ejemplo
Ejemplo 1. Sobrecarga de mtodos privados de una clase que obtienen el cubo de un nmero de
formas diferentes
1.
2.
80
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
81
con dos argumentos de tipo double s.cubo( 10, 3 ). Por ltimo en la salida de la invocacin del
tercer mtodo da "10 al cubo es: 1000.0000000000007", la razn es el error de precisin que tienen
los mtodos Math.exp() y Math.log(), que se debe tomar en cuenta cuando hagamos programas
de alta presicin. La siguiente figura muestra el diagrama de UML con JBuilder 9. versin de prueba:
82
5.6.1 Qu es la herencia?
Ahora que hemos visto algunas definiciones ms, podemos refinar la definicin de herencia.
La herencia es un mecanismo que permite establecer relaciones "es- un" entre clases. Estas
relaciones dan a la subclase la facultad de heredar los atributos y comportamientos de la superclase.
Con la herencia la nueva clase hija hereda de la clase madre , todos los mtodos y atributos que se
encuentran en la interfaz de la clase madre y aparecern automticamente en la interfaz de la hija.
Como se ha visto, para que la jerarqua de herencia tenga sentido, se debe tener la facultad de hacer
con la hija todo lo que pueda hacer con la madre. Esto es lo que realmente certifica la prueba "es un"
. La hija slo tiene permitido aumentar y agregar funcionalidad, pero nunca se le permite eliminarla.
Si se encuentra en la situacin de que una hija requiere eliminar funcionalidad, esto es una clara
seal de que la hija debe aparecer antes que la madreen la jerarqua de herencia.
Al igual que con las madres e hijas reales, las clases hijas y las clases madres deben parecerse. En
vez de compartir genes, las clases comparten informacin de tipos.
Algunos lenguajes permiten que una clase tenga ms de una madre. Esto se conoce como herencia
mltiple. Algunos lenguajes limitan a la hija a tener slo una madre.
Otros lenguajes, como Java, permiten slo una madre para la implementacin, pero proporcionan un
mecanismo para heredar mltiples interfaces (pero no la implementacin, slo las firmas de los
mtodos). y esto lo veremos mas tarde en este captulo.
Al igual que las hijas de carne y hueso, las clases hijas pueden agregar nuevos compartimientos y
atributos. Por ejemplo, una hija de carne y hueso puede aprender a pilotear una avin an cuando la
madre nunca lo haya hecho. De la misma manera, una hija podra redefinir un comportamiento
heredado.
Cuando se desee incorporar un nuevo comportamiento a una clase, puede hacerse agregndole un
En el siguiente ejemplo, tenemos el cdigo de una clase base llamada Persona , vea tambin los
diagramas.
83
Ahora suponga que tiene un alumno entonces usted aprovecha el cdigo de la clase existente
Persona para reutilizar los mtodos y atributos de la misma, para crear una nueva clase derivada
llamada Alumno despus de todo un alumno es un tipo de persona por extensin, veamos el
siguiente cdigo.
84
/**
* Programa que ejemplifica la implementacin de la herencia
* Tambien se utilizan mtodos accesores
* para poder obtener los valores de atributos privados de la
* clase desde su interface publica.
* Tambin observa el uso de la palabra reservada super
* para invocar al constructor de la superclase
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Fecha : 27/06/2002
* Archivo: Alumno.java
* La clase Alumno es la clase derivada de la superclase Persona o
* tambin es la suclase o la extensin de la superclase Persona
*/
class Alumno extends Persona {
protected String NoBoleta;
private double exa1, exa2, exa3 , cal;
Alumno() {
System.out.println("constructor Alumno()");
}
Alumno(String nombre, String sexo, int edad) {
super(nombre,sexo,edad);
System.out.println("constructor Alumno(String nombre, String sexo, int edad)");
}
/* mtodo que establece valores para las variables privadas */
public void setExamen(double examen, int noexa) {
if ( noexa == 1 ) exa1 = examen;
if ( noexa == 2) exa2 = examen;
if ( noexa == 3 ) exa3 = examen;
}
public double getCalif(int noexa) {
if ( noexa == 1 ) return exa1;
else
if ( noexa == 2) return exa2;
else
if ( noexa == 3 ) return exa3;
else return -1;
}
public double getMedia() {
cal = (exa1 + exa2 + exa3) / 3.0;
return cal;
}
} // fin de Alumno
85
Aqu, Alumno basa su definicin en la clase Persona existente, y para lograr esto se utiliza la
palabra reservada extends que indica que la clase Alumno es una extensin de la superclase
Persona.
Debido a que Alumno hereda de Persona, getNombre(), getSexo(), getEdad(), nombre, sexo
y edad pasan a formar parte de la definicin de Alumno.
Observe que en uno de los constructores de la clase Alumno se utiliza la palabra reservada super()
la cual invoca primeramente al constructor de la superclase y le enva los argumentos nombre, sexo y
edad para la construccin de un objeto de la clase Persona regresando posteriormente el control a
la instruccin que sigue de super() en el constructor de la clase Alumno.
super(nombre,sexo,edad);
De esta manera se garantiza que antes de crear un objeto de la clase Alumno, se crea ste primero
como una persona porque un alumno "es una" persona.
La relacin de herencia is-a (es-un).
Por lo anterior la herencia es tambin conocida como una relacin entre clases conocida como is-a (
Ahora una clase llamada CicIpn utiliza las dos clases existentes para crear o instanciar un objeto de
la clase Alumno y as, aprovechar los cdigos de ambas clases, lograndose uno de los objetivos de
la POO que es la reutilizacin de cdigo existente.
Veamos el siguiente cdigo de la clase CicIpn que utiliza la clase Alumno en su mtodo main().
/**
* Programa de java que ejemplifica el uso de la herencia
* Tambien se utilizan mtodos accesorios y mutadores
* para poder accesar y establecer a los atributos privados
* de una clase desde su interface publica.
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Fecha : 19/03/2004
* Archivo: CicIpn.java
* Este programa utiliza las clases Persona y Alumno
* mediante la herencia.
86
*/
public class CicIpn {
public static void main( String args[] ) {
Alumno p = new Alumno("Juana Figueroa","femenino",30);
p.setExamen(8.0, 1);
p.setExamen(10.0, 2);
p.setExamen(9.0 ,3);
System.out.println("Materia: Mtodos Matemticos" +
"\n\t Nombre Alumno(a):" + p.getNombre() +
"\n\t Sexo = " + p.getSexo() +
"\n\t Edad = " + p.getEdad() +
"\n\t EXA1= " + p.getCalif(1) +
"\n\t EXA2= " + p.getCalif(2) +
"\n\t EXA3= " + p.getCalif(3) +
"\n\t CALIFICACION= " + p.getMedia() +
"\n Fin del programa ");
}
} // fin de CicIpn
87
La mayora de los leguajes orientados a objetos no permiten redefinir un atributo. Sin embargo, en
Java si se permite y aqu se incluye el atributo redefinido para dar una explicacin ms completa.
Primero consideremos el siguiente ejemplo. Despus analizaremos cada tipo de mtodo y atributo.
Si deseas el descargar el cdigo de estos programas dale clic aqu
Coordenadas.zip
/**
* Programa que muestra la herencia.
* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0
* @author Oscar Alejandro Gonzlez Bustamante
* Archivo: PuntoXY.java
*/
public class PuntoXY {
private double x;
private double y;
public PuntoXY( double x, double y ) {
setX( x );
setY( y );
}
public double getX ( ) {
return x;
}
public void setX( double x ) {
this.x = x;
}
public double getY( ) {
return y;
}
public void setY( double y ) {
this.y = y;
}
public String toString( ) {
return "Soy un punto bidimensional.\n" +
"Mi coordenada x es: " + getX() + "\n" +
"Mi coordenada y es: " + getY();
}
} // fin de PuntoXY
/**
88
En este ejemplo tenemos dos clases que representan puntos geomtricos. Estos puntos podran
utilizarse en una herramienta grfica, un modelador visual o un simulador de vuelos. Los puntos
tienen muchos usos prcticos.
Aqu, PuntoXY contiene coordenadas x e y. La clase define mtodos para obtener y establecer los
puntos, as como para crear una representacin de tipo String de la instancia del punto.
PuntoXYZ hereda de PuntoXY. La clase PuntoXYZ agrega una coordenada z y un mtodo para
recuperar y establecer el valor.
La clase tambin proporciona un mtodo para obtener una
representacin de tipo String de la instancia.
Debido a que PuntoXYZ hereda PuntoXY,
tambin posee los mtodos contenidos en esta ltima.
Este ejemplo demuestra cada tipo de mtodo.
Mtodos y atributos redefinidos.
La herencia permite tomar un mtodo o un atributo existentes y redefinidos. La redefinicin de un
mtodo permite modificar el comportamiento de un objeto en relacin con ese mtodo.
Un mtodo o un atributo redefinidos aparecern tanto en la madre como en la hija.
PuntoXYZ, redefine el mtodo toString() que aparece en PuntoXY.
Por ejemplo,
// de PuntoXY
public String toString( ) {
return "Soy un punto bidimensional.\n" +
"Mi coordenada x es: " + getX() + "\n" +
"Mi coordenada y es: " + getY();
}
89
La clase PuntoXY define un mtodo toString() que identifica la instancia como un punto
bidimensional e imprime su coordenada de dos elementos.
PuntoXYZ redefine el mtodo toString() para identificar la instancia como un punto tridimensional
e imprime su coordenada de 3 elementos.
// de PuntoXYZ
public String toString( ) {
return "Soy un punto bidimensional.\n" +
"Mi coordenada x es: " + getX() + "\n" +
"Mi coordenada y es: " + getY() + "\n" +
"Mi coordenada z es: " + getZ();
}
Consideremos el siguiente mtodo main():
/**
* Programa que muestra la herencia.
* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Coordenadas.java
*/
public class Coordenadas {
public static void main( String [ ] args ) {
PuntoXY dos = new PuntoXY (10,20);
PuntoXYZ tres = new PuntoXYZ(10,20,30);
System.out.println(dos.toString() );
System.out.println(tres.toString() );
System.out.println("Fin del programa");
}
} // fin de la clase Coordenadas
Al redefinir un mtodo, la clase hija proporciona su propia implementacin del mtodo. Esta nueva
implementacin ofrecer nuevo comportamiento para el mtodo. Aqu, PuntoXYZ redefine el
comportamiento del mtodo toString() de manera que se traduzca apropiadamente en un String.
Redefinir es el proceso el cual una clase hija toma un mtodo de la clase madre y lo reescribe con el
propsito de cambiar su comportamiento.
Cmo sabe el objeto cual definicin debe utilizar?
90
Al considera la redefinicin de un mtodo o atributo, es importante tomar en cuenta que no todos los
mtodos y atributos estn disponibles para que su clase los redefina, menos an para que los utilice.
Las palabras reservadas para controlar el acceso definen quin tiene permitido ver y acceder los
mtodos y atributos. En general, estos niveles de acceso se ubican en tres categoras, como vimos
brevemente en la leccin.
Los mtodos y atributos protegidos son aquellos a los cuales se desea que nicamente las subclases
tengan acceso. Estos mtodos no deben hacerse pblicos. Tan slo quienes tengan un conocimiento
amplio de la clase deberan utilizar los mtodos y atributos protegidos.
Cualquier atributo no constante y los mtodos dedicados exclusivamente a la clase deben
establecerse como privados. El acceso privado impide que cualquier otro objeto, excepto el objeto
mismo, llame al mismo. No establezca como protegido solamente para aquellos mtodos que usted
sabe que sern requeridos por alguna subclase. De lo contrario, utilice acceso pblico o privado. Esta
rgida prctica significar que tal vez ms tarde tendr que regresar al cdigo por cambiar el nivel de
acceso al mtodo. No obstante, esto produce un diseo ms seguro que aquel que deja abierto el
acceso a una subclase.
Regresar a cambiar los niveles de acceso podra parecer una mala prctica. Sin embargo, las
jerarquas de herencia no deben ocurrir nunca por accidente. En vez de ello, las jerarquas deben
desarrollarse naturalmente conforme usted programe. No hay porque avergonzarse de reorganizar las
jerarquas con el paso del tiempo. La programacin orientada a objetos real es un proceso iteractivo.
91
Sin embargo, recuerde que una regla de oro es hacer todo privado. Habr casos en los cuales esto no
ser funcional para usted. Todo depende de lo que tenga que programar. Por ejemplo, si usted vende
bibliotecas genricas, de clases sin proporcionar el cdigo fuente, tal vez tenga que establecer todo
como protegido de manera predeterminada tonel propsito de que sus clientes puedan usar la
herencia para extender sus clases.
De hecho, habr ocasiones en que tendr que disear una subclase pensando en la herencia. En tales
casos es conveniente establecer un protocolo de herencia, que es una estructura abstracta visible
solamente a travs de los elementos protegidos de la clase. La clase madre llamar a estos mtodos,
y la clase hija puede redefinirlos para modifica su comportamiento. En la siguiente leccin ver un
ejemplo.
Con estas definiciones y reglas, es sencillo comprender que los mtodos y atributos protegidos y
pblicos son los ms importantes para la herencia.
Mtodos y atributos nuevos
Los mtodos y atributos nuevos son aquellos que aparecen en la clase hija pero no en la clase madre.
La clase hija agrega el mtodo o atributos a su interfaz. En el ejemplo de la clase PuntoXYZ vimos
mtodos nuevos. Esta clase agrega los mtodos getZ() y setZ(). Para incorporar nueva
funcionalidad a la interfaz de su clase hija puede agregar mtodos y atributos nuevos.
Mtodos y atributos recursivos
Los mtodos y atributos recursivos se definen en la clase madre o en cualquier otro antepasado, pero
no en la clase hija. Al acceder al mtodo o al atributo, el mensaje se enva hacia arriba en la jerarqua
hasta que se encuentra una definicin de mtodo. El mecanismo es el mismo que el que vimos en la
seccin sobre los mtodos y atributos redefinidos.
Los mtodos redefinidos tambin podran comportarse de manera recursiva. Aunque un mtodo
redefinido aparecer en la clase hija, la mayora de los lenguajes orientados a objetos proporcionan
un mecanismo que permite a un mtodo redefinido llamado a la versin del mismo que se encuentra
en la clase madre (o en algn antepasado). Esta capacidad da la oportunidad de aprovechar la
versin de la superclase y definir nuevos comportamientos en la versin de la subclase. En Java, la
palabra reservada super permite tener acceso a la implementacin de la clase madre. En la seccin
siguiente tendr oportunidad de utilizar super.
5.6.3 Sobreposicin de mtodos y variables.
La herencia permite tomar un mtodo o una variable y redefinirlos. La redefinicin de un mtodo
permite modificar el comportamiento de un objeto en relacin con ese mtodo. A esta caracterstica
tambin se le conoce como sobreposicin o tambin se le conoce con el trmino de
sobreescritura ( en ingles el termino es conocido como overriding ).
Un mtodo o una variable redefinidos estn tanto en la clase madre como en la clase hija, esto es, en
el caso de los mtodos estos tienen la misma firma y en caso de las variables o atributos tienen la
misma definicin. Cuando esto sucede , se dice que los mtodos y variables redefinidos de la clase
hija ocultan o sobreescriben a los mtodos y variables de la clase madre o superclase.
Cuando se necesita usar los mtodos y variables de la clase madre o de la superclase empleamos la
palabra reservada super siguiendo la siguiente sintaxis:
super.metodo() // para invocar a el mtodo de la superclase
super.variable
En el siguiente ejemplo tenemos una clase madre o superclase llamada SobreEscritura, con dos
variables miembro de tipo double x = 5.0 y otra double y= 3.0. Tambin esta un mtodo
toString() que es sobreescrito de la clase Object, que nos da una cadena con los valores de los
92
Ahora veremos que estos mtodos y variables sern sobredefinidos o sobreescritos en la clase hija
OcultoySobreEscribo y que hay una variable booleana llamada oculta que permite controlar la
sobreescritura segn su valor. Vea el cdigo y sus comentarios que explican claramente el programa
con el uso de super.
/** Programa de Java que te ensea el uso de clases
* con mtodos y variables sobreescritos o
* redefinidos en la subclase. La superclase de
* esta clase es SobreEscritura. Se ensea tambin el
* uso de super.variable y super.metodo()
* @autor Oscar A. Gonzlez Bustamante
* @version 2.0
* Archivo: OcultoySobreEscribo.java
*/
public class OcultoySobreEscribo extends SobreEscritura {
// esta es la clase hija
double x= 2.0;
double y= 8.0;
boolean oculta; // esta es una bandera para ocultar
// convierte a cadena los valores de los atributos
// de los objetos de sta clase
public String toString() {
return " Hola Soy x= " + x +
" Hola Soy y= " + y +
" Hola Soy oculta= " + oculta;
}
// se redefine o sobreescribe o se sobrepone
// el mtodo potencia de la clase madre dependiendo
// del valor de la variable booleana oculta
double potencia() {
double valor;
if ( oculta ) valor = Math.pow( x , y ); // oculto o sobreescribo
93
else {
x = super.x; // obtengo valor de x de la superclase
y = super.y; // obtengo valor de y de la superclase
valor = super.potencia(); // invoco la mtodo de la superclase
}
return valor;
}
public static void main( String args[]) {
SobreEscritura w = new SobreEscritura(); // w es un objeto de la clase madre
OcultoySobreEscribo z = new OcultoySobreEscribo(); // z es un objeto de la clase hija
// aqu se ve la ocultacin de la variables x e y ademas del mtodo potencia() de la
// superclase, por los correspondientes sobreescritos de la clase hija
z.oculta = true; // true para trabajar con valores redefinidos en la clase hija
System.out.println( "w: " + w );
System.out.println( "z: " + z );
// escribo valores de atributos del objeto z
System.out.println("x= " + z.x + " a la y= " + z.y + " = " + z.potencia() );
// Para usar los valores de la clase hija cambiamos el valor de oculta a true
z.oculta = false; // false para trabajar con valores de la clase madre
System.out.println( "w: " + w );
System.out.println( "z: " + z );
// escribo valores de atributos del objeto z
System.out.println("x= " + z.x + " a la y= " + z.y + " = " + z.potencia() );
} // fin del main()
} // fin de la clase OcultoySobreEscribo
5.6.4 Upcasting
Uno de los aspectos mas importantes de la herencia es la relacin que se tiene entre la nueva clase
hija y la superclase madre. Esta relacin puede ser resumida diciendo: "La nueva clase hija es un
tipo de la clase madre existente".
El acto de convertir el tipo de un objeto h de una clase hija ( clase derivada o subclase ), referencia
o apuntador en un objeto m del tipo de la clase madre ( superclase o clase base ) es conocido como
upcasting .
Veamos el siguiente ejemplo:
Tenemos una clase llamada Upcasting que crea dos objetos emp1 y emp2 de la clase Empleado
as:
94
Upcasting.zip
/**
* Programa que muestra que en la herencia
* hay coversin de tipos Casting Objects o
* Upcasting.
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Upcasting.java
*/
public class Upcasting {
public void hazAlgo( Empleado e ) {
95
if ( e instanceof Gerente ) {
Gerente g = ( Gerente ) e; // convierto el empleado
// en gerente down Casting
System.out.println(" Este es un jefe de :" +
g.getDepartamento() );
System.out.println(" Los detalles del gerente son : \n" +
e.getDetalles() );
}
else {
System.out.println(" Los detalles del empleado son : \n" +
e.getDetalles() );
}
} // fin de hazAlgo()
public static void main( String [] args ) {
Upcasting up = new Upcasting();
java.util.Date santo = new java.util.Date( 1961 - 1900, 01, 13 );
Empleado emp1 = new Gerente( "Oscar A. Gonzlez B. " ,
18750.5,
santo,
"Direccin General" );
up.hazAlgo( emp1 ); // cuando se es gerente
System.out.println("------------------");
java.util.Date santo2 = new java.util.Date( 1976 - 1900, 03, 10 );
Empleado emp2 = new Empleado("Ma. de Jess Jazmin",
12000.00,
santo2 );
up.hazAlgo( emp2 ); // cuando se es empleado
System.out.println( "Fin del programa" );
} // fin del main()
} // fin de la clse Upcasting
Tenemos una clase llamada Empleado con sobrecarga de constructores y uso de la palabra
reservada this para inicializar apropiadamente las variables miembro segn sea el caso invocando a
los constructores de acuerdo al numero y tipo de sus parmetros.
/**
* Programa que muestra que en la herencia
* hay coversin de tipos Casting Objects o
* Upcasting. Tambin utilizamos this para
* invocar a los constructores sobrecargados.
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Empleado.java
*/
import java.util.Date;
public class Empleado {
public String nombre;
public double salario;
public Date onomastico;
public Empleado() {
nombre = "*** No hay nombre ***";
salario = 0.0;
onomastico = null;
}
public Empleado( String n ) {
96
nombre = n;
}
public Empleado( String n, double s ) {
this( n );
salario = s;
}
public Empleado( String n, double s, Date o ) {
this( n, s );
onomastico = o;
}
public String getDetalles() {
return "Nombre
: " + nombre + "\n" +
"Salario : " + salario + "\n" +
"Onomastico : " + onomastico;
}
} // fin de la clase Empleado
Tenemos una clase llamada Gerente es similar a la clase Empleado ya que utiliza sobrecarga de
constructores y uso de la palabra reservada this para inicializar apropiadamente las variables
miembro segn sea el caso , y adems invocando con la palabra super al miembro de la superclase
ya sea variable o constructor para construir el objeto.
/**
* Programa que muestra que en la herencia
* hay coversin de tipos Casting Objects o
* Upcasting.
* Tamben utilizamos this para
* invocar a los constructores sobrecargados.
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Gerente.java
*/
import java.util.Date;
public class Gerente extends Empleado {
public String departamento;
public Gerente() {
departamento = "*** No hay departamento ***";
}
public Gerente( String n ) {
super.nombre = n;
}
public Gerente( String n, double s ) {
this ( n );
super.salario = s;
}
public Gerente( String n, double s, Date o ) {
this( n, s );
super.onomastico = o;
}
public Gerente( String n, double s, Date o, String depa ) {
this( n, s, o );
departamento = depa;
}
public String getDetalles() {
97
}
public String getDepartamento() {
return departamento;
}
} // fin de la clase Gerente
2.
Por diferencia.
3.
Hay que tener cuidado con estos tipos de herencia ya que algunos tipos son ms recomendables
que otros. En las siguientes secciones exploremos cada uno en detalle.
5.6.5.1 Herencia para reutilizar la implementacin
Se vio en secciones anteriores , que la herencia permite a una clase nueva reutilizar la
implementacin de otra clase. En lugar de cortar y pegar cdigo o de instanciar y usar un
componente por medio de composicin, la herencia hace disponible automticamente el cdigo como
parte de la clase nueva. Y as , la clase nueva tiene la funcionalidad de la clase madre.
Problemas de la herencia de la implementacin
Hasta aqu, la herencia de la implementacin parece adecuada. No obstante, tenga cuidado, pues lo
que en la superficie parece una tcnica til, en la prctica puede ser peligrosa. De hecho, la
herencia de la implementacin es el tipo de herencia ms dbil y por lo general debe evitarse. La
reutilizacin tendra que ser sencilla, pero como ver, el costo es muy alto.
Para entender los inconvenientes, es necesario considerar los tipos. Cuando una clase hereda de otra,
automticamente adopta el tipo de la clase de la cual hered. La herencia del tipo adecuado es un
98
aspecto primordial que siempre se debe considerar la disear las jerarquas de clases. Mas tarde ver
la razn, pero por el momento tmelo como una regla.
Una herencia dbil es el Frankenstein de la programacin. Si usted emplea la herencia con el slo
propsito de reutilizar la implementacin sin tomar en cuenta otros aspectos, con frecuencia acabar
con un monstruo conformado por partes que no tendrn relacin entre s.
5.6.5.2 Herencia por diferencia
En el ejemplo de las clases PuntoXY y PuntoXYZ se utiliz la herencia por diferencia.
La programacin por diferencia de la oportunidad de especificar tan slo en qu difiere una clase hija
de su clase madre.
o visto de otra forma:
Programar por diferencia significa heredar una clase y agregarle solamente el cdigo que la haga
distinta de la clase de la cual se est heredando.
En el caso de la clase PuntoXYZ, vimos que la incorporacin de la coordenada z la hace diferente
de la clase madre. Con el propsito de aceptar la coordenada z . La clase PuntoXYZ agrega dos
mtodos para establecer y recuperar el atributo. Tambin sobreescribimos o redefinimos el mtodo
toString() en PuntoXYZ .
La programacin por diferencia es un concepto muy poderoso, pero permite agregar tan solo el
cdigo necesario para determinar la diferencia entre las clases madre e hijas. Esto permite programar
de manera incremental.
El cdigo ms pequeo es ms manejable y da como resultado un diseo ms sencillo y , en teora,
se escriben menos lneas de cdigo, y se cometen menos errores. As, cuando programa por
diferencia, puede escribir cdigo ms correcto en menos tiempo. Al igual que con la herencia por
implementacin, estos cambios incrementales se pueden realizar sin alterar el cdigo existente.
Mediante la herencia, existen dos formas para programar por diferencia:
Especializacin
La especializacin es el proceso mediante el cual una clase se define a s misma en trminos de los
aspectos que la hacen diferente de su clase madre. Despus de todo, la definicin de la clase hija slo
incluye los elementos que la hacen diferente de su clase madre.
Una clase hija se especializa respecto de su madre agregando nuevos atributos y mtodos a su
interfaz, as como redefiniendo atributos y mtodos existentes. Al agregar mtodos o redefinir los
existentes, una clase hija puede expresar comportamientos distintos a los de su madre.
No hay que confundir el trmino especializacin. La especializacin slo permite agregar o redefinir
comportamientos y atributos que la hija haya heredado de su madre. La especializacin, a diferencia
99
Como podemos ver, la especializacin nos restringe la funcionalidad, sino el tipo de categorizacin.
No hay razn par que la especializacin termine con PuntoXYZ. De hecho, no es necesario que
empiece con PuntoXY. La herencia puede ser tan profunda como se requiera.
Se puede utilizar la
herencia para estructurar jerarquas de clases complejas. La explicacin anterior sobre la jerarqua
da lugar a dos nuevos trminos predecesora y descendiente.
Debe procurar conformar jerarquas poco profundas en lugar de muy profundas. Conforme una
jerarqua es ms profunda, es ms difcil darle mantenimiento.
Clase predecesora
Dada una clase hija, una de clase predecesora es aquella que aparece antes que la clase madre en la
jerarqua.
Clase descendiente
Dada una clase, cualquier clase que aparezca despus de ella en la jerarqua es su descendiente.
Digamos que tenemos la jerarqua de clases que se muestra en la siguiente figura Podemos decir
que la clase PuntoX es la madre de PuntoXY y predecesora de PuntoXYZ y PuntoXYZW.
Tambin podemos afirmar que PuntoXY, PuntoXYZ y PuntoXYZW son descendientes de
PuntoX. Todas las clases descendientes comparten los mtodos y atributos de sus clases
predecesoras.
100
UsaLinea.zip
/**
* Programa que muestra la herencia
* por substitucin de tipos.
* Programa modificado del libro:
* Aprendiendo Programacin Orientada a Objetos
* del Autor: Anthony Sintes
* @version 1.0
101
la clase Linea toma dos instancias de PuntoXY como argumentos y proporciona algunos mtodos
para recuperar los valores, un mtodo para calcular la distancia entre los puntos y uno para calcular
el punto central.
Una relacin de sustituibilidad significa que es posible pasar cualquier objeto al constructor de Linea
que herede de PuntoXY.
Recuerde que cuando una hija de la madre se dice que la hija "es-una" clase madre.
PuntoXYZ "es-un" PuntoXY es posible pasar un PuntoXYZ al constructor.
As, como
102
al constructor de la
103
La conectabilidad es importante porque permite escribir cdigo genrico. En lugar de tener una gran
cantidad de instrucciones case o pruebas if-else para saber qu tipo de punto usa en un momento
determinado el programa, todo lo que se tienen que hacer es programar los objetos para que
manejen objetos de tipo PuntoXY.
Consejos para lograr una herencia eficiente.
La herencia tiene su propio conjunto de reglas de diseo. Aunque poderosa, la herencia en realidad le
da a usted una soga para que se cuelgue usted mismo s la usas de manera inapropiada. Los
siguientes consejos le ayudarn a utilizar la herencia de manera eficiente:
Como regla de oro, mantenga relativamente poco profunda sus jerarquas de clases.
Diseo con cuidado las jerarquas de herencia y transfiera los aspectos comunes a las clases
abstractas bsicas. stas permiten definir un mtodo sin necesidad de proporcionar una
implementacin. Debido a que la clase base no especifica una implementacin, no es posible
instanciarla. Sin embargo, el mecanismo de abstraccin obliga a que una clase que hereda
proporcione una implementacin. Las clases abstractas son valiosas para realizar una herencia
planeada. Esto ayuda al desarrollador a saber lo que tienen que implementar estas clases.
Las clases comparten con frecuencia cdigo comn. No tiene mucho sentido contar con
mltiples copias del cdigo. Lo ms recomendable es aislar el cdigo comn en una sola clase madre.
Sin embargo, no lo coloque demasiado arriba. Colquelo tan slo un nivel antes de aquel en donde
considere que lo necesitar.
Es difcil planear siempre las jerarquas en su totalidad. Los aspectos comunes no surgirn
sino hasta despus de escribir el mismo cdigo unas cuantas veces. Cuando encuentre estos aspectos
comunes no dude en reescribir sus clases. Con frecuencia, este trabajo de reescritura se le conoce
como refactorizacin.
El encapsulamiento es tan importante entre las clases madre e hija como lo es entre las
clases que no tienen relacin. No sea descuidado con el encapsulamiento cuando herede. La prctica
de utilizar una interfaz bien definida es tan vlida entre las clases madre e hija como entre las clases
que no tienen absolutamente ninguna relacin. A continuacin tiene algunos tipos que le ayudarn a
tener cuidado del encapsulamiento cuando herede.
Utilice interfaces bien definidas entre la madre y la hija como lo hara entre clases.
En general, evite dejar la implementacin interna de sus objetos al alcance de las subclases.
Si lo hace, una subclase puede volverse dependiente de la implementacin. Esta relacin puede
acarrear todos los problemas que vimos en la leccin 2.
104
stos son algunos aspectos clave finales para lograr una herencia eficiente:
Nunca pierda de vista que la sustitucin es el objetivo nmero uno. Incluso si un objeto
debiera aparecer intuitivamenteen una jerarqua, esto no significa que deba estar ah. No porque
usted pueda incluirlo o su intuicin le sugiera que lo haga, significa que deba hacerlo.
Natural
2.
Confiable
3.
Reutilizable
4.
Mantenible
5.
Extensible
6.
Oportuno
La herencia tambin incluye el deseo del programador de evitar el trabajo repetitivo. No tiene
mucho sentido hacer trabajo redundante.
La herencia permite reutilizar cdigo suficientemente probado como base para las clases
nuevas. Siempre es ms recomendable reutilizar cdigo probado que escribir cdigo nuevo.
Sin embargo, la herencia no es perfecta. Al crear subclases, debe estar atento para no
introducir errores sutiles resultado de destruir inadvertidamente dependencias no expuestas. Tenga
mucho cuidado cuando herede.
La herencia tambin permite reutilizar clases de maneras nunca imaginables por quienes las
hayan escrito. Al redefinir y programar por diferencia es posible cambiar el comportamiento de clases
existentes y utilizarlas en nuevas formas.
105
diferencia de cortar y pegar, hay una sola copia de cdigo original por mantener. Esto ayuda al
mantenimiento pues reduce la cantidad de cdigo que es necesario mantener.
Si usted tuviera que hacer cambios directamente al cdigo existente, podra daar la clase
base y afectar porciones del sistema que utilizara a esa clase.
Oportuno: la herencia ayuda a escribir cdigo oportuno. Ya vimos que la simple reutilizacin
puede reducir el tiempo de desarrollo. La programacin por diferencia significa que es necesario
escribir menos cdigo, por lo tanto usted debe terminar ms rpido. La conectabilidad hace posible
agregar caractersticas sin tener que cambiar mucho el cdigo existente.
La herencia tambin facilita las pruebas porque slo es necesario probar la nueva
funcionalidad y cualquier interaccin con la funcionalidad anterior.
5.7 Composicin
Es la relacin entre las clases conocida como Has a ( tiene un ) y se caracteriza en que un
objeto complejo esta construido de otros objetos.
El ejemplo clsico es pensar en un carro que siendo un objeto complejo, porque esta compuesto de
otros objetos igual de complejos como son el motor, las llantas, el chasis, el sistema elctrico, etc..
todos juntos componen un objeto de la clase Carro, as una instancia de la clase Carro tiene un Motor,
tiene unas Ventanas, tiene unas Puertas, etc., vea el ejemplo de cdigo y tambin el diagrama:
Si quieres obtener elcdigo dale clic aqu Carro.zip
/**
* Programa de java que ejemplifica el uso
* de la relacin entre clases conocida como
* has - a ( tiene - un) o composicin.
* Fuente: Tomado de y traducido al espaol del libro de
* Thinking in Java de Bruce Eckel capitulo 6 programa de
* Composicin con objetos pblicos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo:Carro.java
*/
class Motor {
public void arranque() {}
public void reversa() {}
public void alto() {}
}
class Rueda {
public void inflar(int libras) {}
}
class Ventana {
public void cerrarventana() {}
public void abrirventana() {}
}
class Puerta {
public Ventana ventana = new Ventana();
public void abrirpuerta() {}
public void cerrarpuerta() {}
106
}
public class Carro {
public Motor motor = new Motor();
public Rueda[] rueda = new Rueda[4];
public Puerta izquierda = new Puerta(),
derecha = new Puerta(); // 2-puertas
public Carro() {
for(int i = 0; i < 4; i++)
rueda[i] = new Rueda();
}
public static void main(String[] args) {
Carro tsuru = new Carro();
tsuru.izquierda.ventana.cerrarventana();
tsuru.rueda[0].inflar(30);
}
} // fin de la clase Carro
107
/**
* Programa de java que te ensea a manejar
* la composicin, en particular a invocar
* a los mtodos de los objetos que componen
* la clase RutaTaxi.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo:RutaTaxis.java
*/
class Persona {
protected String nombre;
public String getNombre(){return nombre;}
public void setNombre(String nom) { nombre=nom; }
}
class Taxista extends Persona {
private String horario;
public void setHorario(String hor) { horario=hor; }
public String getHorario() { return horario; }
} // fin de la clase Taxista
class Transporte { }
class Terrestre extends Transporte { }
class Taxi extends Terrestre {
private String placas;
public void setPlacas(String pla) { placas = pla; }
public String getPlacas() { return placas; }
} // fin de la clase Terrestre
class RutaTaxis {
Taxista t1 = new Taxista();
Taxi aut1 = new Taxi();
public static void main(String args[]) {
RutaTaxis rt = new RutaTaxis();
rt.t1.setNombre("Jorge Lopez");
rt.t1.setHorario("de 7 a 16 hrs.");
rt.aut1.setPlacas("000734-AUTW");
System.out.println("\t Ruta de Taxis \n" +
"\n\t Taxista: " + rt.t1.getNombre() +
"\n\t Horario: " + rt.t1.getHorario() +
"\n\t Taxi Placas: " + rt.aut1.getPlacas() +
"\n\t FIN DEL PROGRAMA ");
}
} // fin de la clase RutaTaxis
108
109
El siguiente ejemplo trata de diferentes figuras geomtricas a las cules hay que calcularles su rea,
esto es, tienen que responder al mensaje de calcula tu rea. La clase base o superclase de todas las
figuras es la clase abstracta Figura, la cual determina los atributos y comportamientos que tienen
que redefinir cada una de las clases concretas que hereden de ella.
Si quieres obtener el cdigo clic aqu UsaFiguras.zip
/**
*Programa de Java que ejemplifica el uso
* de las clases abstractas y los mtodos abstractos
* para delegar a sus clases hijo o subclases la
* implementacin del mtodo abstracto y as
* obtener polimorfismo
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo : Figura.java
*/
public abstract class Figura{
protected double area;
public abstract double getArea();
public abstract String escribeArea();
} // fin de Figura
110
concreta tiene que sobreescribir o sobreponer los mtodos abstractos de la clase Figura. Veamos la
clase para el caso de un rectngulo:
/**
* Programa de Java que ejemplifica el uso
* de las clases que heredan mtodos abstractos
* de una clase abstracta llamada Figura para
* as poder implementar polimorfismo con
* enlazamiento temprano para el caso
* de una figura Rectangulo
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Rectangulo.java
*/
public class Rectangulo extends Figura{
double alto;
double ancho;
public Rectangulo(double alto, double ancho) {
this.alto = alto;
this.ancho = ancho;
En el cdigo anterior de la clase Rectangulo, observe que ya estn redefinidos o sobreescritos los
mtodos getArea() y escribeArea() porque as esta especificado en la clase abstracta Figura.
Adems necesitamos dos variables para el alto y ancho del rectngulo y son inicializadas en el
constructor. A continuacin tenemos el cdigo de la clase Crculo la cual tambin redefine los
mtodos que le vienen de su superclase abstracta Figura y agrega la variable para el radio que se
inicializa en el constructor:
/**
* Programa de Java que ejemplifica el uso
* de las clases que heredan mtodos abstractos
* de una clase abstracta llamada Figura para as poder
* implementar polimorfismo con enlazamiento temprano
* ( early binding ) de la figura Circulo
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
111
* Archivo: Circulo.java
*/
public class Circulo extends Figura{
double radio;
public Circulo (double r) {
radio= r;
}
public double getArea() {
area = 3.14 * (radio * radio );
return (area);
}
public String escribeArea() {
String mensaje= "El area del circulo de radio = " + radio +
" es : " + getArea();
return mensaje;
}
} // fin de Circulo
Por ltimo escribimos el cdigo de una clase que use las figuras y sus clases concretas
correspondientes. Al traducir el cdigo fuente a byte code con el compilador de Java , este ya conoce
los mtodos polimrficos getArea() y escribeArea() y a que clase o tipo de objeto corresponden,
gracias al enlazamiento temprano ( early binding ) , que ocurre en el proceso de compilacin. Al
ejecutar el programa con el intrprete de Java, este sabe que c.getArea() pertenece a un objeto de
la clase Circulo y que r.getArea() pertenece a un objeto de la clase Rectangulo. Veamos el
cdigo siguiente:
/**
* Programa de Java que ejemplifica el uso
* de las clases que heredan mtodos abstractos
* de una clase abstracta para as poder
* implementar polimorfismo con enlazamiento
* temprano ( early binding ).
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: UsaFiguras.java
*/
public class UsaFiguras {
public static void main( String argumentos[] ) {
Circulo c = new Circulo(30);
Rectangulo r = new Rectangulo(30, 40);
System.out.println("Area del circulo de radio= 30 es: " + c.getArea() );
System.out.println("Area del rectangulo de 30x40 es: " + r.getArea() );
System.out.println("Fin del programa");
}
} // fin de UsaFiguras
112
Para compilar y ejecutar ste programa de UsaFiguras, hay que ejecutar los siguientes comandos:
javac Figura.java
javac Rectangulo.java
javac Circulo.java
javac UsaFiguras.java
java UsaFiguras
La salida del programa es:
Area del circulo de radio= 30 es: 2826.0
Area del rectangulo de 30x40 es: 1200.0
Fin del programa
5.9.2 Enlazamiento tardo
En la seccin anterior ya habamos visto que en el polimorfismo, cuando conectamos una llamada
(invocacin) de un mtodo con su cuerpo de sentencias, esto es denominado ligado, y que cuando
el ligado es ejecutado antes de que el programa sea ejecutado, a esto se le conoce como
enlazamiento temprano ( early binding ). Qu ocurre cuando el ligado es en tiempo de
ejecucin ?
Cuando el ligado ocurre en tiempo de ejecucin sobre el tipo del objeto, a esto se le conoce como
113
Con la herencia relacionando las clases podemos hacer upcasting o conversin de la clase de un
objeto a la de su clase base y se realiza con:
Figura f = new Circulo();
Aqu, un objeto Circulo es creado y la referencia resultante es inmediatamente asignada a Figura, lo
cual podra ser un error a primera vista, ( asignacin de un tipo por otro ); no obstante esto esta es
correcto , porque un Circulo es una Figura por herencia. As que el compilador esta de acuerdo con
esto y la sentencia no arroja ninguna clase de error.
Suponga ahora que usted invoca a un mtodo de la clase base ( que han sido sobre escritos en las
clases derivadas.
f.dibuja();
Y de nueva cuenta, usted podra esperar que el mtodo dibuja() de Figura es ejecutado, porque
despus de todo es una f es una referencia a Figura, y se preguntara como podra hacer el
compilador lo correcto, y a pesar de esto, el mtodo correcto Circulo.dibuja() es invocado debido
a el enlazamiento tardo (polimorfismo).
El siguiente programa ejemplifica stos conceptos, al cual le hemos agregado una clase Triangulo
para el caso del trangulo. La clase UsaFigurasDos hace uso de las clases Figura, Rectangulo,
Circulo y Triangulo para invocar o llamar al mtodo escribeArea() de manera polimrfica
mediante el enlazamiento tardo, al invocarlo en el ciclo for en:
// llena el arreglo con figuras
for ( int i=0; i < f.length; i++ )
f[i] = figuraalAzar();
aqu el mtodo figuraalAzar() devuelve un objeto de las clases Rectangulo, Circulo y Triangulo
pero lo hace al azar y en tiempo de ejecucin. Luego al invocar al mtodo escribeArea() en el ciclo
for as:
// Hace llamadas a los metodos polimrficos con
// enlazamiento dinmico o early binding
for ( int i=0; i < f.length; i++ )
System.out.println(f[i].escribeArea());
se consigue escribir el rea de la figura adecuada gracias al enlazamiento que se hace de forma
dinmica o en tiempo de ejecucin y que determina a que clase de objeto estamos haciendo
referencia. veamos todo el cdigo del programa:
114
/**
* Programa de java que ejemplifica el uso
* de las clases que heredan mtodos
* de una clase base para as poder
* implementar polimorfismo y el enlazamiento
* tardio o enlazamiento dinmico
* que ocurre en tiempo de ejecucin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: UsaFigurasDos.java
*/
class Triangulo extends Figura{
double base;
double altura;
public Triangulo(double base, double altura) {
this.base = base;
this.altura = altura;
}
public double getArea() {
area = (base * altura)/2.0;
return (area);
}
public String escribeArea() {
String mensaje= "Area del Triangulo de base=" + base +
"\n y de altura=" + altura + " es: " + getArea();
return mensaje;
}
} // fin de Triangulo
public class UsaFigurasDos {
public static Figura figuraalAzar() {
switch ( (int) (Math.random() * 3) ) {
case 0 : return new Circulo(30);
case 1 : return new Rectangulo(40,30);
case 2 : return new Triangulo(30, 40 );
default : return null;
}
}
public static void main( String argumentos[] ) {
Figura f[]= new Figura[9];
// llena el arreglo con figuras
for ( int i=0; i < f.length; i++ )
f[i] = figuraalAzar();
// Hace llamadas a los metodos polimrficos con
// enlazamiento dinmico o early binding
for ( int i=0; i < f.length; i++ )
System.out.println(f[i].escribeArea());
System.out.println("Fin del programa");
}
} // fin de UsaFigurasDos
Para correr el programa hay que ejecutar el siguiente comando java UsaFigurasDos y la salida es
la siguiente:
115
5.10 Interfaces
En esta seccin veremos la utilidad de una potente herramienta denominada interface. La palabra
reservada interface toma el concepto de abstract un paso mas adelante. Usted puede pensar que
una interface como un clase abstracta "pura". Una interface solo provee la forma , pero no la
implementacin.
Las interfaces nacen ah donde la jerarqua de clases hasta ahora tratada se queda corta para el
diseo de complejos programas. Entonces entra una nueva jerarqua que es la jerarqua de
interfaces. La idea es algo parecida a la herencia mltiple pero no es tal.
5.10.1 Qu es una interfaz?
La interface en Java es la clase mas abstracta posible. Esta constituida solamente de mtodos
pblicos abstractos ( nombres de mtodos, lista de argumentos y tipos de retorno , pero no cuerpos
de mtodos, y son implicitamente abstract ) y atributos pblicos y finales (que son implicitamente
static y final).
Cuando se dice que una clase implementa una interfaz es porque sta define todos los mtodos
abstractos de la interfaz. Una clase que implementa una interfaz se comporta como si hubiese
extendido una clase abstracta especificada por la interfaz.
La diferencia fundamental entre una clase abstracta y una interfaz es que, aunque ambas especifican
cmo deben comportarse las subclases, la interfaz no puede dar ningn detalle acerca de la
implementacin de los mtodos ni de los atributos. La consecuencia de estas restricciones es que la
existencia de varias interfaces no presenta los mismos problemas potenciales que la herencia
mltiple. De este modo, mientras que en Java una clase puede extender slo a otra clase base, si que
puede implementar a varias interfaces (implementacin de herencia mltiple).
5.10.2 Creacin de una interfaz
Para crear una interface, hay que utilizar la palabra reservada interface en lugar de la palabra
reservada class. Puede agregar la palabra reservada public antes de la palabra interface - pero
solamente si la interface es definida en un archivo de el mismo nombre - o dejarla con el acceso de
paquete, as solo ser utilizable dentro del mismo paquete.
5.10.4 Ejemplo de interfaces mltiples
Veamos el siguiente ejemplo. Se tiene una clase llamada Zoo que en el mtodo main crea una
116
instancia de Zoo invocando al constructor por omisin. El constructor de Zoo escribe el mensaje de
bienvenida con el mtodo esttico be de la clase Escri , y crea una instancia de la clase
Ornitorrinco. La clase Ornitorrico es una extensin de la clase Mamfero y el constructor de
Mamifero enva otro mensaje por pantalla. Tambin la clase Ornitorrinco implementa los mtodos de
las interfaces Animal, Vertebrado, Anfibio y Oviparo, pero observe que la interface Animal es
una extensin de otra interface llamada Vivo, por lo tanto la clase Ornitorrinco tiene que implementar
los mtodos de la interface Animal y los mtodos de la interface Vivo, ya que estn relacionadas con
117
}
interface Animal extends Vivo {
String soyanimal();
}
interface Vertebrado {
String soyvertebrado();
}
interface Anfibio {
String soyanfibio();
}
interface Oviparo {
String soyoviparo();
}
class Mamifero {
Mamifero () { Escri.be( "Da leche a sus crios \n" ); }
}
class Ornitorrinco extends Mamifero
implements Animal, Vertebrado, Anfibio, Oviparo {
public
public
public
public
public
String
String
String
String
String
}
public class Zoo {
Ornitorrinco ornito;
Zoo() {
Escri.be( "Bienvenidos al Zoologico de Chapultepec \n" +
"Decirme por favor que cosa es aquella que: \n\n" );
ornito = new Ornitorrinco();
Escri.be( ornito.estoyvivo() + "\n" +
ornito.soyanimal() + "\n" +
ornito.soyvertebrado() + "\n" +
ornito.soyanfibio() + "\n" +
ornito.soyoviparo() + "\n\n" );
Escri.be( "Su respuesta: Es un Ornitorrinco !! \n" +
"Gracias por su visita al Zoologico, adios. \n");
}//fin del constructor de zoo
public static void main( String [] args ) {
Zoo z = new Zoo();
}
}//fin de la clase Zoo
// clase utilitaria para escribir en la pantalla
class Escri {
public static void be( String msj ) { System.out.print( msj ) ; }
}// fin de la clase Escri
118
119
120
121
Ejemplos:
float[] x;
122
123
a1[1]
a1[2]
a1[3]
a1[4]
=
=
=
=
3
4
5
6
Figura: Tras declarar el array a1 , se reserva espacio en la memoria stack para la referencia del array.
Despus de usar el operador new para colocar espacio, se reserva memora heap para el contenido
del array. Los valores son inicializados automticamente a 0, si no es que los inicializamos de forma
explcita. Ver la figura del modelo de memoria cuando tras colocar el espacio int[] a1 = new int[5].
124
Por otra parte, para un array de objetos el espacio colocado es para contener una referencia al
objeto, no el objeto en s. Por ejemplo, veamos que al definir una clase Calendario que contenga el
nombre del mes y un nmero de das.
public class Calendario {
String mes;
int nodias;
Calendario ( String mes, int nodias ) {
this.mes = mes;
this.nodias = nodias;
}
}// fin de la clase calendario
Despus de definir la clase , se puede crear un array de esos elementos: new Calendario[12]. El
modelo de memoria tendr el aspecto de la figura siguiente al asignar espacio Calendario c[] =
new Calendario[12].
Se observar que an no hay espacio reservado para objetos Calendario. Todo lo que hay en el array
es una referencia null. Esto no sucede hasta que se reserva espacio mediante new Calendario(..)
y se agregue el objeto a la matriz mediante c[ x ] = ... el modelo de memoria no ser afectado. En
la siguiente figura se muestra el modelo tras ejecutar las siguientes sentencias:
c[ 0 ] = new Calendario("Enero", 31 );
c[ 1 ] = new Calendario("Febrero" , 28);
125
para
para
para
para
Todos estos mtodos estn sobrecargados para los distintos tipos de datos primitivos y para objetos.
Adicionalmente se tiene un mtodo simple asList() que hace que un array se convierta en un
contenedor List, que es una clase para manejar colecciones de objetos como un contenedor, lo cual
es tema para un curso avanzado de Java.
El siguiente ejemplo ( ver figura abajo ) hace uso de algunos de estos mtodos y consta de las
siguientes clases que manejan un arreglo de objetos, los ordena y obtiene promedio, varianza, etc.,
contiene:
-Persona.java para asignar valores de Nombre, apellido y edad
-Estudiante.java extiende Persona, asigna valores de calificacin y pasa los dems valores a la clase
Persona
-Mascarones.java ordena el arreglo por nombre y por calificacin, calcula los valores de promedio,
varianza, mnima y mxima calificacin
-usaEstudiante.java inicializa y asigna el arreglo, manda llamar las demas clases e imprime el
contenido del arreglo original, ordenado y los clculos de promedio, varianza, etc.
126
import java.util.*;
import java.util.Collections;
/**
* <p>Archivo: usaEstudiante.java </p>
* <p>Descripcin: Te ensea a usar el ordenamiento de arreglos
* mediante el uso de colecciones de la clase List</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Gerardo Gonzlez ( alumno del curso de Java )
* amplio y reviso: Oscar Alejandro Gonzlez Bustamante.
* @version 1.0
*/
public class usaEstudiante {
public static Estudiante[] est = new Estudiante[10];
public static void main(String[] args) {
//Inicializa y asigna el Arreglo
est[0]= new Estudiante("Gerardo","Gonzalez ",27,10.0);
est[1]= new Estudiante("Ramon ","Fernandez",30,9.99);
est[2]= new Estudiante("Rocio ","Espejo ",29,8.5);
est[3]= new Estudiante("Octavio","Garces ",29,10.0);
est[4]= new Estudiante("Mariana","Rosas ",33,6.9);
est[5]= new Estudiante("Ricardo","Lopez ",33,9.50);
est[6]= new Estudiante("Ernesto","Ramirez ",26,8.0);
127
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
import java.util.*;
/**
* <p>Archivo: Mascarones.java </p>
* <p>Descripcin: Te ensea a usar el ordenamiento de arreglos
* mediante el uso de la interface Comparator que implementa el
* mtodo compare(). La clase Mascarones2 que esta dentro de este
* archivo, realiza el cculo de los estadisticos y el ordenamiento </p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Gerardo Gonzlez ( alumno del curso de Java )
* amplio y reviso: Oscar Alejandro Gonzlez Bustamante.
* @version 1.0
*/
/*Ordena por NOMBRE */
class Mascarones implements Comparator {
public int compare(Object o1, Object o2) {
Estudiante u1 = (Estudiante) o1;
Estudiante u2 = (Estudiante) o2;
return u1.getNombre().compareTo(u2.getNombre());
}
public boolean equals(Object o) {
return this == o;
128
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
}
} //Fin clase Mascarones
/*Ordena por CALIFICACION */
class Mascarones2 {
private Estudiante[] a;
Mascarones2(Estudiante[] arreglo) { //1er constructor
a = arreglo;
}
// Fin constructor Mascarones2
public void display() {
// Muestra el arreglo
for(int j=0; j<a.length; j++)
System.out.println(""+a[j].toString());
}
public void insertionSort()
int in, out;
//2o constructor
129
89.
90.
91.
92.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Persona(String nombre) {
this.nombre = nombre;
}
Persona() {
this.nombre=null;
this.ap=null;
this.edad=-1;
}
} //Fin clase Persona
130
Cuando se copian arreglos en Java , segn lo que se desee , pueden copiarse las referencias
utilizando el operador de asignacin; y= x; pero puede perderse informacin, o puede utilizarse
tambin el mtodo arraycopy() de la clase System as:
System.arraycopy(x, 0, y, 0, x.length);
lo cual copia el arreglo x en y sin prdida de informacin, vea los siguientes dos ejemplos:
Ejemplo uno: De inicializacin de arreglos y copia de arreglos:
Si quieresobtener el cdigo clic con el botn derecho aqu CopiaArrayUno.java
/**
* Programa de Java que te ensea a copiar
* arreglos (arrays). La inicializacin
* se efecta en tiempo de compilacin, dando los
* valores entre llaves. La copia se hace
* mediante handles o referencias, lo cual
* puede producir prdida de informacin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CopiaArrayUno.java
*/
class CopiaArrayUno
{ // prueba el efecto de asignar un array a otro array
public static void main(String args[])
{
double[] x = {2.2, 4.4};
print(x, "x");
double[] y = {1.1, 3.3, 5.5};
print(y, "y");
y = x; // intentamos copiar x en y
print(y, "y");
x[0] = 8.8;
print(x, "x");
print(y, "y");
}
static void print(double[] u, String id)
{
for (int i=0; i<u.length; i++)
System.out.println(id + "[" + i + "] = " + u[i]);
System.out.println();
}
}// fin de la clase CopiaArrayUno
131
y[1] = 4.4
x[0] = 8.8
x[1] = 4.4
y[0] = 8.8
y[1] = 4.4
En salida del programa se puede observar la prdida de informacin del tercer elemento del arreglo y
con valor de 5.5, adems de que al asignarle un valor a la localidad x[0] = 8.8, sucede que afecta
tambin al arreglo y en su localidad 0. Si es lo que se desea en un programa, puede ser til, pero si
no, entonces se pierde informacin.
Para copiar arreglos sin prdida de informacin tenemos el mtodo El siguiente ejemplo de
inicializacin de arreglos y copia de arreglos con el mtodo:
arraycopy(Object src, int srcPos, Object dst, int dstPos, int count)
donde src y dst son los arreglos fuente y destino. srcPos es la posicin de inicio en el ndice del
arreglo fuente, dstPos es la posicin de inicio en el arreglo destino y count es el nmero de
elementos que van a ser copiados. Veamos el siguiente ejemplo:
Si quieresobtener el cdigo clic con el botn derecho aqu ArraysIniDos.zip
/**
* Programa de Java que te ensea a copiar
* arreglos (arrays). La inicializacin
* se efecta en tiempo de compilacin, dando los
* valores entre llaves. La copia se hace
* mediante el mtodo arraycopy() lo cual
* evita la prdida de informacin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CopiaArrayDos.java
*/
class CopiaArrayDos
{ // prueba del mtodo System.arraycopy()
public static void main(String args[])
{
double[] x = {2.2, 4.4};
print(x, "x");
double[] y = {1.1, 3.3, 5.5};
print(y, "y");
System.arraycopy(x, 0, y, 0, x.length); // copia x en y
print(y, "y");
x[0] = 8.8;
print(x, "x");
print(y, "y");
}
static void print(double[] u, String id)
{
for (int i=0; i<u.length; i++)
System.out.println(id + "[" + i + "] = " + u[i]);
System.out.println();
}
} // fin de la clase CopiaArrayDos
132
133
134
a = "[C@bd0108"
a.length = 7
a[0] = A
a[1] = B
a[2] = C
135
s.charAt(3)
s.charAt(4)
s.charAt(5)
s.charAt(6)
=
=
=
=
D
E
F
G
a[3]
a[4]
a[5]
a[6]
=
=
=
=
D
E
F
G
Ejemplo
Programa
Comentarios
Alfabeto.java
Subcadenas.java
Cambiamayusminus
.java
BusquedaDeCaracte
res.java
Reemplaza.java
ConvierteValorPrimi
tivo.java
PrimitivoaCadena.ja
va
Mtod
os
ejempl
ificado
s
String.le
ngth(),
String.c
harAt(),
String.in
dexOf(),
String.h
ashCod
e().
String.s
ubstring
()
String.t
oLower
La clase String contiene mtodos que hacen posible
Case(),
cambiar de maysculas a minsculas y viceversa en
String.t
una cadena.
oUpper
Case()
String.in
dexOf(),
String.la
La clase String tiene mtodos que regresan el ndice
stIndex
de un caracter dentro de la cadena o el mismo
Of(),
caracter dando el ndice.
String.s
ubstring
()
La clase String de Java tiene el mtodo replace()
String.r
para remplazar un caracter dentro de una cadena.
eplace()
Pasando tipos de datos primitivos a cadenas y
viceversa, con el mtodo valueof() de la clase String String.v
para pasar el valor de variables de tipo primitivo a
alueOf()
cadenas.
Java tiene mtodos en clases wrappers para cada
Integer.
tipo primitivo de dato que permiten pasar el valor de
parseInt
una variable de la clase String a su equivalente
()
vlido de tipo primitivo.
Ejemplo 1.
Haga el programa en Java tal, que dada una cadena con las letras del alfabeto romano, .
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" , diga cuantas letras tiene la cadena, que carcter se
encuentra en la posicin 4, de el ndice de la letra Z , e informe el cdigo hash de dicha cadena.
136
Ejemplo 2
Haga el programa en Java tal, que dada una cadena con las letras del alfabeto romano, .
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" , obtenga las subcadenas del ndice 4 al 8, del 4 al 4, del 4 al
5, del 0 al 8 y del 8 hasta el final de la cadena.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 2 subcadenas o substrings
public class Subcadenas
{
public static void main(String[] argumentos)
{
String alfabeto= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
System.out.println(alfabeto);
System.out.println("La subcadena de indice 4 a indice 8 es "+ alfabeto.substring(4,
8));
System.out.println("La subcadena de indice 4 a indice 4 es "+ alfabeto.substring(4,
4));
System.out.println("La subcadena de indice 4 a indice 5 es "+ alfabeto.substring(4,
5));
System.out.println("La subcadena de indice 4 a indice 8 es "+ alfabeto.substring(0,
8));
System.out.println("La subcadena de indice 4 a indice es "+ alfabeto.substring(8));
}
} // fin de Subcadenas
/*
La salida de ste programa es:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
La subcadena de indice 4 a indice 8 es EFGH
137
La
La
La
La
*/
subcadena
subcadena
subcadena
subcadena
de
de
de
de
indice
indice
indice
indice
4
4
4
4
a
a
a
a
indice
indice
indice
indice
4 es
5 es E
8 es ABCDEFGH
es IJKLMNOPQRSTUVWXYZ
Ejemplo 3.
Haga el programa en Java tal, que dada una cadena , cambie a sta todas sus letras a minsculas y
luego a maysculas.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 3 de maysculas y minsculas
public class Cambiamayusminus
{ public static void main(String[] args)
{ String cadena = "UNIVERSIDAD NACIONAL AUTONOMA DE MXICO";
System.out.println(cadena);
String minusc = cadena.toLowerCase();
System.out.println(minusc);
String mayusc = cadena.toUpperCase();
System.out.println(mayusc);
}
} // fin de Cambiamayusminus
/*
La salida del programa es:
UNIVERSIDAD NACIONAL AUTONOMA DE MXICO
universidad nacional autonoma de mxico
UNIVERSIDAD NACIONAL AUTONOMA DE MXICO
*/
Ejemplo 4.
Haga el programa en Java tal, que dada una cadena , busque un carcter en dicha cadena, y reporte
su posicin o ndice de cada ocurrencia
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 4 de localizar un caracter dentro de una cadena y viceversa
public class BusquedaDeCaracteres
{ public static void main(String[] argumentos)
{ String cad = "UNIVERSIDAD NACIONAL AUTOMA DE MXICO.";
System.out.println(cad);
int i = cad.indexOf('A');
System.out.println("El primer indice de 'A' es " + i);
int j = cad.indexOf('A', i+1);
System.out.println("El siguiente indice de 'A' es " + j);
int k = cad.indexOf('A', j+1);
System.out.println("El siguiente indice de 'A' es " + k);
138
k = cad.lastIndexOf('A');
System.out.println("El ltimo indice de 'A' es " + k);
System.out.println(cad.substring(k));
}
} // fin de BusquedaDeCaracteres
/*
UNIVERSIDAD NACIONAL AUTOMA DE MXICO.
El primer indice de 'A' es 9
El siguiente indice de 'A' es 13
El siguiente indice de 'A' es 18
El ltimo indice de 'A' es 26
A DE MXICO.
Finished executing
*/
Ejemplo 5.
Haga el programa en Java tal, que dada una cadena , busque un carcter en dicha cadena, y
reemplace ste por otro carcter.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 5 de reemplazar un caracter dentro de una cadena
public class Reemplaza
{ public static void main(String[] argumentos)
{ String institucion= "INSTITUTO POLITCNICO NACIONAL";
System.out.println(institucion);
System.out.println(institucion.replace('T', 'Q'));
System.out.println(institucion.replace('O', '#'));
System.out.println(institucion);
}
} // fin de Reemplaza
/*
La salida del programita es:
INSTITUTO POLITCNICO NACIONAL
INSQIQUQO POLIQCNICO NACIONAL
INSTITUT# P#LITCNIC# NACI#NAL
INSTITUTO POLITCNICO NACIONAL
*/
Ejemplo 6.
Haga el programa en Java tal, que dadas unas variables primitivas boolean b = true;
int n = 123; double x = 3.1415926535897932; convierta sus valores a cadenas.
char c = '';
139
Ejemplo 7.
Haga el programa en Java tal, que dada una cadena que contenga la fecha Jun 22, 2002, extraiga
el da y el ao y los convierta en enteros, y calcule la fecha de la semana siguiente.
// Curso de Java Bsico
// Autor: Oscar A. Gonzlez Bustamante
// Ejemplo 7 convierte cadenas a tipos de datos primitivos
public class PrimitivoaCadena
{ public static void main(String[] argumentos)
{ String hoy= "Jun 22, 2002";
String cadenaDiaHoy = hoy.substring(4, 6);
int cadenaDiaInt = Integer.parseInt(cadenaDiaHoy);
int sigDiaSemanaInt = cadenaDiaInt + 7;
String sigFechaSemana = hoy.substring(0, 4) + sigDiaSemanaInt + hoy.substring(6);
System.out.println("La fecha de hoy es " + hoy);
System.out.println("El dia de hoy es " + cadenaDiaInt);
System.out.println("El siguiente dia de la semana es " + sigDiaSemanaInt);
System.out.println("La siguiente fecha de la semana es " + sigFechaSemana);
}
140
} // fin de PrimitivoaCadena
/*
La salida del programa es:
La fecha de hoy es Jun 22, 2002
El dia de hoy es 22
El siguiente dia de la semana es 29
La siguiente fecha de la semana es Jun 29, 2002
*/
Primero: un objeto es creado o instanciado con new como cualquier otro objeto.
141
}
Manejadores de Excepcin
En nuestro cdigo cuando dentro del bloque try se lanza una excepcin , hay que capturarla con
catch y manejarla segn su tipo con el manejador de excepcin adecuado, ya que podemos poner
varios catch para los diferentes tipos de errores que sucedan:
try {
// Codigo que puede genera excepciones
} catch(Tipo1 id1) {
// Manejo de excepciones del Tipo1
} catch(Tipo2 id2) {
// Manejo de excepciones del Tipo2
} catch(Tipo3 id3) {
// Manejo de excepciones del Tipo3
}
// etc...
7.2.1 Ejemplos de try / catch
Primeramente veamos que sucede cuando no hay un bloque try - catch para proteger nuestro
cdigo y capturar una posible excepcin, el ejemplo de divisin por cero es intencional para
Siquieres obtener el cdigo clic con el botn derecho aqu EjemploExcepcin.java
1.
2.
3.
4.
/**
* Programa de Java que te ensea que pasa cuando
* no manejas una excepcin.
* @autor Oscar A. Gonzlez Bustamante
142
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
* @version 1.0
* Archivo: EjemploExcepcion.java
*/
class EjemploExcepcion
{
public static void main(String args[])
{
int divisor = 0;
int cociente = 1234/divisor;
}
}
/**
* Programa de Java que te ensea que pasa cuando
* no manejas una excepcin dentro de un mtodo.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: EjemploExcepcion2.java
*/
class EjemploExcepcion2
{
static void excepcional()
{
int divisor = 0;
int cociente = 1234/divisor;
}
public static void main(String args[])
{
EjemploExcepcion2.excepcional();
}
}
143
excepcional().
Ahora vamos a tratar la excepcin para que el programa sepa que hacer cuando se arroje el error de
divisin por cero. El siguiente ejemplo de programa muestra como podemos usar el try - catch para
ello:
Siquieres obtener el cdigo clic con el botn derecho aqu EjemploExcepcinCapturada.java
/**
* Programa de Java que te ensea que pasa cuando
* manejas una excepcin con el try - catch.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: EjemploExcepcionCapturada.java
*/
class EjemploExcepcionCapturada
{
public static void main(String args[])
{
try
{
int divisor = 0;
int cociente = 1234/divisor;
}
catch (ArithmeticException excepcion)
{
System.out.println("Excepcion de division por cero.");
System.out.println("El mensaje del tipo de error es:"
+ excepcion.getMessage() );
System.out.println("La descripcin de este error es:"
+ excepcion.toString() );
}
}
}
La salida de ste programa al ejecutarlo con el comando java EjemploExcepcionCapturada es:
Excepcion de division por cero.
El mensaje del tipo de error es:/ by zero
La descripcin de este error es:java.lang.ArithmeticException: / by zero
Finished executing
Vemos el efecto de utilizar el mtodo getMessage() de la clase Throwable que es la de obtener
una cadena del tipo de error "/ by zero" y la descripcin de este error lo obtenemos con el mtodo
toString() de la clase Object el cual nos da "java.lang.ArithmeticException: / by zero" que es una
informacin til para saber de que tipo de error o excepcin estamos tratando.
7.3 La clusula finally
Esta clusula se utiliza cuando tengamos que hacer determinada accin necesariamente, para
asegurarnos que se va a realizar conviene crear una excepcin, pero es conveniente usar una clusula
dentro de la sentencia try que esta diseada con ese propsito, es la clusula finally.
try {
//aqui va cdigo que puede lanzar una excepcin
}
144
catch (Tipo1 e)
{
// aqu va el cdigo para tratar la excepcin del Tipo 1
}
finally
{
// Aqu en el bloque finally es donde se ejecutan
// las sentencias que se quieran siempre ejecutar
// haya o no excepcin
}
37.
/**
* Programa de Java que te ensea que pasa cuando
* no manejas una excepcin con try - catch e incluyes
* la clusula finally ( que siempre se ejecutar, haya
* o no error o excepcin )
* @version 1.0
* Archivo: EjemploFinally.java
*/
public class EjemploFinally
{
public static void main(String args[])
{
try
{ //probar con divisor <> 0 finally se ejecutara de todos modos
int divisor = 0; // cambiar divisor = 10 para ver que sucede.
int dividendo = 1234;
int cociente = dividendo/divisor;
System.out.println(" divisor = " + divisor +
"\n dividendo = " + dividendo +
"\n cociente = " + cociente );
}
catch (ArithmeticException excepcion)
{
System.out.println(" Excepcion de division por cero:"
+ excepcion.getMessage() );
}
finally
{
System.out.println(" Aqu en el bloque finally se ejecutan " +
"las sentencias haya o no excepcin");
}
System.out.println(" Este puede ser un bloque de instrucciones");
System.out.println(" que puede continuar despues del finally");
}
} // fin de la clase EjemploFinally
145
divisor = 10
dividendo = 1234
cociente = 123
Aqu en el bloque finally se ejecutan las sentencias haya o no excepcin
Este puede ser un bloque de instrucciones
que puede continuar despues del finally
Observe el lector que lo que esta dentro del bloque try se ejecutar si no hay excepcin y si la hay se
ejecutar lo que este dentro del bloque catch, pero en ambos casos siempre se ejecutarn las
sentencias que se encuentren dentro del bloque finally.
/**
* Programa que muestra el uso de throw para
* lanzar excepciones de manera explcita
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: Upcasting.java
*/
class EjemploExcepcionExplicita
{
146
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
/**
* Programa que muestra el uso de throw para
* lanzar excepciones de manera explcita
* @version 1.0
* @author Oscar Alejandro Gonzalez Bustamante
* Archivo: EjExcepcionExplicita2.java
*/
class EjExcepcionExplicita2
{
public static void main(String args[]) {
int divisor = (int) ( Math.random() * 5 ); // da 0 o 1 o 2 o 3 o 4 o 5
try
{
int cociente = 1234/divisor;
if ( divisor == 0 )
throw new ArithmeticException();
else
System.out.println("cociente= " + cociente );
}
catch (ArithmeticException e )
{
// codigo que maneja la excepcion
System.out.println(e.getMessage());
System.out.println("Excepcion de division por cero.");
System.out.println("La excepcion es manejada");
}
147
27.
28.
29.
30.
31.
32.
finally {
System.out.println("divisor= " + divisor );
}
System.out.println("Fin del programa.");
}
} // fin de la clase EjExcepcionExplicita2
Una posible salida al correr este programa con un divisor igual a cero con el comando java
EjExcepcionExplicita2 es el siguiente
/ by zero
Excepcion de division por cero.
La excepcion es manejada
divisor= 0
Fin del programa.
Si el divisor da un valor diferente de cero, p.ej. que divisor sea cuatro, da la siguiente salida:
cociente= 308
divisor= 4
Fin del programa.
7.4.2 Ejemplos de mtodos que lanzan excepciones
Un mtodo puede declarar que puede lanzar una o mas excepciones con throws. Por ejemplo en el
siguiente fragmento de cdigo el mtodo readDatabaseFile() puede lanzar dos tipos de
excepciones:
1.
2.
3.
4.
5.
6.
Para tener un cdigo robusto , el lenguaje Java requiere que si una excepcin ocurre mientras un
mtodo esta en el stack ( esto es, si este ha sido invocado ), el invocador de este mtodo debe
determinar que accin debe tomarse si surgen problemas.
Esto ltimo puede hacerse si se satisfacen estos requerimientos:
No tener en el mtodo invocador nada que maneje la excepcin, y la excepcin ser lanzada
hacia atrs, hacia su mtodo llamador.
Cabe sealar que un mtodo no esta obligado a manejar o declarar errores o excepciones en tiempo
de ejecucin.
Un mtodo puede declarar una excepcin que en un momento dado puede lanzar su cdigo dentro
de su cuerpo con la clusula throws como sigue:
public static void main(String args[] ) throws IOException
Seguido de la palabra llave throws hay una lista de todas las excepciones que el mtodo puede
arrojar hacia atrs a su invocador. Aunque en el mtodo main() mostrado como ejemplo solo hay
148
una sola excepcin, se puede usar la coma como separador de la lista de todas las excepciones que
pueda lanzar.
7.5 Creacin de clases de excepcin personalizadas
Es posible crear excepciones definidas por el usuario por medio de la herencia extendiendo de la clase
Exception. La clase Exception posee todo lo que una clase comn y corriente tiene. El siguiente
ejemplo es una clase de manejo de excepciones definida por el usuario, conteniendo tres
constructores, aunque tambin puedes poner , algunas variables, y mtodos.
Siquieres descargar el cdigo de este programa, dale clic con el botn derechoaqu
ExcepcionesConstruidas.zip
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
/**
* Programa que te ensea a crear tus propias
* clases para manejar excepciones, o excepciones
* personalizadas o de usuario. Ademas te
* te ejemplifica el uso de el lanzamiento de
* excepciones con costructores diferentes y
* utilizando throw ( en singular )
* y throws ( en plural ).
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ExcepcionesConstruidas
*/
class MiExcepcion extends Exception {
public MiExcepcion() {}
public MiExcepcion(String msg) {
super(" \"" + msg + "\"" );
}
public MiExcepcion( String msg, int noError ) {
super(" Error garrafal No: " + noError +
" \"" + msg + "\"" );
}
} // fin de MiExcepcion
public class ExcepcionesConstruidas {
public static void f() throws MiExcepcion {
System.out.println( " Lanzando MiExcepcion de f() ");
throw new MiExcepcion(); // invocando al contructor por default
}
public static void g() throws MiExcepcion {
System.out.println("Lanzando MiExcepcion de g()");
throw new MiExcepcion(" Originada en g() ");
}
public static void h() throws MiExcepcion {
System.out.println("Lanzando MiExcepcion de h()");
throw new MiExcepcion(" Originada en h() " , 123 );
}
public static void main(String[] args) {
try {
f();
} catch(MiExcepcion e) {
System.out.println("Capturando excepcin de tipo " + e.toString() +
" "+
"Mensaje: " + e.getMessage() );
}
try {
g();
} catch(MiExcepcion e) {
System.out.println("Capturando excepcin de tipo " + e.toString() +
149
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
" "+
"Mensaje: " + e.getMessage() );
}
try {
h();
} catch(MiExcepcion e) {
System.out.println("Capturando excepcin de Tipo: " + e.toString() +
" "+
"Mensaje: " + e.getMessage() );
}
} // fin del main()
} //fin de ExcepcionesConstruidas
/**
* Programa que te ensea a imprimir
* el volcado de pila o stack de un programa
* que tenga errores y as tener la traza de
* donde se origino el problema. Se utiliza
* el mtodo printStackTrace() de la clase
* Throwable.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: VolcadodePila.java
150
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
*/
class VolcadodePila
{ public static void metodo1() throws ErrorGarrafal
{
metodo2();
}
public static void metodo2() throws ErrorGarrafal
{
metodo3();
}
public static void metodo3() throws ErrorGarrafal
{
throw new ErrorGarrafal(); // lanzo un ErrorGarrafal
}
public static void main(String args[])
{
try
{
metodo1();
}
catch ( ErrorGarrafal eg ) // capturo un ErrorGarrafal
{System.out.println("Excepcion: ( " + eg.getMessage() + " ) ");
System.out.println("La pila de llamada es:");
eg.printStackTrace();
}
}
} // fin de la clase VolcadodePila
class ErrorGarrafal extends Exception
{
ErrorGarrafal()
{
super("Esto es un error garrafal");
}
} // fin de la clase ErrorGarrafal
151
8.1 Qu es un Flujo?
Un flujo es un sistema de comunicacin implementado en el paquete java.io cuyo fin es guardar y
recuperar la informacin en cada uno de los diversos dispositivos de almacenamiento.
Podemos imaginar un flujo como un tubo donde podemos leer o escribir bytes. No nos importa lo
que pueda haber en el otro extremo del tubo: Puede ser un teclado, un monitor, un archivo, un
proceso, una conexin TCP/IP o un objeto de Java.
Todos los flujos que aparecen en Java englobados en el paquete java.io, pertenecen a dos clases
abstractas comunes: java.io.InputStream para los flujos de Entrada (aquellos de los que podemos
leer) y java.io.OutputStream para os flujos de salida (aquellos en los que podemos escribir).
Estos flujos, pueden tener orgenes diversos (un archivo, un socket TCP, etc.), pero una vez que
tenemos una referencia a ellos, podemos trabajar siempre de la misma forma: leyendo datos
mediante los mtodos de la familia read() o escribiendo datos con los mtodos write().
Hay flujos de:
Flujos de bytes
Flujos de caracteres
152
Java al igual que cualquier otro lenguaje de programacin tiene su conjunto mtodos que le permiten
captar la informacin de flujos de entrada y enviar flujos de salida por dispositivos estndar.
Los flujos estndar son:
Se realiza mediante la clase System.in y suele recibir los datos del teclado
Utiliza el mtodo read() para conseguir leer los caracteres del teclado
Se realiza mediante la clase System.out y suele enviar los datos por pantalla
o
al usuario
Nos aseguramos que la salida va redirigida al monitor para enviar mensajes de error
El flujo de entrada ms utilizado esta asociado a el teclado, veamos el siguiente ejemplo que es
bastante ilustrativo.
Si quieres obtener elcdigo dale clic aqu HolaOscar.zip
/**
* Ejemplo: programa de flujos (streams)
* que lee tu nombre de la lnea de comandos
* y te lo muestra por la consola de salida.
* Curso de Java Bsico
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: HolaOscar.java
*/
import java.io.*;
public class HolaOscar {
public static void main(String[] args) throws IOException
{
InputStreamReader lector = new InputStreamReader(System.in);
BufferedReader entrada = new BufferedReader(lector);
System.out.print("Cual es tu nombre? ");
String nombre = entrada.readLine();
System.out.println("Hola " + nombre + "!");
}
}// fin de la clase HolaOscar
Da tu nombre: Oscarin
Hola, Oscarin!
153
En la siguiente figura vemos el proceso de tomar los datos del flujo estndar de entrada System.in
asociado al teclado con la creacin del objeto lector de la clase InputStreamReader. Luego
con el objeto lector lo utilizamos como argumento del constructor de un objeto entrada de la
clase BufferReader, el cual tiene mtodos como readLine(), para leer el conjunto de bytes del
buffer hasta el final de la lnea. Finalmente utilizamos el mtodo println() de System.out que esta
asociado al flujo estndar de salida para presentar los datos por la consola o monitor.
154
/**
* Ejemplo: programa de flujos (streams)
* que lee el valor del radio desde el teclado y calcula
* el rea del circulo. La cadena del nmero see lee
* con un flujo de entrada que luego es convertido a
* formato de nmero de tipo double con doubleValue()
* de la clase wrapper Double . El programa calcula el
* rea del circulo en base al radio dado y presenta el
* resultado por pantalla.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: AreaCirculo.java
*/
import java.io.*;
public class AreaCirculo{
public static void main(String[] args) throws IOException
{
InputStreamReader lector = new InputStreamReader(System.in);
BufferedReader entrada = new BufferedReader(lector);
System.out.print("Introduce valor del radio: ");
String texto = entrada.readLine();
Double x = new Double(texto);
double r = x.doubleValue();
System.out.println("El area de un circulo de radio "+ r );
double area = r*r*Math.PI;
System.out.println(" es " + area);
}
}// fin de la clase AreaCirculo
Para correr el programa hay que ejecutar la sentencia java AreaCirculo y presenta los siguientes
resultados si se le da como radio el valor de 10.
Introduce valor del radio: 10
El area de un circulo de radio 10.0
es 314.1592653589793
8.3 Los flujos que ofrece java.io
Java ofrece dos clases abstractas para manejar los flujos de datos procedentes de equipos remotos o
archivos y son java.io.OutputStream y java.io.InputStream, a continuacin presentamos la
jerarqua de estas clases clases .
Object
o
InputStream
FileInputStream
FilterInputStream
PushbackInputStream
BufferedInputStream
LineNumberInputStream
StringBufferInputStream
ByteArrayInputStream
155
SequenceInputStream
PipedInputStream
OutputStream
ByteArrayOutputStream
PipedOutputStream
FileOutputStream
FilterOutputStream
PrintStream
BufferedOutputStream
DataOutputStream
Algunas de estas clases van a aparecer junto con algunos de sus mtodos, en los ejemplos que
veremos mas adelante.
156
Veamos el siguiente ejemplo que muestra el uso del mtodo read() para leer bloques de bytes.
Si quieres obtener elcdigo dale clic aqu EscribeNombres.zip
/**
* Ejemplo: programa de flujos (streams)
* que lee el flujos de bytes. Las cadenas a leer se
* almacenan en los arreglos de bytes buffer1 y buffer2.
* Ambos tiene un tamao especfico de 20 bytes y
* son ledos con el mtodo read(). Luego instanciamos
* dos objetos de la clase String con dichos buffers.
* Finalmente los enviamos por System.out.println() a
* la pantalla o consola de salida, y usamos el mtodo
* trim() para eliminar los espacios blancos o vacos.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: EscribeNombres.java
*/
public class EscribeNombres
{ public static void main(String[] args)
{ final int LON = 20 ;
byte[] buffer1 = new byte[LON];
System.out.print("Introduce tu apellido: ");
try { System.in.read(buffer1, 0, LON) ; }
catch (Exception e) {}
String apellido = new String(buffer1) ;
byte[] buffer2 = new byte[LON];
System.out.print("Introduce tu nombre: ");
try { System.in.read(buffer2, 0, LON) ; }
catch (Exception e) {}
String nombre = new String(buffer2) ;
System.out.println("Hola , " + nombre.trim() + " "
+ apellido.trim());
}
} // fin de la clase EscribeNombres
La salida del programa al ejecutarlo con el comando java EscribeNombres es:
Introduce tu apellido: GONZALEZ
Introduce tu nombre: OSCAR
Hola , OSCAR GONZALEZ
Cerrar el flujo de entrada. Cuando ya no necesitamos leer datos de un flujo de entrada, se tienen
que liberar los recursos reservados mediante el mtodo close(). Si no cerramos el InputStream
explcitamente, el flujo asociado se cierra cuando se destruye el objeto.
Escritura de bytes individuales. La clase OutputStream dispone de varios mtodos write().
Ejemplo:
OutputStream os = ..;
int dato = 777;
os.write(dato);
Como en el caso del mtodo read() de la clase InputStream, el mtodo write() recibe un byte
157
158
159
Ya sea para leer o para escribir en un archivo, estos se manipulan con flujos de acceso a archivos. En
Java tenemos la clase FileInputStream , con los mtodos necesarios para abrir e interactuar con
un canal de comunicacin hacia un archivo de entrada para nuestra aplicacin, y la clase
FileOutputStream para el caso de un archivo de salida.
La clases FileInputStream y FileOutputStream reciben en uno de sus constructores como
parmetro el nombre del archivo a leer o escribir. Hay otras dos variantes: una que recibe un
objeto de tipo File y otra que recibe un objeto de tipo FileDescriptor. En la seccin siguiente veremos
la primera variante y como se utiliza la clase File para dicho fin.
8.7.1 Ejemplos de la clase File
En este primer ejemplo de la clase File muestra el uso de algunos de sus mtodos para manejo de
archivos:
Si quieres obtener elcdigo dale clic aqu FlujoArchivos2.zip
/**
* Programa de java que ejemplifica el uso
* de la clase File, demostrando el acceso a
* archivos y carpetas
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: FlujoArchivos2.java
*/
import java.io.*;
import java.util.Date;
public class FlujoArchivos2
{
static String ruta = "C:\\j2sdk141\\ejemplos\\";
static String[] archivos = { new String("Aeropuerto.java"),
new String("IncrementoDecremento.java") };
static String archi = archivos[1];
static void prhr(char c, int lim) { for(int i=0; i<lim ; i++) System.out.print(c); }
public static void main(String[] argumentos)
{
int parcial,total=0,tamao=0;
char car;
boolean lectura, escritura;
String nombre, directorio;
long modificado;
try
{
File f = new File(ruta+archi);
prhr('-',80);prhr('\n',1);
if (f.exists() )
{
// mas datos sobre el archivo
System.out.println("\tArchivo : "+archi+ " encontrado con xito en: "+ ruta);
System.out.println("\tTamao del archivo(compararlo al final): " + f.length() + " Bytes");
lectura = f.canRead(); // se puede leer el archivo ?
escritura = f.canWrite(); // se puede escribir el archivo?
nombre = f.getName(); /* Nombre (sin directorio) del archivo */
directorio = f.getParent(); /* Directorio del archivo */
modificado = f.lastModified(); /* Fecha de ltima modificacin */
Date d = new Date(modificado);
if (lectura && escritura )
System.out.println("\tEs una archivo de lectura y escritura\n");
else if( lectura && !escritura)
160
161
byte j = 127;
short k = 32767;
System.out.println("c = " + c);
++c;
System.out.println("c = " + c);
++c;
System.out.println("c = " + c);
System.out.println("j = " + j);
--j;
System.out.println("j = " + j);
++j;
System.out.println("j = " + j);
++j;
System.out.println("j = " + j);
System.out.println("k = " + k);
k -= 4;
System.out.println("k = " + k);
k += 5;
System.out.println("k = " + k);
}
}//?>
-----------------------------------------------------------El tamao del archivo:(IncrementoDecremento.java:604 Bytes)
Fin del programa
El segundo ejemplo de la clase File muestra el uso de algunos de sus mtodos para manejo de carpetas o
directorios:
Si quieres obtener elcdigo dale clic aqu FlujoArchivos3.zip
/**
* Programa de java que ejemplifica el uso
* de la clase File para demostrar
* el manejo de carpetas o directorios
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: FlujoArchivos3.java
*/
import java.io.*;
import java.util.Date;
public class FlujoArchivos3
{
static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\";
static String[] lista;
static void prhr(char c, int lim) { for(int i=0; i<lim ; i++) System.out.print(c); }
static void prln(String msg) { System.out.println(msg); }
static void pr(String msg) { System.out.print(msg); }
public static void main(String[] argumentos)
{
try
{
File f = new File(ruta);
prhr('-',80);prhr('\n',1);
if (f.exists() )
{
lista = f.list(); /* Obtenemos la lista de archivos */
for (int i=0; i<lista.length; i++) /* los imprimimos */
prln("Archivo n\u00B0 "+(i+1)+": " + lista[i]);
}
162
else
System.out.println(" El directorio: " + ruta + " no existe ");
}
catch (Exception e)
{
/* directorio no encontrado */
System.err.println("Directorio no encontrado, Error: " + e.getMessage());
}
finally
{
prhr('-',60);prhr('\n',1);
}
System.out.println("Fin del programa");
} // fin del main
} //fin de la clase FlujoArchivos3
La salida del programa que muestra el contenido de archivos de la carpeta de mi computadora
C:\\j2sdk141\\ejemplos\\E-S\\ , al ejecutarlo con el comando java FlujoArchivos3 es:
-------------------------------------------------------------------------------Archivo n 1: Alumnitos.txt
Archivo n 2: Alumno.class
Archivo n 3: alumnosxsqlserver2000.sql
Archivo n 4: ArchiEnt.txt
Archivo n 5: ArchivoEnt.class
Archivo n 6: ArchivoSal.class
Archivo n 7: ArchivoSal.txt
Archivo n 8: classes
Archivo n 9: Copy.class
Archivo n 10: Copy.java
Archivo n 11: E-ASAjava.doc
Archivo n 12: E-SenJava.doc
Archivo n 13: entrada.txt
Archivo n 14: ENTSAL.bak
Archivo n 15: ENTSAL.jde
Archivo n 16: Escribe.class
Archivo n 17: EscribeNombres.class
Archivo n 18: EscribeNombres.java
Archivo n 19: EsencialJDBC.class
Archivo n 20: EsencialJDBC.java
Archivo n 21: Estudiantes.txt
Archivo n 22: Evaluador.class
Archivo n 23: Evaluador.java
Archivo n 24: EvaluadorArchi.class
Archivo n 25: EvaluadorArchi.java
Archivo n 26: EvaluadorArchivos2.class
Archivo n 27: EvaluadorArchivos2.java
Archivo n 28: EvaluadorBD2.class
Archivo n 29: EvaluadorBD2.java
Archivo n 30: EvaluadorBD3.class
Archivo n 31: EvaluadorBD3.java
Archivo n 32: Flujo1.java
Archivo n 33: FlujoArchivos1.java
Archivo n 34: FlujoArchivos2.class
Archivo n 35: FlujoArchivos2.java
Archivo n 36: FlujoArchivos3.class
Archivo n 37: FlujoArchivos3.java
Archivo n 38: Mi2doAccesoJDBC.class
Archivo n 39: MiAccesoJDBC.class
Archivo n 40: MS-DOS.LNK
Archivo n 41: Persona.class
Archivo n 42: PrintNames.class
Archivo n 43: PrintNames.java
Archivo n 44: salida.txt
Archivo n 45: src
163
Copy.zip
/**
* Ejemplo: programa de flujos (streams)
* que ejemplifica el uso de las clases
* FileInputStream y FileOutputStream para
* programar el comando copy de MS-DOS
* El programa utiliza manejo de excepciones
* de tipo java.io.IOException.
* @author Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Copy.java
*/
import java.io.*;
class Copy {
public static void main(String[] args)
{
String origen = args[0];
String destino = args[1];
byte buffer[] = new byte[1024];
int cuenta;
try {
FileInputStream fis = new FileInputStream(origen);
FileOutputStream fos = new FileOutputStream(destino);
164
while((cuenta=fis.read(buffer))>0)
fos.write(buffer,0,cuenta);
}
catch(IOException ioe) {
System.err.println("Se ha producido un error");
ioe.printStackTrace();
}
} // fin del mtodo main()
} // fin de la clase Copy
Si ejecutamos el programa Copy con el comando :
8.9 La clase DataOutputStream
Los programas que se han visto hasta ahora solo escriben bytes en un flujo de datos. A pesar de que
con estas tcnicas podramos leer y escribir cualquier cosa en un archivo, esta forma de trabajar es
relativamente pesada, ya que cada vez que quisiramos escribir, por ejemplo, un entero de 32 bits en
un archivo, tendramos que dividir los 32 bits en cuatro paquetes de 8 bits cada uno, e ir
transmitindolos a travs de flujo de datos. Para leer ese dato, el proceso sera el inverso; leer cuatro
bytes del flujo y combinarlos para obtener el nmero de 32 bits.
Como veremos, el paquete java.io nos proporciona varias herramientas para facilitarnos este trabajo.
La clase DataOutputStream
La clase DataOutputStream, es una extensin de la clase OutputStream, y aade a sta ltima
la posibilidad de escribir datos "complejos" en un flujo de salida. Cuando hablamos de datos
"complejos", en realidad nos referimos a tipo de datos primitivos, pero no restringidos nicamente a
bytes y a matrices de bytes, como en el caso de OutputStream.
Mediante la clase DataOutputStream podemos escribir datos de tipo int, float, double, char,
etc.
Adems podemos escribir algunos objetos, como datos de tipo String, en una gran cantidad
de formatos.
La forma general de trabajar con objetos de tipo DataOutputStream es la siguiente: obtenemos un
objeto OutputStream (cuyo origen puede ser cualquiera, un archivo, un socket, una matriz en
memoria, la salida estndar, etc.) y lo "envolvemos" en un objeto DataOutputStream, de forma
que podamos usar la interfaz que nos proporciona este ltimo. Para crear este DataOutputStream,
le pasamos como parmetros el OutputStream a su constructor.
Cada vez escribamos un dato "complejo" en un objeto DataOutputStream. Este lo traducir a bytes
individuales, y los escribir en el OutputStream subyacente, sin que nosotros tengamos que
preocuparnos de la forma en que lo hace.
Veamos algunos ejemplos:
OutputStream os = ... ;
165
writeUTF() escribe la cadena en un formato conocido como UTF-8. Este formato incluye
informacin sobre la longitud exacta de la cadena.
La conclusin importante que debemos extraer de estos tres ltimos mtodos es que slo el ltimo
nos permite recuperar la cadena con facilidad. Los otros dos mtodos no incluyen informacin sobre
la longitud de la cadena, por lo que si otro programa necesita leer los datos que nosotros hemos
escrito, es necesario conocer con anticipacin la longitud de la cadena. Si no sabemos esto, es
imposible saber el nmero de bytes o de valores char que debemos leer.
Un fragmento de cdigo ejemplo de utilizacin de estos mtodos es:
Strng cadena1 = "Me voy a descomponer en una cadena de texto de bytes individuales";
String cadena2 = "Me voy a descomponer en una cadena de texto de chars individuales";
String cadena3 = "Me voy a descomponer en una cadena de texto en formato UTF-8 ";
dos.writeBytes(cadena1);
dos.writeChars(cadena2):
dos.writeUTF(cadena3);
Si podemos escribir datos formateados entonces tambin podemos leerlos cmodamente. Esta
funcin es posible porque disponemos de la clase DataInputStream.
La clase DataInputStream est diseada para leer datos generados por un objeto
DataOutputStream. La especificacin de esta clase garantiza que cualquier archivo escrito por un
DataOutputStream, sobre cualquier plataforma y sistema operativo, ser legible correctamente por
un DataInputStream, sin tener necesidad de preocuparse de que si las mquinas son "littleendian" o "big-endian".
166
Supongamos que estamos intentando leer los datos escritos por el programa de ejemplo anterior
(donde escribamos un int, un float y un double en un flujo de salida):
InputStream is = ... ; // creamos un flujo de entrada
DataInputStream dis = new DataInputStream( is );
int x;
float y;
double z;
x = dis.readInt();
y = dis.readFloat();
z = dis.readDouble();
dis.close();
is.close();
Qu pasa si deseamos leer las cadenas de texto que hemos escrito?. Es inmediato leer la cadena
escrita en formato UTF. En cambio, leer las otras dos cadenas nos va a costar ms trabajo, ya que
debemos leer los bytes o los chars individuales, juntarlos de forma adecuada y construir la cadena
resultante.
En este caso usaremos un truco , ya que sabemos que las cadenas cadena1 y cadena2 tienen una
longitud de 65 letras exactamente. En una situacin normal, puede que no tengamos esta
informacin.
int tam = 65; // Aplicamos el truco
InputStream is =...; //creamos el flujo de entrada
DataInputStream dis = new DataInputStream( is );
byte miNuevoArray[] = new byte [ tam ];
dis.readFully(miNuevaArray); /* Este mtodo es nuevo */
String cadenaConvertida = new String(miNuevaArray,0=;
// Ahora tenemos que leer un montn de caracteres char de (16 bits)
// que forman el siguiente String escrito.
// Hay que hacer un bucle para ir leyendo los caracteres uno por uno
char otroArrayMas[] = new char[tam]:
for( int n = 0 ; n < tam ; n++ )
otroArrayMas[ s ] = dis.readChar();
String otraCadenaconvertida = new String( otroArrayMas );
// Solo resta leer el String en formato UTF-8
// Unicamente con llamar a readUTF(), ya que la longitud
// del String est indicada en el propio archivo.
String ultimaCadena = dis.readUTF();
167
int c:
while( ( c = bais.read() ) != -1 )
168
condicion = ;
}
byte[] bufferSalida = baos.toByteArray();
Una vez ejecutado el cdigo anterior obtenemos una matriz de bytes con todos los datos que se han
ido introduciendo en la iteracin del bucle.
siguiente
programa
utilizando
las
clases
DataInputStream
Un profesor de computacin lleva las calificaciones de sus alumnos en una libreta y desea calcular las
calificaciones de estos. El promedio total para cada alumno ser : 50% para la calificacin de
Windows, 25% para la de Word y 25% para la de Excel. Si el alumno saca 10 la calificacin ser
Sobresaliente, si obtiene entre 9 a 9.999 su calificacin ser Muy Bien, si obtiene entre 8 a 8.9999
su calificacin ser Bueno, si obtiene de 7 a 7.999 su calificacin ser De pansazo y si obtiene
entre 0 a 6.999 su calificacin ser Burro no aprobado.
El rea que esta en gris debe ser calculada con frmulas. Los datos deben leerse de un archivo de
entrada: entrada.txt y los resultados en un archivo de salida: salida.txt.
I d Apellidos Nombre C
1 D a v o l i o N a n c y Representante de ventas S r t a .
8.00
8.19
9.04
2 F u l l e r A n d r e w Vicepresidente comercial D
8.00
9.00
6.00
8.00
8.00
8.00
r a
8.32
8.00
8.00
5 Buchanan S t e v e n G e r e n t e d e v e n t a s S
10.00
8.00
10.00
6 S u y a m a M i c h a e l Representante de ventas S
8.00
5.00
8.00
7 K i n g R o b e r t Representante de ventas S
8.91
8.00
9.00
8.00
8.00
1.14
7.50
5.57
8.00
Informacin
general
Mxima Calificacin
Promedi
o
ALumno
de
rendimiento
del
Mnima Calificacin
Promedi
o
Alumno
grupo
de
estudian
Solucin: La clase EvaluadorArchivos tiene el mtodo main() que arranca todo el proceso, y en l
estn los nombres de los archivos entrada.txt y salida.txt para el manejo de los datos. Tambin se
leen todos los datos del archivo entrada.txt para asignrselos al arreglo p de la clase Alumnos en el
bucle while de la lnea 116 a la 119.
169
Despus se invocan a algunos mtodos estticos de clase para el clculo de los datos estadsticos.
As, el mtodo esttico de clase PromediosGenerales(Alumno z[]) devuelve el promedio de
cada alumno y recibe el arreglo de la clase Alumno. El mtodo maxYminCalif(Alumno w[])
hace el trabajo de obtener que alumnos obtuvieron la mxima y mnima calificacin y los imprime, y
finalmente el mtodo varianzaPromedios(Alumno v[],double media) calcula la varianza, en
base a la media que se le envia como argumento.
Si quieres obtener todo el cdigo de este ejemplo dale clic aqu EvaluadorArchivos2.zip
1.
/**
2.
* Programa de java que ejemplifica el uso
3.
* de las clases DataInputStream y DataOutputStream
4.
* para ensearte a usar datos con formato en archivos.
5.
* @autor Oscar A. Gonzlez Bustamante
6.
* @version 1.0
7.
* Archivo: EvaluadorArchivos2.java
8.
*/
9.
10.
public class EvaluadorArchivos2 {
11.
12.
static void
imprime( Alumno x[] ) {
13.
final int band=1;
14.
15.
if( band ==1)
16.
System.out.println("Id\tNombre\tApellidos\tCargo\tTrato\tWindows\tWord\tExcel\tPromedio\tCalificac
ion");
17.
18.
for (int i=0; i< x.length; i++) {
19.
System.out.println(""+x[i].id
+ "\t" +
20.
x[i].nombre
+ "\t" +
21.
x[i].apellidos
+ "\t" +
22.
x[i].cargo
+ "\t" +
23.
x[i].getExamen(1)
+ "\t" +
24.
x[i].getExamen(2)
+ "\t" +
25.
x[i].getExamen(3)
+ "\t" +
26.
x[i].getPromedio()
+ "\t" +
27.
x[i].getCalificacion() + "\t" );
28.
Escribe.ponRaya(100,"-");
29.
}
30.
31.
}
32.
33.
static double PromediosGenerales(Alumno z[]) {
34.
double sumaWindows=0.0, sumaWord=0.0, sumaExcel= 0.0, sumaGrupo= 0.0;
35.
double promWindows=0.0, promWord=0.0, promExcel= 0.0, promGrupo= 0.0;
36.
37.
System.out.println();
38.
Escribe.ponRaya(100,"=");
39.
System.out.println("Informacin general del rendimiento del grupo de estudiantes");
40.
Escribe.ponRaya(100,"=");
41.
42.
for (int i=0; i< z.length; i++) {
43.
sumaWindows = sumaWindows + z[i].getExamen(1);
44.
sumaWord = sumaWord + z[i].getExamen(2);
45.
sumaExcel = sumaExcel + z[i].getExamen(3);
46.
sumaGrupo = sumaGrupo + z[i].getPromedio();
47.
}
48.
49.
promWindows = sumaWindows / z.length;
50.
promWord = sumaWord / z.length;
51.
promExcel = sumaExcel / z.length;
52.
promGrupo = sumaGrupo / z.length;
53.
170
54.
System.out.println("\tPromedio de Windows:"+ promWindows + "\n" +
55.
"\tPromedio de Word: " + promWord
+ "\n" +
56.
"\tPromedio de Excel: " + promExcel
+ "\n" +
57.
"\tPromedio del Grupo: " + promGrupo);
58.
59.
System.out.println("");
60.
61.
return promGrupo;
62.
63.
}
64.
65.
public static void maxYminCalif(Alumno w[]) {
66.
double maxima=0.0, minima=0.0;
67.
int burro= 0, estrellita= 0;
68.
System.out.println();
69.
maxima = w[0].getPromedio();
70.
minima = w[0].getPromedio();
71.
for(int i=1; i< w.length; i++){
72.
if ( maxima < w[i].getPromedio() ) {maxima = w[i].getPromedio();
estrellita = i; }
73.
if ( minima > w[i].getPromedio() ) {minima = w[i].getPromedio(); burro =
i; }
74.
}
75.
Escribe.ponRaya(40,"-");
76.
System.out.println("\tMaxima Calificacion:" +
77.
"\n\tAlumno:" + w[estrellita].nombre + " " + w[estrellita].apellidos
+
78.
"\n\tPromedio:" + maxima);
79.
System.out.println();
80.
System.out.println("\tMinima Calificacion:" +
81.
"\n\tAlumno:" + w[burro].nombre + " " + w[burro].apellidos +
82.
"\n\tPromedio:" + minima);
83.
84.
}
85.
86.
public static void varianzaPromedios(Alumno v[],double media) {
87.
double ds=0.0, varianza = 0.0;
88.
89.
for (int i=0; i < v.length; i++) {
90.
ds = ds + Math.pow(media - v[i].getPromedio(),2);
91.
}
92.
ds = ds/ v.length;
93.
94.
varianza = Math.sqrt(ds);
95.
Escribe.ponRaya(40,"-");
96.
System.out.println("\tVarianza de los promedios:" + varianza);
97.
}
98.
99.
public static void main( String args[] ) {
100.
101.
String[] archivos = { new String("salida.txt"), new String("entrada.txt") };
102.
String archient = archivos[1];
103.
String archisal = archivos[0];
104.
105.
double lamedia = 0.0;
106.
107.
Alumno p[] = new Alumno[9];
108.
109.
// Crea un flujo de entrada
110.
ArchivoEnt archivo_secu = new ArchivoEnt(archient);
111.
112.
113.
// Mientras no se encuentre el final del archivo sigue leyendo
114.
171
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
int i=0;
while (i<p.length) {
p[i] = archivo_secu.leer();
i++;
}
archivo_secu.cerrar();
133.
134.
imprime(p);
lamedia=PromediosGenerales(p);
maxYminCalif(p);
varianzaPromedios(p,lamedia);
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
Al ejecutar este programa con el comando java EvaluadorArchivos2 da los siguientes resultados:
Id Nombre Apellidos Cargo Trato Windows Word Excel Promedio Calificacion
1 Davolio Nancy Representante de Ventas 8.0 8.19 7.04 7.807499999999999 Muy Bien
---------------------------------------------------------------------------------------------------2 Fuller Andrew Vicepresidente comercial 8.0 9.0 6.0 7.75 Muy Bien
---------------------------------------------------------------------------------------------------3 Leverling Janet Representante de Ventas 8.0 8.0 8.0 8.0 Muy Bien
---------------------------------------------------------------------------------------------------4 Peacock Margaret Representante de Ventas 8.32 8.0 8.0 8.16 Muy Bien
---------------------------------------------------------------------------------------------------5 Buchanan Steven Gerente de Ventas 10.0 8.0 10.0 9.5 Muy Bien
---------------------------------------------------------------------------------------------------6 Suyama Michael Representante de Ventas 8.0 5.0 8.0 7.25 Muy Bien
---------------------------------------------------------------------------------------------------7 King Robert Representante de Ventas 8.91 8.0 9.0 8.705 Muy Bien
---------------------------------------------------------------------------------------------------8 Callahan Laura Cordinador ventas interno 8.0 1.14 5.57 5.6775 Muy Bien
---------------------------------------------------------------------------------------------------9 Dodsworth Anne Representante de ventas 8.0 7.5 8.0 7.875 Muy Bien
---------------------------------------------------------------------------------------------------=====================================================================
===============================
Informacin general del rendimiento del grupo de estudiantes
=====================================================================
===============================
Promedio de Windows:8.35888888888889
172
La clase ArchivoEnt hace el trabajo de leer los datos del archivo entrada.txt . La ubicacin de ese
archivo es especificada por la variable String ruta en la lnea 14 y puede ser cambiada.
/**
* Clase publica ArchivoEnt y que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArchivoEnt.java
*/
import java.io.*;
public class ArchivoEnt {
static String ruta = "C:\\j2sdk141\\ejemplos\\E-S\\";
private File fichero;
private FileInputStream f;
private DataInputStream ent;
boolean fin;
ArchivoEnt(String nombarchent) {
try {
fin = false;
fichero = new File(ruta+nombarchent);
f = new FileInputStream(fichero);
ent = new DataInputStream( f );
} catch(IOException ioe) {
System.err.println("Se ha producido un Error: " + ioe.getMessage());
ioe.printStackTrace();
}
}
173
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
La clase ArchivoSal hace el trabajo de escribir los datos del archivo salida.txt . La ubicacin de
ese archivo es especificada por la variable String ruta en la lnea 14 y puede ser cambiada.
/**
* Clase publica ArchivoSal y que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArchivoSal.java
*/
174
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
import java.io.*;
1.
2.
3.
4.
5.
6.
7.
8.
9.
/**
* Clase publica Persona que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Persona.java
*/
60.
} // fin de la clase de ArchivoSal
La clase Persona establece los campos y mtodos accesores get y modificadores o mutadores set
para obtener o cambiar los valores de las variables miembro de la clase. Esta clase heredar todos
estos miembros a su subclase Alumno y que son utilizados a lo largo del programa ejemplo.
175
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
La clase Alumno que es hija de la clase Persona . En esta clase se manejan las calificaciones de los
exmenes de cada alumno con las variables de tipo doble exa1, exa2 y exa3, la media o
promedio con la variable de tipo doble promedio y la calificacin con la variable String
calificacion.
Tiene los mtodos getPromedio() y setPromedio() que hacen las operaciones del clculo del
promedio ponderado, y los mtodos setCalificacion() y getCalificacin() para la obtencin de la
calificacin en base al promedio. Implementa la interface ConstantesUtiles para manejar un arreglo
de Strings para asignar la calificacin.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
/**
* Clase publica Alumno y que es subclase
* de la clase Persona y que es necesaria para el
* programa EvaluadorArchivos2.java y que ensea a
* utilizar las clases DataInputStream y DataOutputStream
* para usar datos con formato en archivos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Alumno.java
*/
176
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
int noexa) {
//windows
//word
//excel
177
77.
78.
} // fin de Alumno
La interface ConstantesUtiles solo sirve para declarar un arreglo constante de objetos String para cada una
de las calificaciones y se utiliza en la clase Alumno.
1.
/**
2.
* Interface publica con constantes que necesita
3.
* el programa EvaluadorArchivos2.java y que ensea a
4.
* utilizar las clases DataInputStream y DataOutputStream
5.
* para usar datos con formato en archivos.
6.
* @autor Oscar A. Gonzlez Bustamante
7.
* @version 1.0
8.
* Archivo: ConstantesUtiles.java
9.
*/
10.
11.
public interface ConstantesUtiles {
12.
13.
public static String calificativo[] = {
14.
"Sobresaliente", "Muy Bien","Bien","De pansazo","Burro no aprobado" };
15.
} // fin de la interface ConstantesUtiles
16.
Finalmente la clase Escribe tiene el mtodo ponRaya( int lim, String simb ) el cual se emplea para escribir
lneas de smbolos para separar los resultados de la salida y su uso es utilitario.
1.
/**
2.
* Clase publica Escribe y que es necesaria para el
3.
* programa EvaluadorArchivos2.java y que ensea a
4.
* utilizar las clases DataInputStream y DataOutputStream
5.
* para usar datos con formato en archivos.
6.
* @autor Oscar A. Gonzlez Bustamante
7.
* @version 1.0
8.
* Archivo: Escribe.java
9.
*/
10.
class Escribe {
11.
public static void ponRaya(int lim, String simb) {
12.
for (int i = 1; i <= lim; i++)
13.
System.out.print(simb);
14.
System.out.println();
15.
}
16.
} // fin de la clase Escribe
178
Siempre que se desea crear un paquete de clases empleamos la palabra reservada package con
la siguiente sintaxis:
package nombre_del_paquete;
siendo esta definicin la primera primera lnea de cdigo no comentada dentro de un programa
de Java, salvo comentarios , dentro del archivo fuente.
Los paquetes pueden ser organizados, mediante importaciones, en una estructura jerrquica
anloga a la que se establece entre las clases al emplear los mecanismos de herencia. De hecho,
las propias libreras del lenguaje estn organizadas de este modo. El nombre del paquete refleja
su origen y el lugar que ocupa en la jerarqua. La empresa Sun ha especificado un convenio de
nombres que consiste en comenzar el nombre de paquete con el nombre de dominio usado en
Internet por los creadores del paquete, pero con el orden invertido. Adems el dominio de mas
alto nivel ( com, mil, org, mx, edu, etc. ) se escribe en maysculas. A este nombre de
dominio le sigue una serie de nombres que especifican, en sentido descendente, la posicin del
paquete en la jerarqua.
Las distintas partes del nombre van separadas por puntos. Todo se
vera ms claro con un ejemplo, el nombre:
MX.ipn.cic.ute.cursojava.utilerias
hace referencia a un paquete utilerias, el cual depende en la jerarqua de cursojava y esta
desarrollado en el dominio ute.cic.ipn.mx.
Este convenio hace posible evitar conflictos entre los nombres de los paquetes desarrollados en
diferentes lugares, al estar garantizada la no repeticin de los nombres de dominio. Una ventaja
adicional es la facilidad para localizar las ltimas versiones de un paquete y para contactar con sus
desarrolladores.
9.2 Creacin y uso de paquetes ( package / import )
Como habamos dicho la seccin anterior, siempre que se desea crear un paquete de clases
empleamos la palabra reservada package y sta debe ser la primera lnea de cdigo no
comentada dentro de un programa de java.
Es posible hacer que parte de las clases y las interfaces contenidos en un paquete sean utilizados
desde fuera del paquete. Para ello , es necesario que dichas clases e interfaces hayan sido
definidos como public.
Para acceder a una clase de otro paquete se emplea la palabra clave import del siguiente modo:
import nombre_del_paquete.Nombre_de_la_clase;
as, si se quiere importar la clase Escri del paquete cuyo nombre dbamos antes como
ejemplo, habra que hacer:
import MX.ipn.cic.ute.cursojava.utilerias.Escri;
Una vez importada la clase, se puede usar su nombre sin el nombre del paquete, a menos que
exista una clase con el mismo nombre en el paquete que contiene el import , o que exista un
conflicto de nombres con otra clase importada desde otro paquete.
179
Si se quieren importar varias clases de un mismo paquete, el hacerlo clase por clase puede
resultar muy engorroso. Con el fin de evitar stas repeticiones se ha previsto la posibilidad de
emplear un comodn en la parte del nombre de clase en la sentencia import
import MX.ipn.cic.ute.cursojava.utilerias.*;
Esto hace que todas las clases e interfaces pblicas del paquete especificado sean importados al
paquete actual.
El siguiente ejemplo es ilustrativo:
Tenemos las dos clases pblicas A y P en la carpeta
C:\cursojava\mascarones\alumnitos Estas forman parte del paquete de clases package
mascarones.alumnitos; se compilan y generan las unidades de compilacin A.class , C.class
, D.class y P.class.
Tenemos tambin una clase B en la carpeta C:\jdk1.3\ejemplos ( aunque puede ser cualquier
carpeta) que utiliza las clases publicas A y P disponibles en el paquete mascarones.alumnitos
gracias a la utilizacin de la instruccin import mascarones.alumnitos.*; que debe ser
tambin la primera lnea no comentada del programa.
Ahora para que todo este bien, tenemos que modificar la variable de ambiente CLASSPATH
agregndole C:\cursojava que es la carpeta donde inicia la ruta de clases, al final de la
instruccin de esa variable de ambiente, as:
CLASSPATH=.;C:\jdk1.3\bin;C:\jdk1.3\lib\tools.jar;C:\jdk1.3\lib\dt.jar;C:\jdk1.3\lib;C:\cursojava
As tanto el compilador javac.exe y el intrprete java.exe pueden localizar las clases definidas
por el usuario en el paquete mencionado.
Al compilar todos los programas y ejecutarlos
produce la salida que se muestra abajo. Ver los siguientes cdigos y la figura.
Siquieres obtener el cdigo clic con el botn derecho aqu A.java
/**
* Programa de Java que te ensea a construir
* mediante la palabra reservada package un paquete de clases.
* Solo las clases e interfaces pblicas sern miembros del
* paquete. En ste ejemplo solo la clase A es miembro del
* paquete mascarones.alumnitos. Las clases C y D no son miembros
* del paquete mascarones.alumnitos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: A.java
*/
package mascarones.alumnitos;
public class A {
public A() {
System.out.println("constructor mascarones.alumnitos.A() ");
C xc= new C();
D xd= new D();
}
}// fin de A
class C {
180
C() {
System.out.println("constructor mascarones.alumnitos.C() ");
}
}//fin de C
class D {
D() {
System.out.println("constructor mascarones.alumnitos.D() ");
}
}//fin de D
Para compilar el programa A.java usa el comando javac A.java, el cual te va a producir los
archivos A.class , C.class y D.class. Todos deben estar en el la carpeta
C:\cursojava\mascarones\alumnitos.
Siquieres obtener el cdigo clic con el botn derecho aqu
P.java
/**
* Programa de Java que te ensea a construir
* mediante la palabra reservada package un paquete de clases.
* Solo las clases e interfaces pblicas sern miembros del
* paquete. En ste ejemplo solo la clase P es miembro del
* paquete mascarones.alumnitos.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: P.java
*/
package mascarones.alumnitos;
public class P {
public P() {
System.out.println("constructor mascarones.alumnitos.P() ");
}
public static void escribe(String s) {
System.out.println(s);
}
} // fin de la clase P
181
182
Nota.Las estadsticas para las bibliotecas de Java 1.0.1.3 proceden de Java Developers Almanac
2000 de Patrick Chan (addison Wesley, 2000)
Aqu presentaremos las bibliotecas que son estndar para Java 2 Standard Edition (J2SE) versin
1.4. Aunque el lenguaje es relativamente sencillo, deber estar familiarizado con lo que se
encuentra disponible con el conjunto de bibliotecas estndar. En caso contrario, pasar ms
tiempo intentando adivinar lo que es cada cosas que usando realmente las clases de bibliotecas
adecuadas. Aparte de las bibliotecas estndar presentadas aqu, hay muchas otras bibliotecas
estndar de Java que no estn incluidas en la versin J2SE ya que hay bibliotecas que aparecen
en Java 2 Enterprise Edition (J2EE), adems de las bibliotecas no empaquetadas con ninguna
edicin, conocida como extensiones estndar. Las extensiones estndar tambin son conjuntos de
bibliotecas de Java, pero Sun no las incluye en las ediciones estndar de Java. Si quiere usar las
extensiones, deber descargarlas por separado.
Muchas bibliotecas se inician como extensiones estndar antes incorporarse al ciclo de versiones
estndar. Un sencillo indicador de si una biblioteca se inici como extensin estndar es
comprobar el nombre del paquete. Si ese nombre comienza javax.*, probablemente fue una
extensin. Como mnimo, estos paquetes se pueden utilizar con varias versiones de Java.
Bibliotecas de utilidades: Algunos paquetes estn tan arraigados en la tecnologa de desarrollo
Java que todo el mundo debe conocerlos. Incluyen clases para compatibilidad con lenguajes
principales, utilidades, flujos de E/S, formato de texto, componentes reutilizables y seguridad.
9.3.1 Paquete java.lang
Las clases del paquete java.lang estn tan profundamente integradas en el desarrollo de Java
que ni siquiera debe indicarle al compilador que las importe. Desde luego, ya se ha encontrado
con varias de las clases que forman esta biblioteca String, Thread y Exception, por nombrar
algunos. En este paquete encontrar varias categoras de clases.
Clases envolventes: Son clase que le permiten tratar tipos primitivos como objetos
reales, por ejemplo, los objetos int y float; reciben el nombre de Integer y Float. Puede utilizar
las clases envolventes para realizar conversiones entre cadenas o tipos de datos especficos y las
otras utilidades de conversin numrica.
183
Compatibilidad con multitarea: Las clases de apoyo se encuentran en java.lang:
Thread, Runnable, ThreadGRoup, ThreadLocal y InheritableThreadLocal. Con estas
clases puede crear varios thread de ejecucin en sus programas de Java.
java.util.jar y java.util.zip, que ofrecen compatibilidad con archivos JAR (Java Archive),
GZIP y ZIP.
184
javax.net: Java Secure Socket Extensin (JSSE) agrega compatibilidad con SSL. (Secure
Socket Layer).
org.ietf.jgss: Java GSS-API agrega compatibildad con Kerberos V5 (GSS significa Servicio
genrico de seguridad).
9.3.7 Paquete java.awt
185
Este paquete forma parte de las bibliotecas relacionadas con multimedia de Java incluyen las
bibliotecas necesarias para crear aplicaciones grficas, dibujar, sonido, manipulacin de imgenes
y accesibilidad.
AWT significa Abstract Window Toolkit.
El paquete AWT se divide en dos partes. La
primera la ayuda para dibujar. Aqu encontrar clases y subpaquetes para dibujar formas,
establecer patrones de relleno, manipular imgenes y trabajar con fuentes. La otra parte de AWT
es un conjunto de componentes, contenedores y layouts ( administradores de diseo ), para
crear aplicaciones grficas GUI y sus clases de apoyo.
Cabe sealar que en la versin de Java 1.4 SDK SE, la mayora de los casos, no usar estos
componentes AWT; en su lugar usar componentes de javax.swing, que son una versin
mejorada de la AWT.
Directamente relacionadas, pero fuera de la jerarqua de paquetes java.awt se encuentran dos
bibliotecas, java.applet y javax.imageio. Ya ha visto al paquete java.applet en
funcionamiento; es la base de la compatibilidad con applets.
Paquetes java.awt.print y java.print
Hay muchas clases de apoyo para que aparezcan cosas en pantalla con Java. La mayora de ellas
en java.awt.print y javax.print. Prcticamente, cada nueva versin de Java intenta mejorar los
anteriormente pobres servicios grficos. Afortunadamente, los ltimos intentos mejoran los
mtodos errneos del pasado.
Paquete javax.sound
El siguiente es el paquete javax.sound. Naturalmente, esto agrega sonido para Java. Encontrar
la posibilidad de reproducir archivos con formato AU, WAV, AIFF, RMF (Rich Music Format) y
MIDI. I
Para ms informacin sobre como grabar sonidos y el mezclador, acuda a
http://java.sun.com/products/java-media/sound/.
9.3.8 Paquete javax.swing
Este paquete tambin orma parte de la Java Foundation Classes (JFC). Tambin lo es AWT, pero
el trmino JFC puede escucharse ms frecuentemente asociado a Swing que AWT. Swing es el
componente de segunda generacin integrado en Java. Al usar componentes Swing con las clases
de apoyo AWT (y las utilidades de dibujo) puede crear interfaces de usuario muy elaboradas. Los
componentes disponibles para Swing, comienzan con los botones y etiquetas ms bsicos y
continan con elementos ms elaborados como mens, barras de herramientas, barras de
progreso, tablas, rboles e incluso un completo editor compatible con HTML. Incluso es
compatible con ventanas emergentes especializadas para escoger colores y archivos y mostrar
mensajes.
9.3.9 Paquete java.net
El paquete java.net es el paquete para el trabajo en red en general, incluyendo compatibilidad
con Ipv6, la siguiente generacin de protocolos de Internet. Las clases esenciales de java.net
proporcionan compatibilidad con muchas tareas relacionadas con el trabajo en red, ejemplos:
InetAddress, URL y URI, para direccionamiento en Internet.
Socket y ServerSocket, para comunicaciones basadas en TCP/IP.
186
x file
187
Si se incluye algn subdirectorio en los archivos a aadir a un archivo JAR, se integra a ese
subdirectorio automticamente incluyendo tambin todos sus subdirectorios, etc. Tambin se
mantiene la informacin de rutas.
9.4.1 Ejemplo de creacin de un archivo .jar
Para este ejemplo debes tener configurado tu autoexec.bat , o tu variable de entorno path, de
manera que tengas la ruta del directorio donde se encuentra el archivo jar.exe de tu SDK, en
%java_home%\bin.
1. En la consola del MS-DOS o en la terminal de linux , ejecutas el archivo jar.exe desde la
ruta donde se encuentran tus archivos compilados. Si escribes jar y das un enter, se desplegar
una lista de ayuda donde te muestran los parmetros que acompaan la instruccin.
Regularmente se utilizan tres parmetros que son c, v y f: crear un nuevo archivo JAR,
desplegar una salida (solo para ver que archivos se van empaquetando) y especificar el nombre
del archivo JAR generado respectivamente.
2. Supongamos que en tu directorio C:\tareaj tienes los archivos Hola.class, Saludos.class,
Sonia.class y MiFoto.gif; y quieres empaquetarlos en un JAR. Entonces la instruccin es la
siguiente:
C:\tareaj>jar cvf Sonia.jar Hola.class Saludos.class MiFoto.gif
Esta instruccin
archivos.
te
empaquetar
en
un
JAR
de
nombre
Sonia.jar
los
tres
3. Ahora, supongamos que en tu directorio C:\tareaj generaste una librera de clases con la
sentencia package de nombre MiLibreria. Esto gener una carpeta que contiene los archivos
.class dentro de tu directorio C:\tareaj. Si quieres hacer un JAR con esta carpeta que contiene
tus archivos .class :
C:\tareaj> jar cvf Sonia.jar MiLibreria MiFoto.gi
Esta instruccin te empaquetar en un JAR de nombre Sonia.jar
MiLibreria con todos los archivos .class que contiene, mas el archivo GIF.
la
carpeta
4. Si la idea de usar el archivo JAR es para empaquetar los archivos de un applet, la llamada del
applet debe ser la siguiente manera en tu pagina web:
Usaremos la librera MiLibreria creada en el punto 3.
<applet archive=Sonia.jar code=MiLibreria.Sonia.class width=300 height=200>
</applet>
Ejemplo de uso de un archivo JAR en un applet.
El applet que se usa para explicar el uso del archivo JAR despliega una imagen, por lo que se
empaca en un archivo JAR llamado izta.jar : A_imagen.class y arita_de_la_luz.jpg como se
muestra en la siguiente pantalla:
188
tareaj.zip
La clase Applet proporciona todo lo necesario para la creacin de applets. Est contenida en el paquete
java.applet, por tanto, siempre que deseemos desarrollar un applet deberemos importar este paquete, as como
tambin el paquete java.awt , java.awt.event, y javax.swing que contienen todas las herramientas necesaria
para desarrollar interfaces grficas.
189
Un applet es un programa que se ejecuta mediante un navegador de Internet o con el programa herramienta del
SDK appletviewer.exe .
Los applet tienen la ventaja de ejecutarse en Internet sobre el navegador en el equipo del cliente, pero los
diseadores de Java les colocaron algunas restricciones para evitar que estos daen o inserten virus en las mquina
donde se ejecutan, entre ellas estn:
a)
b)
c)
d)
190
...........
public void init()
{ ....... }
public void paint()
{ ....... }
public boolean action(Event e, Object o )
{ ....... }
}
En 10.2 Ciclo de vida de un applet
Un applet hereda sus propiedades y sus mtodos de la clase Applet del paquete java.awt
existente en la biblioteca java.applet, cuenta con varios mtodos que el usuario puede
sobreescribir para darle la funcionalidad requerida. Estos mtodos siguen un ciclo de vida que se
explica en el diagrama de abajo, estos mtodos son:
init(): es el primer mtodo que se ejecuta al cargar el applet y slo se ejecuta una vez. Se debe
utilizar para inicializar las variables.
start(): se ejecuta despus del init(). Permite reinicializar un applet despus de que se haya
parado. El mtodo start() se ejecuta cada vez que se muestra en pantalla el documento HTML
que contiene el applet.
paint(): se ejecuta cada vez que se debe volver a pintar la salida de un applet.
stop(): se ejecuta cuando el navegador abandona la pgina HTML que contiene el applet. Se
utiliza para parar el applet; para volverlo a iniciar se llama el mtodo start().
destroy(): se ejecuta cuando el entorno determina que el applet debe ser borrado
completamente de la memoria. El mtodo stop() siempre se ejecuta antes que el destroy.
En esta clase el mtodo inicial para ejecutar un applet es init() cuando se omite se usa el mtodo
start() , si tambin se omite se usa el mtodo paint() ( esto significa que no requiere de un
mtodo main() )
191
En el ejemplo siguiente se muestra un applet llamado CicloVida que despliega una serie de
mensajes en la consola y en el visualizador del appletviewer , el cual demuestra el ciclo de vida
del applet.
/**
* Programa que muestra las etapas de la vida de un applet.
* Ejemplifica los mtodos ms comunes de un applet.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CicloVida.java
*/
import java.applet.Applet;
import java.awt.Graphics;
public class CicloVida extends Applet
{
/**
* Mtodo constructor del applet. Tiene el mismo nombre de la clase
*/
public CicloVida()
{
System.out.println("El constructor se esta ejecutando....");
}
/**
* Mtodo init del applet. Inicializa el applet.
*/
public void init()
{
System.out.println("Este es el mtodo init().\n");
}
/**
* Mtodo start. Arranca o comienza el applet
*/
public void start()
{
System.out.println("Este es el mtodo start(). \n");
}
/**
* Mtodo paint. Dibuja o pinta el applet.
*/
public void paint(Graphics lasGraficas)
{
lasGraficas.drawString("Hola , a todos mis pupilos!", 10,50);
System.out.println("El applet acaba de ser dibujado con paint() \n");
}
/**
* Mtodo stop. Para el applet.
*/
public void stop()
{
System.out.println("Este es el mtodo stop(), para el applet. \n");
}
/**
* Mtodo destroy. Destructor del applet.
*/
public void destroy()
{
System.out.println("Este es el mtodo destroy(), destruye el applet.\n");
}
} // fin de CicloVida
192
<html>
<head>
<title>CHECA EL CICLO DE VIDA DEL APPLET</title>
</head>
<body>
<APPLET CODE= "CicloVida.class" WIDTH="200" HEIGHT="150">
</APPLET>
</body>
</html>
La figura siguiete muestra la ejecucin del applet CicloVida con el comando appletviewer
ElciclodelApplet.htm
193
Height
<PARAM name
parmetro">
</APPLET>
c)
d)
CODEBASE, contiene la ruta de las clases del applet, si se omite se considera
el mismo directorio de la pgina web.
f)
PARAM, contiene una pareja de NAME
applet , y pueden ser uno o mas etiquetas PARAM.
VALUE
para
enviar
parmetros
al
Actualmente se tienen equipos informticos en donde residen las pginas web, las bases de
datos, cmaras de vdeo y otros servicios; estos se conocen como hosts o servidores. Las
computadores que reciben los datos, imgenes, pginas web de los servidores se conocen como
clientes.
En Java los programas que se ejecutan en el cliente se llaman applets y los que se ejecutan del
lado del servidor se llaman servlets .
Con el paquete javax.swing la clase Applet recibe el nombre de JApplet, pero tiene los
mismos mtodos de la clase Applet del paquete java.awt . Ahora veremos como podemos
utilizar la clase JApplet en un un programa que despliega mensaje:
Si quieres el cdigo del applet dale clic aqu
SwingEjemplo.zip
SwingEj.htm
/**
* Programa de Java que te ensea a hacer applets
* con la librera java.swing.*
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: SwingEjemplo.java
*/
import java.awt.Graphics;
import java.util.Date;
public class SwingEjemplo extends javax.swing.JApplet
{
public void paint( Graphics g )
{
194
el archivo HTML para invocar a este applet es similar que para el caso de los applets con la clase
Applet, as:
<HTML>
<HEAD>
<TITLE>Applet Hola</TITLE>
</HEAD>
<BODY>
<P>Applet con javax.swing de bienvenida</P>
<APPLET CODE="SwingEjemplo.class" WIDTH=500 HEIGHT=100>
</APPLET>
</BODY>
</HTML>
195
dibuja la figura dependiendo del valor recibido en el parmetro "figura", si este valor es "circulo",
dibujar un circulo y obtendr su rea, pero si el valor es "cuadrado" entonces dibujar un
cuadrado y calcular su rea :
Si quieres el cdigo del programa dale clic aqu
SwingParametros.zip
/**
En este caso el archivo HTML con el que se invoca el applet tiene dos etiquetas <APPLET> y cada
una con un parmetro "figura" que es el parmetro que se le enva al programa en Java el cual
extrae su valor con el mtodo getParamenter() y en una sentencia if se decide cual figura
dibujar , el archivo es el siguiente:
196
<HEAD>
<TITLE>Applet con parmetros</TITLE>
</HEAD>
<BODY>
<P>Applet que desplega un el area de una figura y la dibuja</P>
<P>Ahora voy a dibujar una figura=circulo</P>
<APPLET CODE = "SwingParametros.class" WIDTH=400 HEIGHT=100>
<PARAM NAME="figura" VALUE= "circulo" >
<PARAM NAME="radio" VALUE= "50.0" >
</APPLET>
<APPLET CODE = "SwingParametros.class" WIDTH=400 HEIGHT=100>
<PARAM NAME="figura" VALUE= "cuadrado" >
<PARAM NAME="lado" VALUE= "50.0" >
</APPLET>
</BODY>
</HTML>
Las AWT proveen componentes bsicos para una GUI ( Graphics User
Interface - Interface Grfica de Usuario ) y son utilizados en las
aplicaciones y los applets de Java. Una de las ventajas de usar AWT es
que la interface es independiente de la plataforma o interface grfica de
la mquina. Esto nos asegura que lo que se vea en una computadora
aparecer igual en otra computadora.
Una estrategia para estudiar las AWT es dividirlas en :
Componentes
Contenedores
Eventos
197
java.lang.Object
BorderLayout
CardLayout
CheckboxGroup
Color
Event
FlowLayout
Font
FontMetrics
Graphics
GridLayout
198
Image
Insets
Point
Polygon
Toolkit
MenuComponent
Component
MenuBar
MenuItem
CheckBoxMenuItem
Menu
PopupMenu
Component
Button
Canvas
Checkbox
Choice
Container
Panel ------- ( java.applet package
)
ScrollPane
Window
Dialog ---- FileDialog
Frame
Label
List
Scrollbar
TextComponent
199
TextArea
TextField
Exceptions - AWTException
Errors - AWTError
11.2 Componentes
Como habamos mencionado al principio de este captulo, los componentes son clases o interfaces
que permiten crear los objetos grficos que componen una GUI. La tabla siguiente nos
introduce brevemente a la amplia gama de los componentes de la AWT.
Tabla. Las AWT y sus componentes
Tipo de Componente
Button
Canvas
Checkbox
CheckboxMenuItem
Choice
Component
Container
Dialog
Frame
Label
List
Menu
MenuItem
Panel
Scroollbar
ScroolPane
TextArea
Descripcin
Es un botn usado para recibir el clic del ratn
Un lienzo o panel usado para dibujar
Cuadro de verificacin. Es un componente que le permite
seleccionar un elemento
Es un cuadro de verificacin dentro de un men
Es una lista desplegable de elementos estticos.
Es el padre de todos los componentes AWT, excepto de
los componentes de tipo men
Es el padre de todos los contenedores
Es un cuadro de dilogo o una ventana de alto nivel con
titulo y bordes.
Es un marco o ventana y es la clase base de todas las
ventanas GUI con controles para ventana.
Etiqueta. Es una cadena de texto como componente.
Un componente que contiene un conjunto dinmico de
elementos.
Es un elemento dentro de la barra de men, el cual
contiene un conjunto de elementos de tipo men.
Un elemento dentro de un men.
Una clase contenedora bsica usado frecuentemente para
crear diseos ( layouts ) complejos.
Un componente que permite al usuario hacer una
seleccin dentro de un rango de valores.
Una clase contenedora que implementa un deslizador
horizontal y vertical para un nico componente hijo
Un componente que permite al usuario introducir texto en
un bloque o rectngulo.
11.2.1 Button
En esta seccin veremos ejemplos que hacen uso de los componentes, del paquete java.awt los
cuales puede escoger para crear su GUI.
200
Ya nos es familiar que un objeto de la clase Button sea un componente. Puede ser construido
con una etiqueta de texto para informar al usuario sobre su uso. En el siguiente fragmento de
cdigo se crea un nuevo botn , se le da una etiqueta, una dimensin, y se le agrega un oyente
mediante delegacin de eventos, luego se agrega el componente al contenedor.
private Button boton = new Button(); //se crea el botn
boton.setLabel("Botoncito"); //se le da una etiqueta
boton.setBounds(new Rectangle(70, 45, 95, 55)); // se le da una dimensin al botn
boton.addActionListener(new ActionListener() // agregamos un oyente al botn
{
public void actionPerformed(ActionEvent e)
{
button1_actionPerformed(e); // si le dan clic al botn se dispara el evento
}
});
this.getContentPane().add(boton, null); // se agrega el botn al contenedor
201
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Button;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Button.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: FrameJDev.java
*/
public class Frame1JDev extends JFrame
{
private Button boton = new Button(); //se crea el botn
public Frame1JDev()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Esto es un Frame");
boton.setLabel("Botoncito"); //se le da una etiqueta
boton.setBounds(new Rectangle(70, 45, 95, 55)); // se le da una dimensin al botn
boton.addActionListener(new ActionListener() // agregamos un oyente al botn
{
public void actionPerformed(ActionEvent e)
{
button1_actionPerformed(e); // si le dan clic al botn se dispara el evento
}
});
this.getContentPane().add(boton, null); // se agrega el botn al contenedor
}
private void button1_actionPerformed(ActionEvent e)
{
System.out.println("Viva villa jijos del maiz!!!!");
}
public static void main( String args[] ) throws IOException
{
Frame1JDev f = new Frame1JDev();
202
60.
61.
62.
63.
64.
65.
66.
f.setVisible( true );
System.out.println("da un teclazo!!!");
System.in.read();
}
}
11.2.2 CheckBox
El componente Checkbox nos provee de un simple dispositivo de encendido/apagado con una
etiqueta de texto a un lado. Veamos el siguiente ejemplo:
Si se selecciona el Checkbox correspondiente desplegar el sabor del helado correspondiente, si
se quita la marca de verificacin o la palomita escribir que no hay ese sabor correspondiente.
RicosHelados.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Checkbox;
import java.awt.Rectangle;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.io.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Checkbox.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: RicosHelados.java
*/
public class RicosHelados extends JFrame
{
private Checkbox fresa = new Checkbox(); // se crean los componentes Checkbox
private Checkbox chocolate = new Checkbox();
private Checkbox vainilla = new Checkbox();
203
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
public RicosHelados()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(370, 145));
this.setTitle("Ricos Helados de Coyoacn"); // titulo del JFrame
this.setBackground(Color.cyan);
fresa.setLabel("FRESA"); // se establecen la etiquetas
fresa.setBounds(new Rectangle(35, 35, 73, 23)); // tamao del componente
fresa.setBackground(Color.pink); // color del fondo
fresa.addItemListener(new ItemListener() // se agrega un oyente
{
public void itemStateChanged(ItemEvent e)
{
fresa_itemStateChanged(e); // se delega el evento
}
});
chocolate.setLabel("CHOCOLATE");
chocolate.setBounds(new Rectangle(135, 35, 90, 25));
chocolate.setForeground(Color.white);
chocolate.setBackground(new Color(162, 126, 12));
chocolate.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
chocolate_itemStateChanged(e);
}
});
vainilla.setLabel("VAINILLA");
vainilla.setBounds(new Rectangle(235, 35, 73, 23));
vainilla.setBackground(Color.yellow);
vainilla.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
vainilla_itemStateChanged(e);
}
});
this.getContentPane().add(vainilla, null); // se agregan los componentes
this.getContentPane().add(chocolate, null);
this.getContentPane().add(fresa, null);
}
// se invoca este mtodo en caso de que escojan fresa
private void fresa_itemStateChanged(ItemEvent e)
{
String sabor = "No hay de Fresa";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
sabor = "Rico helado de Fresa";
}
System.out.println( e.getItem() + " => " + sabor );
204
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
}
// se invoca este mtodo en caso de que escojan chocolate
private void chocolate_itemStateChanged(ItemEvent e)
{
String sabor = "No hay de Chocolate";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
sabor = "Rico helado de Chocolate";
}
System.out.println( e.getItem() + " => " + sabor );
}
// se invoca este mtodo en caso de que escojan vainilla
private void vainilla_itemStateChanged(ItemEvent e)
{
String sabor = "No hay de Vainilla";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
sabor = "Rico helado de Vainilla";
}
System.out.println( e.getItem() + " => " + sabor );
}
public static void main( String args[] ) throws IOException
{
RicosHelados rh = new RicosHelados();
rh.setVisible( true );
System.out.println("da un teclazo para terminar!!!");
System.in.read();
}
} // fin de la clase RicosHelados
205
MiCheckboxGroup.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.CheckboxGroup;
import java.awt.Checkbox;
import java.awt.Rectangle;
import java.io.*;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase CheckboxGroup.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: MiChecboxGroup.java
*/
public class MiCheckboxGroup extends JFrame
{
private CheckboxGroup cbg = new CheckboxGroup(); // se crea el CheckboxGroup
private Checkbox am = new Checkbox("AM",cbg, false); // constructores de los items
private Checkbox fm = new Checkbox("FM",cbg, false);
private Checkbox tv = new Checkbox("TV",cbg, true); // opcin seleccionada
private Checkbox video = new Checkbox("VIDEO",cbg, false);
public MiCheckboxGroup()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
206
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Botones de radio mutuamente excluyentes");
am.setBounds(new Rectangle(75, 85, 73, 23));
am.addItemListener(new ItemListener() // se agrega un oyente al Checkbox am
{
public void itemStateChanged(ItemEvent e) // si cambia su estado
{
am_itemStateChanged(e); // se dispara el evento por delegacin
}
});
fm.setBounds(new Rectangle(120, 85, 75, 25));
fm.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
fm_itemStateChanged(e);
}
});
tv.setBounds(new Rectangle(160, 85, 73, 23));
tv.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
tv_itemStateChanged(e);
}
});
video.setBounds(new Rectangle(205, 85, 73, 23));
video.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
video_itemStateChanged(e);
}
});
this.getContentPane().add(video, null); // se agregan los componetes al JFrame
this.getContentPane().add(tv, null);
this.getContentPane().add(fm, null);
this.getContentPane().add(am, null);
}
// se maneja el evento del Checkbox am
private void am_itemStateChanged(ItemEvent e)
{
String modo = "No hay AM";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
modo = "MODO AMPLITUD MODULADA";
}
System.out.println( e.getItem() + " => " + modo );
}
private void fm_itemStateChanged(ItemEvent e)
{
String modo = "No hay FM";
if ( e.getStateChange() == ItemEvent.SELECTED )
{
modo = "MODO FRECUENCIA MODULADA";
}
207
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
11.2.4 Choice
Un Choice es un componente que nos provee de una simple lista de seleccin de un elemento el cual
ser seleccionada una entrada.
Cuando se hace clic en el objeto Choice, este despliega una lista de elementos que pueden ser
aadidos a ella. Estos elementos agregados son objetos String.
208
Se hace uso de la interface ItemListener para observar los cambios en la lista Choice. Los detalles
del manejo del evento son los mismos que para el caso del Checkbox.
Es siguiente cdigo ejemplifica el uso de una lista Choice con elementos de algunas universidades en
Mxico ( ver figura anterior ) los cuales al seleccionarlos despliega texto por la consola y establece un
valor nuevo para la etiqueta.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
ChoiceUniversidades.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Choice;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.io.*;
import java.awt.Label;
import javax.swing.JTree;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Choice.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ChoiceUniversidades.java
*/
public class ChoiceUniversidades extends JFrame
{
private static String escuela = null;
private Choice lista = new Choice(); // se crea la lista desplegable o Choice
private Label le = new Label();
public ChoiceUniversidades()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
} // fin del constructor
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(412, 134));
this.setTitle("Universidades Mexicanas de prestigio y renombre");
lista.setBounds(new Rectangle(90, 20, 175, 25));
lista.setBackground(Color.blue); // color de la lista
lista.setForeground(Color.yellow); // color de la letra en la lista
lista.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
lista_itemStateChanged(e);
}
});
le.setText("hola");
209
55.
le.setBounds(new Rectangle(10, 65, 380, 30));
56.
le.setBackground(Color.white);
57.
lista.addItem("UNAM"); // agregamos los elementos a la lista
58.
lista.addItem("IPN");
59.
lista.addItem("UAM");
60.
lista.addItem("CHAPINGO");
61.
lista.addItem("UVM");
62.
lista.addItem("UNITEC");
63.
this.getContentPane().add(le, null);
64.
this.getContentPane().add(lista, null); // agregamos la lista al JFrame
65.
66. }
67.
68.
public static void main( String args[] ) throws IOException
69.
{
70.
ChoiceUniversidades cu = new ChoiceUniversidades();
71.
cu.setVisible( true );
72.
System.out.println("da un teclazo para terminar!!!");
73.
System.in.read();
74.
System.out.println("Fin del programa");
75.
} // fin del main()
76.
77. // manejamos el evento de la lista Choice
78. private void lista_itemStateChanged(ItemEvent e)
79. {
80.
if( "UNAM".equals( e.getItem() ) ) // obtenemos el elemento seleccionado
81.
{
82.
escuela = new String("UNIVERSIDAD NACIONAL AUTNOMA DE MXICO");
83.
}
84.
else if ( "IPN".equals( e.getItem() ) )
85.
{
86.
escuela = new String("INSTITUTO POLITCNICO NACIONAL");
87.
}
88.
else if ( "UAM".equals( e.getItem() ) )
89.
{
90.
escuela = new String("UNIVERSIDAD AUTNOMA METROPOLITANA");
91.
}
92.
else if ( "CHAPINGO".equals( e.getItem() ) )
93.
{
94.
escuela = new String("UNIVERSIDAD DE CHAPINGO");
95.
}
96.
else if ( "UVM".equals( e.getItem() ) )
97.
{
98.
escuela = new String("UNIVERSIDAD DEL VALLE DE MXICO");
99.
}
100.
else if ( "UNITEC".equals( e.getItem() ) )
101.
{
102.
escuela = new String("UNIVERSIDAD TECNOLGICA DE MXICO");
103.
}
104.
105.
le.setText( escuela ); // establecemos nuevo valor a la etiqueta
106.
System.out.println("==> "+ escuela );
107. } // fin del metodo que maneja el evento
108.
} // fin de la clase ChoiceUniversidades
Un objeto Label despliega una lnea sencilla de texto esttico. El programa puede cambiar el texto
pero el usuario no. No hay bordes especiales u otra decoracin que sea usada para delinear un
Label. Recordaremos que en el programa de la seccin anterior 11.2.4 Choice utilizamos una Label
para cambia el texto de la etiqueta de acuerdo a al opcin que se eligiera en la lista Choice:
private Label le = new Label(); // se construye un objeto Label
le.setText("hola"); // se le asigna valor al objeto Label
le.setBounds(new Rectangle(10, 65, 380, 30)); // se le da una tamao
210
package mypackage1;
import java.io.*;
import java.awt.event.*;
import java.awt.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase Canvas. Con eventos del teclado
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CanvasLienzo.java
*/
public class CanvasLienzo extends Canvas implements KeyListener
{
private int index;
Color colores[] = { Color.red, Color.green, Color.blue };
public void paint( Graphics g )
211
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
{
g.setColor( colores[ index ] );
g.fillRect( 0, 0, getSize().width, getSize().height );
}
// Metodos para manejo de eventos del teclado
public void keyTyped( KeyEvent ke )
{
index++;
if ( index == colores.length )
{
index = 0;
}
repaint();
}
// Metodos de teclado no utilizados en este programa
public void keyPressed( KeyEvent ke ) { }
public void keyReleased( KeyEvent ke ) { }
11.2.6 TextField
Un objeto TextField es una lnea simple de texto en un cuadro de entrada, por ejemplo:
debido a que solo puede tener una lnea, un ActionListener puede ser informado, usando
actionPerformed(), cuando la tecla del Enter o Return sea presionada. Puede agregar otros
componentes oyentes si as lo desea.
Se puede utilizar el componente TextField para enmascarar teclas como en el caso de una contrasea
o para ignorar algunas teclas del teclado. El siguiente ejemplo crea el cdigo para que el campo de
texto Nombre ignore los dgitos y que la contrasea aparezca enmascarada con un asterisco.
212
ComponenteTextField.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.TextField;
import java.awt.Rectangle;
import java.awt.Label;
import java.awt.event.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase TextField.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ComponenteTextField.java
*/
public class ComponenteTextField extends JFrame
{
// se construyen los campos de texto
private TextField tfnombre = new TextField("Nombre del Web");
private TextField tfurl = new TextField( );
private TextField tfpassw = new TextField( );
// se construyen sus etiquetas
private Label labnombre = new Label("Nombre:");
private Label laburl = new Label();
private Label labpassw = new Label();
public ComponenteTextField()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
} // fin del constructor
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null); // layout por default
this.setSize(new Dimension(388, 220)); // dimensin del JFrame
this.setTitle("Ejemplo del componente TextField"); // titulo del JFrame
tfnombre.setBounds(new Rectangle(160, 20, 180, 25)); // tamao del TextField
tfnombre.addKeyListener ( new QuitaDigitos() ); // quita los digitos al campo tfnombre
tfurl.setText("URL del Web"); // su texto por default
tfurl.setBounds(new Rectangle(160, 65, 150, 25));
tfpassw.setBounds(new Rectangle(160, 115, 145, 30));
tfpassw.setEchoChar('*'); // caracter de enmascaramiento
labnombre.setBounds(new Rectangle(25, 20, 130, 30));
laburl.setText("Direccin o URL:");
laburl.setBounds(new Rectangle(25, 65, 100, 30));
labpassw.setText("Contrasea:");
labpassw.setBounds(new Rectangle(25, 115, 100, 30));
// se agregan los componentes
this.getContentPane().add(labpassw, null);
this.getContentPane().add(laburl, null);
this.getContentPane().add(labnombre, null);
this.getContentPane().add(tfpassw, null);
this.getContentPane().add(tfurl, null);
this.getContentPane().add(tfnombre, null);
213
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
}
class QuitaDigitos extends KeyAdapter
{
public void keyPressed( KeyEvent e )
{
char c = e.getKeyChar();
if ( Character.isDigit( c ) )
{
e.consume();
}
}
} // fin de la clase interna QuitaDigitos
public static void main( String args[] )
{
ComponenteTextField ctf = new ComponenteTextField();
ctf.setVisible( true );
System.out.println("Fin del programa");
} // fin del main()
11.2.7
TextArea
Una TextArea "rea de texto" es un objeto para manejar texto capturado desde el un dispositivo de
entrada y este puede manejar mltiples lneas y mltiples columnas. Se puede establecer ue sea de
solo lectura, usando el mtodo setEditable( boolean ). Este desplegar unas barras de
deslizamiento verticales y horizontales.
El oyente se puede especificar con addTextListener() el cual recibe la notificacin de las teclas
pulsadas de la misma manera que lo hace un TextField.
Se puede en agregar oyentes en general, a una rea de texto, pero debido a que es multilnea , el
presionar la tecla de Enter pone otro caracter en el buffer. Si se necesita reconocer "una entrada
completa" , se puede poner un botn de aplicar o Enviar seguido del rea de texto para permitir al
usuario indicar esto.
Si quieres el cdigo de este programa dale clic aqu
1.
TextAreaPersona.zip
package mypackage1;
214
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.Rectangle;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.lang.String;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase TextArea. Utiliza una clase llamada
* Persona que esta en el mismo paquete
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: TextAreaPersona.java
*/
public class TextAreaPersona extends JFrame
{
private Label labNombre = new Label();
private Label labEdad = new Label();
private Label labPeso = new Label();
private TextField tfNombre = new TextField();
private TextField tfEdad = new TextField();
private TextField tfPeso = new TextField();
private TextArea ta = new TextArea(); // se construye un TextArea
private String texto = null;
public TextAreaPersona()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(363, 374));
this.setTitle("Ejemplo de una TextArea");
// etiquetas
labNombre.setBounds(new Rectangle(40, 5, 50, 30));
labNombre.setText("Nombre:");
labEdad.setText("Edad:");
labEdad.setBounds(new Rectangle(40, 50, 60, 30));
labPeso.setText("Peso:");
labPeso.setBounds(new Rectangle(40, 90, 110, 30));
tfNombre.setBounds(new Rectangle(95, 10, 185, 25));
tfEdad.setBounds(new Rectangle(95, 50, 185, 25));
tfPeso.setBounds(new Rectangle(95, 90, 185, 25));
tfPeso.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
tfPeso_actionPerformed(e);
}
215
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
});
texto = new String( "*** datos introducidos ***\n");
ta.setText( texto ); // establece texto inicial al TextArea
ta.setBounds(new Rectangle(70, 130, 220, 200)); // dimensin del TextArea.
ta.setEditable(false); // se inhibe la entrada por teclado al TextArea
this.getContentPane().add(ta, null);
this.getContentPane().add(tfPeso, null);
this.getContentPane().add(tfEdad, null);
this.getContentPane().add(tfNombre, null);
this.getContentPane().add(labPeso, null);
this.getContentPane().add(labEdad, null);
this.getContentPane().add(labNombre, null);
}
private void tfPeso_actionPerformed(ActionEvent e)
{ // construyo una persona con los valores de los TextField
Persona pe = new Persona( tfNombre.getText(),
tfEdad.getText(),
tfPeso.getText() );
texto += tfNombre.getText() + "\n";
texto += tfEdad.getText() + "\n";
texto += tfPeso.getText() + "\n\n";
texto += "ahora con toString() \n";
texto += pe.toString();
// se agregan estos valores al TextArea
ta.setText( texto );
}
1. package mypackage1;
2. /**
3.
* Programa de Java que utiliza TextAreaPersona.
4.
* @autor Oscar A. Gonzlez Bustamante
5.
* @version 1.0
6.
* Archivo: Persona.java
7.
*/
8. class Persona {
9.
String nombre;
10.
String
edad;
11.
String peso;
12.
13.
Persona( String nom, String edad, String peso) {
14.
nombre = nom;
15.
this.edad = edad;
16.
this.peso = peso;
17.
} // fin del constructor
18.
19.
Persona () { }
20.
21.
public String toString() {
22.
String s = new String ( "Nombre: " + nombre + "\n" +
216
23.
"Edad: " + edad + "\n" +
24.
"Peso: " + peso + "\n" );
25.
return s;
26.
}
27.
28. } // fin de la clase Persona
11.2.8 List
Una List es una "lista" que presenta varias opciones de texto que son desplegadas en una rea que
permite seleccionar varios elementos al mismo tiempo y es posible recorrerla mediante barras de
desplazamiento.
El numero de argumentos del constructor define el tamao preferido de la lista en trminos del
nmero de renglones visibles. Como ha de suponerse un administrador de diseo "Layout" puede
sobreescribir este valor. El argumento booleano indica que la lista debe permitir al usuario hacer
mltiples selecciones.
Cuando un elemento es seleccionado o deseleccionado de la lista, java.awt enva una instancia de
ItemEvent a la lista. Cuando el usuario hace doble clic sobre el elemento en una lista desplazable, un
ActionEvent es generado por la lista en modo de seleccin simple y en modo de seleccin mltiple.
Los elementos son seleccionados desde la lista de acuerdo a las convenciones de la plataforma. Para
un entorno UNIX Motif , un simple clic ilumina una entrada de la lista , pero debe hacerse doble clic
para disparar la accin de la lista.
El siguiente ejemplo muestra una lista con platillos mexicanos que al seleccionarlos despliega por la
consola lo que el comensal quiere comer:
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ListEj.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.Label;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
* Programa de Java que te ensea a utilizar componentes
217
218
76.
77.
78.
79.
80.
{
System.out.println("Yo quiero comer: " + e.getActionCommand() );
}
Debido a que el Dialog es una subclase de Window, su administrador de diseo por omisin es
BorderLayout.
El siguiente ejemplo muestra ampliamente el uso de la clase Dialog. Es una aplicacin sencilla que
utiliza manejo de base de datos con Java ( ver seccin 12.1.5 Ejemplo JDBC-ODBC con AWT y Access)
Si quieres el cdigo y la bd de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DatosPersonales.zip
import java.awt.*;
import java.sql.*;
import java.awt.event.*;
class DatosPersonales extends Frame
implements ActionListener
{ Button crear, ver, insertar, cerrar;
TextField informacion;
Panel principal;
219
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
Connection conexion;
DatosPersonales()
{ super("Datos personales");
setSize(200,120);
principal=new Panel();
crear=new Button ("Crear");
crear.addActionListener(this);
ver=new Button ("Ver");
ver.addActionListener(this);
insertar=new Button("Insertar");
insertar.addActionListener(this);
cerrar=new Button("Cerrar");
cerrar.addActionListener(this);
informacion=new TextField(20);
principal.add(informacion);
principal.add(crear);
principal.add(insertar);
principal.add(ver);
principal.add(cerrar);
addWindowListener(new Cerrar());
principal.setBackground(SystemColor.control);
add(principal);
setVisible(true);
try
{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
catch(ClassNotFoundException e)
{ informacion.setText("No se pudo cargar el controlador JDBC-ODBC");}
}
private void Crear_tabla()
{ Statement sentencia;
try
{
conexion=DriverManager.getConnection("jdbc:odbc:Personal");
sentencia=conexion.createStatement();
try
{
sentencia.executeUpdate("DROP TABLE DATOSPERSONALES");
}
catch(SQLException e){informacion.setText("Error al crear la tabla");
System.out.println(e);}
sentencia.executeUpdate("CREATE TABLE DATOSPERSONALES("+
"NOMBRE CHAR(20) NOT NULL,"+
"APELLIDOS CHAR(20),"+
"EDAD CHAR(3),"+
"TELEFONO CHAR(10))");
informacion.setText("Tabla creada");
conexion.close();
}
catch(SQLException e){}
}
220
75.
{ informacion.setText("");
76.
Crear_tabla();}
77.
else
78.
if ("Insertar".equals(com))
79.
{ new Insertar(this);
80.
}
81.
else
82.
if ("Ver".equals(com))
83.
{
84.
new Ver(this);
85.
}
86.
87.
else
88.
{dispose();System.exit(0);}
89. }
90.
91.
92. class Cerrar extends WindowAdapter
93. { public void windowClosing(WindowEvent e)
94. { dispose();
95.
System.exit(0);
96. }
97. }
98.
99. public static void main(String args[])
100. { new DatosPersonales();}
101.
102. }
103.
104.
105. class Insertar extends Dialog implements ActionListener
106. {
107. private Connection conexion;
108. private Button incluir,terminar;
109. private TextField nombre,apellidos,edad,telefono;
110. Insertar(Frame f)
111. { // constructor f es el Frame dueo del Dialog
112. super(f,"Insertar datos",true);
113. setSize(310,160);
114. nombre=new TextField(20);
115. apellidos=new TextField(20);
116. edad=new TextField(3);
117. telefono=new TextField(10);
118.
119. incluir=new Button("Incluir");
120. incluir.addActionListener(this);
121.
122. terminar=new Button("Terminar");
123. terminar.addActionListener(this);
124.
125.
126.
127. Panel P_Datos=new Panel();
128. P_Datos.add(new Label("Nombre : "));
129. P_Datos.add(nombre);
130. P_Datos.add(new Label("Apellidos: "));
131. P_Datos.add(apellidos);
132. P_Datos.add(new Label("Edad
: "));
133. P_Datos.add(edad);
134. P_Datos.add(new Label("Telefono : "));
135. P_Datos.add(telefono);
136. P_Datos.add(incluir);
137. P_Datos.add(terminar);
138.
221
139.
140. nombre.setEditable(true);
141. apellidos.setEditable(true);
142. edad.setEditable(true);
143. telefono.setEditable(true);
144.
145. add(P_Datos);
146. setVisible(true);
147.
148.
149.
150. }
151. private void insertar_fila()
152. { Statement sentencia;
153. try{
154. conexion=DriverManager.getConnection("jdbc:odbc:Personal");
155. sentencia=conexion.createStatement();
156. sentencia.executeUpdate("INSERT INTO DATOSPERSONALES"+
157.
" VALUES ('"+nombre.getText()+"',"+
158.
"'"+apellidos.getText()+"',"+
159.
"'"+edad.getText()+"',"+
160.
"'"+telefono.getText()+"')");
161.
162. }
163. catch(SQLException e){}
164. }
165.
166. public void actionPerformed(ActionEvent e)
167. { String com=e.getActionCommand();
168. if ("Incluir".equals(com))
169.
{insertar_fila();
170.
nombre.setText("");
171.
apellidos.setText("");
172.
edad.setText("");
173.
telefono.setText("");
174.
}
175.
else
176.
{
177.
if(conexion!=null)
178.
{
179.
try
180.
{
181.
conexion.close();
182.
}
183.
catch(SQLException ex){}
184.
}
185.
dispose();
186.
}
187. }
188. }
189.
190.
191.
192.
193. class Ver extends Dialog
194. implements ActionListener
195. {
196. private Connection conexion;
197. private ResultSet resultado;
198. private Button siguiente,terminar;
199. private TextField nombre,apellidos, edad,telefono;
200. Ver(Frame f)
201. { // constructor f es el Frame dueo del Dialog
202. super(f,"Ver datos",true);
222
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
setSize(310,160);
nombre=new TextField(20);
apellidos=new TextField(20);
edad=new TextField(3);
telefono=new TextField(10);
siguiente=new Button("Siguiente");
siguiente.addActionListener(this);
terminar=new Button("Terminar");
terminar.addActionListener(this);
Panel P_Datos=new Panel();
P_Datos.add(new Label("Nombre : "));
P_Datos.add(nombre);
P_Datos.add(new Label("Apellidos: "));
P_Datos.add(apellidos);
P_Datos.add(new Label("Edad
: "));
P_Datos.add(edad);
P_Datos.add(new Label("Telefono : "));
P_Datos.add(telefono);
P_Datos.add(siguiente);
P_Datos.add(terminar);
add(P_Datos);
nombre.setEditable(false);
apellidos.setEditable(false);
edad.setEditable(false);
telefono.setEditable(false);
mostrar();
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{ String com=e.getActionCommand();
if ("Siguiente".equals(com))
siguiente();
else
{
if (conexion!=null)
{
try
{
conexion.close();
}
catch(SQLException ex){}
}
dispose();
}
}
private void mostrar()
{
Statement sentencia;
try{
conexion=DriverManager.getConnection("jdbc:odbc:Personal");
sentencia=conexion.createStatement();
resultado=sentencia.executeQuery("SELECT * FROM DATOSPERSONALES");
siguiente();
}
223
291.
El primer argumento en el constructor de Dialog designa si el dueo del Dialog que esta siendo
construido. En el Ejemplo previo, f es el Frame al que pertenece el Dialog.
Un Dialog generalmente no se hace visible a el usuario cuando es creado. Este se desplegar en
respuesta a alguna accin del usuario sobre la interface, tal como presionar un botn.
Para ocultar un Dialog, podemos invocar al mtodo
setVisible ( false ). Se hace esto aadiendo un WindowListener a el y esperando una llamada a
el mtodo WindowClosing() en dicho oyente.
11.2.10 FileDialog
Un FileDialog es una implementacin de un dispositivo para la seleccin de un archivo. Este tiene su
propio ventana, la cual permite al usuario navegar dentro del sistema de archivos del sistema y
seleccionar un archivo en particular para subsecuentes operaciones, por ejemplo:
224
Frame2JDev.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Button;
import java.awt.Rectangle;
import java.awt.FileDialog;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase FileDialog.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: Frame2JDev.java
*/
public class Frame2JDev extends JFrame
{
private Button boton = new Button(); //se crea el botn
ArchivoDialogo ad; //se hace una referencia a la clase con el FileDialog
public Frame2JDev()
{
try
{
jbInit();
}
catch(Exception e)
225
30.
{
31.
e.printStackTrace();
32.
}
33. }
34.
35. private void jbInit() throws Exception
36. {
37.
this.getContentPane().setLayout(null);
38.
this.setSize(new Dimension(309, 191));
39.
this.setTitle("Esto es el Frame padre");
40.
this.setLocation( 150, 150 ); // colocar Frame en esa posicin
41.
ad = new ArchivoDialogo( this ,"Un FileDialog" ); // Clase con un FileDialog
42.
boton.setLabel("Abrir el FileDialog"); //se le da una etiqueta
43.
boton.setBounds(new Rectangle(70, 45, 115, 55)); // se le da una dimensin al boton
44.
boton.addActionListener(new ActionListener() // agregamos un oyente al botn
45.
{
46.
public void actionPerformed(ActionEvent e)
47.
{
48.
button1_actionPerformed(e); // si le dan clic al botn se dispara el evento
49.
}
50.
});
51.
this.getContentPane().add(boton, null); // se agrega el botn al contenedor
52. }
53.
54. private void button1_actionPerformed(ActionEvent e)
55. {
56.
ad.setLocation( 250, 250 ); // colocar el FileDialog en esa posicin
57.
ad.setVisible( true ); // hace visible el FileDialog
58.
// obtiene la ruta seleccionada en el FileDialog
59.
String archnom = ad.getDirectory() + ad.getFile();
60.
System.out.println("Ruta: " + archnom );
61. }
62.
63.
public static void main( String args[] ) throws IOException
64.
{
65.
Frame2JDev f = new Frame2JDev();
66.
f.setVisible( true );
67.
System.out.println("da un teclazo!!!");
68.
System.in.read();
69.
} // fin del main()
70.
71. } // fin de la clase Frame2Dev
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.AWTEvent;
import java.awt.event.WindowEvent;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase FileDialog.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ArchivoDialogo.java
*/
public class ArchivoDialogo extends FileDialog
{
/**
*
226
20.
* @param parent
21.
* @param title
22.
* @param modal
23.
*/
24. public ArchivoDialogo(JFrame parent, String title )
25. {
26.
super(parent, title);
27.
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
28.
try
29.
{
30.
jbInit();
31.
}
32.
catch(Exception e)
33.
{
34.
e.printStackTrace();
35.
}
36.
37. }
38.
39. private void jbInit() throws Exception
40. {
41.
this.setSize(new Dimension(400, 300)); // 400 x 300 para el FileDialog
42.
this.setLayout(null);
43. }
44.
45. /**
46.
*
47.
* @param e
48.
*/
49. protected void processWindowEvent(WindowEvent e)
50. {
51.
if (e.getID() == WindowEvent.WINDOW_CLOSING)
52.
{
53.
cancel();
54.
}
55.
super.processWindowEvent(e);
56. }
57.
58. void cancel()
59. {
60. }
61. } // fin de ArchivoDialogo
11.2.11 ScroollPane
Un ScroollPane provee de un contenedor general que no puede ser usado como un componente
libre. Siempre esta asociado con un contenedor ( por ejemplo, un Frame ) . Provee un rea de
visualizacin dentro de una regin grande y con barras de deslizamiento para manipularla.
El ScroollPane crea y maneja las barras de desplazamiento y las contiene en un solo componente.
No es posible controlar el administrador de diseo que usa, en lugar de esto se puede agregar a un
227
Panel para que el scrooll pane , configure el administrador de diseo, y coloque los componentes en
dicho panel.
Generalmente , no es posible manejar eventos en un ScroollPane; los eventos son manejados a
travs de los componentes que se contengan.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
PruebaSeleccionMultiple.zip
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase JScrollPane.
* Este programa fue recopilado y modificado del libro:
* Java Como programar. - Deitel & Deitel 5ta edicin.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PruebaSeleccionMultiple.java
*/
public class PruebaSeleccionMultiple extends JFrame {
private JList listaColores, listaCopia;
private JButton botonCopiar;
private final String nombresColores[] = { "Negro", "Azul", "Cyan",
"Gris oscuro", "Gris", "Verde", "Gris claro", "Magenta", "Naranja",
"Rosa", "Rojo", "Blanco", "Amarillo" };
// configurar GUI
public PruebaSeleccionMultiple()
{
super( "Listas de seleccin mltiple" );
// obtener panel de contenido y establecer su esquema
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// establecer objeto JList listaColores
listaColores = new JList( nombresColores );
listaColores.setVisibleRowCount( 5 );
listaColores.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaColores ) );
// crear botn copiar y registrar su componente de escucha
botonCopiar = new JButton( "Copiar >>>" );
botonCopiar.addActionListener(
new ActionListener() { // clase interna annima
// manejar evento de botn
public void actionPerformed( ActionEvent evento )
{
// colocar valores seleccionados en listaCopia
listaCopia.setListData( listaColores.getSelectedValues() );
}
} // fin de clase interna annima
); // fin de la llamada a addActionListener
contenedor.add( botonCopiar );
228
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76. }
77.
11.2.12 MenuBar
Un Menu es un componente diferente a otros componentes porque no se puede agregar a un Menu a
los contenedores comunes. Solo se puede agregar mens a un "menu container". Se puede comenzar
un rbol de men poniendo un MenuBar "una barra de men" en un Frame, usando el mtodo
setMenuBar(). Desde este punto, se pueden agregar mens a la barra de men y mens o
elementos de men dentro del men.
Los mens Pop-up son una excepcin porque estos aparecen como ventanas flotantes y no requieren
un administrador de diseo, pero es importante agregar el menu Pop-up al contenedor padre, de lo
contrario no funciona.
Los Help menu ( mens de Ayuda ) pueden ser implementados en un MenuBar mediante el uso del
mtodo setHelpMenu( Menu ). Se debe agregar el men a ser tratado como un Help menu a la
barra de menu; entonces ser tratado en la misma forma que un Help menu para la plataforma en que
se este trabajando. Para X/Motif-type systems, este ser colocado como una entrada de men al final
229
PopUpMenu.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Button;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.PopupMenu;
import java.awt.MenuItem;
import java.awt.Font;
import java.awt.Color;
import java.awt.MenuBar;
import java.awt.Menu;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase PopupMenu.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PopUpMenu.java
*/
public class PopUpMenu extends JFrame {
String [] elementos = {"Nuevo", "Abrir","Re Abrir","Eliminar", "Guardar", "Cargar", "Salir" };
private Button b = new Button();
private PopupMenu popupMenu1 = new PopupMenu(); // se instancia un PopupMenu
private MenuItem menuItem1 = new MenuItem(); // se instancian los elementos
private MenuItem menuItem2 = new MenuItem(); // del PopupMenu
private MenuItem menuItem3 = new MenuItem();
private MenuItem menuItem4 = new MenuItem();
private MenuItem menuItem5 = new MenuItem();
private MenuItem menuItem6 = new MenuItem();
private MenuBar menuBar1 = new MenuBar();
private Menu a = new Menu ( "Archivo");
private Menu e = new Menu ( "Editar");
private Menu h = new Menu ( "Ayuda" );
public PopUpMenu()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 282));
this.setTitle("Un Pop up Men");
this.setBackground(Color.blue);
230
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
231
121.
122.
123.
124.
125.
126.
El MenuBar no soporta oyentes. Como parte normal del comportamiento de un men, los eventos
anticipados que ocurran en la regin de la barra de men son procesados automticamente.
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CreandoMenuBar.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.MenuBar;
import java.awt.Menu;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase MenuBar.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CreandoMenuBar.java
*/
public class CreandoMenuBar extends JFrame
{
private MenuBar mb1 = new MenuBar(); // se crea un objeto MenuBar
private Menu menu1 = new Menu(); // se crea un objeto Menu
public CreandoMenuBar()
{
try
{
jbInit();
}
catch(Exception e)
{
232
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Creando Un Menu Bar");
mb1.setName( "Soy un MenuBar");
// se hace esto para que aparezca la barra de menu vacia
menu1.setLabel(" ");
mb1.add(menu1);
}
public static void main( String args[] )
{
CreandoMenuBar cmb = new CreandoMenuBar();
cmb.setMenuBar( cmb.mb1 ); // se agrega el MenuBar al JFrame
cmb.setVisible ( true );
} // fin del main()
Es posible crear entradas a una barra de men agregando objetos de la clase Menu. Los
componentes Menu proveen a la barra de men elementos de tipo men pull-down " mens
desplegables ".
Puede agregarse un ActionListener a un objeto Menu, pero este es poco comn. Normalmente, se
usan mens para desplegar y controlar los mens items, " elementos de men " los cuales son
descritos en la siguiente seccin.
11.2.12.2 Creando un MenuItem
Un componente MenuItem son los nodos hoja de una rbol de men. Son agregados a un men
para completarlo; por ejemplo:
233
CreandoMenuItem.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.MenuBar;
import java.awt.Menu;
import java.awt.MenuItem;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase MenuItem.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CreandoMenuItem.java
*/
public class CreandoMenuItem extends JFrame
{
private MenuBar mb1 = new MenuBar(); // se crea un objeto MenuBar
private Menu a = new Menu("Archivo"); // se crean objetos Menu
private Menu e = new Menu("Editar");
private Menu h = new Menu("Ayuda");
MenuItem mi1 = new MenuItem("Nuevo"); // se crean objetos MenuItem
MenuItem mi2 = new MenuItem("Guardar");
MenuItem mi3 = new MenuItem("Cargar");
MenuItem mi4 = new MenuItem("Salir");
public CreandoMenuItem()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Creando Un Menu Bar");
mb1.setName( "Soy un MenuBar");
// se hace esto para que aparezca la barra de menu vacia
mb1.add( a ); // se agregan los objetos Menu al MenuBar
mb1.add( e );
234
48.
mb1.setHelpMenu( h ); // se agrega el objeto menu Help a MenuBar
49.
a.add( mi1 ); // agregando los objetos MenuItem al objeto Menu
50.
a.add( mi2 );
51.
a.add( mi3 );
52.
a.addSeparator(); // agrega un separador entre los MenuItem
53.
a.add( mi4 );
54. }
55. public static void main( String args[] )
56. {
57.
CreandoMenuItem cmi = new CreandoMenuItem();
58.
cmi.setMenuBar( cmi.mb1 ); // se agrega el MenuBar al JFrame
59.
cmi.setVisible ( true );
60.
61. } // fin del main()
62. } // fin de la clase CreandoMenuItem
CreandoChecboxMenuItem.zip
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.MenuBar;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.CheckboxMenuItem;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase ChecboxMenuItem.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: CreandoChecboxMenuItem.java
*/
public class CreandoCheckboxMenuItem extends JFrame
{
private MenuBar mb1 = new MenuBar(); // se crea un objeto MenuBar
private Menu a = new Menu("Archivo"); // se crean objetos Menu
235
66.
Por ultimo deseo agregar un ejemplo realizado por un alumno que tiene todo lo referente a mens
visto en esta seccin, pero el utiliza mucho las clases del paquete javax.swing, en lugar de las de
java.awt, pero es esencialmente lo mismo, veamos:
236
como se podr observar en la figura , hay menus que responden a los eventos y envian un mensaje a
un TextArea , el cdigo es el siguiente:
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CreandoChecboxMenuItem.zip
import java.awt.*;
import java.awt.event.*;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;
import javax.swing.JMenuBar;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JFrame;
/**
* Programa de Java que te ensea a utilizar componentes
* del paquete java.awt. Este demuestra el uso de los
* objetos de la clase ChecboxMenuItem.
* @autor Gilardoni Jara
* @version 1.0
* Reviso: Oscar Alejandro Gonzlez Bustamante
* Archivo: MenuSwing.java
*/
public class MenuSwing extends JFrame
implements ActionListener, ItemListener {
JTextArea salida;
JScrollPane barrascroll;
String newline = "\n";
public MenuSwing() {
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;
JRadioButtonMenuItem radioBotom;
JCheckBoxMenuItem checkBotom;
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
237
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
238
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132. }
133.
11.3 Contenedores
Usted agrega componentes GUI a un contenedor utilizando el mtodo add(). Hay dos tipos
principales de contenedores: la clase Window y Panel.
Una ventana ( Window ) es un rectngulo que flota libremente en la pantalla. Hay dos tipos de
ventanas. El Frame y el Dialog. Un Frame es una ventana con una barra de titulo y esquinas que
pueden ser cambiadas de tamao. Un Dialog es una simple ventana que no puede tener una barra
de men y aunque se puede mover no puede ser cambiada de tamao.
El Panel debe estar contenido dentro de otro contenedor, o dentro de una ventana de un navegador
Web. El Panel es una rea rectangular dentro de la cual se puede colocar otros componentes. Se
debe colocar un Panel dentro de una ventana de tipo Window ( o dentro de una subclase de Window
) para ser desplegado.
Posicionamiento y tamao de los componentes en un contenedor.
La posicin y el tamao de un componente dentro de un contenedor es determinado por un
administrador de diseo ( layout manager ). Un contenedor mantiene una referencia a una instancia
en particular de un administrador de diseo . Cuando el contenedor necesita posicionar un
componente, este invoca a el administrador de diseo para dicho fin. La misma delegacin sucede
cuando es decido el tamao de un componente. El administrador de diseo toma todo el control
sobre todos los componentes dentro del contenedor. Es responsable del clculo y definicin del
tamao preferido para el objeto en el contexto del tamao actual de la pantalla.
Debido a que el administrador de diseo generalmente es responsable del tamao y posicin de los
componentes dentro de su contenedor, usted generalmente no debera intentar establecer el tamao
239
package oscar;
import java.awt.*;
import java.io.*;
/**
* <p>Ttulo: EjemploFrame.java</p>
* <p>Descripcin: Te ensea un contendor Frame </p>
* <p>Copyright: Es libre </p>
* <p>Empresa: Patito feo </p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0
*/
public class EjemploFrame {
private Frame f;
public EjemploFrame() {
f = new Frame(" Hola esto es un Frame ");
}
public void lanzaelFrame() {
f.setSize(200, 200);
f.setBackground( Color.red );
f.setLocation( new Point( 250, 250 ) );
f.setVisible( true );
}
240
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Los Paneles
Un Panel es como un Frame, y provee del espacio para que el programador coloque cualquier
componente GUI, incluyendo tambin otros paneles. Cada panel hereda de la clase Container todos
sus mtodos y atributos , y puede tener su propio administrador de diseo.
El siguiente programa crea un pequeo panel de color verde , y lo agrega a un frame.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
package oscar;
import javax.swing.*;
import java.awt.*;
import java.io.*;
/**
* <p>Ttulo:FrameConPanel.java </p>
* <p>Descripcin: Te ensea a crear un panel dentro de un Frame </p>
* <p>Copyright:es libre</p>
* <p>Empresa: El patito feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante.
* @version 1.0
*/
public class FrameConPanel extends JFrame {
Panel panel1 = new Panel();
FlowLayout flowLayout1 = new FlowLayout();
FlowLayout flowLayout2 = new FlowLayout();
public FrameConPanel() {
super( "Frame con un Panel");
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
this.getContentPane().setLayout(flowLayout2);
panel1.setLayout(flowLayout1);
panel1.setBackground(Color.green);
panel1.setLocale(java.util.Locale.getDefault());
this.getContentPane().setBackground(Color.blue);
flowLayout1.setAlignment(FlowLayout.LEFT);
241
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
flowLayout1.setHgap(50);
flowLayout1.setVgap(50);
flowLayout2.setAlignment(FlowLayout.LEFT);
this.getContentPane().add(panel1, null);
}
11.4 Layouts
La distribucin de los componentes en un contenedor usualmente esta controlada con un
administrador de diseo ( layout manager ). Cada contenedor ( como un Panel o un Frame ) tiene
por omisin un administrador de diseo asociado con este, el cual puede ser cambiado invocando al
mtodo setLayout().
Cada administrador de diseo es responsable de definir el tamao de cada componente en sus
contenedores.
Los siguientes administradores de diseo son incluidos en el lenguaje de programacin Java:
CardLayout - Es raramente usado, y coloca los componentes en capas, donde cada capa es
como una carta de naipes, de ah su nombre.
GridBagLayout - Utilizado para distribuir los componentes como dentro de unas celdillas
pero de diferente tamao, es parecido al GridLayout.
242
EjemploFlowLayout.zip
package oscar230604;
import java.awt.*;
import java.awt.event.*;
/**
* <p>Ttulo: EjemploFlowLayout.java </p>
* <p>Descripcin: Te ensea a usar el FlowLayout</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0
243
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
*/
public class EjemploFlowLayout extends Frame {
Button button1 = new Button();
Button button2 = new Button();
Button button3 = new Button();
FlowLayout flowLayout1 = new FlowLayout();
public EjemploFlowLayout() {
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("Aceptar");
button1.setLocale(java.util.Locale.getDefault());
button1.addActionListener(new EjemploFlowLayout_button1_actionAdapter(this));
button2.setLabel("Abrir");
button3.setLabel("Cerrar");
this.setSize( 400, 300 );
this.setBackground(Color.orange);
this.setResizable(true);
this.setTitle("Ejemplo de FlowLayout - Curso de Java Bsico -");
this.setLayout(flowLayout1);
flowLayout1.setAlignment(FlowLayout.RIGHT);
flowLayout1.setHgap(20);
flowLayout1.setVgap(40);
this.add(button1, null);
this.add(button2, null);
this.add(button3, null);
}
public static void main(String[] args) {
EjemploFlowLayout ejemploFlowLayout = new EjemploFlowLayout();
ejemploFlowLayout.setVisible( true );
}
void button1_actionPerformed(ActionEvent e) {
}
}
class EjemploFlowLayout_button1_actionAdapter implements java.awt.event.ActionListener {
EjemploFlowLayout adaptee;
EjemploFlowLayout_button1_actionAdapter(EjemploFlowLayout adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.button1_actionPerformed(e);
}
} // fin de la clase EjemplodeFlowLayout
En la figura siguiente podemos ver que al ejecutar el programa con el comando java
EjemploFlowLayout nos presenta una ventana con tres botones con los espacios entre cada botn
de 20 unidades por 40 unidades y con alineacin hacia la derecha .
244
El BorderLayout
Es el administrador de diseo por default de la clase Frame. Los componentes son agregados a 5
regiones especificas dentro de la ventana o frame:
NORTH ocupa la parte de arriba
EAST ocupa el lado derecho
SOUTH ocupa la parte inferior
WEST ocupa la parte izquierda
CENTER ocupa la parte central
Cuando ajustamos verticalmente el tamao de la ventana o frame , las regiones EAST, WEST y
CENTER son ajustadas.
Cuando ajustamos horizontalmente el tamao de la ventana o frame , las regiones NORT, SOUTH y
CENTER son ajustadas.
Cuando aadimos botones a las posiciones relativas los botones no cambian si la ventana es cambiada
de tamao, pero los tamaos de los botones si cambian.
El siguiente constructor crea un administrador de diseo de tipo BorderLayout sin espacios entre sus
componentes:
setLayout( new BorderLayout() );
Usando el siguiente constructor podemos indicarle los espacios entre los componentes especificados
por hgap y vgap:
BorderLayout( int hgap, int vgap );
Se deben agregar los componentes en las regiones especficas respetando maysculas y minsculas
ya que no es lo mismo add( boton, BorderLayout.CENTER ) que add( boton,
BorderLayout.center ) en el administrador de diseo , o de otra forma no sern visibles. Si se
quiere evitar esto se puede usar add ( boton, "center" ) .
Si se deja una regin sin utilizar, esta se comportar como si se hubiera preferido un tamao de 0 x 0.
La regin CENTER seguir apareciendo como fondo cuando incluso si no tiene componentes.
245
Solo se puede agregar un solo componente por cada una de las cinco regiones. Si se trata de agregar
mas de una, solo la ltima agregada ser la visible. Cuando deseamos agregar mas componentes por
regin usaremos la clase Panel, lo cual veremos despus.
Si quieres el cdigo de los programas de esta seccin dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
EjemploBorderLayout.zip
package oscar230604;
import java.awt.*;
import java.awt.event.*;
/**
* <p>Ttulo: EjemploBorderLayout.java </p>
* <p>Descripcin: Te ensea a usar el FlowLayout</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0
*/
public class EjemploBorderLayout extends Frame {
Button button1 = new Button();
Button button2 = new Button();
Button button3 = new Button();
BorderLayout borderLayout1 = new BorderLayout();
Button button4 = new Button();
TextArea textArea1 = new TextArea();
public EjemploBorderLayout() {
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("Aceptar");
button1.setLocale(java.util.Locale.getDefault());
button1.addActionListener(new EjemploBorderLayout_button1_actionAdapter(this));
button2.setLabel("Abrir");
button3.setLabel("Cerrar");
this.setSize( 400, 300 );
this.setBackground(Color.cyan);
this.setResizable(true);
this.setTitle("Ejemplo de BorderLayout - Curso de Java Bsico -");
this.setLayout(borderLayout1);
button4.setBackground(Color.red);
button4.setLabel("Aplicar");
borderLayout1.setHgap(20);
borderLayout1.setVgap(40);
textArea1.setColumns(20);
textArea1.setEditable(false);
textArea1.setEnabled(true);
textArea1.setFont(new java.awt.Font("Arial", 3, 12));
textArea1.setLocale(java.util.Locale.getDefault());
textArea1.setSelectionEnd(20);
textArea1.setSelectionStart(20);
textArea1.setText("\t Hola esto es un TextArea \n " +
"\t dentro de un Frame con un \n " +
"\t BorderLayout en la regin \n " +
"\t CENTER");
textArea1.setVisible(true);
246
59.
this.add(button1, BorderLayout.NORTH);
60.
this.add(button2, BorderLayout.WEST);
61.
this.add(button3, BorderLayout.SOUTH);
62.
this.add(button4, BorderLayout.EAST);
63.
this.add(textArea1, BorderLayout.CENTER);
64. }
65.
66. public static void main(String[] args) {
67.
EjemploBorderLayout ejemploBorderLayout = new EjemploBorderLayout();
68.
ejemploBorderLayout.setVisible( true );
69. }
70.
71. void button1_actionPerformed(ActionEvent e) {
72.
73. }
74. }
75.
76. class EjemploBorderLayout_button1_actionAdapter implements java.awt.event.ActionListener
{
77. EjemploBorderLayout adaptee;
78.
79. EjemploBorderLayout_button1_actionAdapter(EjemploBorderLayout adaptee) {
80.
this.adaptee = adaptee;
81. }
82. public void actionPerformed(ActionEvent e) {
83.
adaptee.button1_actionPerformed(e);
84. }
85. } // fin de EjemploBorderLayout
86.
En la figura siguiente podemos ver que al ejecutar el programa con el comando java
EjemploBorderLayout nos presenta una ventana con cuatro botones y un rea de texto en la
regin CENTER.
El GridLayout
Este administrador de diseo proporciona flexibilidad para colocar componentes en celdillas de
izquierda a derecha y de arriba a abajo en una rejilla al estilo de una hoja electrnica de clculo con
filas y columnas. Por ejemplo un GridLayout con tres renglones y dos columnas puede ser creado
mediante la sentencia new GridLayout ( 3, 2 ) lo que se traduce en 6 celdas.
Con un administrador de tipo GridLayout siempre se ignoran los tamaos preferidos para cada
componente. El ancho de todas celdas es idntico y es determinado mediante la divisin del ancho
disponible sobre el nmero de columnas, as como el alto de todas las celdas es tambin determinado
mediante el alto disponible entre el nmero de renglones.
247
El orden en el cual los componentes son agregados a la rejilla es determina la celda que ocupa. Los
renglones de celdas son llenados de izquierda a derecha, como un texto de una pgina que es llenada
con lneas de de arriba a abajo.
Veamos el siguiente ejemplo.
Si quieres el cdigo de los programas de esta seccin dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
EjemploGridLayout.zip
package oscar230604;
import java.awt.*;
import javax.swing.*;
/**
* <p>Ttulo: EjemploGridLayout.java </p>
* <p>Descripcin: Te ensea a usar el FlowLayout</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante
* @version 1.0
*/
public class EjemploGridLayout extends Frame {
GridLayout gridLayout1 = new GridLayout();
Button button1 = new Button();
Button button2 = new Button();
Button button3 = new Button();
Button button4 = new Button();
Button button5 = new Button();
Button button6 = new Button();
public EjemploGridLayout() {
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("UNO");
gridLayout1.setColumns(2);
gridLayout1.setHgap(20);
gridLayout1.setRows(3);
gridLayout1.setVgap(40);
this.setLayout(gridLayout1);
button2.setLabel("DOS");
button3.setLabel("TRES");
button4.setLabel("CUATRO");
button5.setLabel("CINCO");
button6.setLabel("SEIS");
this.setBackground(Color.red);
this.setTitle("Ejemplo de Frame con GridLayout");
this.add(button1, null);
this.add(button2, null);
this.add(button3, null);
this.add(button4, null);
this.add(button5, null);
this.add(button6, null);
}
248
62.
En la figura siguiente podemos ver que al ejecutar el programa con el comando java
EjemploGridLayout nos presenta una ventana con 3 filas por 2 columnas o 6 celdas botones son
colocados en el orden en que se van agregando al contenedor y todos tienen los espacios
especificados de 20 unidades en horizontal y 40 en vertical.
11.5 Eventos
Cuando un usuario ejecuta una accin en una interface grfica, como dar clic al ratn sobre un botn o
presionar una tecla, esto provoca un evento. Los eventos son objetos que describen que ha
sucedido. Hay diferentes clases de eventos para describir diferentes categoras de acciones por parte
del usuario.
Fuentes de eventos
249
Una fuente de un evento es el generador de un evento, as por ejemplo, el clic del ratn sobre un
componente botn genera un ActionEvent con el botn como origen o fuente del evento. La
instancia de un ActionEvent es un objeto que contiene informacin acerca de los eventos que
acaban de darse. Este contiene:
getActionCommand() - Devuelve el nombre del comando asociado con la accin.
getModifiers() - Regresa cualquier modificador que se haya dado durante la accin.
Manejadores de eventos
Un manejador de evento es un mtodo que recibe un objeto de tipo evento y decide y procesa la
interaccin con el usuario.
11.5.1 El modelo de delegacin de eventos
El modelo de delegacin de eventos aparece con la versin JDK 1.1. Con este modelo los eventos
son enviados a el componente desde donde el evento fue originado, pero cada componente propaga el
evento a un o mas clases llamadas oyentes ( listeners ).
Los oyentes contienen manejadores de eventos que reciben y procesan el evento. De esta forma, el
manejador del evento puede ser un objeto separado de el componente. Los oyentes son clases que
implementan la interface EventListener.
Los eventos son objetos que reportan solamente a los oyentes registrados. Cada evento tiene una
interface oyente correspondiente que le indica cuales son los mtodos adecuados que deben ser
definidos dentro de la clase para recibir tales tipos de eventos. La clase que implementa la interface
define todos esos mtodos y pueden ser registrados como un oyente.
Los componentes que no tienen oyentes registrados no son propagados.
Por ejemplo, veamos el siguiente cdigo de un simple Frame con un simple botn:
Si quieres el cdigo de los programas de esta seccin dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
PruebaBoton.zip
import java.awt.*;
import java.awt.event.*;
/**
* <p>Ttulo: PruebaBoton.java </p>
* <p>Descripcin: Te ensea a usar delegacin de eventos</p>
* <p>Copyright: Totalmente libre</p>
* <p>Empresa: El patito Feo Inc.</p>
* @author Oscar Alejandro Gonzlez Bustamante
250
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
* @version 1.0
*/
public class PruebaBoton
extends Frame {
Button button1 = new Button();
FlowLayout flowLayout1 = new FlowLayout();
public PruebaBoton() {
try {
jbInit();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
void jbInit() throws Exception {
button1.setLabel("Botn");
button1.setActionCommand("Dame clic y vers que bonito!");
// registrar un oyente al botn
button1.addActionListener(new PruebaBoton_button1_actionAdapter(this));
this.setBackground(Color.blue);
this.setTitle("Frame con botn");
this.setLayout(flowLayout1);
this.add(button1, null);
}
public static void main(String[] args) {
PruebaBoton pruebaBoton = new PruebaBoton();
pruebaBoton.setSize(300, 100);
pruebaBoton.setLocation(300, 200);
pruebaBoton.setVisible(true);
pruebaBoton.button1.setSize(50, 50);
}
void button1_actionPerformed(ActionEvent e) {
System.out.println("" + e.getActionCommand());
}
} // fin de la clase PruebaBoton
// La clase PruebaBoton_button1_actionAdapter es la clase manejadora en la
// cual el evento es delegado.
class PruebaBoton_button1_actionAdapter
implements java.awt.event.ActionListener {
PruebaBoton adaptee;
PruebaBoton_button1_actionAdapter(PruebaBoton adaptee) {
this.adaptee = adaptee;
}
La figura siguiente muestra la ejecucin del programa anterior en JBuilder X ( versin de prueba ).
Cuando el usuario le da clic al botn, se dispara el evento y escribe en la ventana de mensajes "
!Dame clic y vers que bonito! "
251
252
ocurrido.
El modelo de delegacin es bueno por la distribucin del trabajo entre las clases.
Los eventos no tienen por que estar relacionados a un componente AWT. Este modelo de eventos
provee soporte para JavaBeans.
La siguiente figura muestra las categoras de los eventos.
El mecanismo general para recibir eventos de los componentes ha sido descrito en el contexto de un
simple tipo de evento. Muchas de las clases de eventos estn en el paquete java.awt.event , pero
otras existen en cualquier otra parte en el API.
Para cada categora de eventos, hay una interface que tiene que ser implementada por la clase de
objetos que quieren recibir los eventos. Esta interface demanda que uno o mas mtodos sean
definidos. Aquellos mtodos son llamados cuando un suceso o evento en particular surge. La
siguiente tabla lista estas interfaces por categorias.
Categora
Action
Item
Mouse
Nombre de la Interface
ActionListener
ItemListener
MouseListener
Mtodos
actionPerformed( ActionEvent )
itemStateChanged( ItemEvent )
mousePressed( MouseEvent )
mouseReleased( MouseEvent )
mouseEntered( MouseEvent )
253
Mouse
Motion
Key
MouseMotionListener
Focus
FocusListener
Adjustment
AdjustmentListener
Component
ComponentListener
Window
WindowListener
Container
ContainerListener
Text
TextListener
mouseExited( MourseEvent )
mouseClicked( MouseEvent )
mouseDragged( MouseEvent )
mouseMoved( MouseEvent )
keyPressed( KeyEvent )
keyReleased( KeyEvent )
keyTyped( KeyEvent )
focusGained( FocusEvent )
focusLost( FocusEvent )
adjustmentValueChanged( AdjustmentEvent
KeyListener
)
componentMoved( ComponentEvent )
componentHidden( ComponentEvent )
componentResized( ComponentEvent )
componentShown( ComponentEvent )
windowClosing( WindowEvent )
windowOpenend( WindowEvent )
windowIconified( WindowEvent )
windowDeiconified( WindowEvent )
windowClosed( WindowEvent )
windowActivated( WindowEvent )
windowDeactivated( WindowEvent )
componentAdded( ContainerEvent )
componentRemoved( ContainerEvent )
textValueChanged( TextEvent )
public
public
public
public
public
void
void
void
void
void
Como una conveniencia, el lenguaje de programacin Java provee de clases adaptadoras que
implementan cada interface conteniendo mas de un mtodo. Los mtodos en estas clases
adaptadoras estn vacios.
254
As , las clases oyentes que usted define pueden extenderse en clases adaptadoras y sobrescribir solo
los mtodos que usted necesite.
Ejemplo:
Si quieres el cdigo de este programa dale clic aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
ManejadorClicRaton.zip
import java.awt.*;
import java.awt.event.*;
/**
* Programa de Java que te ensea a utilizar clases adaptadoras
* del paquete java.awt. Este demuestra el uso de los
* multiples eventos de la clase MouseEvent con
* la clase adaptadora MouseAdapter
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: ManejadorClicRaton.java
*/
public class ManejadorClicRaton extends MouseAdapter {
// necesitamos el manejador mouseClick, asi que usamos
// entonces el adaptador para evitar tener que escribir todos los
// mtodos manejadores de eventos
public void mouseClicked( MouseEvent e ) {
// Aqu programamos el evento del clic del ratn
}
} // fin de la clase ManejadorClicRaton
Hay que notar que esto es una clase, no una interface. Esto significa que es posible extender
solamente a otra clase. Debido a que los oyentes son interfaces, usted puede implementar muchas
otras mas clases.
11.5.5 Manejo de eventos usando clases internas
Es posible implementar manejadores de eventos como clases internas ( como se ve en la lnea 27, 3439) . Esto permite el acceso a los datos privados de las clases externas ( lnea 38 ). Por ejemplo:
PruebaInterna.zip
1. import java.awt.*;
2. import java.awt.event.*;
255
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
/**
* Programa de Java que te ensea a utilizar clases adaptadoras pero como
* clases internas.
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PruebaInterna.java
*/
public class PruebaInterna {
private Frame f;
private TextField tf;
public PruebaInterna() {
f = new Frame("Ejemplo de Manejo de eventos con clases internas");
tf = new TextField( 30 );
} // fin del constructor
public void lanzaFrame() {
Label etiqueta = new Label(" Da clic o arrastra el ratn ");
// agrega componentes al Frame
f.add( etiqueta, BorderLayout.NORTH );
f.add( tf, BorderLayout.SOUTH );
// agrega un oyente que use una clase interna
f.addMouseMotionListener( new MiRatonseMueveOyente() );
f.addMouseListener( new ManejadorClicRaton() );
// Tamao del frame y hacerlo visible
f.setSize( 300, 200 );
f.setVisible( true );
} // fin del mtodo lanzaFrame()
class MiRatonseMueveOyente extends MouseMotionAdapter {
public void mouseDragged( MouseEvent e ) {
String s = "Ratn arrastrandose: X = " + e.getX() +
" Y = " + e.getY();
tf.setText ( s );
} // fin del mtodo mouseDragged()
} // fin de la clase interna adaptadora MiRatonseMueveOyente
public static void main( String[] argumentos ) {
PruebaInterna obj = new PruebaInterna();
obj.lanzaFrame();
} // fin del main()
} // fin de la clase PruebaInterna
256
PruebaAnonima.zip
import java.awt.*;
import java.awt.event.*;
/**
* Programa de Java que te ensea a utilizar clases internas annimas para
* manejar eventos en las AWT
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Archivo: PruebaAnonima.java
*/
public class PruebaAnonima {
private Frame f;
private TextField tf;
public PruebaAnonima() {
f = new Frame("Ejemplo de Manejo de eventos con clases internas annimas");
tf = new TextField( 30 );
} // fin del constructor
public void lanzaFrame() {
Label etiqueta = new Label(" Da clic o arrastra el ratn ");
// agrega componentes al Frame
f.add( etiqueta, BorderLayout.NORTH );
f.add( tf, BorderLayout.SOUTH );
// agrega un oyente que use una clase interna annima
f.addMouseMotionListener( new MouseMotionAdapter() {
public void mouseDragged( MouseEvent e ) {
String s = "Ratn arrastrandose: X = " + e.getX() +
" Y = " + e.getY();
tf.setText ( s );
}
} ); // <-- observe que hay que cerrar el parntesis
f.addMouseListener( new ManejadorClicRaton() );
// Tamao del frame y hacerlo visible
f.setSize( 300, 200 );
f.setVisible( true );
} // fin del mtodo lanzaFrame()
public static void main( String[] argumentos ) {
40.
PruebaAnonima obj = new PruebaAnonima();
41.
obj.lanzaFrame();
42.
} // fin del main()
43. } // fin de la clase PruebaAnonima
257
Se muestra un programa que utiliza arreglos, y la clase java.awt.Graphics para crear un graficador
de funciones.
/**
* Programa de Java que ejemplifica el uso
* de una java.awt y java.awt.event
* dentro de un applet. En particular te
* ensea a utilizar algunos mtodos de la
* clase Graphics para dibujar figuras
258
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
259
70.
panelarriba.add(lt);
71.
add(panelarriba,BorderLayout.NORTH);
72.
add(tg,BorderLayout.WEST);
73.
add(can,BorderLayout.CENTER);
74.
add(b,BorderLayout.SOUTH);
75.
76. } // fin init
77.
78. // EJECUTA ACCIONES VIA BOTON
79. public void actionPerformed(ActionEvent e){
80.
81.
// EJECUTA EL GRAFICADOR
82.
if(e.getActionCommand().equals("Graficar"))
83.
{
84.
85.
// OBTIENE EL TIPO DE FUNCIN QUE SE VA A GRAFICAR
86.
int tipofun = tg.getSelectedIndex();
87.
switch (tipofun)
88.
{
89.
case 0: fun = 1; break; //parabola f(x)=x*x
90.
case 1: fun = 2; break; //linea
f(x)=8*x;
91.
case 2: fun = 3; break; //circulo (pendiente) f(x)=x*x + y*y
92.
case 3: fun = 4; break; //sinuidal f(x)=sin(10*x)+ cos(3*x)
93.
case 4: fun = 5; break; //seno f(x)=sin(x)
94.
case 5: fun = 6; break; //sinuidal f(x)=4*sin(10*x)
95.
case 6: fun = 7; break; //movimiento armonico simple f(x)=exp(-x/20.0) *
sin( 50*x)
96.
default : fun = -1; break;
97.
} //fin del switch
98.
99.
can.setFun(fun);
100.
101.
} //fin del if
102.
103.
can.repaint();
104.
105.
106. } // fin actionPerformed
107.
108.
109. } // fin ProyGraf
110.
111.
112. class MyCanvas extends java.awt.Canvas {
113.
114.
/* VARIABLES PARA EL GRAFICADOR */
115. static final int M = 720;
116. static final String TITULO = "GRAFICAS DE FUNCIONES DE OSCARIN";
117. static final String EJEX = "Absisas eje x";
118. static final String EJEY = "Ordenadas eje y";
119. static double x[] = new double[M];
120. static double y[] = new double[M];
121. static int xi[] = new int[M];
122. static int yi[] = new int[M];
123. static double ymax,ymin,yrango;
124. static double xmax,xmin,xrango;
125.
126. int fx;
127.
128. public void setFun(int funcion) { fx = funcion; }
129.
130. public int getFun() { return fx; }
131.
132.
260
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
261
231.
El uso de la los puentes o drivers de conexin con los manejadores de bases de datos,
puentes 1 y 4, esto es, el puente ODBC-JDBC y el puente java nativo JDBC
El uso de las clases e interfaces del paquete java.sql.* , para la interaccin con bases
de datos, mediante sentencias de SQL estndar con DDL y DML.
262
Java
Base de Datos con Java
Objetivo: El participante obtendr el los conocimientos necesarios, para
crear programas de Java que interacten con Bases de Datos, conocer las
clases e interfaces disponibles en el API JDBC para ello.
ODBC (Open Database Conectivity) es un standar que permite que una
aplicacin sobre Windows pueda comunicarse con diferentes sistemas
manejadores de bases de datos.
Java utiliza la interfaz JDBC para comunicarse con las Bases de Datos y tiene
la misma funcin que el ODBC la tiene para Windows. JDBC , est
compuesto por un nmero determinado de clases que permiten a cualquier
programa escrito en Java acceder a una base de datos.
Puente 1. JDBC-ODBC
Java puede acceder a la base de datos mediante un puento o driver o controlador JDBC apropiado que
pueda utilizar las clases que permiten el acceso a la base de datos. Existen 4 tipos de drivers.
Puente 1. JDBC-ODBC: Los controladores de este tipo utilizan el sistema de pasarela o puente. Un
ejemplo es el JDBC-ODBC. No es la mejor solucin porque en muchos casos es necesario instalar un
software especfico en el cliente adems de ser algo lento en los accesos a la base de datos.
Este controlador convierte todas las llamadas de JDBC a ODBC realizando el proceso
inverso para la obtencin de resultados.
Su principal inconveniente radica en que al realizar una llamada de JDBC a ODBC, ste
ltimo debe realizar una llamada a la librera nativa del fabricante del SGBD,
disminuyendo claramente la velocidad del controlador
Al utilizar ODBC como puente se crea una doble capa, y a su vez creamos una
aplicacin dependiente de la plataforma, ya que ODBC est definido para Windows.
263
Es 100% nativo, este controlador se brinca la capa ODBC que se genera con el JDBC ODBC, por tanto, ste controlador realiza invocaciones a las libreras nativas del
sistema gestor de la base de datos de forma directa.
Al ser 100% Java necesita utilizar libreras nativas, por sta razn no podremos utilizar
ste tipo de controlador para nuestros applets.
264
265
Al dar clic al botn Incluir se limpian loscampos y puedes insertar otro registro.
266
267
Nota: Sivuelves a correr el programa y le das clic al botn Crear, los registros seborrarn y se crear
otra vez la tablaDATOSPERSONALES.
2. Junto a la ficha Controladores seleccionarla ficha DNS de usuario. Darle clic al botn de Agregar...
para agregar elorigen de datos "Personal" .
Aparecern los controladores ODBC que seencuentran ya instalados, en ste caso se escogera el
controlador "MicrosoftAccess Driver".
268
3. Una vez elegido el tipo de controladoraparecer una pantalla con el cuadro de dialogo Configuracin de ODBCMicrosoft Access - , en ste cuadro insertars el nombre del origen de datos
(Personal ) y seleccionars la base de datos "Datospersonales.mdb", da clic enAceptar .
269
Los resultados devueltos por SQL pueden ser tratados como objetos, de
manera tal que ,si hay errores puedan ser tratados como excepciones.
En la siguiente figura se ven las operaciones que pueden realizarse en una base de datos. Cada uno de
los rectngulos representa una clase o interfaz de JDBC que tiene un rol en el acceso a una base de
datos relacional. Todo el trabajo con el JDBC comienza con la clase DriveManager, que es la que
establece las conexiones con las fuentes de datos, mediante los drivers o controladores JDBC.
Los drivers de bases de datos JDBC se definen mediante clases que implementan la interfaz Driver.
Cada driver sabe cmo convertir peticiones SQL para una base de datos concreta. Si no disponemos
del driver adecuado, no podemos conectarlos a una base de datos, y el JDBC depende de las
implementaciones concretas de cada fabricante. Por lo tanto, lo primero que debe llevar a cabo un
programa es cargar el driver adecuado para que el cdigo de Java pueda comunicarse con la base de
datos.
2. Junto a la ficha Controladores seleccionarla ficha DNS de usuario. Darle clic al botn de Agregar...
270
3. Una vez elegido el tipo de controladoraparecer una pantalla con el cuadro de dialogo Configuracin de ODBCMicrosoft Access - , en ste cuadro insertars el nombre del origen de datos
(Personal ) y seleccionars la base de datos "Datospersonales.mdb", da clic enAceptar .
271
Siempre que se crea un programa en java para manejo de bases de datos importamos el paquete:
import java.sql.*;
recuerda que debe ser la primera instruccin dentro del archivo fuente.
Cargar el Driver.
Para conseguir una conexin con la base de datos utilizamos el mtodo Class.forName() que nos
permite cargar el Driver al crear una instancia de la clase Driver de forma dinmica. A veces se
necesita el mtodo newInstance() para asegurarse de que se esta registrando el driver de la
siguiente manera:
Class.forName("com.mysql.jdbc.Driver").newInstance();
Al hacer esto, ya esta disponible el driver JDBC para ser utilizado por el resto de los objetos necesarios
para acceder a la base de datos
jdbc:mysql://[<servidor>][:puerto]/<nombre_basededatos>[?param1=valor
1][¶m2=valor2]...[¶mN=valorN]
Uso
Nombre del usuario para acceder la
la base de datos
Contrasea de acceso a la base de
datos
Reintenta conectar de nuevo si la
conexin se rompe
Nmero de veces que se debe de
internar reconectar
Segundos de espera entre las
diferentes reconexiones
Nmero mximo de tuplas a devolver
( 0 significa todas )
272
useUnicode
false
Conectate.java
import java.sql.*;
public class Conectate {
public static void main ( String args[] ) throws Exception {
Connection con = null;
try {
String url = "jdbc:mysql://barbanegra/test";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,"","");
if ( con != null ) {
System.out.println("Se ha establecido una conexin a la base
de datos ");
}
}
finally {
if ( con != null ) {
try {
con.close();
} catch( Exception e ) {
System.out.println(
e.getMessage());
}
}
}
}
}
programa es:
273
ejedgsca es el nombre de la base de datos que creamos para este ejercicio, y el usuario y contrasea
son opcionales, depende si quieres tener seguridad en tu base de datos, y eso lo estableces desde el
manejador de base de datos.
Una vez creada la conexin a la base de datos, podemos crear sentencias o ejecutar consultas desde
nuestro programa de Java para interactuar con la base de datos. Podemos crear consultas que
modifiquen la base de datos sin devolver ningn resultado, p. ej: INSERT, ALTER, DELETE, CREATE,
DROP, o UPDATE.
El cdigo en cuestin debe presentar una estructura similar a sta, ver ejemplo:
Statement stmt;
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO interes (interes_nombre, interes_url," +
"interes_tipo) VALUES ('" + args[0] + "', '" + args[1] + "', '" + args[2] +"')");
El mtodo createStatement() crea un canal abierto a travs del cual se pueden ejecutar consultas.
Insertame.java
import java.sql.*;
public class Insertame {
public static void main ( String args[] ) throws Exception {
Connection con = null;
Statement stmt = null;
try {
String url = "jdbc:mysql://barbanegra/ligas";
String usuario = "yomismo";
String contrasea = "santoysea";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,usuario,contrasea);
if ( con != null )
System.out.println("Se ha establecido una conexin a la base de datos " +
"\n " + url );
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO interes (interes_nombre, interes_url," +
"interes_tipo) VALUES ('" + args[0] + "', '" + args[1] + "', '" + args[2] +"')");
System.out.println("Los valores han sido agregados a la base de datos ");
274
23.
}
24.
catch( SQLException e ) {
25.
e.printStackTrace();
26.
}
27.
28.
finally {
29.
if ( con != null ) {
30.
try {
31.
con.close();
32.
stmt.close();
33.
} catch( Exception e ) {
34.
System.out.println( e.getMessage());
35.
}
36.
}
37.
}
38.
}
39.
}
Ejemplo de ejecucin del programa:
C:\j2sdk141\ejemplos\bdmysql>javac Insertame.java
C:\j2sdk141\ejemplos\bdmysql>java Insertame UNAM http://www.unam.mx educativo
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos
C:\j2sdk141\ejemplos\bdmysql>java Insertame IPN http://www.ipn.mx educativo
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos
C:\j2sdk141\ejemplos\bdmysql>java Insertame "Aeropuertos y Servicios Auxiliares" http://www.asa.gob.mx
gobierno
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos
275
LIMIT 5");
Ya creado el objeto ResultSet, la forma mas fcil de conseguir esto consiste en usar un bucle
while ( rs.next() ) {
/* Haga algo con los resultados */
}
Para recuperar los valores de los campos de una tabla el procedimiento consiste en manejar los
resultados mediante la asignacin de los valores de las columnas a variables, en funcin del tipo de
valor. Hay funciones para distintos tipos, as getInt() recupera un valor entero, getDoble()
recupera un valor double, y getString() se encarga de la manipulacin del texto. Todos estos
mtodos aceptan tanto el nmero ( indexado a partir del 1 ) as como el nombre de la columna como
argumento:
while ( rs.next() ) {
String inom = rs.getString("interes_nombre");
String iurl = rs.getString("interes_url");
String itip = rs.getString("interes_tipo");
System.out.println("Sitio Web "+ (i++) + ":\n"
+ inom + "\n"
+ iurl + "\n"
+ itip + "\n\n" );
}
Ejemplo: si quieres el cdigo descrgalo aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Seleccioname.java
import java.sql.*;
public class Seleccioname {
public static void main ( String args[] ) throws Exception {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
String url = "jdbc:mysql://barbanegra/ligas";
String usuario = "yomismo";
String contrasea = "santoysea";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url,usuario,contrasea);
if ( con != null )
System.out.println("Se ha establecido una conexin a la base de datos " +
"\n " + url );
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT interes_nombre, interes_url, interes_tipo FROM interes
LIMIT 5");
22.
23.
24.
25.
26.
27.
28.
29.
276
30.
+ iurl + "\n"
31.
+ itip + "\n\n" );
32.
}
33.
}
34.
catch( SQLException e ) {
35.
e.printStackTrace();
36.
}
37.
38.
finally {
39.
if ( rs != null ) {
40.
try {
41.
rs.close();
42.
} catch( SQLException e ) {
43.
System.out.println( e.getMessage());
44.
e.printStackTrace();
45.
}
46.
}
47.
if ( stmt != null ) {
48.
try {
49.
stmt.close();
50.
} catch( SQLException e ) {
51.
System.out.println( e.getMessage());
52.
e.printStackTrace();
53.
}
54.
}
55.
if ( con != null ) {
56.
try {
57.
con.close();
58.
} catch( SQLException e ) {
59.
System.out.println( e.getMessage());
60.
e.printStackTrace();
61.
}
62.
}
63.
64.
}
65.
}
66.
}
La salida al ejecutar este programa es:
Se ha establecido una conexin a la base de datos
jdbc:mysql://barbanegra/ligas
Los valores han sido agregados a la base de datos
Sitio Web 1:
UNAM
http://www.unam.mx
educativo
Sitio Web 2:
IPN
http://www.ipn.mx
educativo
Sitio Web 3:
Aeropuertos y Servicios Auxiliares
http://www.asa.gob.mx
gobierno
277
close(), y hay que verificar si en ese proceso hubo alguna excepcin, porque el mtodo close(),
puede reportar algn evento de error y hay que capturarlo.
finally {
if ( rs != null ) {
try {
rs.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
if ( stmt != null ) {
try {
stmt.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}
if ( con != null ) {
try {
con.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
Liberar objetos ResultSet, Statement y Connection
278
finally {
if ( rs != null ) {
try {
rs.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
if ( stmt != null ) {
try {
stmt.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}
if ( con != null ) {
try {
con.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
Un archivo de propiedades contiene los parmetros necesarios para la conexin a la base de datos.
Bsicamente es un archivo de texto cuyas entradas responden al formato nombre=valor.
Normalmente, este archivo se guarda con la extensin .properties cuando se utiliza en Java.
Una vez creado el archivo de propiedades, podemos usar la clase ResourceBundle del paquete
java.util.*; para acceder a l, asi:
ResourceBundle bundle = ResourceBundle.getBundle( "NombreDelArchivoDePropiedades" );
String nomb = bundle.getString("nombre");
Veamos un ejemplo:
279
Conectate2.java
import java.sql.*;
import java.util.*;
public class Conectate2 {
public static void main ( String args[] ) throws Exception {
Connection con = null;
ResourceBundle bundle = ResourceBundle.getBundle( "ligas" );
try {
String url = bundle.getString("URL");
Class.forName( bundle.getString("Driver") ).newInstance();
con = DriverManager.getConnection( url,
bundle.getString("User"),
bundle.getString("Password") );
if ( con != null ) {
System.out.println("Se ha establecido una conexin a la base de datos ");
}
}
finally {
if ( con != null ) {
try {
con.close();
} catch( Exception e ) {
System.out.println( e.getMessage());
}
}
}
}
32.
}
La salida de ste programa es:
C:\j2sdk141\ejemplos\bdmysql>java Conectate2
Se ha establecido una conexin a la base de datos
280
Uso de PreparedStatement.
Es otra forma de lanzar consultas sobre una base de datos pero de tal manera que stas sean
dinmicas. Para esto hay que especificar despus de que se haga la consulta , una serie de
parmetros mediante los mtodos de la interface PreparedStatement, veamos el siguiente ejemplo:
String valor1 = "UNAM";
String valor2 = "educativo";
String query = "SELECT interes_nombre, interes_url, interes_tipo FROM
interes" +
" WHERE interes_nombre = ? AND interes_tipo = ?";
PreparedStatement pstmt = con.prepareStatement( query );
pstmt.setString( 1 , valor1 ); // el 1 indica que es el 1er. parmetro y
// establece ese valor al RecordSet
pstmt.setString( 2, valor2 ); // el 2 indica que es el 2do. parmetro y
// establece es valor al
RecordSet
rs = pstmt.executeQuery();
El smbolos de interrogacin ? notifican al objeto ResultSet rs, que le sern enviados una serie de
valores que sern remplazados por stos smbolos , con el fin de completar la consulta y que sta
pueda ser ejecutada con el mtodo executeQuery().
Para establecer los valores utilizamos mtodos setXxx() , as para el primero de los valores, la
columna interes_nombre se utiliza el mtodo setString( 1, valor1 ) y para el segundo el mtodo
setString( 2, valor2 ), porque ambos son de tipo varchar en la base de datos. Pero si fueran de
otro tipo usaramos setInt( ), setDouble( ), setFloat( ), setBoolean( ), setDate( ), etc..
Una vez establecidos todos los valores de los parmetros, se puede ejecutar la consulta como se ha
hecho hasta ahora, porque la interface PreparedStatement tambin dispone de los mismos
mtodos que Statement para ejecutar las consultas de la base de datos, al heredar de Statement.
Ejemplo: si quieres el cdigo descrgalo aqu
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
PreparaUnStatement.java
281
22.
String valor = "tecnologa";
23.
24.
String query = "SELECT interes_nombre, interes_url, interes_tipo FROM interes" +
25.
" WHERE interes_tipo = ?";
26.
28.
System.out.println("Los registros de la base de datos que concuerdan con: \n"
29.
+ query + "\n donde el valor de ? es: "
30.
+ valor + "\n son los siguientes : \n" );
31.
32.
pstmt = con.prepareStatement( query );
33.
34.
pstmt.setString( 1 , valor ); // el 1 indica que es un parmetro
35.
36.
rs = pstmt.executeQuery();
37.
38.
int i=1;
39.
while ( rs.next() ) {
40.
String inom = rs.getString("interes_nombre");
41.
String iurl = rs.getString("interes_url");
42.
String itip = rs.getString("interes_tipo");
43.
System.out.println("Sitio Web "+ (i++) + ":\n"
44.
+ inom + "\n"
45.
+ iurl + "\n"
46.
+ itip + "\n\n" );
47.
}
48.
pstmt.clearParameters();
49.
}
50.
catch( SQLException e ) {
51.
e.printStackTrace();
52.
}
53.
54.
finally {
55.
if ( rs != null ) {
56.
try {
57.
rs.close();
58.
} catch( SQLException e ) {
59.
System.out.println( e.getMessage());
60.
e.printStackTrace();
61.
}
62.
}
63.
if ( pstmt != null ) {
64.
try {
65.
pstmt.close();
66.
} catch( SQLException e ) {
67.
System.out.println( e.getMessage());
68.
e.printStackTrace();
69.
}
70.
}
71.
if ( con != null ) {
72.
try {
73.
con.close();
74.
} catch( SQLException e ) {
75.
System.out.println( e.getMessage());
76.
e.printStackTrace();
77.
}
78.
}
79.
80.
}
81.
}
82.
}
La salida del programa es:
C:\j2sdk141\ejemplos\bdmysql>java PreparaUnStatement
282
283
tecnologas que son basadas en Java, esto es, son un subconjunto del lenguaje de
programacin Java, y obtener buenos resultados en el consumo de recursos, tiempos y
desarrollo y confiabilidad del producto final.
Indice
1.1 Qu es un Servlet?
Losservletsson clases de Javaque amplan la funcionalidad de un servidor Web mediante la
generacin dinmicade pginas Web. Un entorno de ejecucin denominadomotor
deservletsadministra la carga y descarga del servlet, y trabaja con elservidor Web HTTP para
dirigir las peticiones de los usuarios remotos(clientes) a los servlets y enviar la respuesta a los
284
El siguiente ejemplo de tu primer servlet, maneja el mtodo doGet paradar salida por el
navegador a los mensajes con el mtodo println del objetosalida de la clase PrintWriter.
Checa que cuando hagas un servlet debes importar javax.servlet.*; yjavax.servlet.http.* y tu
clase debe heredar de HttpServlet.
Ejemplo de tu primer servlet:Descrgalo dando clic aqu Checa1erServlet.java
package oscaruno;
import java.io.*;
import java.util.*;
importjavax.servlet.*;
import javax.servlet.http.*;
La salida es:
285
Las caractersticas que hacen que los servlets superen a los CGIson:
Son 100% puro Java, lo que los hacen multiplataforma
Es un Lenguaje Orientado a Objetos y por lo tanto poseen todas lascaractersticas
que se derivan de esto.
Puede utilizar todas las tecnologas de Java : clases dealmacenamiento, hilos o
threads, acceso a bases de datos, flujos de E/S, RMI,acceso a la red, etc.
No cargan al servidor con excesivo procesamiento de peticionesdebido a que en la
primera peticin, el servidor Web crea un proceso para elservlet, y en las
posteriores peticiones, crea hilos (threads) de ejecucin deeste proceso.
Son mucho ms rpidos que los CGI ya que estn precompilados ydebido al punto
anterior, no se generan procesos independientes cada vez que sesolicita una URL
( como suele suceder con CGI )
Son seguros ya que aplican el Security Manager de Java
La comunicacin con otros servlets es muy sencilla
Mediante el manejo de excepciones los errores pueden manejarsesencillamente
durante la ejecucin del servlet.
Veamos ahora un pequeo servlet que produce las tablastrigonomticas. Este nos servir de
referencia para cuando comencemos a ver laspginas JSP, ya que generaremos la misma tabla
trigonomtica que genera steservlet con una JSP, y analizaremos la relacin que hay entre un
servlet y unaJSP.
Ejemplo de un Servlet que produce una tabla de funcionesTrigonomtricas
Dale clic aqu para descargar el cdigo SenoServlet.java
/** Programa de java que ejemplifica el de unServlet que
* imprime una tabla trigonomtrica
* Fuente: Adaptado dellibro Manual de referencia JSP de Phil Hanna
* Capitulo 2. Editorial McGraw- Hill
* @autor Oscar A. Gonzlez Bustamante
* @version 1.0
* Fecha :18/03/2003
* Archivo:SenoServlet.java
*/
packageoscaruno;
import java.io.*;
import java.text.*;
286
importjava.util.*;
import javax.servlet.*;
importjavax.servlet.http.*;
/**
* Imprime la tabla trigonomtrica del seno,coseno,
* tangente y cotangente
*/
public class SenoServlet extendsHttpServlet
{
private static final DecimalFormat FMT1
= newDecimalFormat("#0");
private static final DecimalFormat FMT2
= newDecimalFormat("#0.0000");
private static final String PAGE_TOP = ""
+"<HTML>"
+ "<HEAD>"
+ "<TITLE>Tablas trigonomtricas -Seno</TITLE>"
+ "</HEAD>"
+ "<BODY>"
+"<H3><CENTER>Tabla de la funcinSeno</CENTER></H3>"
+ "<TABLE ALIGN =\"CENTER\" BORDER=1CELLPADDING=3 CELLSPACING=0>"
+ "<TR>"
+ "<TH ALIGN=\"CENTER\">Grado</TH>"
+ "<TH ALIGN=\"CENTER\">Seno</TH>"
+ "<TH ALIGN=\"CENTER\">Coseno</TH>"
+ "<TH ALIGN=\"CENTER\">Tangente</TH>"
+ "<TH ALIGN=\"CENTER\">Cotangente</TH>"
+ "</TR>"
;
privatestatic final String PAGE_BOTTOM = ""
+ "</TABLE>"
+"</BODY>"
+ "</HTML>" ;
public voiddoGet(
HttpServletRequest request,
HttpServletResponse response)
throwsServletException,IOException
{
response.setContentType("text/html");
PrintWriter out =response.getWriter();
out.println(PAGE_TOP);
for (double gdo = 0;gdo<= 45; gdo += 1.0) {
out.println("<TR>");
out.println("<TDALIGN =\"CENTER\"><font face=\"Arial\" size=1>"
+ FMT1.format(gdo)+ "</font></TD>");
out.println("<TD ALIGN=\"CENTER\"><font face=\"Arial\" size=1>"
+FMT2.format(Math.sin(Math.toRadians(gdo))) + "</font></TD>"); //seno
out.println("<TD ALIGN =\"CENTER\"><font face=\"Arial\"size=1>"
+ FMT2.format(Math.cos( Math.toRadians(gdo)))+"</font></TD>"); // coseno
out.println("<TD ALIGN=\"CENTER\"><font face=\"Arial\" size=1>"
+ FMT2.format(Math.tan(Math.toRadians(gdo))) + "</font></TD>"); //tangente
out.println("<TD ALIGN =\"CENTER\"><font face=\"Arial\"size=1>"
+ FMT2.format(1/Math.tan( Math.toRadians(gdo))) +"</font></TD>"); // cotangente
out.println("</TR>");
}
out.println(PAGE_BOTTOM);
}
}
287
1.2 Qu es JSP?
Un JSP, ( del acrnimo en ingls JavaServerPages) es una pgina Java en Servidor y es una
plantilla para una pgina Web queemplea cdigo Java para generar un documento HTML
dinmicamente. Las JSP . LasJSP se ejecutan en un componente del servidor
denominadocontenedor deJSP, y este las traduce o convierte a servlets de Java equivalentes
ypor lo tanto, lo que se puede hacer con un JSP, tambin se puede hacer con unservlet, as que
tienen los JSP tienen las ventajas de un servlet asaber:
1.3JSP o Servlets?
Primeramente mencionaremos las ventajas de unServlet y JSP sobre los CGI y luego las Ventajas
de los JSP sobre losServlets.
Ventajas de los Servlets yJSP
Tienen un mejor desempeo y capacidad deadaptacin que los CGI, debido a que
se conservan en la memoria y manejanmltiples subprocesos.
No se requiere una configuracin especial porparte del cliente.
Soportan sesiones HTTP, lo que hace posiblela programacin de aplicaciones.
Pueden acceder a la tecnologa disponible enJava para manejar hilos o treads,
sockets o trabajo en red, conectividad conbases de datos y todo esto sin las
limitaciones de los applets delcliente.
288
Al descomprimirlo aparece una carpeta con elmismo nombre y en esa carpeta hay varios archivos
y carpetas , ver siguientefigura:
289
Una vez que ya se estableci en el casspath laruta de el driver de MySQL, haremos un programa
sencillo en Java paraprobarlo:
Paso 13. Escribir el siguiente programa enJava.Si no lo quieres escribir, descrgalo dando clic
aqu TablaGeneral2.java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
importjava.sql.*;
/** Programade java que ejemplifica como utilizar los contenidos
de cualquiertabla dando su nombre con un parametro de entrada
al programael cual es convertido en maysculas
* @autor Oscar A. Gonzlez Bustamante
@version 1.0
Fecha :02/10/2003
Archivo:TablaGeneral2.java
*/
public classTablaGeneral2 {
publicstatic void main ( String argumentos[] ) {
if ( argumentos.length<1 ) {
System.out.println("Datos incompletos oinsufucientes");
return;
290
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
}
String varNombreTabla = argumentos[0];
//varNombreTabla = varNombreTabla.toUpperCase();
System.out.println("Mostrando la Tabla: " + varNombreTabla);
try {
/* cargar las clases del JDBC de MySQL */
Class.forName("com.mysql.jdbc.Driver").newInstance();
/* Establece la cadena para conectarse a la base de datoslocal */
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
System.out.println(" Intentando conectarse a: " + connString);
Connection conn = DriverManager.getConnection( connString);
/* Obtener el result set */
Statement stmt = conn.createStatement();
String varSQL = "SELECT * FROM " +varNombreTabla;
ResultSet rs = stmt.executeQuery( varSQL);
/* Obtiene los meta datos sobre el result set*/
ResultSetMetaData rsMeta =rs.getMetaData();
/* Despliega los nombres de las columnas como cadenas */
String varColNombres = "";
int varColCuenta = rsMeta.getColumnCount();
for ( int col = 1; col<= varColCuenta; col++ ){
varColNombres += rsMeta.getColumnName(col ) + " ";
}
System.out.println( varColNombres );
/* Despliega los valores de las columnas */
while ( rs.next() ) {
for ( int col = 1; col<= varColCuenta; col++ ){
System.out.print( rs.getString( col ) +" ");
}
System.out.println();
}
/* limpieza */
rs.close();
stmt.close();
conn.close();
}
catch ( Exception e ) {
e.printStackTrace();
}
}// findel main()
}// fin deTablaGeneral2
291
Dentro del try de la lnea 24 ala 30 utilizamos el mtodo de claseforName, de la claseClass del
paquete java.lang para cargar el controlador o driver JDBC de MySQL. Elargumento
deforName es el url del controlador o driver, el cual indicaque com.mysql es el nombre de la
empresa u organizacin que desarrollo eldriver, jdbc.Driver indica que es un puente de tipo jdbc o
puente 4.
23.
24.
25.
26.
27.
28.
29.
30.
Una vez cargado el driver, se establece laconexin a la base de datos local. Para conectarse a la
base de datos, senecesita usar el url JDBC con el siguiente formato:
jdbc:mysql://[hostname][,failoverhost...][:port]/[dbname][?param1=value1][¶m2=value2]....
.
Los parmetros son:
292
datos que creamos para este ejercicio, y el usuario ycontrasea son opcionales, depende si
quieres tener seguridad en tu base dedatos, y eso lo estableces desde el motor de MySQL con el
comando mysqladmin ocon el monitor de mysql.
En la lnea 30 utilizas el mtodo getConnection de la claseConnectionpara establecer la
conexina la base de datos y se utiliza la variable connString como suargumento.
De la lnea 33 a la 35 estamos creado un objetode la clase Statement, el cul nos sirve para
crear una sentencia deSQL. El mtodoexecuteQuery utiliza la cadena varSQL para realizar
unaconsulta de todas las tuplas o registros de la tabla alumnox , estas tuplas estn contenidas
en rsque es un objeto de la claseResultSetysirve para manejar conjuntos de registros de una
consultadeterminada.
32.
33.
34.
35.
293
49.
50.
51.
52.
53.
54.
while ( rs.next() ) {
for ( int col = 1; col<= varColCuenta; col++ ){
System.out.print( rs.getString( col ) +" ");
}
System.out.println();
}
Finalmente cerramos la el objetoConnection pero antes tambin tenemos que cerrar los flujos
delStatementyRecordSeten el orden inverso en que se instanciaron:
56.
57.
58.
59.
/* limpieza */
rs.close();
stmt.close();
conn.close();
LA TECNOLOGA JDBC
Estatecnologa nos permite mediante programas de Java o desde una JSP , realizarconexiones a
una base de datos y ejecutar sentencias de SQL para hacer consultassobre ella . Esta tecnologa
se detalla con profundidad en la direccinweb: http://java.sun.com/jdbc/.
El API JDBC
El API JDBC es una tecnologaestndar creada por Sun y su uso permite al desarrollador de
pginas de Java yJSP tener conexin con un motor de base de datos no importando de que
tiposea.
Caractersticas ms importantesde sta API JDBC son:
Losresultados devueltos por SQL pueden ser tratados como objetos, de manera
tal que ,
si hay errores puedan ser tratados comoexcepciones.
El API JDBC de Sun esta inspirado en lafilosofa del estndar ODBC ( Open Data Base
Conectivity ) creado porMicrosoft. Esta filosofa se basa en crear un estndar para el uso de
cualquierbase de datos utilizando el lenguaje Java. Es por esto que Sun creo unaespecie de
pasarela o puente entre JDBC y ODBC . Este puente se encarga derealizar la conversin de las
llamadas del JDBC a ODBC de forma totalmentetransparente para el programador. EL puente
JDBC-ODBC no es la solucin masadecuada, ya que hay un proceso de conversin de una API a
otra y es motivo demal rendimiento en una aplicacin cuando se hace uso masivo de consultas en
unabase de datos.
Tipos decontroladores.
Existen cuatro puentesdiferentes de controladores o driver JDBC definidos en la especificacin
JDBC deSun.
294
295
Class.forName("com.mysql.jdbc.Driver").newInstance();
Al hacer esto, ya esta disponible el driver JDBC para ser utilizado por el resto de los objetos
necesarios para acceder a la basede datos.
Lo siguiente es construir la URL en la que sedefine la forma de conexin a la base de datos, el
servidor en el que esta, elnombre de la misma y un usuario con clave son necesarios para acceder
a la basede datos.
La sintaxis que se utiliza para construir la URLque servir para la conexin a la base de datos es:
jdbc:mysql://[<servidor>][:puerto]/<nombre_basededatos>[?param1=valor1][¶m2=valor2].
..[¶mN=valorN]
Los parmetros son:
NombreUsoValor poromisinuserNombre del usuario paraacceder la la base de
datosningunopasswordContrasea de acceso a labase de datosningunoautoReconnectReintenta
296
297
298
Cdigo delEjemplo2:Teclear elsiguiente cdigo. Puedes descargarlo dndole clic con el botn
derecho aqu TablaGeneral2.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
1.
2.
<!-- Ejemplo de Acceso a una Basede Datos desde una Pgina JSP -->
3.
<@ page import="java.sql.*"%>
4.
<HTML>
5.
<HEAD>
6.
<TITLE>Desplegando unatabla usando el JDBC y MySQL</TITLE>
7.
<meta name="author" content="Oscar Alejandro GonzálezBustamante">
8.
<meta name="keywords" content="JSP, JDBC, MySQL, Acceso aDatos">
9.
<metaname="description" content="Un ejemplo de despliegue de una tabla usandoJSP">
10.
</HEAD>
11.
<BODY>
12.
<H2>Ejemplo de Acceso a unabase de Datos usando JSP y MySQL</H2>
13.
<% String varNombreTabla =request.getParameter("Tabla");%>
14.
<H3>Mostrando los datos desdeMySQL de la base de datos ejedgsca</H3>
15.
<%
16.
try {
17.
/* cargar las clases del JDBC de MySQL */
18.
Class.forName("com.mysql.jdbc.Driver").newInstance();
19.
20.
/* Establece lacadena para conectarse a la base de datos
21.
local */
22.
23.
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
24.
Connection conn = DriverManager.getConnection( connString);
25.
26.
/* Obtener el result set*/
27.
Statement stmt = conn.createStatement();
28.
String varSQL = "SELECT * FROM " + varNombreTabla;
29.
ResultSet rs = stmt.executeQuery( varSQL );
30.
/* Obtiene losmeta datos sobre el result set */
31.
ResultSetMetaData rsMeta =rs.getMetaData();
32.
%>
33.
<TABLE BORDER=1 bgcolor="#FFFFFF" cellspacing="5"><fontface="Arial, Helvetica, sansserif" color="#000000">
34.
<caption><B><%= varTablaNombre%></B></caption></font>
35.
<THEAD>
36.
<TR><%
37.
/* Despliega los nombres de las columnas como cadenas */
38.
String varColNombres ="";
39.
int varColCuenta = rsMeta.getColumnCount();
40.
for ( int col = 1; col<= varColCuenta; col++ ){
41.
%><THbgcolor="C0C0C0" bordercolor="#000000"><font size="2" FACE
="Arial"color="#000000"
42.
><%= rsMeta.getColumnName( col )%></font> </TH>
43.
<%}%>
44.
</TR>
45.
</THEAD>
46.
<tbody><%
47.
/* Despliega los valores de las columnas */
48.
while ( rs.next() ) {
49.
%><TRvalign="top"><%
50.
for ( int col = 1; col<= 10;col++ ) {
51.
%><TD bordercolor="#C0C0C0"><font size="2" face="Arial, Helvetica,sansserif" color="#000000"
52.
><%= rs.getString( col )%><BR></font></TD>
53.
<% }
54.
}
55.
/* limpieza */
56.
rs.close();
57.
stmt.close();
58.
conn.close();
299
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
}
catch ( ClassNotFoundException e ) {
out.println("Excepcindel Driver: " + e );
}%>
</tr>
</tbody>
<tfoot></tfoot>
</TABLE>
</BODY>
</HTML>
300
mediante pago. Hay mas ejemplos de servidores en el librode Martin Hall- Servlets y JavaServer
pages.enhttp://www.moreservlets.com/
3.-Los paquetes de clases servlet:
javax.servlet
javax.servlet.http
sepueden encontrar en:
http://java.sun.com/products/servlet/download.html
otambin se pueden conseguir en:
La API con el paquete de clasesCore Servlets y JavaServer Pages.
2.1 Apache Tomcat
Aqu veremos como instalar y configurar elservidor webJakarta-Tomcat distribuido libremente
por la organizacinApache. Tomcat es un mas de los proyectos de apache.org y es
unaimplementacin oficial de referencia de la especificacin Servlet 2.3 yJavaServerPages 1.2.
Pero antes de entrar en la instalacin y configuracin deTomcatnecesitamos conocer el concepto
deAplicacin Webycontenedor.
Concepto deAplicacin Web. Esteconcepto fue introducido en la versin 2.2 de la especificacin
de servlet, ysegn esta especificacin , una aplicacin web es una coleccin de servlets,paginas
JSP, clases Java, archivos de descripcin de la aplicacin, documentosestticos HTML , XHTML,
imgenes, etc. y otros recursos que pueden serempaquetados y ejecutados en distintos servidores
de diferentes proveedores. Esto es, una aplicacin web se podra definir coma la capa web de
cualquieraplicacin.
Concepto decontenedor. El contenedores el que contiene o alberga una aplicacin web y no es
mas que la estructura dedirectorios en donde estn colocados todos los archivos necesarios para
laejecucin de la aplicacin web. Es lgico entonces que el primer paso en eldesarrollo de
cualquier aplicacin web consiste en crear la estructura dedirectorios en donde se colocaran los
componentes. En el caso de Tomcat, eldirectorio a partir del cual se instala cualquier aplicacin
web debe ser TOMCAT-HOME/webapps, en dondeTOMCAT-HOMEes una variable queapunta
al directorio de instalacin de Tomcat.
Una vez aclarado estos conceptos vamos a verlo que tenemos que hacer para descargar, instalar y
configurar elApache-Tomcat.
301
Ah encontraras otra liga llamada Tomcat4.1.24 que te lleva a la pagina de descarga de la versin
Apache Tomcat 4.1.24que es la que se descargara para este curso porque es la mas reciente.
Para esto tienes que dar clic a la carpetabin/ que es donde se aloja el archivo binario que
queremos descargar y es laliga jakarta-tomcat-4.1.24.exe para bajar el archivo del mismo nombre
con untamao de 8.5 Mb. (ver la siguiente figura)
3: La Tecnologa JSP
Mecanismo de funcionamiento de unaJSP
Una JSP atraviesa por etapas de evolucin detres pasos, en su cdigo :
1. Cdigo fuente JSP. Esescrito por el programador o desarrolador de JSP. Esta
en un archivo de textocon extensin.jsp y se compone de una mezcla de cdigo
HTML,instrucciones enlenguaje Java, directivasJSP y acciones que describen cmo
generar una pagina Web para responder a unasolicitud por parte del cliente.
2. Cdigo fuente Java. El contenedor de JSP traduce el cdigofuente JSP a
cdigo fuente de un servlet Java equivalente. Este cdigo fuente se guarda en un
rea de trabajo y puede ser tilenelproceso de depuracin de errores.
3. Clase Java compilada. Como sucede con cualquier otro programa deJava, el
servlet generado se compila en byte code (cdigo de bytes )resultando en un
archivo.classque esta listo para ser cargado yejecutado por el servidor.
Gestin de las JSP por elcontenedor
302
El contenedor de las JSP gestionaautomticamente cada una de stas etapas de la pgina JSP.
Por ejemplo comorespuesta a una peticin HTTP, el contenedor comprueba si el archivo
fuente.jspha tenido modificaciones desde que el cdigo fuente.javasecompil por ltima vez.
Tambin el contenedor determina primeramente el nombre de la clase correspondiente al
archivo.jsp. Si la clase noexiste o es anterior al archivo.jsp esto significa que el cdigo
fuenteJSP ha cambiado desde que fue compilado por ltima vez, luego entonces elcontenedor
crea el cdigo fuente Java para un servlet actualizado equivalente ylo compila. Si no hay an
una instancia o ejemplar del servlet enfuncionamiento, el contenedor carga la clase servlet y crea
un ejemplar. Finalmente el contenedor lanza un subproceso para que gestione la peticin
HTTPactual del ejemplar encargado. Ver la siguiente figura:
303
304
Para poderestablecer la relacin entre las pginas JSP y servlets hay que observar elcdigo fuente
generado por el contenedor JSP. Este cdigo difiere de uncontenedor a otro y la tcnica de
implementacin que se adopte. Si se comparaeste cdigo generado por el contenedor, y el
ejemplo de un Servlet que produceuna tabla de funciones trigonomtricas que se vio
anteriormente nos daremoscuenta que ste es un tanto automatizado o mecnico, como si
hubiera sidogenerado por un programa - y as a sido, en efecto - , pero an lo podemosreconocer
como un servlet.
package org.apache.jsp;
importjava.io.*;
import java.text.*;
import java.util.*;
importjavax.servlet.*;
import javax.servlet.http.*;
importjavax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
publicclass SenoJSP$jsp extends HttpJspBase {
// begin[file="/oscaruno/SenoJSP.jsp";from=(8,3);to=(13,0)]
private static finalDecimalFormat FMT1
= new DecimalFormat("#0");
private static finalDecimalFormat FMT2
= new DecimalFormat("#0.0000");
// end
static{
}
public SenoJSP$jsp( ) {
}
private static boolean_jspx_inited = false;
public final void _jspx_init() throwsorg.apache.jasper.runtime.JspException {
}
public void_jspService(HttpServletRequest request, HttpServletResponse response)
305
throwsjava.io.IOException, ServletException {
JspFactory _jspxFactory =null;
PageContext pageContext = null;
ServletContext application =null;
ServletConfig config = null;
JspWriter out = null;
Object page =this;
String _value = null;
try {
if (_jspx_inited == false){
synchronized (this) {
if (_jspx_inited == false){
_jspx_init();
_jspx_inited = true;
}
}
}
_jspxFactory =JspFactory.getDefaultFactory();
response.setContentType("text/html;ISO-8859-1");
pageContext= _jspxFactory.getPageContext(this, request, response,
"", false, 8192,true);
application = pageContext.getServletContext();
config =pageContext.getServletConfig();
out = pageContext.getOut();
// HTML //begin[file="/oscaruno/SenoJSP.jsp";from=(3,4);to=(4,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(4,27);to=(5,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(5,54);to=(6,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(7,31);to=(8,0)]
out.write("\r\n");
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(13,2);to=(29,0)]
out.write("\r\n<HTML>\r\n<HEAD>\r\n<TITLE>Tablastrigonomtricas - Seno conJSP</TITLE>\r\n</HEAD>\r\n<BODY>\r\n<H3><center>Tablade Funciones
Trigonomtricas</center></H3>\r\n<TABLE ALIGN=CENTER BORDER=1 CELLPADDING=3
CELLSPACING=0>\r\n<TR>\r\n<TH ALIGN=CENTER>Grado</TH>\r\n<TH ALIGN
=CENTER>Seno</TH>\r\n<THALIGN =CENTER>Coseno</TH>\r\n<TH
ALIGN=CENTER>Tangente</TH>\r\n<TH ALIGN=CENTER>Cotangente</TH>\r\n</TR>\r\n\r\n");
// end
//begin [file="/oscaruno/SenoJSP.jsp";from=(29,2);to=(30,47)]
for (doublegdo = 0; gdo<= 45; gdo += 1.0) {
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(30,49);to=(33,9)]
out.write("\r\n \t<TR>\r\n<TD ALIGN =\\\"CENTER\\\"><divalign=\"left\"><font face=\\\"Arial\\\"
size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(33,12);to=(33,30)]
out.print(FMT1.format(gdo) );
306
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(33,32);to=(35,9)]
out.write("</font></div></TD>\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\" size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(35,12);to=(35,58)]
out.print(FMT2.format(Math.sin(Math.toRadians(gdo))) );
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(35,60);to=(37,9)]
out.write("</font></TD><!-- seno -->\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\" size=1>\r\n
");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(37,12);to=(37,58)]
out.print(FMT2.format(Math.cos( Math.toRadians(gdo))) );
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(37,60);to=(39,9)]
out.write("</font></TD><!-- coseno -->\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\"
size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(39,12);to=(39,58)]
out.print(FMT2.format(Math.tan( Math.toRadians(gdo))) );
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(39,60);to=(41,9)]
out.write("</font></TD><!-- tangente -->\r\n<TD ALIGN=\\\"CENTER\\\"><font face=\\\"Arial\\\"
size=1>\r\n ");
//end
// begin[file="/oscaruno/SenoJSP.jsp";from=(41,12);to=(41,58)]
out.print(FMT2.format(1/Math.tan( Math.toRadians(gdo))));
// end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(41,60);to=(43,9)]
out.write("</font></TD><!-- cotangente -->\r\n</TR>\r\n");
// end
// begin[file="/oscaruno/SenoJSP.jsp";from=(43,11);to=(45,9)]
}
//end
// HTML // begin[file="/oscaruno/SenoJSP.jsp";from=(45,11);to=(49,0)]
out.write("\r\n</TABLE>\r\n</BODY>\r\n</HTML>\r\n");
//end
} catch (Throwable t) {
if (out != null&&out.getBufferSize() != 0)
out.clearBuffer();
if (pageContext != null)pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null)_jspxFactory.releasePageContext(pageContext);
}
}
}
307
Los datos plantilla ( generalmente HTML) sontodo aquello que el contenedor de JSP no
reconoce. Estos pasan a travs delcontenedor sin sufrir modificaciones, as que el HTML
finalmente generadocontiene los datos de plantilla tal y como estaban codificados en el
archivo.jsp.
Hay tres tipos de elementos JSP:
308
3.2.3 Scriptlets
309
310
sb.append("<TH>");
sb.append(Integer.toHexString(row+ col*16));
sb.append("</TH>");
sb.append("<TH>");
sb.append((row +col*16));
sb.append("</TH>");
char c = (char)(row +col*16);
sb.append("<TD>");
sb.append(c);
sb.append("</TD>");
sb.append("</TR>");
row++;
}
sb.append("</TABLE>");
sb.append("</TD>");
col++;
}
out.println(sb);
%>
</TABLE>
</CENTER>
</BODY>
</HTML>
3.3 Directivas
Son etiquetas que seutilizan en una pgina JSP cuya principal caracterstica es incluir el smbolo@
en su sintaxis, que tiene la siguiente forma:
<%@ nombre_directiva [ atributo_i = "valor_i" ] %>
Su mbito es de tipopage ( pgina ) , esto es, su accin slo ocurrir en la pgina en la que
hansido utilizadas, adems no devuelven ningn valor al cliente como lasexpresiones o los
311
scriptlets, salvo lo generado por su ejecucin. Laespecificacin JSP 1.1 describe tres directivas
estndar disponibles en todoslos entornos JSP que son: page, include y taglib
3.3.1 Directiva page
Se utiliza para definir atributos globalesque deben ser aplicados a la pgina JSP completa, y a
cualquier archivo ,excepto los de contenido dinmico, que se haya incluido en sa pgina con
ladirectiva include o la accin jsp:include. Su sintaxis es lasiguiente:
<%@ page [languaje= "java" ] [extends= "paquete.clase" ]
[import="{paquete.clase | paquete.*},..." ]
[session="true| false" ] [buffer="none |8kb| tamao kb" ]
[autoFlush="true| false" ] [isThreadSafe="true| false" ]
[info="mensaje"] [errorPage="URLrelativa" ]
[contentType="{tipoMime [ ;charset=juegoCaracteres ] |text/html;
charset=ISO-8859-1}" ] [isErrorPage="true |false" ]
[pageEncoding="{juegoCaracteres |ISO-8859-1}" ]
los valores en rojo son por default, lostrminos opcionales se sitan entre corchetes y la barra
vertical indica quecualquiera de los valores puede ser utilizado. Los atributos de la directiva
sedetallan a continuacin:
languaje ="java"
Define el lenguaje que se utilizar en losscriptlets o trozos de cdigo que se colocan en
la pgina JSP o en cualquierarchivo que se incluye en la pgina mendiante la directiva
o la accincorrespondiente. Actualmente, la especificacin JSP 1.2 permite
asignarsolamente el valorjavapara esteatributo.
extends="paquete.clase"
Especifica el nombre de una clase, totalmentecualificada, que se pueda extender en el
archivo JSP. Notifica a la clasegenerada despus de solicitar la pgina JSP si hereda
de una superclase. Pordefecto este valor no es utilizado.
import="{paquete.clase | paquete.*},..."
Permite especificar una lista de paquetes oclases, separados por comas, que pueden
ser invocados en los scriptlets,expresiones, declaraciones, etiquetas que se utilicen
dentro de la pginaJSP. Este atributo debe aparecer antes de cualquiera de las clases
que seimporten.
Los paquetes que se importan por default son :
java.lang.*, javax.servlet.*,javax.servlet.jsp.* y javax.servlet.http.*;
sesion="true| false"
Cuando se realiza una peticin por parte de uncliente al servidor web, ste le asigna
un identificador a esa sesin para poderreferirse a la conexin HTTP que se ha
establecido. Si se indica true (elvalor por defecto si no se especifica el atributo en la
directiva) el objetosessionse puede utilizar y se refiere a la sesin actual o a
cualquiernueva sesin que se establezca, si se indica false como valor de este
atributo,el objeto session no se podr utilizar en la pgina JSP.
buffer="none|8kb|tamaokb"
Especifica el tamao del buffer utilizado por unobjeto implcitooutpara enviar el
resultado de la salida compilada dela pgina JSP al navegador cliente. Puede indicarse
que no se use, en cuyo casola salida es enviada directamente a travs del
objetoPrintWriter; o untamao especfico, siendo el valor por defecto 8 kb.
autoFlush="true| false"
312
Controla el buffer de salida. Si el valor estrue, su valor por defecto, cuando el buffer
de salida est completo, sedescargar hacia el navegador; si su valor es false el buffer
no se descarga,con lo que se genera una excepcin de buffer completo cuando el
buffer estlleno. Este atributo no puede ser false cuando el valor del atributo buffer
esnone.
isThreadSafe="true|false"
Indica al motor JSP cmo se debe implementar laseguridad de las tareas. Si el valor
es true, el que toma por omisin, el motorpuede enviar mltiples solicitudes
concurrentes a la pgina JSP; es decir,varias tareas diferentes podran acceder a la
pgina JSP, por lo que esresponsabilidad del desarrollador sincronizar los mtodos
para proporcionarseguridad entre las tareas.
info="mensaje"
Indica un mensaje de texto, generalmente dedescripcin o informacin de copyright,
que ser incorporado a la pgina JSP yque, posteriormente, puede ser recuperado
invocando al mtodo getServletInfo().
errorPage="URL relativa"
Especifica una pgina JSP a la que se desva laejecucin cuando se produce una
excepcin en la pgina que no estcapturada.
Si la ruta comienza con una barra inclinada (/),la URL ser relativa a la raz de
documentos del servidor web, por lo que stees el encargado de la resolucin
completa de la direccin de la pgina de error;mientras si no comienza con la barra
inclinada, la ruta estar referenciada aldirectorio actual que de fine la directiva page.
contentType="{tipoMime [ ; charset=juegoCaracteres ] |text/html; charset=ISO8859-1}"
Indica el tipo mime y la modificacin del juegode caracteres que se enviar en la
respuesta que se genera hacia el cliente. Se puede utilizar cualquier tipo mime y
juego de caracteres soportado por elmotor JSP. Por defecto, se enva la pgina HTML
con el juego de caractereseuropeo normal.
isErrorPage="true |false"
Este atributo indica si la pgina JSP actual esuna pgina de error. Si el valor es true,
la pgina tendra acceso al objetoimplcito exception, que contiene una referencia a la
excepcin que haya lanzadoel motor JSP.
pageEncoding="{juegoCaracteres |ISO-8859-1}"
Indica el juego de caracteres que se utiliza enla propia pgina JSP. Por omisin, en
caso de que se haya especificado unvalor diferente para el atributo contentType, se
ser el valor depageEncoding, o bien ISO-8859-1 en cualquier otro caso.
Ejemplo:
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu DirectivaPageJSP.jsp
Si quieres ver la ejecucin del programa dale clic aqu (ejecucin)
313
314
315
Este ejemplo podra recuperar el valor del campo nombre de lasiguiente URL.
http://localhost:8080/oscaruno/ObjetoRequestJSP.jsp?nombre=Oscarin
ya que su mbito de funcionamiento es de tiporequest.
3.4.4 Objeto sesin
Es una instancia de la clasejavax.servlet.http.HttpSesion. El cometido de este objeto es
manejartodas las acciones relacionadas a la sesin del usuario, por lo tanto su mbitode utilizacin
es de tipo sesin. Una sesin es creada automticamente ( amenos que se especifique lo
contrario ) cuando un usuario solicita una pginaJSP, y de esta manera podemos almacenar
informacin relativa a ese usuario.
Si por ejemplo deseamos almacenar un objetoen la sesin, para posteriormente poder recuperarlo
hacemos:
<%
HttpSession unaSesion = request.getSession();
unaSesion.setAttribute(usuario,"pancho_lopez");
316
%>
3.4.5 Objeto application
)
Es una instancia de la clasejava.servlet.ServletContext, y su mbito de utilizacin es de tipo
application. Representa la aplicacin web en el que se est ejecutando la pginaJSP.
3.5.1 Qu es un JavaBean?
Son una adicin de programacin muy eficaz a Java, y su usocontribuye a migrar la programacin
Web a un modelo de componentes. LosJavaBeans actan como la capa de la aplicacin o lgica
317
de negocios, mientrasque las pginas de JSP actan como la lgica de presentacin, de esta
manera sepueden crear aplicaciones Web mas escalables y eficaces.
Un JavaBean es una clase de Java estndar que cumple una serie deconvenciones de
nomenclatura y diseo muy sencillos. Un JavaBean define susmtodos y objetos exportados en
una convencin de nomenclatura estndar que sepuede obtener fcilmente llamando a la
aplicacin. Esto proporciona una entrada( interfaz ) de programacin en el JavaBean sin entender
el funcionamientointerno del JavaBean.
Las Convenciones de los JavaBeans
El uso de convenciones de nomenclatura y diseo estndar, permitenque las aplicaciones
entiendan la lgica intrnseca de un JavaBean y lo puedanutilizar. El uso de una semntica y
reglas especficas permite que aplicacionescomo JSP analicen clases y mtodos disponibles para
obtener llamadas de mtodosy propiedades disponibles.
Hay tres requisitos de diseo para un JavaBean:
1. El constructor no necesita aceptar ningn parmetro.
Por definicin un JavaBean debe tener un constructor sin parmetrospara instanciar objetos.
Debido a que puede suceder que una aplicacin haga unallamada al bean y desconozca el
funcionamiento del bean, sera casi imposiblepara la aplicacin comprender los parmetros de
instanciacin especficosnecesarios. Es posible sobrecargar el constructor con varias firmas, pero
laetiqueta<jsp: useBean>predeterminada nicamente utilizar elconstructor sin parmetros. En
todas las clases de Java hay un constructor pordefault sin parmetros, esto es, el compilador de
Java crea un constructor sinparmentros y no inicializa valores, luego entonces un JavaBean
puede ser unaclase vaca y, a pesar de ello, ser correcto. Por ejemplo, un JavaBean vlidopuede
ser:
public class VacioBean() {}
2. El acceso al JavaBeans se realiza a travs de mtodos de
accesoespecficos.
Todo lo que un JavaBean muestre se le denominar propiedad, y no esms que una
representacin externa del estado interno del JavaBean. Parainteractuar con los valores de las
propiedades del JavaBean, habr mtodos deacceso que establecen un valor, o bien obtienen un
valor de una propiedadespecfica. No se recomienda que el acceso al estado interno del JavaBean
seadirecto porque violara la caracterstica de encapsulamiento del estado internodel objeto
necesario para crear componentes.
Con frecuencia una propiedad tiene mtodos de acceso que permitenconfigurar y obtener un
valor, no obstante, esto no es obligado y necesario queuna propidad deba tener ambos mtodos
de acceso ya que puede que solo tenga uno,o quizs algunas propiedades no tengan o permitan
mtodos de accesoalguno.
Los mtodos de acceso se crean siguiendo un formato de nomenclaturaconvenida para poder
obtener informacin del JavaBean sin un conocimientoespecfico del mismo.
Los mtodos que se utilizan para obtener datos se denominanmtodos de obtencinomtodos
accesoresy siguen esteformato:
public { Tipo-Objeto } get { Propiedad } ( )
El complemento de los anteriores se denominanmtodosmutadoresomtodos de
configuracinque permiten establecer datos enuna propiedad y siguen este formato:
public void set { Propiedad } ( { Tipo-Objeto })
3. Es preciso distribuir un JavaBean en un archivo JAR de maneraespecial.
Tcnicamente una clase no es un JavaBean hasta que sta se coloqueen un archivo JAR que
incluya una opcin determinada. Cada archivo de clase quesea un JavaBean se debe marcar con
el atributo Java-Bean: true en elarchivo. No obstante esto, es posible utilizar una clase como
un JavaBeanaunque no este dentro de un JAR.
318
319
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
packagedgsca.jb;
importjava.sql.*;
publicclass BeanLigas {
privateConnection con = null;
privateStatement stmt = null;
privateResultSet rs = null;
privateString datosPuente = "";
privateString servidorBD = "";
privateString nombreBD = "";
privateString puertoBD = "";
privateString usuarioBD = "";
320
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
privateString
privateString
privateString
privateString
privateString
contraseaBD = "";
consultaBD = "";
interesnombre = "";
interesurl = "";
interestipo = "";
publicResultSet getResultado() {
try{
datosPuente = "jdbc:mysql://" +
servidorBD +"/" +
nombreBD+ ":" +
puertoBD;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con =DriverManager.getConnection( datosPuente,usuarioBD,contraseaBD );
if ( con!= null )
System.out.println("Se ha establecido una conexin a la base de datos "+
"\n " +datosPuente );
stmt =con.createStatement();
rs =stmt.executeQuery( consultaBD );
} catch(SQLException e ) {
System.out.println("Error: " + e.getMessage() );
e.printStackTrace();
}
finally{
returnrs;
}
}//findel mtodo getResultado
publicvoid setResultado() {
rs =getResultado();
}
publicboolean siguiente()
{boolean bandera = false;
try
{
if(rs.next() ) bandera= true;
elsebandera= false;
}
catch(SQLException e){
System.out.println("Error: " + e.getMessage() );
e.printStackTrace();
}
finally{
returnbandera;
}
}
publicvoid cerrarConexion() {
if ( rs!= null ) {
try{
rs.close();
} catch(SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}
if ( con!= null ) {
try{
321
76. con.close();
77. } catch(SQLException e ) {
78. System.out.println( e.getMessage());
79. e.printStackTrace();
80. }
81. }
82. } //findel mtodo cerrarConexion()
83.
84. publicvoid setServidorBD( String servidorBD ) {
85. this.servidorBD = servidorBD;
86. }
87. publicString getServidorBD() {
88. returnservidorBD;
89. }
90.
91. publicvoid setNombreBD ( String nombreBD ) {
92. this.nombreBD = nombreBD;
93. }
94.
95. publicString getNombreBD () {
96. returnnombreBD;
97. }
98.
99. publicvoid setPuertoBD ( String puertoBD ) {
100. this.puertoBD = puertoBD;
101. }
102.
103. publicString getPuertoBD() {
104. returnpuertoBD;
105. }
106.
107. publicvoid setUsuarioBD ( String usuarioBD ) {
108. this.usuarioBD = usuarioBD;
109. }
110.
111. publicString getUsuarioBD() {
112. returnusuarioBD;
113. }
114.
115. publicvoid setContraseaBD ( String contraseaBD ) {
116. this.contraseaBD = contraseaBD;
117. }
118.
119. publicString getContraseaBD() {
120. returncontraseaBD;
121. }
122.
123. publicvoid setConsultaBD ( String consultaBD ) {
124. this.consultaBD = consultaBD;
125. }
126.
127. publicString getConsultaBD() {
128. returnconsultaBD;
129. }
130.
131. publicString getinteresNombre () {
132. try{
133. interesnombre = rs.getString("interes_nombre");
134. }
135. catch(SQLException sqle ) {
136. System.out.println("Error:" + sqle.getMessage() );
137. sqle.printStackTrace();
138. }
139. finally{
322
140. returninteresnombre;
141. }
142. }
143.
144. publicvoid setinteresNombre( String interesnombre ) {
145. this.interesnombre = interesnombre;
146. }
147.
148. publicString getinteresUrl () {
149. try{
150. interesurl = rs.getString("interes_url");
151. }
152. catch(SQLException sqle ) {
153. System.out.println("Error:" + sqle.getMessage() );
154. sqle.printStackTrace();
155. }
156. finally{
157. returninteresurl;
158. }
159. }
160.
161. publicvoid setinteresUrl( String interesurl ) {
162. this.interesurl = interesurl;
163. }
164.
165. publicString getinteresTipo() {
166. try{
167. interestipo= rs.getString("interes_tipo");
168. }
169. catch(SQLException sqle ) {
170. System.out.println("Error:" + sqle.getMessage() );
171. sqle.printStackTrace();
172. }
173. finally{
174. returninterestipo;
175. }
176. }
177.
178. publicvoid setinteresTipo( String interestipo ) {
179. this.interestipo = interestipo;
180. }
181.
182. }// fin del BeanLigas
4: La Tecnologa JDBC
Esta tecnologa nos permite mediante programas de Java o desde una
JSP , realizarconexiones a una base de datos y ejecutar sentencias de
SQL para hacer consultassobre ella . Esta tecnologa se detalla con
profundidad en la direccinweb: http://java.sun.com/jdbc/.
323
Los resultados devueltos por SQL pueden ser tratadoscomo objetos, de manera
tal que ,
si hay errores puedan ser tratados comoexcepciones.
El API JDBC de Sun estainspirado en la filosofa del estndar ODBC ( Open Data Base
Conectivity )creado por Microsoft. Esta filosofa se basa en crear un estndar para el usode
cualquier base de datos utilizando el lenguaje Java. Es por esto que Suncreo una especie de
pasarela o puente entre JDBC y ODBC . Este puente seencarga de realizar la conversin de las
llamadas del JDBC a ODBC de formatotalmente transparente para el programador. EL puente
JDBC-ODBC no es lasolucin mas adecuada, ya que hay un proceso de conversin de una API a
otra yes motivo de mal rendimiento en una aplicacin cuando se hace uso masivo deconsultas en
una base de datos.
324
El primer paso es conectarnuestro programa de Java con el servidor en que esta situada nuestra
base dedatos. En muchas ocasiones se necesitar de un nombre de usuario y contraseapara
poder acceder a la base de datos.
Cuando usamos Tomcat , parallevar a cabo la conexin con la base de datos, necesitamos que el
driver JDBC,que puede ser una archivo .jar o .class, se incluya en el CLASSPATH delentorno en
que se vaya a utilizar. En este caso ese archivo debe copiarse a lacarpeta lib, dentro de la
carpeta en que est instalado el intrprete depginas JSP. ver figura, tenemos el API JDBC de
MySQL en el archivomysql-connector-java-3.0.9-stable-bin.jar.
325
Class.forName("com.mysql.jdbc.Driver").newInstance();
Al hacer esto, ya estadisponible el driver JDBC para ser utilizado por el resto de los
objetosnecesarios para acceder a la base de datos.
Lo siguiente es construir laURL en la que se define la forma de conexin a la base de datos, el
servidor enel que esta, el nombre de la misma y un usuario con clave son necesarios paraacceder
a la base de datos.
La sintaxis que se utiliza paraconstruir la URL que servir para la conexin a la base de datoses:
jdbc:mysql://[<servidor>][:puerto]/<nombre_basededatos>[?param1=valor1][¶m2=valor2].
..[¶mN=valorN]
Los parmetrosson:
NombreUsoValor por omisinuserNombre del usuario paraacceder la la base de
datosningunopasswordContrasea de acceso a labase de datosningunoautoReconnectReintenta
conectar denuevo si la conexin se rompefalsemaxReconnectsNmero de veces que sedebe de
internar reconectar3initialTimeoutSegundos de espera entrelas diferentes
reconexiones2maxRowsNmero mximo de tuplas adevolver ( 0 significa todas
)0useUnicodeUtiliza Unicode cuandoest manejando datos de tipo StringcharacterEncoding Mapa
Unicode a utilizarcuando ninguno se enven datos de tipo Stringfalse
pero paranuestro ejemplo concreto la cadena es:
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
El primer dato,jdbc,especifica la forma de conexin a la base de datos,mysql es el nombredel
fabricante o manejador de base de datos,barbanegraes el nombre demi computadora, pero
puedes poner en su lugar el nombre de tu computadora, oponer localhost o 127.0.0.1 . El
nombreejedgsca esel nombre de la base de datos que creamos para este ejercicio, y el usuario
ycontrasea son opcionales, depende si quieres tener seguridad en tu base dedatos, y eso lo
estableces desde el motor de MySQL con el comando mysqladmin ocon el monitor de mysql.
4.3.3.Enviar consultas.
Una vez creada la conexin a labase de datos, podemos crear sentencias o ejecutar consultas
desde nuestroprograma de Java para interactuar con la base de datos. Podemos crear
consultasque modifiquen la base de datos sin devolver ningn resultado, p. ej: INSERT,ALTER,
DELETE, CREATE, DROP, o UPDATE.
El cdigo en cuestin debepresentar una estructura similar a sta, ver ejemplo:
Statement stmt;
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTOinteres (interes_nombre, interes_url," +
"interes_tipo) VALUES ('" + args[0]+ "', '" + args[1] + "', '" + args[2] +"')");
326
...
Class.forName("com.mysql.jdbc.Driver").newInstance();
con =DriverManager.getConnection(url,usuario,contrasea);
stmt =con.createStatement();
rs =stmt.executeQuery("SELECT interes_nombre, interes_url, interes_tipo
FROMinteres LIMIT 5");
327
+ inom + "\n"
+iurl + "\n"
+itip + "\n\n" );
Ejemplo1:
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu TablaGeneral2.jsp
Si quieres ver la ejecucin del programa dale clic aqu (enconstruccin)
1.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2.
<!-- Ejemplo de Acceso a una Base de Datos desdeuna Pgina JSP -->
3.
<@ page import="java.sql.*" %>
4.
<HTML>
5.
<HEAD>
6.
<TITLE>Desplegando una tablausando el JDBC y MySQL</TITLE>
7.
<meta name="author" content="Oscar AlejandroGonzález Bustamante">
8.
<meta name="keywords" content="JSP, JDBC, MySQL,Acceso a Datos">
9.
<meta name="description" content="Unejemplo de despliegue de una tabla usando JSP">
10.
</HEAD>
11.
<BODY>
12.
<H2>Ejemplo de Acceso a una base de Datos usando JSP yMySQL</H2>
13.
<% String varNombreTabla = request.getParameter("Tabla");%>
14.
<H3>Mostrando los datos desde MySQL de la base de datos ejedgsca</H3>
15.
<%
16.
try {
17.
/* cargar las clases del JDBC deMySQL */
18.
Class.forName("com.mysql.jdbc.Driver").newInstance();
19.
20.
/* Establece la cadenapara conectarse a la base de datos
21.
local */
22.
23.
String connString ="jdbc:mysql://barbanegra/ejedgsca?user=root";
24.
Connection conn =DriverManager.getConnection( connString );
25.
26.
/* Obtener el result set */
27.
Statement stmt =conn.createStatement();
28.
String varSQL = "SELECT * FROM " +varNombreTabla;
29.
ResultSet rs = stmt.executeQuery( varSQL);
30.
/* Obtiene los meta datossobre el result set */
31.
ResultSetMetaDatarsMeta = rs.getMetaData();
32.
%>
33.
<TABLE BORDER=1 bgcolor="#FFFFFF"cellspacing="5"><font face="Arial, Helvetica, sansserif"color="#000000">
34.
<caption><B><%= varTablaNombre%></B></caption></font>
35.
<THEAD>
36.
<TR><%
37.
/* Despliega los nombres delas columnas como cadenas */
38.
String varColNombres ="";
39.
int varColCuenta =rsMeta.getColumnCount();
40.
for ( int col = 1; col<=varColCuenta; col++ ) {
41.
%><TH bgcolor="C0C0C0"bordercolor="#000000"><font size="2" FACE
="Arial"color="#000000"
42.
><%= rsMeta.getColumnName( col )%></font> </TH>
43.
<%}%>
44.
</TR>
45.
</THEAD>
46.
<tbody><%
47.
/* Despliega los valores delas columnas */
48.
while ( rs.next() ) {
49.
%><TRvalign="top"><%
50.
for ( int col =1; col<= 10; col++ ) {
51.
%><TD bordercolor="#C0C0C0"><font size="2" face="Arial, Helvetica, sansserif"color="#000000"
328
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Ejemplo 2:
Si quieres obtener el cdigo del archivo dale clic con el botn derechoaqu
TablaGeneral4Ligas.jsp
Si quieres ver la ejecucin del programa dale clic aqu (enconstruccin)
1.
2.
java.io.*,
3.
java.sql.*,
4.
javax.servlet.*,
5.
javax.servlet.http.*,
6.
sun.jdbc.odbc.*,
7.
java.lang.*"%>
329
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
<HTML>
<HEAD>
<TITLE>Desplegando una tabla usando el JDBC yMySQL</TITLE>
<meta name="author" content="Oscar Alejandro
GonzálezBustamante">
<meta name="keywords" content="JSP, JDBC, MySQL,Acceso a Datos">
<meta name="description" content="Un ejemplo de despliegue de unatabla
usando JSP">
</HEAD>
<BODY>
<H2>Ejemplo de Acceso a una base de Datos usando JSP yMySQL</H2>
<%
String varNombreBase =request.getParameter("Bd");
String varNombreTabla =request.getParameter("Tabla");
%>
<H3>Mostrando los datos desde MySQL de la base de datos ejedgsca</H3>
<%
try {
/* cargar las clases del ODBC-JDBC deMySQL
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); */
Class.forName("com.mysql.jdbc.Driver").newInstance();
/* Connection conn =DriverManager.getConnection(
"jdbc:odbc:cursojsp2003" ); */
String connString ="jdbc:mysql://barbanegra/"+ varNombreBase
+"?user=root";
Connection conn =DriverManager.getConnection( connString );
/* Obtener el result set*/
Statement stmt = conn.createStatement();
String varSQL = "SELECT * FROM " +varNombreTabla;
ResultSet rs = stmt.executeQuery( varSQL);
/* Obtiene los meta datossobre el result set */
ResultSetMetaData rsMeta = rs.getMetaData();
%>
<TABLE BORDER=1 bgcolor="#FFFFFF"cellspacing="5"><font face="Arial,
Helvetica, sans-serif"color="#000000">
<caption>Base de datos:<B><%=
varNombreBase%></B>Tabla:<B><%=varNombreTabla%></B></caption></font
>
<THEAD>
<TR><%
/* Despliega los nombres de las columnascomo cadenas */
String varColNombres = "";
int varColCuenta = rsMeta.getColumnCount();
for ( int col = 1; col<= varColCuenta; col++ ){
%><TH bgcolor="C0C0C0"bordercolor="#000000"><font size="2"
FACE ="Arial"color="#000000">
<%= rsMeta.getColumnName( col
)%></font> </TH>
<%}%>
</TR>
</THEAD>
<tbody><%
/* Despliega los valores de las columnas*/
while ( rs.next() ) {
%><TRvalign="top"><%
for ( int col = 1; col<=varColCuenta; col++ ) {
if ( !rsMeta.getColumnName(col ).equals( "interes_url" ) ) {%>
<TD bordercolor="#C0C0C0">
330
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
331
finally {
if ( rs != null ) {
try {
rs.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
if ( stmt != null ) {
try {
stmt.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
}
if ( con != null ) {
try {
con.close();
} catch( SQLException e ) {
System.out.println( e.getMessage());
e.printStackTrace();
}
332
333