You are on page 1of 100

Curso de Java

CURSO DE JAVA

Curso de Java

INDICE

CURSO DE JAVA (PROGRAMACIN)


Pg

CAPTULO I 1.Objetos 1.1 Objetos 1.1.1 Ejercicio 1.2 Clases 1.3 Encapsulamiento 1.3.1 Ejercicio 1.4 Mtodos 1.5 Polimorfismo 1.6 Herencia

7 7 7 8 8 9 9 9 10 10 12 12 12 12 13 14 15 15 15 16 17 19 19 20 20 20 21 25 25 25 27 27

CAPTULO II 2.Clases, objetos y mtodos en Java 2.1 Clases 2.2 Tipos de clases 2.3 Constructores 2.4 Mtodos 2.4.1 Ejercicio 2.5 Finalizadores o destructores 2.6 Control de acceso a los mtodos 2.7 Elementos estticos 2.8 Algo ms de clases abstractas

CAPTULO III 3.Tipos nativos de datos

CAPTULO IV 4.JDK (Java Development Kit) 4.1 Tipos de archivos generados por el JDK y por el usuario 4.2 Herramientas del JDK

CAPTULO V 5.Declaraciones, estructuras de decisin y repeticin 5.1 Declaraciones e imports 5.2 Estructuras de decisin 5.3 Estructuras de repeticin

Curso de Java

INDICE Pg

CAPTULO VI 6.Software para desarrollo de aplicaciones Java. 6.1 6.2 6.3 6.4 6.5 6.6 VisualAge for Java 3.02 Worbench Explorador de Proyectos (Project Explorer) Debugger (Depurador) Console Window Visual Composition Editor (Editor de composicin visual)

29 29 29 31 32 33 35 35 38 38 38 39 42 43 43 45 45 45 45 46 47 47 48 48 50 50 52 52 52 52 53
3

CAPTULO VII 7.Estructuras de Datos 7.1 Arrays (Arreglos) 7.2 Vectores (Vector) 7.3 Hashtable

CAPTULO VIII 8.API (Documentacin)

CAPTULO IX 9.AWT (Abstract Window Toolkit) 9.1 Frame 9.2 Panel 9.3 Label 9.4 Button 9.5 List 9.6 TextField 9.7 TextArea

CAPTULO X 10.- Eventos CAPTULO XI 11.- Applets 11.1 Applets vs Applications (Applets vs Aplicaciones) 11.2 AppletViewer 11.3 Mtodos de un Applet

Curso de Java

INDICE Pg

CAPITULO XII 12.- Eventos II 12.1 Listeners 12.2 Adaptadores (Adapters) CAPTULO XIII 13.- Threads 13.1 Extendiendo la clase thread 13.2 Implementando la case Runnable 13.3 Arranque de un thread (Starting a thread) 13.4 Sleeping a thread 13.5 Suspensin de un thread 13.6 Verificacin del estado de un thread 13.7 Prioridad de un thread 13.8 Ejercicio CAPTULO XIV 14.- Sockets 14.1 Leyendo, escribiendo e inicializando un socket 14.1.1 Desarrollo de la clase cliente ? Inicializando el socket del cliente ? Enviando mensajes por un socket ? Recibiendo mensajes por un socket 14.1.2 Desarrollo de la clase servidor ? Inicializando el servidor 14.1.3 Desarrollo de la segunda clase servidor 14.1.4 Comentarios finales CAPTULO XV 15.- Archivos (Files) 15.1 Creacin de un objeto File 15.2 Comprobaciones y utilidades de los archivos ? Respecto al nombre del archivo ? Respecto a las comprobaciones sobre el archivo ? Respecto a la informacin del archivo

56 56 56 58 60 60 61 61 61 62 63 63 63 63 64 64 65 65 66 66 66 66 68 68 69 70 70 70 70 70 70 70

Curso de Java

INDICE Pg

15.3 Escritura y lectura de un archivo 15.3.1 FileWriter ? Crear un archivo nuevo ? Aadir informacin a un archivo previamente creado 15.3.2 FileReader 15.4 Archivos de propiedades 15.4.1 Escritura de un archivo de propiedades 15.4.2 Lectura de un archivo de propiedades CAPTULO XVI 16.- Swing 16.1 Componentes de Swing CAPTULO XVII 17.- JavaDoc CAPTULO XVIII 18.- Acceso a Bases de Datos desde Java 18.1 Tipos de conexiones a una base de datos por medio de Java 18.2 Realizar una conexin y ejecutar sentencias SQL en la base de datos 18.3 Registrar y usar el Driver 18.4 Tipos de Drivers 18.5 Algunas funcionalidades extras 18.6 Ejemplo de una conexin 18.7 Ejecucin de sentencias SQL y obtencin de datos 18.8 Conexiones con un Driver JDBC CAPTULO XIX 19.- Programacin Distribuida basada en componentes desde Java 19.1 Introduccin a los Servlets 19.2 Arquitectura de los Servlets 19.3 Funcionamiento de los Servlets 19.4 Interaccin con los Servlets 19.5 Manejo de las solicitudes GET y POST 19.6 Asuntos de Multihilo 19.7 Ciclo de vida de los Servlets 19.8 Inicializacin del Servlet 19.9 Interaccin con el Servlet 19.10 Destruccin del Servlet 19.11 Configuracin del Tomcat

70 71 71 72 72 73 73 74 76 76 77 78 78 81

81 82 83 84 85 86 87 88 90 90 90 91 91 92 92 92 93 93 93 94 94
5

Curso de Java

INDICE Pg

19.12 Inicio del Tomcat 19.13 Detener el Tomcat 19.14 Configuracin Avanzada Mltiples instancias 19.15 Problemas comunes CAPTULO XX 18.- Ejercicios 18.1 Varios 18.2 Toc-Toc 18.3 PhotoView CAPTULO XIX 19.- Literatura

94 95 95 96 97 97 97 98 99 100 100

Curso de Java

CONCEPTOS DE LA OxO

CAPTULO I 1.- Conceptos de la Programacin Orientada a Objetos (POO).


Para poder comprender la programacin Java es importante conocer la programacin orientada a objetos, la cual gira sobre algunos conceptos claves: clases, objetos, miembros de datos, mtodos y herencia.

1.1 Objetos.
Los objetos representan cosas, simples o complejas, reales o imaginarias. Casi todo puede ser considerado como un objeto. Una antena parablica es un objeto complejo y real. Un objeto profesor representa los detalles y las actividades de una persona, no es esa persona en si misma, es pues, imaginario. Una frase, un nmero complejo, una cuenta bancaria son representaciones de cosas intangibles. Todas son objetos. Algunas cosas no son objetos, sino atributos, valores o caractersticas de objetos. Es decir, no todas las cosas son objetos, ni son consideradas normalmente como objetos. Algunas de ellas son simplemente atributos de los objetos como el color, el tamao y la velocidad. Los atributos reflejan el estado de un objeto, la velocidad del objeto avin, o el tamao de un objeto edificio. Para definir el objeto hay que ser capaces de abstraer sus funciones y atributos es decir lo que puede hacer y qu caractersticas lo distinguen de otros objetos; a esto se le conoce como abstraccin funcional y abstraccin de datos. Para nuestro ejemplo: Abstraccin funcional : Funcionalmente el coche puede realizar las siguientes acciones: Ir, parar, girar a la izquierda, girar a la derecha. Abstraccin de datos: representa las caractersticas del coche: Color, velocidad, tamao. En general, un objeto es una instancia o variable de una clase. Un objeto se distingue de los miembros de la clase por sus atributos.

Figura 1 Objeto Carro

Curso de Java

CONCEPTOS DE LA OxO

1.1.1 Ejercicio. A continuacin se presenta un cuadro para que escriba un ejemplo de un objeto, as como sus acciones y caractersticas. Objeto Acciones Caractersticas

1.2 Clases.
Una clase define un miembro real o una entidad abstracta, las clases proporcionan una especie de plantilla para los objetos, definiendo el comportamiento y atributos de un grupo de objetos.

Los objetos con estados similares, y con el mismo comportamiento se agrupan en clases.

Figura 2 Objetos de la Clase Coche

Curso de Java

CONCEPTOS DE LA OxO

1.3 Encapsulamiento.
Los objetos encapsulan sus operaciones y su estado, son islas de estado y de comportamiento. ? ? El comportamiento del objeto est definido por las operaciones. El estado est definido por los datos o atributos del objeto.

Encapsulacin: Es una forma de ocultar y proteger la informacin. Otra forma de describirlo es como un empaquetado. Las clases realmente ocultan o empacan sus datos de otras clases. Pero el encapsulamiento es mucho ms que esto, ya que permite a los grandes programadores descomponer grandes sistemas en sistemas encapsulados ms pequeos que son ms fciles de desarrollar y de darles mantenimiento. Como un ejemplo imagine que tiene problemas con su automvil. Digamos que falla el filtro del aceite y usted olvida reemplazarlo. Al paso del tiempo, el aceite se ensucia mucho ms. Esto a su vez puede dar lugar a otros problemas con el motor. El motor del automvil no est encapsulado: el aceite no est oculto o protegido del motor. En programacin, el encapsulamiento le permite construir subsistemas (como el motor virtual) que no pueden ser manipulados o corrompidos por otros subsistemas (como un filtro de aceite), a menos que se les otorgue un permiso especial. Un error en alguno, no corromper al otro. 1.3.1 Ejercicio. Plantee un objeto el cual se encuentre encapsulado, y posteriormente defina su parte pblica y privada en la siguiente tabla.

Objeto encapsulado

Parte pblica

Parte privada

1.4 Mtodos.
Los objetos pueden enviar y recibir mensajes; es as como se comunican. Por ejemplo: un gato. El objeto estmago del gato enva un mensaje al objeto cerebro. El objeto estmago indica que est vaco. El objeto cerebro enva un mensaje al objeto piernas, indicndoles que es hora de moverse.
9

Curso de Java

CONCEPTOS DE LA OxO

Las tareas del objeto se realizan a travs de mtodos. Entre ms mtodos tenga un objeto ms cosas podr hacer. Estos mtodos determinan el comportamiento de cada objeto.

1.5 Polimorfismo.
Se refiere a la naturaleza de los objetos. Los mensajes enviados de un objeto a otro, dan como resultado un comportamiento distinto entre los diversos objetos. El comportamiento es dependiente de la naturaleza del objeto dado. Este polimorfismo contribuye a que los objetos de la programacin orientada a objetos sean reutilizables. Por ejemplo, tome un objeto que sume dos nmeros cualesquiera (enteros, punto flotante, etc.) y devuelve un total. En este caso, lo que parece ser la misma operacin mantiene en realidad un comportamiento nico (suma de dos nmeros) en forma transparente para diferentes tipos de argumento. Esto es polimorfismo en accin.

1.6 Herencia.
La idea bsica consiste en que las clases nuevas se construyen a partir de las clases ya existentes. Es decir, las clases nuevas heredan la vida de las ms antiguas. La herencia es la caracterstica clave de los sistemas orientados a objetos para propiciar la reusabilidad. La herencia implementa las relaciones es-un (type-of ) o es-una-clase-de ( instanceof ). Por ejemplo:

Figura 3 Diagrama de Herencia

La clase pelota es la clase padre (superclase) en la jerarqua. Sus mtodos y atributos por las clases hijas o derivadas. Ftbol es una clase de pelota. Ftbol tiene todos los atributos y operaciones de pelota. No obstante, la clase Ftbol ha ocultado (hecho privada) la operacin desinflar (sacndola del interfaz pblico) y sobrecargando el mtodo lanzar con una implementacin apropiada para el Ftbol.
10

Curso de Java

CONCEPTOS DE LA OxO

Figura 4 Sobrecarga de mtodos

La herencia es una forma de especializacin en la que las clases hijas son refinadas para tener el comportamiento y atributos adecuados para la aplicacin de que se trate. Al poder las clases derivadas aadir, redefinir y ocultar miembros, la herencia se convierte en reusabilidad programable

11

Curso de Java

OBJETOS EN JAVA

CAPTULO II 2.- Objetos, clases y mtodos en Java.


Un objeto es una instancia de una clase, al igual que una variable es una instancia de un tipo de dato. Los objetos encapsulan mtodos y variables de instancia. A continuacin se explica en detalle qu es una clase en java y como se utilizan.

2.1 Clases
Las clases son lo ms simple de Java. Todo en Java forma parte de una clase, es una clase o describe como funciona una clase. El conocimiento de las clases es fundamental para poder entender los programas Java. Todas las acciones de los programas Java se colocan dentro del bloque de una clase o un objeto. Todos los mtodos se definen dentro del bloque de la clase, ya que Java no soporta funciones o variables globales. As pues, el esqueleto de cualquier aplicacin Java se basa en la definicin de una clase. Todos los datos bsicos, como los enteros, se deben declarar en las clases antes de hacer uso de ellos. En C la unidad fundamental son los archivos con cdigo fuente; en Java son las clases. De hecho, son pocas las sentencias que se pueden colocar fuera del bloque de una clase. La palabra clave import puede colocarse al principio de un archivo, fuera del bloque de la clase, sin embargo, el compilador reemplazar esa sentencia con el contenido del fichero que se indique, que consistir, como es de suponer, en ms clases.

2.2 Tipos de Clases


Al declarar una clase, es necesario declarar un identificador el cual describir la visibilidad que tendr la misma dentro y fuera del paquete, y bsicamente existen los siguientes: ? public Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado, y para acceder desde otros paquetes, primero tienen que ser importadas. ? abstract Una clase abstract tiene al menos un mtodo abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia. ? final Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final.
12

Curso de Java

OBJETOS EN JAVA

synchronizable Este modificador especifica que todos los mtodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobrescriban.

Si la clase no posee identificador, sino que se decla ra solamente como class MyClass, esto significa que la clase solo puede ser accesada desde el mismo paquete en la cual est declarada.

2.3 Constructores
Ahora se definirn otros aspectos inherentes a las clases antes vistas, como son los constructores, los mtodos y sus respectivas implementaciones. Vase el siguiente ejemplo: //Definicin de una clase llamada Rectngulo public class Rectangulo{ //Constructor de la clase public Rectangulo(){ } } Observando la clase que se ha creado, puede observarse que tiene un mtodo solamente que se llama igual que la clase. Es un constructor. Un constructor es el mtodo que se llama cuando se crea una instancia nueva. Se suele utilizar para inicializar valores. Aqu se observa como se crea un objeto de tipo Rectangulo y se asigna a una referencia llamada prueba: Rectangulo prueba = new Rectangulo(); Puede notarse que, al crear el objeto se coloca a la derecha de new una llamada al constructor. Si no se especifica ningn constructor, los objetos se crean un constructor por defecto que no admite parmetros y no realiza ninguna tarea de inicializacin. En este caso tendra todas sus propiedades en su valor inicial, es decir, cero.

13

Curso de Java

OBJETOS EN JAVA

2.4 Mtodos
//Definicin de una clase llamada Rectngulo public class Rectangulo { //Definicin de cuatro variables de tipo float: private float x1,y1,x2,y2; //Definicin del constructor de la clase public Rectangulo(float X1, float Y1, float X2, float Y2) { x1 = X1; x2 = X2; y1 = Y1; y2 = Y2; } //Definicin de un mtodo pblico de la clase public float calcularArea() { return (x2- x1) * (y2- y1); } //Definicin del mtodo main public static void main(String[] args) { Rectangulo prueba = new Rectangulo(1,4,7,6); System.out.println(prueba.calcularArea()); } } Los mtodos son f unciones que pueden ser llamados dentro de la clase o por otras clases. El constructor es un tipo especfico de mtodo que siempre tiene el mismo nombre que la clase (como se vio anteriormente). Cuando se declara una clase en Java, se pueden declarar uno o ms constructores opcionales que realizan la inicializacin cuando se instancia un objeto de dicha clase (o lo que se conoce como polimorfismo). La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new, no consume memoria, simplemente es una declaracin de tipo.

14

Curso de Java

OBJETOS EN JAVA

2.4.1 Ejercicio. En el siguiente cuadro, declare una clase, teniendo en consideracin que debe tambin agregar el constructor de la misma. Posteriormente, incluya un mtodo privado de su escogencia.

2.5 Finalizadores o Destructores


Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automticamente todos los objetos que se salen del alcance. No obstante proporciona un mtodo que, cuando se especifique en el cdigo de la clase, el reciclador de memoria (garbage collector) ser llamado: //Cierra el canal cuando este objeto es reciclado protected void finalize() { close(); }

2.6 Control de acceso a los mtodos.


Ha llegado el momento de especificar lo que es control de acceso. Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las variables
15

Curso de Java

OBJETOS EN JAVA

de instancia y los mtodos definidos en la clase por medio de los siguientes modificadores de acceso: ? public Cualquier clase puede acceder a las propiedades y mtodos pblicos. ? protected Slo las clases heredadas y aquellas situadas o no en el mismo paquete, pueden acceder a las propiedades y mtodos protegidos. ? private Las variables y mtodos privados slo pueden ser accedidos desde dentro de la clase. Cuando al mtodo no se le coloca ningn identificador, el mtodo slo puede ser accesado dentro del paquete en el cual se encuentre, pero no puede ser visto desde otros paquetes. A continuacin se cita una tabla para que el lector complete: Tabla 1 Accesibilidad a los mtodos segn su modificador

Accesible en: public Misma clase Clase en el mismo paquete SubClass en un paquete diferente Non-SubClass en un paquete diferente

Visibilidad del Mtodo protected none

private

2.7 Elementos estticos


Se declara uno de estos elementos como esttico cuando se quiere que slo exista una copia del mismo. Las clases estticas en Java no existen, pero se llama as coloquialmente a las clases que tienen todos sus mtodos y propiedades estticos y que no permiten ser instanciadas (como pasa con Math). Ese tipo de clases suelen ser repositorios de mtodos y/o propiedades y suelen alejarse un poco de la idea de programacin orientada a objetos. Las propiedades y mtodos estticos (en clases que no lo son) traen otro problema aadido. Desde los mtodos normales se puede acceder a todas ellas, pero desde los estticos slo se puede acceder a los estticos. Esto es debido a que, cuando llamamos a un mtodo no esttico, Java le pasa implcitamente como parmetro la referencia this, que como se sabe apunta a la instancia actual. En el caso de los mtodos estticos esto no sucede, por lo que dentro del cdigo del mtodo no sabe qu instanc ia le ha llamado y por tanto no
16

Curso de Java

OBJETOS EN JAVA

puede acceder a la copia de las variables de dicha instancia, slo a la copia nica de las propiedades y mtodos estticos. Un problema de las propiedades estticas es su inicializacin. Puesto que son comunes a todas las instancias de un objeto, no es buena idea hacerlo desde un constructor ya que inicializara dichas propiedades cada vez que se creara una instancia nueva. Normalmente se puede inicializar en la misma declaracin: static int i = 324; Pero, en algunos casos, puede ser necesario algo ms complicado, o quiz simplemente queramos separar la declaracin de la variable de su inicializacin. En ese caso se utilizar la siguiente sintaxis: //Programa ejemplo para demostrar lo antes explicado public class Inicializando { static String mensaje; static { mensaje = new String(Este es el mensajito); } public static void main(String[] args) { System.out.println(mensaje); } } Se ve, adems, reflejado en este ejemplo el hecho de que los mtodos estticos pueden acceder a otros miembros estticos de la clase

2.8 Algo ms de clases abstractas


Como se observ anteriormente, es posible que con la herencia se termine creando una familia de clases con un interfaz comn. En esos casos es posible, y hasta probable, que la clase raz de las dems no sea una clase til, y que hasta se desee que el usuario nunca haga instancias de ella, porque su utilidad es inexistente. No se quiere implementar sus mtodos, slo declararlos para crear una interfaz comn. Entonces declaramos sus mtodos como abstractos: public abstract void mi_metodo(); Como se puede observar, se est declarando el mtodo pero no implementndolo, ya que se substituye el cdigo que debera ir entre llaves por un punto y coma. Cuando existe un mtodo abstracto se deber declarar la clase abstracta o el compilador nos dar un error. Al declarar como abstracta una clase se asegura de que el usuario no pueda crear instancias de ella.
17

Curso de Java

OBJETOS EN JAVA

He aqu un ejemplo: abstract class Mamifero { String especie, color; public abstract void mover(); } class Gato extends Mamifero { int numero_patas; public void mover() { System.out.println("El gato es el que se mueve"); } } public class Abstractos { public static void main(String[] args) { Gato bisho = new Gato(); bisho.mover(); } }

18

Curso de Java

TIPOS NATIVOS DE DATOS

CAPTULO III 3.- Tipos nativos de datos.


En Java existen diversos tipos de datos, pero hay unos tipos particulares a los cuales se les llama nativos, ya que no son objetos, y por lo tanto al momento de usar una variable no es necesario utilizar el operador new, lo cual s es necesario con los objetos. Tabla 2 Tipos nativos de datos
Tipo boolean char byte short int long float double void Descripcin Tamao Valor lgico Carcter Entero muy pequeo Entero pequeo Entero normal Entero grande Nmero real de precisin simple Nmero real de doble precisin Tipo vaco Rango Clase equivalente Boolean Character Byte Short Integer Long Float Double

Se pueden crear variables de estos tipos de la manera usual como sigue: int numero = 12; El definir un valor al declararlos no es necesario, especialmente porque en Java todos tienen un valor por defecto (0 en los nmeros, false en los booleanos y el carcter nmero cero). En algunas ocasiones, es necesario utilizar clases que representen los mismos valores que los tipos de datos bsicos. En esos casos se puede utilizar la clase equivalente. En el ejemplo se podra hacer lo siguiente: Integer numero = new Integer(12); Al hacer esto, se tiene la ventaja de poder incluir un valor entero, por ejemplo en un Vector, que posteriormente se ver.

19

Curso de Java

JDK

CAPTULO IV 4.- JDK (Java Development Kit).


A continuacin se describen los archivos y directorios que se requieren para desarrollar aplicaciones Java (Los directorios que no se requieren incluyen demos, y cdigo fuente Java). El siguiente grfico muestra dichos archivos y directorios:
jdk1.3 ___________|_________________ | bin | java* javac* javadoc* | jre ________| | bin | java*

Asumiendo que el Software de jdk 1.3 ha sido instalado en /jdk1.3, a continuacin se describen los directorios importantes: ? ? ? ? /jdk1.3: El directorio raz de la instalacin del jdk. Contiene el copyright, licencias y archivos readme. /jdk1.3/bin: Aqu se encuentran los archivos ejecutables de todas las herramientas de desarrollo contenidas en el jdk. El path del computador debera tener incluido este directorio. /jdk1.3/jre: El directorio raz del Java Runtime Environment (jre) usado por las herramientas de desarrollo del jdk. /jdk1.3/jre/bin: Archivos ejecutables para las herramientas y libreras usadas por la plataforma java. Existe tambin otro directorio de utilidad que se cita a continuacin:
?

/jdk1.3/demo: Ejemplos, con cdigo fuente, que muestra al usuario como programar en la plataforma Java. En este directorio se encuentran tambin otros directorios con otros ejemplos entre los cuales se encuentran, applets (/applets), swing (/jfc), java 2D (/Java2D), etc.

4.1 Tipos de archivos generados por el JDK y por el usuario.


Existen 3 tipos de archivos importantes en Java: ? .jar : es un archivo de plataforma independiente que permite empaquetar un applet de Java u otra aplicacin, y sus componentes requeridos (archivos .class, imgenes y sonido) en un solo archivo. Los JAR permiten compresin, lo cua l reduce su tamao, mejorando an el tiempo de descarga en un navegador.

20

Curso de Java

JDK

.java: es un archivo texto, en el cual se incluyen instrucciones y declaraciones java. Este archivo se puede hacer en cualquier editor de textos, pero debe almacenarse bajo la extensin .java. .class : son archivos ejecutables que tienen cdigo nativo para la Java Virtual Machine JVM (Mquina Virtual de Java), que se generan con la utilidad javac y se les llama archivos bytecode, ya que el compilador transforma los .java que son texto, a archivos binarios que son los .class. La JVM es una computadora que en realidad no existe, pero el JRE (Java Runtime Environment) de java toma el cdigo nativo de la JVM y lo ejecuta en una computadora que s existe, por eso es un ejecutable. Otro aspecto interesante es que los archivos .class puede ejecutarse en Linux o en Windows sin necesidad de recompilar el cdigo.

4.2 Herramientas del JDK.


La herramienta de desarrollo JDK, posee algunas herramientas las cuales permiten al programador comp ilar y correr las aplicaciones que desarrolle. Estas herramientas se describen a continuacin: ? javac: este comando permite compilar un archivo .java, es decir, esta herramienta lee las clases y las definiciones que se encuentran en el archivo .java, y las compila en un archivo .class. Si en el archivo fuente existe una clase pblica llamada MyClass, el archivo fuente debe llamarse MyClass.java y el archivo compilado se llamar MyClass.class. Esto es importante al momento de almacenar un archivo, ya que de no hacerlo de esta forma, ocurrirn errores de compilacin. Por defecto el compilador coloca los archivos .class en el mismo directorio en el cual se encuentre el cdigo fuente, pero con la opcin d se puede especificar un directorio distinto. A continuacin se incluyen algunas de las opciones que pueden utilizarse al compilar un programa .java. Opciones: ? -d directorio : Especifica el directorio raz de la jerarqua de clases. Ejemplo: javac d /class MyClass.java

21

Curso de Java

JDK

-nowarn : Si es usada esta opcin, el compilador no muestra ningn aviso.

jar : este comando permite generar un archivo .jar a partir de archivos .class. Los archivos .jar son archivos que contienen en su interior todos los archivos .class e inluso permite incluir imgenes y sonidos, todos comprimidos en este archivo (tambin se pueden incluir archivos .java). Esta herramienta posee, as como el comando anterior, algunos modificadores, que se explicarn con un ejemplo: jar cf archivo.jar lista-archivos Las opciones que se incluyen en el ejemplo se refieren a lo siguiente:

? ? ? ?

c : indica que el usuario desea crear un nuevo archivo .jar. f : indica que el usuario desea que la salida vaya a un archivo. archivo.jar : es el nombre del archivo .jar que el usuario desea crear. lista-archivos : es el archivo que el usuario desea incluir en el archivo .jar. Si se desea incluir ms de un archivo, slo se deben colocar como una lista de archivos, aunque si el nmero de archivos es muy grande, esta herramienta permite incluir todo un directorio de la siguiente forma: jar cf archivo.jar test/

De esta forma se estn incluyendo todos los archivos que se encuentren en el subdirectorio test . Pero cuidado, si hay otros archivos distintos de los .class, por ejemplo, .java, tambin sern inc luidos. Las opciones c y f deben ir seguidas, sin ningn espacio entre ellos. El comando jar tambin generar un archivo Manifest.mf por defecto para el archivo jar. A continuacin se incluyen una tabla con otros modificadores:

22

Curso de Java

JDK

Tabla 3 Lnea de comando para usar la utilidad jar Para crear un archivo .jar Mostrar el contenido de un archivo .jar jar cf archivo.jar lista-archivos jar tvf archivo.jar

A continuacin se puede observar la generacin de un archivo jar usando el archivo .class previamente generado con el compilador:

En este ejemplo solamente se utiliz una clase para generar el jar. ? java : bsicamente este comando permite ejecutar un programa java. Primero se debe generar el archivo .jar y luego mediante la siguiente lnea, se ejecuta el programa java: java cp archivo.jar mainClass

23

Curso de Java

JDK

He aqu un ejemplo de como se ejecutara el archivo .jar, y la salida que debera producir el programa que se ha hecho:

La salida que produce el programa hecho, es simplemente una salida por consola, la cual muestra un texto.

24

Curso de Java

ESTRUCTURAS

CAPTULO V 5.- Declaraciones, estructuras de decisin y repeticin.


Java es un lenguaje cuya sintaxis es similar a C, C++ y Javascript. Se explicar, por tanto, de forma rpida, empezando por los comentarios. Los comentarios en Java son como los de C++ pero con aadidos. Se tiene, por ejemplo, el comentario que dura hasta final de lnea: // Esto es un comentario y el comentario que ocupa varias lneas: /* Esto es un comentario */ Sin embargo tambin se tiene un tipo especial de comentarios que procuran ayudar en la tarea de documentar nuestros programas. Todo programador sabe la pereza que da documentar los programas, y por eso Java intenta ayudarnos con un tipo especial de comentarios. Es equivalente al anterior, pero se utiliza un asterisco ms para empezar: /** Esto es un comentario que servir para documentar nuestro programa */ La herramienta javadoc recoger esos comentarios y los incluir en una documentacin en HTML que genera de forma automtica. Dado que el resultado es HTML, se puede incluir HTML en los comentarios. Para respetar el modo de comentar de muchos programadores, un asterisco al comienzo de la lnea ser ignorado.

5.1 Declaraciones e imports.


Las declaraciones en Java tienen la siguiente forma: tipodato nombrevariable; Por ejemplo, si se desea declarar un entero se hace de la siguiente forma: int contador; En el caso de que se desee inicializar la variable puede hacerse luego o en la misma lnea en la cual se declara. Posteriormente se har un ejemplo ms extenso cubriendo ms cosas. Los import son una referencia para facilitarle la codificacin al programador, ya que le dice al compilador, por ejemplo si no encuentra la clase JLabel en el paquete actual, la
25

Curso de Java

ESTRUCTURAS

buscar en los paquetes del import, en este caso, javax.swing. Por otra parte, cuando se genera el archivo .class, la referencia a las clases se hace directa, es decir, javax.swing.JLabel. Existen muchos paquetes en la librera estndar de Java, paquetes que, adems, han ido variando segn se sucedan las versiones del mismo. As, pues, vamos a destacar algunos paquetes presentes en todos los JDK: ? java.lang Este paquete incluye las clases imprescindibles para que el lenguaje Java funcione como tal, es decir, clases como Object , Thread, Exception, System , Integer, Float , Math, Package, String, etc., que implementan la base del lenguaje. No es necesario importar nada desde ese paquete porque se carga por defecto. ? java.util Este paquete es el segundo en importancia, ya que incluye muchas clases tiles como puede ser Date (fecha) y, sobre todo, diversas clases que permiten el almacenamiento dinmico de informacin, como Vector, LinkedList , HashMap, etc. ? java.applet Contiene la archifamosa clase Applet , que nos permite crear applets para verlos en nuestro navegador. ? java.awt Este paquete, cuyo nombre corresponde a las siglas de Abstract Windowing Toolkit, contiene las clases necesarias para crear interfaces de usuario, por medio de mens (Menu), botones( Buttons), reas de texto(TextField, TextArea), cajas de confirmacin (CheckBox), etc. ? java.io Este paquete contiene las clases necesarias para realizar las operaciones de entrada/salida, ya sea a pantalla o a ficheros, clases heredadas de FileInputStream y FileOutputStream.

26

Curso de Java

ESTRUCTURAS

5.2 Estructuras de decisin.


El ms bsico, sencillo y utilizado es el if-else. Dado que else es opcional, se puede escribir de dos formas:

En general, cada vez que aparezca de ahora en adelante la palabra sentencia podr significar dos cosas: 1) es una sentencia simple terminada en un punto y coma y, 2) es una serie de sentencias agrupadas mediante llaves. Esta construccin permite ejecutar la sentencia primera si la expresin lgica es verdadera. En caso de que sea falsa (y de que el if-else est en la segunda forma) se ejecutar la segunda sentencia. Para bifurcar tambin existe el switch:

La estructura switch compara el valor contenido en la expresin con cada uno de los valores situados despus del case, ejecutando en caso de que exista coincidencia el cdigo situado a la derecha de los dos puntos. Ese cdigo no se engloba mediante llaves. Si no existe coincidencia, se ejecuta la sentencia default. En este tipo de estructura, solamente pueden utilizarse enteros (int ), caracteres ( char), entero corto ( short ) y el byte para las distintas opciones.

5.3 Estructuras de repeticin.


Vamos a ver ahora las distintas estructuras que nos ofrece Java para realizar iteraciones.

27

Curso de Java

ESTRUCTURAS

Las ms genricas son while y do- while :

En ambos casos se ejecutar la sentencia mientras se cumpla la expresin booleana. La diferencia consiste en que en el primer caso, esa expresin se comprueba antes de iterar (ejecutar la sentencia) y en el segundo despus. Por tanto, en ese ltimo caso, la sentencia se ejecutar al menos una vez. Otra iteracin interesante es el bucle for :

En este caso lo primero que har ser ejecutar las sentencias contenidas en inicializacin, luego comprobar si es cierta la expresin booleana y ejecutar el cdigo de sentencia. Finalmente ejecutar las sentencias contenidas en paso y comprobar de nuevo la expresin booleana. Por ltimo, conviene recordar el uso de return. Se utiliza para devolver un valor de retorno en los mtodos (en caso de que stos n o devuelvan void), pero tambin conviene destacar que en el momento que se llega a return, el programa sale del mtodo que se est ejecutando.

28

Curso de Java

VISUALAGE FOR JAVA 3.02

CAPTULO VI 6.- Software para desarrollo de aplicaciones Java.


En la actualidad existe una variedad de paquetes que ofrecen un entorno visual para desarrollar aplicaciones Java, quedando claro que entorno visual se refiere a un ambiente que permita codificar, compilar y correr aplicaciones Java. Sumado a esto, se tiene que incluso mucho de este software tiene herramientas de composicin visual, es decir, se pueden disear clases visualmente, semejndose al estilo de programacin que introdujeron Visual Basic y Visual C++. A continuacin se enumerarn ciertos paquetes que permiten realizar aplicaciones en Java con las versatilidades descritas. 1.2.3.4.5.6.Forte AnyJ JBuilder Visual J++ Visual Cafe VisualAge

Muchos de estos paquetes manejan la compilacin de los programas java con sus propias herramientas, es decir, con sus propios compiladores, guardando siempre la relacin con el jdk, aunque no todos poseen las habilidades de Java 2 (ltima especificacin de java), ya que por lo general existen varias versiones de estos paquetes, las cuales han ido evolucionando a travs del correr de los aos. El uso de uno u otro, depende de las necesidades que requiera la aplicacin en desarrollo, por lo cual se recomienda, antes de comenzar a usar algunos de ellos, revisar cual versin de java soporta, lo cual evitar que la aplicacin funcione mal o no cumpla las especificaciones deseadas.

6.1 VisualAge for Java 3.02


VisualAge es una de las herramientas ms usadas actualmente para desarrollar aplicaciones en Java, ya que permite un diseo de paquetes, clases y mtodos orientados a una mejor visualizacin grfica. VisualAge for Java contiene un debugger integrado, un sistema de control de versiones y una interfaz de diseo grfico (Visual Composition Editor), soportando adems, el desarrollo de JavaBeans, RMI, y por supuesto desarrollo de aplicaciones. Este ambiente es compatible con la versin de jdk 1.2.1, y viene incluida una librera genrica de coleccin de clases. VisualAge est escrito en Small Talk , por lo tanto hay una gran exigencia de memoria para el computador, y se recomienda tener como mnimo 64 Mbytes de memoria RAM. El desarrollo en VisualAge no est basado en almacenar el cdigo en archivos. En si, dos archivos principales contienen todo el cdigo. El archivo principal (scratch), guarda la
29

Curso de Java

VISUALAGE FOR JAVA 3.02

informacin de la configuracin, y las modificaciones de cdigo ms recientes. Luego el segundo archivo (repositorio), contiene versiones ms viejas del cdigo. Este repositorio tiene la ventaja de que si por casualidad un paquete, clase o mtodo es borrado, puede ser recuperado en su totalidad, accesando el mismo. Para poder usar el cdigo escrito fuera del VisualAge, es necesario exportar el cdigo. El programador puede escoger entre exportar el cdigo Java (.java), las clases (.class ) o un Jar (.jar), incluso puede exportar todo un proyecto como un directorio, en cuyo caso, se crear un directorio con todos los paquetes y clases. Estos directorios tendrn archivos .class o .java, dependiendo el tipo de archivo a exportar que haya escogido el usuario. Por otro lado, para poder usar cdigo que se haya generado fuera del VisualAge, es necesario importarlo, y los tipos de archivos que se pueden importar, son los mismos que se pueden exportar. Sumado a esto, cada vez que se hace una modificacin como mover, copiar, renombrar un paquete, clase, o mtodo, el VisualAge compila instantneamente el cdigo, dando a conocer al usuario los posibles errores que pudieran existir. El IDE (Integrated Development Environment = Ambiente de Desarrollo Integrado) es un conjunto de ventanas que proveen acceso a las herramientas de desarrollo. Estas ventanas incluyen el Workbench, Repository Explorer, Log, Console y el Debugger. El programador puede usar el IDE para crear Applets de Java, los cuales pueden correr en navegadores o en aplicaciones java autnomas. Como otro aspecto interesante, el VisualAge posee un editor visual (Visual Composition Editor) que puede ser usado para crear interfases grficas de usuario, en base a componentes previamente creados. A continuacin se muestran los smbolos de algunos de los elementos de VisualAge: Tabla 4 Smbolos usados por el VisualAge

30

Curso de Java

VISUALAGE FOR JAVA 3.02

6.2 Workbench.
El Workbench es el centro de control principal del VisualAge, y permite bsicamente realizar todas las tareas que implican el realizar una aplicacin en Java. Permite exportar proyectos, importar cdigo, e incluso programar, pero como se ver ms adelante, existe otro ambiente que permite una mejor manipulacin de los proyectos. A continuacin se muestra un screenshot de dicho ambiente:

Figura 5 Vista del Workbench del Visual Age

El Workbench permite manejar los proyectos y sus paquetes, tambin manejar las versiones y las exportaciones e importaciones de los mismos. Por otra parte, permite tambin accesar el debugger y otras de las herramientas que contiene el VisualAge. La primera vez que se abre el Workbench, el mismo posee 3 paquetes standard que han sido importados por el mismo VisualAge. Estos paquetes son:
? ? ?

IBM Java Implementation. Java class libraries. Sun class libraries.

En VisualAge, los cambios en el cdigo se manejan creando ediciones o versiones del proyecto. El crear una versin de un paquete significa que ese cdigo ser almacenado en el
31

Curso de Java

VISUALAGE FOR JAVA 3.02

repositorio ( ivj.dat ), lo cual es beneficioso al momento de que el VisualAge deje de funcionar, ya que es posible extraer el repositorio (que es un archivo), e incluirlo en la nueva instalacin del paquete. Por otra parte el versionar permite exportar un repositorio del paquete, almacenndose en el mismo las versiones que se hayan hecho del proyecto (todas o una solamente). El Workspace contiene al menos una edicin de cualquiera de los proyectos, la cual es, la edicin que el programador est actualmente usando.

6.3 Explorador de Proyectos (Project Explorer).


Para crear un proyecto, se hace click en el Menu File, luego en Quick Start y luego en la opcin Create Project . Esto crear un proyecto, teniendo que aadirse luego los paquetes, clases y mtodos que se deseen programar. Luego de haberse creado el proyecto, al hacer doble click en el mismo, se abrir otra ventana que es el Explorador de Proyectos el cual permite una manipulacin mejor del proyecto creado. A continuacin se presenta una visualizacin del mismo:

Figura 6 Explorador de Proyectos del Visual Age

Como se puede observar, esta ventana ofrece un mejor manejo de los proyectos que el programador est desarrollando, ya que en la misma ventana el VisualAge hace una separacin entre los paquetes que tiene el proyecto, las clases y los mtodos y campos del mismo. Ests son las 3 ventanas pequeas que se muestran y se llaman: Packages Types Members. La ventana inferior es en la cual se muestra el cdigo que el programador haya
32

Curso de Java

VISUALAGE FOR JAVA 3.02

escrito, e incluso se muestra tambin el cuerpo de la clase con sus atributos (objetos globales de la clase), as como los distintos paquetes que se estn importando (import java.awt.*). En esta ventana es posible crear los distintos paquetes del proyecto, agregar clases a los paquetes, y posteriormente definir los mtodos y atributos de cada clase. Tambin este espacio de trabajo, permite mover, copiar y renombrar (entre otras cosas), clases y mtodos entre paquetes lo cual permite un mejor manejo del proyecto. Al momento de escribirse algn cdigo, para salvar el trabajo, es necesario presionar las teclas Ctrl+S, con lo cual se consigue no solamente guardar los cambios, sino conseguir que el VisualAge compile de una vez dicho cdigo, observndose instantneamente posibles errores en la programacin.

6.4 Debugger (Depurador).


El Debugger o depurador, permite muchas veces corregir problemas de codificacin, ya que como todo programador sabr, es necesario el poder ir viendo la ejecucin del programa lnea a lnea, e incluso visualizar los valores de los objetos y de las variables que posea el proyecto que se est ejecutando. Estas posibilidades u opciones las pone en marcha el debugger que contiene el VisualAge, permitiendo incluso modificar cdigo on-line, es decir, poder (mientras se ejecuta la aplicacin) aadir o eliminar lneas de cdigo sin necesidad de que la aplicacin sea completamente reiniciada, solamente el mtodo sobre el cual se realiz la modificacin. Esta versatilidad es proporcionada por el VisualAge en general, ya que mientras se ejecuta una aplicacin, es posible modificar alguna lnea de cdigo, y al momento de guardar dicha modificacin, la misma se podr observar en la aplicacin que se est ejecutando.

33

Curso de Java

VISUALAGE FOR JAVA 3.02

A continuacin se muestra un screenshot del debugger:

Figura 7 Vista del Debugger del Visual Age

Esta ventana posee ciertas caractersticas peculiares que se explicarn a continuacin. Como podr verse existen 3 ventanas en la parte superior y una en la parte inferior. De las ventanas de la parte superior, solamente se describirn las dos de la parte derecha, ya que la primera contiene conceptos avanzados que no pueden ser explicados en este momento, pero que posteriormente se darn a conocer. La ventana Variable, contiene informacin sobre los objetos y variables que actualmente estn siendo evaluados o usados. En general existir siempre un objeto que aparecer en sta ventana, el cual es this, y se refiere al objeto actual que se est evaluando. Este objeto tiene todos los atributos de la clase (objetos y variables) con sus respectivos valores. Para observar los valores de algn objeto o variable solamente basta con hacer click en el objeto o variable y el valor se ver reflejado en la ventana Value. Otra forma de ver el valor de un objeto o variable, es marcando el objeto con el ratn (subrayndolo) y presionar el botn derecho y seleccionar la opcin Inspect . Como ltima opcin se mencionarn las opciones que existen para correr las aplicaciones en el debugger, mediante una tabla:
34

Curso de Java

VISUALAGE FOR JAVA 3.02

Tabla 5 Teclas de funcin para ejecutar una aplicacin paso a paso F5 F6 F7 F8

6.5 Console Window.


La consola (Console Window) bsicamente es la que permite ver los mensajes que se producen cuando se ejecuta cdigo como System.out.println(), es decir, al ejecutar un programa en VisualAge, la lnea antes descrita produce una salida por consola que es mostrada en la ventana antes mencionada. Esta ventana es de gran utilidad al momento de depurar el cdigo, ya que se pueden escribir lneas como las descritas anteriores en algunos mtodos de inters, y observar el desempeo de la aplicacin. Otra utilidad de esta ventana, es que muestra las excepciones en tiempo de ejecucin que genere el VisualAge, siempre y cuando se utilice esta opcin en el cdigo. A continuacin se muestra dicha ventana:

Figura 8 Vista de la Consola del Visual Age de IBM

En esta ventana se muestra tambin el proyecto que est actualmente ejecutndose, e incluso se puede parar la ejecucin de la aplicacin desde esta ventana.

35

Curso de Java

VISUALAGE FOR JAVA 3.02

6.6 Visual Composition Editor (Editor de composicin visual).


El editor de composicin visual permite bsicamente construir clases visualmente y su ambiente es parecido a la programacin que se realiza en Visual Basic. Esta forma de programar una aplicacin consiste en ir colocando componentes (Beans) en una ventana. Por ejemplo, si se quisiera una ventana con un texto, se colocara un Frame y luego un Label en dicho editor visual. Posteriormente se ver de donde se obtienen estos beans, e incluso se podr observar que se pueden construir las mismas aplicaciones que en el editor visual pero usando solamente cdigo. A continuacin se muestra la ventana del editor visual:

Figura 9 - Vista del Editor Grfico del Visual Age de IBM

36

Curso de Java

VISUALAGE FOR JAVA 3.02

Tabla 6 Beans usados por el editor de composicin visual

37

Curso de Java

API

CAPTULO VII 7.- Estructuras de Datos. 7.1 Arrays (Arreglos).


Es una estructura que permite agrupar valores de un mismo tipo bajo un mismo nombre. Para acceder a los valores individuales se le asigna a cada uno de ellos un nmero denominado ndice. En Java se pueden declarar arrays de dos maneras. char c[ ]; char[ ] c; Los arreglos en Java son en realidad objetos porque tiene definido el operador [ ] y por lo tanto se inicializan llamando a un cons tructor con new int c[]= new int [10]; //10 enteros

Existe otra manera de hacerlo y es indicando los valores iniciales: String[] paises = { "Espaa", "Holanda", "Brasil" }; Esta declaracin es equivalente a crear el array por medio de un constructor e ir asignndole valores uno a uno. String[] paises = new String[3]; paises[0] = "Espaa"; paises[1] = "Holanda"; paises[2] = "Brasil"; Como se puede observar para acceder a un valor especfico de un arreglo, se pone el nombre del mismo acompaado del ndice correspondiente entre corchetes. public class Vectores { static String[] paises = { "Espaa", "Holanda", "Brasil" }; public static void main(String[] args) { System.out.println(paises[1]); } } Como buen objeto posee el mtodo length, que indica la longitud del array. paises. length

38

Curso de Java

API

Los arrays se utilizan cuando se sabe la longitud requerida. Si no se sabe exactamente lo ms recomendable es utilizar Vectores (pertenecientes al paquete java.util). Se muestra a continuacin un ejemplo: public class ArrayDemo { public static void main(String[] args) { int [] anArray; //declara un array de enteros anArray = new int [10]; // crea un array de enteros //asigna un valor a cada elemento del array y los imprime por consola for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.println(anArray[i]); } } } A continuacin se muestra una tabla para verificar lo estudiado acerca de los Arrays. Debe rellenar la columna derecha con la sintaxis correspondiente, de acuerdo a lo explicado anteriormente.

Tabla 7 Revisin de arrays Declaracin de un arreglo Obtener el tamao de un arreglo Como acceder a un valor de un arreglo

7.2 Vectores (Vector).


Es un array unidimensional de nmeros. Para usar la clase Vector se debe poner al principio del archivo del cdigo fuente la siguiente sentencia: import java.util.*; Declaraciones: La declaracin del vector se hace de la siguiente forma: Vector v = new Vector(); Debido a que el vector almacena un nmero n de elementos, no es necesario especificar el tamao del mismo, solamente basta con agregarlos.

39

Curso de Java

API

Aadir elementos a un vector: Para aadir elementos a un vector, se utiliza la funcin miembro addElement de la siguiente forma: v.addElement("uno"); Este valor que es aadido, es colocado al final del vector que se ha declarado. Elementos almacenados en un Vector: Para saber cuantos elementos guarda un vector se llama a la funcin miembro size(). Esta funcin devuelve un valor entero: v.size(); Eliminar elementos de un Vector: Se puede eliminar todos los elementos de un vector, llamando a la funcin miembro removeAllElements(), o bien se puede eliminar un elemento en concreto, por ejemplo el que guarda el String "tres". v.removeElement ("tres"); Se puede tambin eliminar dicho elemento si se especifica su ndice: v.removeElementAt(2); Acceso a los elementos de un Vector: Para acceder a los elementos de un vector se usa la funcin miembro elementAt(). Esta funcin devuelve un objeto de tipo Object por lo tanto es necesario realizar un cast del elemento que se est extrayendo. Por ejemplo, si el vector posee Strings, la forma de extraer una cadena sera de la siguiente forma: Vector person = new Vector(); person.addElement("pedro"); person.addElement("perez"); String name = (String ) person.elementAt(0); Para acceder a todos los elementos del vector, se puede escribir el siguiente cdigo. for(int i=0; i<v. size (); i++){ System.out.println(v.elementAt(i)); }

40

Curso de Java

API

A continuacin se muestra un ejemplo sencillo del uso de los Vectores: import java.util.*; public class VectorApp { public static void main(String[] args) { Vector v = new Vector(); v.addElement("uno"); v.addElement("dos"); v.addElement("tres"); v.addElement("cuatro") v.addElement("cinco"); v.addElement("seis"); v.addElement("siete"); v.addElement("ocho"); v.addElement("nueve"); v.addElement("diez"); System.out.println("n de elementos " + v.size()); v.removeElement("tres"); for(int i=0; i<v.size(); i++){ System.out.println(v.elementAt(i)); } try { //espera la pulsacin de una tecla y luego ENTER System.in.read(); }catch (Exception e) { } } } A continuacin se muestra una tabla para verificar los conceptos previamente vistos acerca de los Vectores. Debe rellenar la columna derecha con la sintaxis correspondiente de acuerdo a lo explicado anteriormente. Tabla 8 Revisin de vectores Declaracin de un Vector Obtener el tamao de un Vector Consulta de un elemento de un Vector Como aadir elementos a un Vector

41

Curso de Java

API

Tabla 9 Mtodos para la clase vector Mtodos Vector() void addElement( Object obj) void removeElementAt( int index) Object elementAt(int ) int size() Funcin que realiza

7.3 Hashtable.
Es una tabla que relaciona una clave con un valor. Cualquier objeto distinto de null puede ser tanto clave como valor. Este tipo de estructura de dato, permite entre otras cosas poder accesar un elemento, pero dependiendo de una clave y no de una posicin. En el siguiente ejemplo, se muestra la inicializacin de un Hashtable y luego se aaden dos ele mentos: import java.util.*; public class MyClass{ public MyClass(){ } public static void main(String args[]){ Hashtable hash = new Hashtable(); hash.put(12588480,ana); hash.put(13588485,pedro); System.out.println((String) hash.get(12588480)); } } Tabla 10 Mtodos de la clase Hashtable

Mtodos
Hashtable() int size() Object get(Object key) Object put( Object key, Object value) Object remove( Object key)

Funcin que realiza

42

Curso de Java

API

CAPTULO VIII 8.- API.


La documentacin API (Application Programming Interface) es una especificacin de las clases que conforman un programa Java. Esta documentacin se basa en el diseo de una pgina Web la cual muestra entre otras cosas, la jerarqua de clases, comentarios sobre la funcionalidad de la clase que se est visualizando, e incluso una descripcin de los mtodos que tenga la misma. Por otra parte, dependiendo de que especificacin de Java sea, muestra los mtodos que han sido deprecados, es decir, mtodos que han sido substituidos por otros mejorados. Para cualquier informacin sobre la forma en la cual se escriben estas documentaciones, referirse a la siguiente direccin:
http://java.sun.com/j2se/javadoc/writingdoccomments/index.html

La estructura de un documento generado con la herramienta javadoc es la siguiente: ? Comentarios de la pgina. ? Descripcin del paquete ? Descripcin de la clase ? Descripcin de los mtodos. A continuacin se muestra una pgina de ejemplo:

Figura 10 API o Documentacin del Lenguaje Java 43

Curso de Java

API

La herramienta javadoc es una utilidad la cual genera la documentacin API, es decir, el VisualAge posee esta herramienta que genera automticamente las pginas Web con la descripcin de la aplicaci n que se ha diseado. Otra ventaja de la herramienta javadoc, es que permite dentro de los comentarios de la clase y de los mtodos, colocar etiquetas html (html tags), usando la misma sintaxis del cdigo html. Por ejemplo si se desea resaltar algn texto se puede usar la etiqueta <b> usada para la negrita, recordndose que la etiqueta debe cerrarse (</b>). Como puede observarse esta herramienta es sumamente til al momento de dejar documentadas las aplicaciones que se realizen, lo cual permite que un proyecto pueda ser manejado y a la vez comprendido por varios programadores.

44

Curso de Java

AWT

CAPTULO IX 9.- AWT (Abstract Window Toolkit).


Java provee una librera de clases llamada AWT, la cual permite bsicamente realizar aplicaciones grficas o lo que se llama comnmente GUI (Graphical User Interface Interfaz Grfica de Usuario). Esta librera posee diversos componentes u objetos, los cuales pueden ser aadidos, o simplemente ser creados para ser contenedores de otros. A continuacin se explican los componentes ms utilizados, aunque antes de poder usar todos estos componentes, es necesario importar el paquete java.awt, en la declaracin de la clase.

9.1 Frame.
El Frame es el principal componente en una aplicacin, y es obligatorio al disear una interfaz grfica, construir un frame. Lo de obligatorio es debido a que los componentes que a continuacin se vern deben agregarse o aadirse en algn espacio, y ese espacio lo proporciona el frame. Para construir un frame solamente se necesita el siguiente cdigo: Frame frame = new Frame(); frame.setSize(200,200); frame.show(); //crea el frame //se coloca un tamao //se muestra el frame

La ltima lnea de cdigo es necesaria, ya que sino el frame no se visualizara. Otra utilidad interesante es que al frame se le puede agregar un ttulo, y esto se logra de la siguiente manera: frame.setTitle("Mi primer frame");

9.2 Panel.
Un panel es un componente el cual puede funcionar como contenedor de otros componentes, y puede ser beneficioso al momento de organizar varios componentes en una misma ventana. Para ilustrar un poco mejor esto, a continuacin se deja un espacio para que rellene cada lnea de comentario con su respectivo cdigo.

45

Curso de Java

AWT

Si observa algo desconocido, por favor hgalo saber al instructor.

//crea un nuevo frame //coloca el tamao del frame //se coloca el ttulo del frame //se muestra el frame //se crea un panel //se coloca el tamao //se sita el panel a 50 pixeles //se coloca el color del fondo del panel //se aade el panel al frame

Como podr observarse, no es necesario hacer visible el panel, ya que como su contenedor (el frame) est visible, pues el panel tambin lo estar. De la misma forma que se agreg el panel en el frame, pueden agregarse componentes en el panel utilizando el mismo mtodo antes visto.

9.3 Label.
Los labels como su nombre lo indica, son etiquetas que se pueden aadir en un contenedor, para mostrar una informacin, la cual debe ser texto. Si el programador deseara mostrar nmeros en un label, debe convertirlo a texto previamente. Un label no puede ser editado, es decir, la informacin que muestra no puede ser cambiada por el usuario en tiempo de ejecucin, sino que debe ser previamente escrita en tiempo de diseo. A continuacin se deja un espacio para que usted escriba un cdigo que aada un label al panel que anteriormente se ha creado.

46

Curso de Java

AWT

Cabe destacar que en un label solamente se puede colocar una lnea de texto. Si se quisieran varias lneas de texto, se tendra que usar otro tipo de compone nte.

9.4 Button.
Los botones son usualmente usados para que el usuario presione el mismo cuando ha finalizado de ingresar algn dato. Principalmente los botones permiten interactuar con el usuario, aunque cabe decir que en Java para que un botn ejecute una accin cuando el usuario hace click sobre l, es necesario capturar el evento click, lo cual se explicar ms adelante. Para colocar el nombre del botn, se puede hacer de dos formas: 1.En la llamada al constructor de la clase Button, se coloca el nombre. Button button = new Button("Ok"); 2.Invocando el mtodo de la clase Button setLabel. button.setLabel("Ok"); Aunque a veces es necesario colocar imgenes en los botones, la clase Button no soporta directamente el poder poner una imagen en el mismo, aunque es posible lograr tal efecto, aunque dicho tpico se deja para investigacin del lector.

9.5 List.
Una lista, es una caja de texto la cual aade barras de desplazamiento (scrollbars) segn sea necesario, y que en su interior se puede tener una lista de items, segn sea lo que se est listando. Por ejemplo: List list = new List (); //llamada al constructor list.setName("Continentes"); //se coloca el nombre de la lista list.add("America"); //se aaden los continentes list.add("Europa"); list.add("Asia"); list.add("Oceania"); list.add("Africa"); El cdigo de arriba crea una lista con los 5 continentes. Como puede verse, llamando al mtodo add se pueden ir agregando los items de la lista. Los items agregados a la lista, puede ser seleccionados e incluso se pueden ejecutar acciones en base a esta seleccin, pero nuevamente se ve la necesidad de implementar un evento, lo cual ser tratado en un apartado posterior.

47

Curso de Java

AWT

9.6 TextField.
El Textfield es un rea en la cual el usuario puede introducir alguna informacin, ya sea texto o nmero, aunque cuando se desea consultar el texto que se encuentra en el textfield, el mismo ser devuelto en un String, por lo tanto se deber convertir al formato necesitado. Por otra parte es posible obtener el texto que ha selecionado el usuario, ya que para esto tambin existen mtodos. Aunque este tipo de componente permite al usuario introducir un texto, el mismo solamente puede ser de una lnea, ya que no se pueden introducir varias lneas presionando la tecla ENTER como lo hara en una aplicacin Word por ejemplo. Para crear un textfield solamente es necesario llamar al constructor de la clase, y luego definir el tamao que tendr el mismo. A continuacin se cita un ejemplo: TextField textField = new TextField(); textField.setSize(100,100);

9.7 TextArea.
El TextArea es un componente bastante verstil, sobre todo para ingresar informacin en varias lneas. Si se quisiera, por ejemplo, colocar un comentario en algn sitio de la aplicacin, un componente a usar es un TextArea. Otro aspecto interesante de los textarea es que si cuando se crea el componente, se coloca la opcin de que solamente exista el scroll vertical, cuando el texto crece y sobrepasa el ancho horizontal, el texto es automticamente cortado y pasado a la lnea siguiente. He aqu un ejemplo de como lograrse lo antes explicado:
TextArea textArea = new TextArea("",100,100,TextArea.SCROLLBARS_VERTICAL_ONLY);

En este caso se est creando un textarea con las siguientes especificaciones: ? ? ? ? Primer parmetro: es el texto que inicialmente va a tener el textarea. En este caso se est pasando un caracter vaco. Segundo parmetro: es el nmero de filas que tendr el textarea. Tercer parmetro: es el nmero de columnas que tendr el textarea. Cuarto parmetro: es la constante del textarea que indica que solamente existir el scrollbar vertical. Debido a que no existe scrollbar horizontal, el texto es cortado y pasado a las lneas siguientes.

Ejercicio prctico: ? Realice un programa corto en el cual se cree un Frame, un Panel que estar dentro del Frame, y en el Panel aadir los siguientes componentes: Un Label que tenga como texto la cadena "Curso de Java"; un Button que tenga por nombre "Presione", y un

48

Curso de Java

AWT

TextField situado debajo del botn. Note que el Label debe estar al lado del botn. A continuacin se deja para que realice el ejercicio. Puede anotar al lado de cada lnea de cdigo el comentario que desee.

49

Curso de Java

EVENTOS

CAPTULO X 10.- Eventos.


En Java para que cuando un usuario haga click en un botn, se ejecute una accin, es necesario implementar un listener, cuya funcin es la de escuchar, como su palabra lo indica, las posibles acciones que el usuario ejecute sobre un componente en particular. Cuando el usuario hace click o mue ve una ventana, un evento correspondiente a dicha accin se disparar y notificar a los listener que estn escuchando, y posteriormente, se ejecutar alguna accin en la aplicacin. Para lograr lo antes descrito, podra decirse que en forma general se necesitan tres pasos: 1.Implementar el listener que se necesite, dependiendo de las necesidades de la aplicacin, ya que existen diversos tipos. La interfaz ms utilizada, es el ActionListener. A continuacin se cita un ejemplo de como debera declararse esta interfaz en la clase: public class MyClass implements ActionListener{ } 2.Al realizar la declaracin arriba descrita, es necesario implementar un mtodo en especial. Si se est en VisualAge, el paquete advertir que es necesario implementar un mtodo el cual es el actionPerformed y que su sintaxis se deja para que el lector posteriormente la realice:

50

Curso de Java

EVENTOS

3.-

Luego de haberse implementado el listener correspondiente, es necesario que el componente en donde se ejecutar la accin del usuario, tenga aadido el mismo, ya que de lo contrario, el componente no podr escuchar el disparo del evento click por ejemplo. Si se tuviera un botn, la sintaxis para aadir el listener sera como sigue: Button button = new Button(); button.addActionListener(this); La palabra reservada this , significa que se est pasando el objeto que se haya creado de esa clase, siempre y cuando la clase implemente la interfaz ActionListener descrita en el paso 1. De esta forma, cuando el usuario haga click en el botn, se dispara un evento y como el botn posee el listener, el mtodo actionPerformed es llamado.

51

Curso de Java

APPLETS

CAPTULO XI 11.- Applets.


Segn la definicin muy bien resumida por Patrick Naughton, indica que un applet es "una pequea aplicacin accesible en un servidor Internet, que se transporta por la red, se instala automticamente y se ejecuta in situ como parte de un documento web" . Claro que as la definicin establece el entorno (Internet, Web, etc.). En realidad, un applet es una aplicacin pretendidamente corta basada en un formato grfico sin representacin indepediente: es decir, se trata de un elemento a embeber en otras aplicaciones; es un componente en su sentido estricto. Antes de entrar en detalle con los applets, se har mencin a las diferencias entre una aplicacin y un applet (application / applet), ya que pudiera dar lugar a confusiones, y es necesario dejar claro la funcionalidad de cada uno de ellos.

11.1Applets vs Applications (Applets vs Aplicaciones).


Como ya se dijo anteriormente un applet es un programa Java que corre en un navegador Web, mientras que una aplicacin corre desde una lnea de comando, o mediante un doble click en el archivo de la aplicacin. Un applet es un panel que es automticamente insertado en una pgina Web, por lo tanto, todos los componentes se aaden a este panel. Por otra parte el navegador le dice al applet cuando crear la parte grfica (llamando al mtodo init ), y cuando comenzar ( start ) y parar ( stop) un proceso. Cuando una aplicacin es cargada, el mtodo main es llamado, pero cuando un applet es cargado, el mtodo que se llama es el mtodo init . Posteriormente se dar una explicacin detallada de los mtodos principales de un applet. Como puede observarse, una aplicacin puede ejecutarse en cualquier entorno, pero un applet solamente puede ejecutarse en un navegador o con la herramienta appletviewer. Otra diferencia en cuanto a estas dos formas de realizar programas Java, es que debido a que los applets bsicamente funcionan en un navegador, y el mismo debe soportar todos los componentes que en el applet se usen, es decir, las compaas deben dar soporte de los componentes Java, para que se puedan ver de una forma correcta. Este hecho no es cierto, ya que actualmente los navegadores no soportan la programacin hecha con Swing (para lograr esto es necesario realizar ciertas modificaciones). Por lo tanto he aqu una de las restricciones de usar un applet, aunque muchas veces los programas que se desarrollan pueden ajustarse a ciertas especificaciones.

11.2AppletViewer.
Al ser un applet una mnima aplicacin Java diseada para ejecutarse en un navegador Web, no necesita por tanto preocuparse por un mtodo main() ni en dnde se realizan las llamadas. El applet asume que el cdigo se est ejecutando desde dentro de un navegador. El appletviewer se asemeja al mnimo navegador. Este crear un espacio de navegacin, incluyendo un rea grfica, donde se ejecutar el applet, entonces llamar a la clase applet
52

Curso de Java

APPLETS

apropiada. Para utiliza el appletviewer solamente es necesario utilizar la utilidad del VisualAge, el cual contiene esta herramienta.

11.3 Mtodos de un Applet.


? init : este mtodo se llama cada vez que el appletviewer carga por primera vez la clase. Si el applet llamado no lo sobrecarga, init() no hace nada. Fundamentalmente en este mtodo se debe fijar el tamao del applet, aunque en el caso de Netscape Navigator el tamao que vale es el que se indique en la lnea del fichero html que cargue el applet. Tambin se deben realizar en este mtodo las cargas de imgenes y sonidos necesarios para la ejecucin del applet, y por supuesto, la asignacin de valores a las variables globales a la clase que se utilicen. En el caso de los applet, este mtodo nicamente es llamado por el sistema al cargar el applet. start : es la llamada para arrancar el applet cada vez que es visitado. La clase Applet no hace nada en este mtodo. Las clases derivadas deben sobrecargarlo para comenzar la animacin, el sonido, etc. Esta funcin es llamada automticamente cada vez que la zona de visualizacin en que est ubicado el applet se expone a la visin, a fin de optimizar el uso de los recursos del sistema, y no ejecutar algo que no puede ser apreciado (aunque es potestad del programador el poder variar este comportamiento impuesto por defecto, y hacer que un applet siga activo incluso cuando se encuentre fuera del rea de visin). Esto es, imagnese la carga de un applet en un navegador minimizado; el sistema llamar al mtodo init(), pero no a start(), que s ser llamado cuando se restaure el navegador a un tamao que permita ver el applet. Naturalmente, start() se puede ejecutar varias veces: la primera tras init() y las siguientes (porque init() se ejecuta solamente una vez) tras haber aplicado al applet el mtodo stop(). stop: es la llamada para detener la ejecucin del applet. Se llama cuando el applet desaparece de la pantalla. La clase Applet tampoco hace nada en este mtodo, que debera ser sobrecargado por las clases derivadas para detener la animacin, el sonido, etc. Este mtodo es llamado cuando el navegador no incluye en su campo de visin al applet; por ejemplo, cuando abandona la pgina en que est insertado, de forma que el programador puede paralizar los threads que no resulten necesarios respecto de un applet no visible, y luego recuperar su actividad mediante el mtodo start(). destroy: este mtodo se llama cuando ya no se va a utilizar ms el applet, cuando se necesita que sean liberados todos los recursos dispuestos por el applet, por ejemplo, cuando se cierra el navegador. La clase Applet no hace nada en este mtodo, pero las clases derivadas deberan sobrecargarlo para hacer una limpieza final. Los applet multithread deberan utilizar destroy() para detener los threads que quedasen activos. El appletviewer tambin contiene la clase Component , que usa dos mtodos para ayudar al applet a escribir en el espacio grfico que el appletviewer le proporciona para su ejecucin. paint: es la funcin llamada cada vez que el rea de dibujo del applet necesita ser refrescada. La clase Applet simplemente dibuja un rectngulo gris en el rea, es la
53

Curso de Java

APPLETS

clase derivada, obviamente, la que debera sobrecargar este mtodo para representar algo inteligente en la pantalla. Cada vez que la zona del applet es cubierta por otra ventana, se desplaza el applet fuera de la visin o el applet cambia de posicin debido a un redimensionamiento del navegador, el sistema llama automticamente a este mtodo, pasando como argumento un objeto de tipo Graphics que delimita la zona a ser pintada; en realidad se pasa una referencia al contexto grfico en uso, y que representa la ventana del applet en la pgina web. ? update: este es el mtodo que realmente se llama cuando se necesita una actualizacin de la pantalla. La clase Applet simplemente limpia el rea y llama al mtodo paint(). Esta funcionalidad es suficiente para la mayora de los casos; aunque, de cualquier forma, las clases derivadas pueden sustituir esta funcionalidad para sus propsitos especiales. Es decir, en las situaciones detalladas anteriormente que daan la zona de exposicin del applet, el sistema llama al mtodo paint(), pero en realidad la llamada se realiza al mtodo update(), cuyo comportamiento establecido en la clase Component es llamar al mtodo paint(), tras haber rellenado la zona del applet con su color de fondo por defecto. Pudiera parecer as que se trata de un mtodo de efecto neutro, pero si la funcin paint() cambiara el color del fondo, se podra percibir un flick de cambio de colores nada agradable. Por tanto, habr que cuidarse por lo comn, de eliminar este efecto de limpia primero, sobrecargando el mtodo update(), para que llame nicamente a paint(). Otra solucin sera insertar el cdigo de pintado en una sobrecarga del mtodo update() y escribir un mtodo paint() que slo llame a update(). La ltima solucin pasara por usar el mismo mtodo setBackground(Color.color), en el mtodo init() para as evitar el efecto visual sin tener que sobrecargar el mtodo update(). Estas son las mismas razones que aconsejan usar el mtodo resize() incluido en init(), para evitar el mismo desagradable efecto. repaint: llamando a este mtodo se podr forzar la actualizacin del applet, la llamada a update(). Pero hay que tener cuidado, AWT posee cierta inteligencia (combinacin casi siempre nefasta), de forma que si se llama a update() mediante repaint() con una frecuencia muy corta, AWT ignorar las llamadas a update() que estime oportuno, pues considera a esta funcin un bien escaso.

54

Curso de Java

APPLETS

A continuacin se muestra una figura que ilustra el ciclo de llamadas a los mtodos antes descritos:

Figura 11 Ciclo de Vida de un Applet

Como previamente se hizo notar, no es necesario rescribir todos los mtodos, aunque el init() o el start() si debieran ser reescritos, ya que en algn mtodo deben colocarse los componentes que se desean mostrar.

55

Curso de Java

EVENTOS

CAPTULO XII 12.- Eventos II.


Como se pudo observar en el curso previo, es importante el manejo de eventos, ya que son los que permiten capturar las distintas acciones del usuario en una aplicacin. En esta parte se utilizarn otros tipos de eventos, y algunas implementaciones extras, las cuales mostrarn nuevamente la versatilidad del Java. A continuacin se describen los distintos listener que existen y a que eventos corresponden.

12.1Listeners.
? ActionListener: esta interfaz captura diversos eventos. En su mayora se usa para el manejo de botones, pero tambin puede ser usado para otros tipos de componentes como son escoger un tem de un menu, presionar ENTER dentro de un textfield, etc. Probablemente este es el ms sencillo que existe. Cuando el usuario realiza alguna de las acciones antes descritas, se dispara un action event , y un actionPerformed message es enviado a todos los listeners que estn aadidos en el componente en cuestin. Esta interfaz, solamente posee un mtodo: ? void actionPerformed(ActionEvent event)

ComponentListener: primeramente es importante hacer notar que muchos de los componentes que se usan en AWT (Frame, Panel, etc.), provienen de la clase Component. Por lo tanto este listener, se orienta a la capturacin de eventos que se ejecuten en un componente, y en especial existen 4 eventos que se capturan: void componentHidden(ComponentEvent event): se activa despus de que el mtodo setVisible es llamado para ocultar el componente. void componentMoved(ComponentEvent event): llamado luego de que un componente es movido de su posicin original. void componentResized(ComponentEvent event): llamado luego de que el tamao del componente es modificado. void componentShown(ComponentEvent event): se activa despus de que el mtodo setVisible es llamado como resultado de mostrar el componente.

ContainerListener: esta interfaz escucha eventos que se generan cuando un componente es aadido a un contenedor, o removido de ste. Los dos mtodos que se deben sobrescribir son: void componentAdded(ContainerEvent event): este mtodo es llamado cuando se agrega un componente a un container. void componentRemoved(ContainerEvent event): este mtodo es llamado cuando se elimina un componente de un container.

56

Curso de Java

EVENTOS

ItemListener: esta interfaz permite escuchar eventos que son generados por componentes en los cuales generalmente se mantiene un estado de prendido / apagado (on/off), como son los checkboxes, checkbox menu items, choices y list. Esta interfaz solamente requiere implementar un mtodo: void itemStateChanged(ItemEvent event)

KeyListener: este interfaz indica cuando el usuario se encuentra tipeando algn texto o nmeros, en resumen, cuando se interacta con el teclado. Ntese, de que debe existir un componente en el cual se pueda escribir, es decir, que tenga el foco para tipear algn texto, ya que de lo contrario, estos eventos no se dispararn. Existen 3 mtodos que deben ser sobrescritos: void keyPressed(KeyEvent event): llamado despus de que el usuario ha tipeado un caracter. void keyTyped(KeyEvent event): llamado cuando el usuario presiona una tecla. void keyReleased(KeyEvent event): llamado una vez que el usuario ha soltado la tecla que presion anteriormente.

MouseListener: esta interfaz indica al programa cuando el usuario est usando el mouse, y por ende interactuando con un componente. Estos eventos ocurren en el componente que est escuchando este tipo de eventos, para lo cual se deben implementar 5 mtodos: void mouseClicked(MouseEvent event): llamado cuando el usuario hace click en un componente. void mouseEntered(MouseEvent event): llamado cuando el cursor entra en los lmites de un componente. void mouseExited(MouseEvent event): llamado cuando el cursor sale de los lmites de un componente. void mousePressed(MouseEvent event): llamado cuando el usuario presiona el mouse sobre un componente. void mouseReleased(MouseEvent event): llamado cuando el usuario suelta el botn del mouse que fue previamente presionado.

MouseMotionListener: esta interfaz indica cuando el usuario se encuentra moviendo (moved), o arrastrando (dragged ) el mouse dentro de un componente. Por lo tanto solame nte se deben sobrescribir dos mtodos: void mouseDragged(MouseEvent event): es llamado cuando el usuario arrastra el ratn sobre el componente. Se hace notar que esta funcin se refiere a cuando el usuario presiona el botn del mouse y lo mueve mientras lo est presionando. void mouseMoved(MouseEvent event): es llamado cuando el usuario se encuentra moviendo el mouse, pero sin estar presionando ningn botn del mismo.

57

Curso de Java

EVENTOS

WindowListener: esta interfaz permite capturar eventos que se generan cuando una ventana, ya sea un Frame o un Window se abren, cierran, iconifican, desiconifican, se activan o desactivan. A continuacin se enumeran estos eventos en detalle: void windowOpened(WindowEvent event): este evento es llamado cuando una ventana se muestra por primera vez. void windowClosing(WindowEvent event): es llamado cuando el usuario realiza el cerrado de la ventana, es decir, cuando el usuario hace click en la cruz de la ventana (x ), se llama este mtodo. void windowClosed(WindowEvent event): es llamado cuando la ventana ha sido cerrada. void windowIconified(WindowEvent event): llamado cuando la ventana ha sido iconificada, es decir, puesta como un icono en alguna parte del desktop. void windowDeiconified(WindowEvent event): llamado cuando la ventana es desiconificada, es decir, vuelve a aparecer luego de haberse dado un click en el icono. void windowActivated(WindowEvent event): llamado cuando la ventana posee el foco, es decir se encuentra activa. void windowDeactivated(WindowEvent event): llamado cuando la ventana pierde el foco, es decir no se encuentra activa.

Como se puede notar, todas estas interfases no son necesarias implementarlas en su totalidad, es decir, va a depender de la necesidad de cada programador en su uso. Por lo tanto, una vez que se tienen claras las tareas que la aplicacin realizar, en base a esto se escogern las interfases apropiadas para manejar dicha aplicacin.

12.2Adaptadores (Adapters).
En base a lo anteriormente visto, puede notarse de que al implementar las interfases, es necesario sobrescribir todos los mtodos, lo cual muchas veces puede aglomerar mtodos en una clase, muchos de los cuales no poseen ningn cdigo. Por lo tanto, Java provee una forma de no tener que implementar todos los mtodos y es usando los adaptadores. Casi todas las interfases poseen su versin como adaptadores. Las que no lo tienen es porque solamente poseen un mtodo, como por ejemplo la interfaz ActionListener, por lo tanto, el programador solamente tiene que escoger entre usarla o no usarla. A continuacin se muestra una lista de los adaptadores que existen en base a la lista anterior: ? ? ? ? ? ? ComponentAdapter ContainerAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter

58

Curso de Java

EVENTOS

La forma de utilizar estos adaptadores, es heredando de ellos, es decir, utilizando la palabra reservada extends. Luego simplemente se sobrescribe el mtodo dentro del cual se vaya a introducir algn cdigo. A continuacin se detalla un ejemplo:
public class MyWindow extends WindowAdapter{ public MyWindow(){ } public void windowClosing(ActionEvent event){ System.exit(0); } }

Observe de que el nico mtodo que se sobrescribe, es el windowClosing, ya que es el nico que interesaba en este caso. Como puede notarse ambos tienen sus ventajas, ya que uno me permite poder extender otras clases (listeners), pero los otros (adapters) me permiten tener solamente los mtodos que se van a necesitar. Nuevamente se llama a la reflexin del programador en base a la manera en la cual utilice lo antes visto.

59

Curso de Java

THREADS

CAPTULO XIII 13.- Threads.


Muchos programadores estn familiarizados con escribir programas secuenciales, los cuales ejecutaban lneas de cdigo una a una, imposibilitndose la ejecucin paralela de dos o ms actividades a la vez. Estas aplicaciones son programas de flujo nico (single-thread), ya que poseen un principio, unas secuencias de ejecucin y un final, lo cual trae como consecuencia que existe un slo punto de ejecucin. En Java existe la posibilidad de tener mltiples puntos de ejecucin (programas de flujo mltiple) utilizando threads, los cuales no son ms que lneas de cdigo que se ejecutan dentro de los programas. Es importante aadir que un thread no es un programa como tal, ya que por si solo no puede ejecutarse. Por el contrario, los threads funcionan dentro de un programa. Un thread tiene semejanza con los programas secuenciales, ya que stos poseen tambin un punto de inicio, una secuencia de ejecucin y un final, pero con la diferencia de que pueden existir varios de stos. En base a lo antes descrito, es que se puede decir que el lenguaje Java es multithreading, ya que el poder de los threads no radica en crear uno solamente, sino tener varios ejecutndose al mismo tiempo. A continuacin se muestra una figura que demuestra en un flujograma, el funcionamiento de varios threads.

Figura 12 Flujograma del funcionamiento de varios Threads

En Java existen dos formas para la implementacin de threads: ? ? Extendiendo (heredando) la clase Thread. Implementando la interfaz Runnable. A continuacin se explican en detalle cada uno de ellos.

60

Curso de Java

THREADS

13.1Extendiendo la clase Thread.


Para utilizar los threads de esta forma, es necesario crear una clase la cual extienda de Thread como se ilustra a continuacin:
public class MyThread extends Thread{ public MyThread(String nameThread){ super(nameThread); } }

Luego de haberse creado la clase, es necesario sobrescribir el mtodo run(), ya que dentro de este mtodo es donde se colocarn las lneas de cdigo que ejecutarn alguna accin. Un aspecto interesante es que, en el constructor de la clase, es bastante til llamar al super(threadName) de la clase, pasando como parmetro un String. Esto es para los efectos de que el thread creado posea un nombre, lo cual facilita las depuraciones (debugging) de los programas que se realicen, e incluso se puede conocer el thread que se encuentra en ejecucin por su nombre.

13.2Implementando la interfaz Runnable.


Bsicamente el utilizar esta interfaz para implementar los threads, es exactamente igual, en cuanto al funcionamiento del thread como tal, que cuando se hereda de la clase Thread, pero la ventaja que ofrece esta interfaz, es que permite extender de otra clase que se necesite. Por ejemplo si se quisiera crear un Frame extendiendo de esta clase, se podra utilizar la interfaz Runnable para implementar los threads en esta clase de ser necesario. En esta forma de implementar los threads, es necesario sobrescribir el mtodo start (), y tambin sobrescribir el mtodo run(), como en el punto previo.

13.3Arranque de un Thread (Starting a thread).


Al momento de crear el thread, es decir, instanciar el objeto solamente, el thread es simplemente un objeto vaco, ningn recurso del sistema ha sido tomado. Por lo tanto, cuando el thread se encuentra en este estado, solamente es posible llamar al mtodo start (). ste mtodo crea los recursos necesarios del sistema para correr el thread. Recuerde que la clase que anteriormente se ha explicado, por si sola no ejecuta ninguna accin. Es necesario, como se dijo anteriormente, crear una instancia de sta para poder iniciar el thread. Para iniciar un thread, luego de crearse la instancia, se llama al mtodo start (), el cual es un mtodo de la clase que llama al mtodo run () antes visto. El mtodo start () no es necesario sobrescribirlo, ya que slo sirve para iniciar el thread, aunque se hace la salvedad de que cuando se utilice la interfaz Runnable, s es necesario. Luego de que este mtodo ha sido llamado, el thread se encuentra corriendo (running state). Debido a que muchos de los computadores que se usan poseen solamente un slo
61

Curso de Java

THREADS

CPU, no es posible ejecutar o correr todos los threads que se encuentren corriendo. Por lo tanto el Java Runtime System debe implementar itinerarios, en los cuales se comparte el procesador entre todos los threads que se encuentren corriendo.

13.4Sleeping a thread.
Este mtodo lo que permite es parar la ejecucin de un thread o de una lnea de cdigo por un tiempo determinado. Si es un thread el que lo est llamando, es decir, un objeto que se haya creado de tipo Thread, lo que se lograr es que el thread como tal pare su ejecucin por un tiempo. Recuerde que por lo general los threads poseen en su mtodo run() la implementacin de cdigo que se necesite. Por tanto al llamar al mtodo sleep(), se lograr que el thread se duerma por un tiempo y luego continue. Caso distinto si se hace en una sola lnea. Por ejemplo si en el mtodo run() se coloca en una lnea el mtodo sleep(), cada vez que se ejecute este mtodo, se parar la ejecucin por un tiempo, y luego continuarn ejecutndose las lneas de cdigo restantes. Se hace notar algo importante: Es muy diferente si solamente se coloca como una lnea a que si se llama desde el objeto thread creado. A continuacin con un ejemplo se demuestra lo antes explicado: 1er Caso: sleep como lnea dentro de un mtodo
public class MyClass implements Runnable{ private Thread thread; public MyClass(){ thread = new Thread(this,myThread); } public void run(){ try{ sleep(1000); }catch (Exception exception){ } } }

2do Caso: el objeto thread llama al mtodo sleep


public class MyClass implements Runnable{ private Thread thread; public MyClass(){ thread = new Thread(this,myThread); thread.sleep(1000); thread.start(); } public void run(){ System.out.println(Mensaje); } }

Ejecute estas lneas de cdigo y observe la diferencia.


62

Curso de Java

THREADS

13.5Suspensin de un thread.
Puede resultar til suspender la ejecucin de un thread, sin marcar un lmite de tiempo. Por ejemplo, si se est construyendo un Applet con un thread de animacin, puede ser til que el usuario pueda detener la animacin y luego reanudarla. Se hace notar que no se termina la animacin, sino que se suspende por un tiempo. Para poder realizarse esta tarea, se tiene el mtodo suspend(). Este mtodo, no detiene la ejecucin permanentemente, sino que el thread se encuentra suspendido indefinidamente, hasta el punto en que se desee volver a reanudarlo, para lo cual se utiliza el mtodo resume().

13.6Verificacin del estado de un thread.


Existe un mtodo el cual permite saber si un thread se encuentra corriendo, o se encuentra detenido. El mtodo se llama isAlive(), y devolver un verdadero si el thread se encuentra corriendo, o un falso en caso contrario.

13.7Prioridad de un thread.
La prioridad de un thread, establece que tan importante es ese thread con respecto a los otros que se estn ejecutando en la aplicacin. Este valor es un nmero que oscila entre 1 y 10, correspondiendo el 1 como prioridad mnima y el 10 como prioridad mxima. Estos valores, son los que se toman en cuenta al ejecutar los threads en el CPU. Como se dijo anteriormente, debido a que la mayora de las mquinas poseen un solo CPU, el Java Runtime System implementa un itinerario en el cual se especifica cual thread se ejecutar primero y cual despus. Por lo tanto la prioridad del thread es tomada en cuenta para crear este itinerario. Cuanto mayor sea la prioridad del thread, mayor posibilidad tendr de ejecutarse primero que los otros.

13.8Ejercicio.
Plantee un problema, en el cual se puedan utilizar threads. Luego de haberlo planteado, indique cual sera la estrategia de solucin. Problema Estrategia de solucin

63

Curso de Java

SOCKETS

CAPTULO XIV 14.- Sockets.


En este captulo, se pretende iniciar el desarrollo, por parte del lector, a aplicaciones cliente/servidor, en las cuales existe una comunicacin entre ellos. Estas comunicaciones se pueden realizar de diversas formas, pero en este curso se tocar la comunicacin por sockets. Normalmente, un servidor se est ejecutando en un computador y tiene un socket que est asignado a un puerto especfico de la mquina. El servidor simplemente espera que el socket del cliente realice una solicitud de conexin. Esta situacin puede observarse en la siguiente figura:

Figura 13 Peticin de conexin por parte de un Cliente mediante un Socket

Por otro lado, el cliente sabe el nombre de la mquina (hostname) en la cual el servidor est corriendo, y el nmero del puerto al cual el servidor se encuentra conectado. Por lo tanto es informacin suficiente para solicitar la conexin al servidor. Si todo funciona correctamente, el servidor acepta la solicitud y la conexin queda establecida. Luego de esto, el servidor obtiene un nuevo socket que se direcciona a un puerto diferente. Esto es debido a que el servidor necesita seguir escuchando las solicitudes de otros clientes, mientras que atiende a las solicitudes del cliente con el cual se conect. Cabe mencionar que este proceso de cambio de puerto, es completamente transparente al programador, por lo tanto no hay que preocuparse por ello. Como puede observarse en la figura, la conexin queda establecida entre el servidor y el cliente:

Figura 14 Conexin establecida entre un Servidor y un Cliente

Si la conexin queda establecida, el socket queda creado y el cliente puede usar el socket para comunicarse con el servidor. Por lo tanto el cliente y el servidor pueden escribir y leer informacin por ese canal de comunicacin que ha quedado establecido.

64

Curso de Java

SOCKETS

Los sockets son puntos finales de enlaces de comunicaciones entre procesos. Los procesos los tratan como descriptores de archivos, de forma que se pueden intercambiar datos con otros procesos, transmitiendo y recibiendo a travs de sockets. El tipo de sockets, describe la forma en la que se transfiere informacin a travs del mismo. Para poder utilizar los sockets, es necesario importar el paquete java.net , que implementa un lado de una comunicacin bidireccional entre el programa Java y otro programa de la red. Adicionalmente, este paquete incluye la clase ServerSocket, la cual implementa un socket que los servidores usan para escuchar y aceptar solicitudes de conexiones por parte de los clientes.

14.1Leyendo, escribiendo e inicializando un socket.


A continuacin se cita un ejemplo sencillo sobre sockets. Este programa lo que hace es simplemente enviar un texto al servidor y luego ese mismo texto re-enviarlo al cliente. Se menciona que deben crearse en principio dos clases: una que sea el cliente, y otra que sea el servidor. A continuacin se muestra el cdigo del cliente. 14.1.1 Desarrollo de la clase cliente.
import java.io.*; import java.net.*; public class Eco { private PrintWriter out; private BufferedReader in; private Socket cSocket; public Eco() { super(); //Mtodo que inicializa el socket initCanal(); //Mtodo que enva una cadena al servidor enviaCadena(); //Mtodo que recibe una cadena del servidor recibeCadena(); } }

El cdigo antes mostrado declara una clase, que actuar como cliente de la aplicacin que se va a desarrollar. La idea principal se basa en desarrollar una aplicacin cliente/servidor utilizando sockets.

65

Curso de Java

SOCKETS

Inicializando el socket del cliente.


private void initCanal() { try{ //Se crea el objeto Socket indicando el servidor al cual se va a conectar //Otro parmetro es el puerto por el cual se realiza la solicitud de conexin cSocket = new Socket ("localhost",4444); in = new BufferedReader(new InputStreamReader(cSocket.getInputStream())); out = new PrintWriter(cSocket.getOutputStream(), true); }catch(Exception e){ System.out.println ("ServidorCliente - initCanal " + e); } }

Enviando mensajes por un socket. Para enviar mensajes por un socket, se utiliza el siguiente cdigo:
private void enviaCadena() { try{ //Se utiliza el objeto out para imprimir un mensaje. //Se utiliza el mtodo println para enviar el mensaje al servidor out.println("prueba"); }catch (Exception e){ System.out.println("Eco " + e); } }

Recibiendo mensajes por un socket. El mtodo que recibe mensajes utiliza el objeto in que se cre anteriormente:
private void recibeCadena() { try{ //Se utiliza el objeto in , en especial el mtodo readLine() . System.out.println(in.readLine()); }catch (Exception e){ System.out.println("Eco " + e); } }

14.1.2

Desarrollo de la clase servidor. Para realizar el servidor se utiliza la clase ServerSocket , y lo que se hace es simplemente inicializar el servidor, y posteriormente se arranca el servidor creado.

66

Curso de Java

SOCKETS

A continuacin se cita el cdigo del servidor:


import java.util.*; import java.net.*; import java.io.*; public class Servidor { //Atributo de tipo ServerSocket que escuchar las peticiones del cliente private ServerSocket sSocket; public Servidor() { super(); //Llamada al mtodo que inicializa el servidor initServidor(); } }

Inicializando el servidor. Inicializar el servidor, significa que se deben realizar ciertas tareas de verificacin para conocer si existe algn cliente que solicite una conexin, y de ser as, crearse un proceso alterno que se comunique con el cliente que se ha conectado. A continuacin se cita un ejemplo de la inicializacin del servidor:
//Mtodo para inicializar el servidor private void initServidor() { try{ //Se crea un objeto de tipo ServerSocket que escuche por el puerto 4444 sSocket = new ServerSocket(4444); //Se enva un mensaje que indique que el servidor ha arrancado System.out.println("Servidor corriendo..."); //A continuacin se crea un lazo infinito que verifica si ha habido una //solicitud de conexin por parte de un cliente while (true){ //Se crea un objeto de tipo ServidorCliente pasndole como //parmetro un objeto de tipo Socket. ServidorCliente sc = new ServidorCliente(sSocket.accept()); //Se inicia un thread sc.start(); } }catch (Exception e){ System.out.println("Servidor - initServidor " + e); } }

Antes de que se contine con el siguiente paso en la construccin de la aplicacin, es necesario hacer notar que todava no se ha indicado para que se necesita la clase ServidorCliente, pero posteriormente se clarifican estos aspectos. Hasta los momentos el programador solamente ha creado una clase Cliente, y otra clase Servidor. Un objeto de la clase Cliente, es el que se encargar de
67

Curso de Java

SOCKETS

realizar las peticiones de conexin a un objeto de la Clase Servidor. Se hace notar que la clase Cliente posee un Socket, mientras que la clase Servidor posee un ServerSocket. Cmo se pueden comunicar un Socket con un ServerSocket? A continuacin se clarifica esta pregunta. 14.1.3 Desarrollo de la segunda clase Servidor. Para que el ejemplo anteriormente citado funcione correctamente, es necesario crear otra clase que tenga funciones de servidor tambin. Esto es debido, bsicamente, a que un ServerSocket no puede enviar datos, solamente escuchar solicitudes de conexin. Por lo tanto, se ve la necesidad de implementar otra clase que tenga un Socket, ya que en s la conexin se hace de Socket a Socket. A continuacin se tiene el cdigo de la otra clase que se necesita.
import java.io.*; import java.net.*; import java.util.*; //Declaracin de la clase. public class ServidorCliente extends Thread{ //Objeto de tipo Socket que se va a comunicar con el cliente. private Socket cSocket; private PrintWriter out; private BufferedReader in; //Constructor de la clase, que recibe un objeto Socket public ServidorCliente(Socket cSocket) { super(); this.cSocket = cSocket; } }

Debido a que esta clase hereda de Thread, es necesario implementar el mtodo run(), en el cual se realizar la comunicacin con el cliente. Dicha implementacin se muestra a continuacin:
//Sobreescritura del mtodo run public void run() { try{ //Llamada a un mtodo que inicializa el socket initCanal(); //Se lee la cadena que envia el cliente String cadenadelcliente = in.readLine(); //Se reenvia la misma cadena. Este ejemplo simplemente realiza un eco del mensaje out.println(cadenadelcliente); } catch (Exception e){ System.out.println("ServidorCliente " + e); } }

68

Curso de Java

SOCKETS

Debido a que se llama a un mtodo creado por el programador, a continuacin se cita dicho mtodo:
//Declaracin del mtodo private void initCanal() { try{ out = new PrintWriter(cSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(cSocket.getInputStream())); } catch (Exception e){ System.out.println("ServidorCliente - in itCanal " + e); } }

14.1.4

Comentarios finales. Una vez que se ha desarrollado el ejemplo en su totalidad, a continuacin se describe la funcionalidad del mismo, para que de esta forma se tenga una mejor visin del propsito del programa. El ejemplo que se ha diseado busca realizar un eco, es decir, que el cliente enve algo al servidor, y que el servidor le responda con el mismo texto que envi el cliente. La clase extra que tuvo que agregarse, es debido a una premisa que se mencion anteriormente, la cual es la necesidad de crear una clase ServidorCliente. Debido a que un ServerSocket no puede enviar informacin, se necesita otro servidor que si pueda enviarla. Cuando un ServerSocket acepta la conexin, es decir, acepta la solicitud de conexin por parte de un cliente, el mtodo ServerSocket.accept() devuelve un Socket, y si el lector puede revisar la implementacin previa, se llama al constructor de la clase ServidorCliente pasndosele un objeto de tipo Socket, y disparndose un thread. Es decir, el thread que se encuentra corriendo es un Socket proporcionado por el ServerSocket y que mantendr la comunicacin con el cliente, dejando el ServerSocket libre para que escuche alguna otra peticin por parte de otro cliente. Una vez que ha dejado claro el propsito de la implementacin anterior, se deja para que el lector realice otras aplicaciones en las cuales el servidor pueda realizar otras tareas, como por ejemplo, intercambiar distintos mensajes entre el cliente y el servidor, o interconectar dos clientes.

69

Curso de Java

ARCHIVOS

CAPTULO XV 15.- Archivos (Files).


En todo lenguaje es importante el poder manejar archivos, ya que son los que en verdad mantendrn de forma permanente la informacin que se maneje en la aplicacin. Aunque en general se utilizan bases de datos, los archivos son y sern un fuerte aliado en la programacin.

15.1Creacin de un objetoFile.
La clase File es la que permitir la manipulacin de archivos. Para crear un objeto de este tipo, se utiliza el constructor de la clase: File archivo = new File (nombreArchivo); Una vez hecho esto, se pueden comenzar a utilizar las propiedades de los archivos.

15.2Comprobaciones y utilidades de los archivos.


Una vez que se hecho la instancia de la clase File, se tiene acceso a ciertas propiedades y mtodos que se enumeran a continuacin: ? Respecto al nombre del archivo: String getName() String getPath() boolean renameTo(File newName) ? Respecto a las comprobaciones sobre el archivo: boolean exists() boolean canWrite() boolean canRead() boolean isFile() ? Respecto a la informacin del archivo: long lastModified() long length()

15.3Escritura y lectura de un archivo.


Para escribir o leer de un archivo, es necesario obtener la ayuda de dos clases ms, las cuales se encargarn de escribir y leer datos.

70

Curso de Java

ARCHIVOS

15.3.1

FileWriter. Esta clase es la que se utiliza para escribir en un archivo de texto. Luego de que se ha creado una instancia de la clase File, es necesario crear una instancia del objeto FileWriter, ya sea para crear un archivo nuevo, o para agregar ms informacin al mismo. A continuacin se citan unos ejemplos para crear y aadir informacin a un archivo. ? Crear un archivo nuevo.
import java.io.*; public class FileManager { //Este es el objeto de tipo File para manejar el archivo private File file = null ; //Esta es la cadena que tiene el nombre del archivo private String fileName = null ; //Constructor de la clase. Recibe como parmetro el nombre del archivo public FileManager(String fileName) { super(); this.fileName = fileName; //se crea el objeto File file = new File(this.fileName); } //Este mtodo crea un archivo nuevo. Si el archivo existe sobreescribe los datos public void newFile(String data) { try { //Se crea el objeto FileWriter pasando como parmetro un objeto File //Tambin se puede pasar el nombre como un String FileWriter fileWriter = new FileWriter(file); fileWriter.write(data + "\n"); //se escribe el dato en el archivo fileWriter.flush(); //se cierra el archivo fileWriter.close(); } catch (Exception exception){ System.out.println(exception); } } }

71

Curso de Java

ARCHIVOS

Aadir informacin a un archivo previamente creado.


//Se utiliza un mtodo para aadir datos. Se pasa como parmetro el dato que se desea //aadir public void appendData(String data) { try{ //Se instancia nuevamente un objeto de la clase FileWriter //El constructor recibe un parmetro extra que es un valor booleano //Si es verdadero, significa que se va a aadir informacin FileWriter fileWriter = new FileWriter(fileName,true); //Se escriben los datos fileWriter.write(data + "\n"); //Se descargan en el archivo fileWriter.flush(); fileWriter.close(); } catch (Exception exception){ System.out.println(exception); } }

Como puede notarse, esta clase permite realizar la escritura de un archivo. Posteriormente se mostrar como se puede leer de un archivo. 15.3.2 FileReader. Esta clase permite bsicamente, leer archivos texto con Java. Nuevamente a continuacin se incluye un cdigo que realiza tal tarea.
//Mtodo para leer los datos public void readData() { //Cadena para guardar el String que se obtenga del archivo String data = null ; try{ //Se utiliza la clase BufferedReader para realizar la lectura de cada linea del //archivo //Dentro del objeto dataRead, se pasa un objeto de tipo FileReader que //recibe el archivo que se est trabajando BufferedReader dataRead = new BufferedReader(new FileReader(file)); //Se lee una linea del archivo data = dataRead.readLine(); //Se verifica que la linea no sea nula. De serlo, indica que se ha llegado al final //del archivo. while (data != null ){ System.out.println(data); //Lectura de otro dato data = dataRead.readLine(); } //Se cierra el archivo dataRead.close(); } catch (Exception exception){ System.out.println(exception); } }

72

Curso de Java

ARCHIVOS

Cabe mencionar, como ltimo aspecto, de que este manejo de archivos es secuencial y de texto.

15.4Archivos de propiedades.
Los archivos de propiedades, son archivos un poco especiales, ya que como su no mbre lo indica, contienen informacin acerca de alguna especificacin de un proyecto, base de datos, etc. Por ejemplo, el archivo Win.ini, es un archivo de propiedades, es decir, la informacin que contiene es sobre el archivo del wallpaper, la resolucin del monitor, etc. Estos archivos son muy utilizados, ya que por medio de ellos, el usuario puede introducir algunas especificaciones de la aplicacin cuando es la primera vez que se arranca la misma, quedando estas especificaciones listas para cuando el programa vuelva a ser ejecutado. Por ejemplo, el nombre de una base de datos que se va a usar, puede preguntarse cuando la aplicacin se ejecuta por primera vez y posteriormente, no es necesario volver a hacerlo ya que en el archivo de especificaciones quedar permanentemente dicho nombre. Posteriormente se explica en detalle la escritura y lectura de estos tipos de archivos. 15.4.1 Escritura de un archivo de propiedades. A continuacin se cita un ejemplo:
//Mtodo para escribir un archivo de propiedades public void writePropertyFile() { //Este es el archivo que va a ser creado FileOutputStream file; //Este es un objeto de tipo Properties que almacenar las propiedades Properties prop = new Properties(); //Este es el objeto que va a leer por consola las propiedades BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Por favor introduzca los siguientes parmetros:"); try { //Crea el archivo de propiedades file = new FileOutputStream("d:/property.ini"); //Le pregunta al usuario la informacin que debe introducir System.out.print("Nombre (o direccin IP) del computador en el cual usted trabaja:"); //Mtodo para asignar el nombre de la propiedad, y la informacin de esa propiedad prop.put("idComputer", reader.readLine()); System.out.print("Nombre de la base de datos que actualmente usa:"); prop.put("dbName", reader.readLine()); System.out.print("Login del usuario de la base de datos:"); prop.put("dbUsr", reader.readLine()); System.out.print("Password del usuario de la base de datos:"); prop.put("dbPsw", reader.readLine()); //Se graba en el archivo las propiedades antes escritas. prop.store(file,"Propiedades del usuario de la base de datos"); //Cierra el archivo file.close(); System.out.println("El archivo ha sido creado satisfactoriamente"); } catch (Exception e) { System.out.println(e); } } 73

Curso de Java

ARCHIVOS

La funcin de este cdigo, es la de escribir un archivo de propiedades, utilizando la clase Properties. Una vez que el archivo ha quedado escrito, debe aparecer como se muestra en el siguiente screenshot:

Figura 15 Vista de un Archivo de Propiedades

Ntese que los datos que se introdujeron se encuentran al lado del nombre de la propiedad, e incluso hay un igual (=) entre el nombre y el valor. Aunque es un archivo de texto, su significado va ms all de ser un simple archivo de texto. En s es un archivo de propiedades. A continuacin se detalla el cdigo del mtodo que se encarga de leer las propiedades de este archivo. 15.4.2 Lectura de un archivo de propiedades. Para leer un archivo de propiedades, se hace uso de la clase Properties tambin, ya que esta clase es una gran aliada al momento de escribir o leer archivos de este tipo. A continuacin se detalla el mtodo para le er estos archivos:

74

Curso de Java public void readPropertyFile() { //El objeto de tipo File para leer el archivo FileInputStream file; //El objeto de tipo Properties Properties prop = new Properties(); //Objetos de tipos String para almacenar las propiedades String idComputer = null ; String dbName = null ; String dbUsr = null ; String dbPsw = null ; try { //Se abre el archivo para lectura file = new FileInputStream("d:/property.ini"); //Se cargan las propiedades en el objeto de tipo Properties prop.load(file); //Se leen las propiedades idComputer = prop.getProperty("idComputer"); dbName = prop.getProperty("dbName"); dbUsr = prop.getProperty("dbUsr"); dbPsw = prop.getProperty("dbPsw"); System.out.println(idComputer); System.out.println(dbName); System.out.println(dbUsr); System.out.println(dbPsw); } catch (Exception e) { System.out.println(e); } }

ARCHIVOS

En el cdigo arriba mostrado, simplemente se hace la extraccin de las propiedades del archivo. Como se puede ver, es realmente simple el escribir y leer un archivo de propiedades, ya que la clase Properties ofrece una gran ayuda para este propsito.

75

Curso de Java

SWING

CAPTULO XVI 16.- Swing.


Antes de que se enumeren y expliquen ciertos componentes, cabe realizar una pequea comparacin entre lo que es AWT y Swing, ya que existe una relacin bien estrecha entre ellos. Primeramente cabe mencionar que en Swing existen todos los componentes que existen en AWT, pero la primera diferencia que salta a la vista, es que todos los componentes en Swing comienzan con una J. Por ejemplo en AWT existe un componente que se llama Frame, pero en Swing se llama JFrame. Otro aspecto importante, es que no solamente hubo un cambio con los nombres de los componentes, sino que muchas de sus propiedades y mtodos cambiaron tambin. Por ejemplo, cuando se deseaba agregar un componente a un Frame, se utilizaba el mtodo add(), pero en un JFrame si se quiere utilizar, cuando se ejecute el programa, se abrir el debugger y dar una excepcin la cual notificar que se debe usar el mtodo getContentPane().add() en lugar del mtodo add (). Modificaciones como estas fueron implementadas en Swing, aparte de que se agregaron funcionalidades nuevas para dar mayor poder o fuerza a los componentes. Otro aspecto que cabe menc ionar, es que cuando se desea hacer un Applet , que en el caso de Swing es el JApplet , los navegadores no poseen soporte para este tipo de componentes, aunque se hace notar que por ejemplo el Neoplanet posee soporte para una de las versiones de Swing. Es importante que el lector conozca tambin que debido a que el software se encuentra en cambios continuos, es posible que las versiones de los navegadores posteriores implementen dicho soporte. Otro aspecto importante, es que Swing es una extensin de AWT y no un reemplazo. El lector podr pensar que cuando se encuentre programando su aplicacin y decida utilizar un JButton en lugar de un Button, en verdad est reemplazando uno por otro, pero recuerde que la funcionalidad del JButton est basada en la funcio nalidad del Button de AWT. Swing introdujo tres avances significativos: utiliza pocos recursos del sistema, aade gran cantidad de componentes ms sofisticados y permite construir la apariencia de los programas. En s es un conjunto de paquetes construido en la parte ms alta de AWT, que proporciona un gran nmero de clases preconstruidas como se mencion anteriormente. A continuacin se enumerarn una lista de algunos componentes que posee el Swing, aunque su explicacin se deja para ser tocada en los ejemplos, ya que muchos de los componentes se vieron con el AWT.

76

Curso de Java

SWING

16.1Componentes de Swing.
? ? ? ? ? ? ? ? ? ? JFrame JPanel JButton JTextArea JTextField JList JRadioButton JChekBox JScrollBar JScrollPane

Aunque existen otros componentes, solamente se muestran los ms relevantes en cuanto a su uso, pero se motiva al lector a que contine en la bsqueda de nuevos componentes, lo cual har las aplicaciones que desarrolle ms profesionales. A continuacin se mostrarn algunos ejemplos de aplicaciones hechas en Swing, para que el lector las desarrolle, e incluso sean el punto de partida para aadir mejoras en cuanto a visualizacin.

77

Curso de Java

JAVADOC

CAPTULO XVII 17.1Javadoc.


En el curso previo se vieron aspectos relacionados con esta herramienta, la cual entre otras cosas, permite generar una documentacin bien slida, de las aplicaciones que los programadores desarrollan. A continuacin se detallar la forma en la cual se deben hacer los comentarios del cdigo, para que luego aparezcan en las distintas pginas web que automticamente genera el VisualAge.
/** * Este comentario describe la funcionalidad de la clase. <br> * Para un salto de lnea se utiliza el tag "br", como se hizo en la lnea previa. */ public class ExampleJavadoc { /** * Este comentario, es para describir la funcionalidad del mtodo. En este caso es un * <b>constructor</b>. <br> * Para utilizar la negrita, se usa el tag "b" y luego se debe cerrar. */ public ExampleJavadoc() { super(); } }

Este cdigo, simplemente describe como deben hacerse los comentarios para que el javadoc los tome en cuenta. A continuacin se muestra un screenshot de como queda la pgina documentada, en base al cdigo anterior.

78

Curso de Java

JAVADOC

Figura 16 API o Documentacin del Lenguaje Java

Como puede observarse, primero se encuentra la definicin de la clase, con el comentario respectivo. Ntese que la palabra constructor se encuentra en negrita, ya que en el cdigo se colocaron los html tags respectivos para tal fin. Otro aspecto resaltante, es que la seccin siguiente a la definicin de la clase es el resumen del constructor (Constructor Summary), en el cual solamente el comentario se toma hasta el primer punto que exista en la oracin. Luego se muestran los mtodos que se estn heredando de alguna clase, y posteriormente viene una seccin con el detalle del constructor. Como puede observarse, el comentario escrito en el constructor, se muestra por completo. Si la clase tuviera ms
79

Curso de Java

JAVADOC

mtodos, los mismos apareceran en la misma forma que el constructor, lo nico es que estaran en la parte de los mtodos. Otro aspecto interesante, es que se puede hacer el javadoc de un paquete en especial, o el javadoc del proyecto completo, en el cual aparecern todos los paquetes que existen en el proyecto desarrollado. Aunque existen mayores aplicaciones del javadoc, el mejorar la forma en que se presenten las documentaciones de las aplicaciones desarrolladas, depender del programador, ya que el cdigo html ofrece una amplia gama de tags para mejorar la pgina que el VisualAge genera.

80

Curso de Java

BASES DE DATOS

CAPITULO XVIII 18.- Acceso a Bases de Datos desde Java. 18.1Tipos de conexiones a una base de datos por medio de Java.
Bsicamente, existen dos formas de realizar una conexin a una base de datos desde Java y estas son: ? Mediante el uso de un Driver JDBC-ODBC o lo que comnmente se llama Puente JDBC-ODBC. Este puente es un Driver JDBC que implementa operaciones JDBC traducindolas en operaciones ODBC. Para el ODBC funciona como un programa de aplicacin normal. El puente implementa JDBC para cualquier base de datos para la cual un Driver ODBC est disponible. El puente est implementado en el paquete sun.jdbc.odbc y contiene una librera nativa usada para acceder al ODBC. Mediante el uso de un Driver JDBC.

JDBC es la abreviatura para Java DataBase Connectivity, y no es ms que una interfaz para fuentes de datos relacionales. La librera JDBC provee el significado para ejecutar sentencias SQL, accesar y operar sobre una base de datos relacional. El JDBC fue diseado como una interfaz orientada a objetos basada en Java para acceso a bases de datos, y su intencin es ser un estndar para lo que los desarrolladores Java y las Compaas de Bases de Datos puedan aadir. A continuacin se muestra una imagen sobre la visin del usuario sobre lo que ocurre desde la aplicacin, hasta que se guardan los datos en la base de datos.

Figura 17 Vista del Usuario o Programador del Acceso a una Base de Datos Relacional

La arquitectura JDBC en una coleccin de clases e interfaces, que juntas habilitan al programador a conectarse con bases de datos de diferentes compaas. Cada una de las
81

Curso de Java

BASES DE DATOS

operaciones permitidas a ejecutarse sobre la base de datos, se realizan mediante el uso de una interfaz, y existe una secuencia de uso, comenza ndo desde el registro del Driver, la peticin de conexin, el establecimiento de la misma y luego, poder ejecutar cualquier sentencia SQL sobre la base de datos. Cabe mencionar que para poder hacer uso de todas estas interfaces debe importarse el paquete java.sql. Esta secuencia de operaciones se puede mostrar a continuacin:

Figura 18 Secuencia de llamadas para conectarse y ejecutar sentencias SQL sobre la BD

Las interfases ms importantes son (todas pertenecientes al paquete java.sql antes mencionado): ? ? ?
?

DriverManager : maneja la carga del Driver y proporciona soporte para crear nuevas conexiones a bases de datos. Connection: representa una conexin a una base de datos en particular. Statement : acta como un contenedor para ejecutar sentencias SQL sobre una conexin dada. ResultSet : controla el acceso a las filas resultantes de una sentencia dada.

18.2Realizar una conexin y ejecutar sentencias SQL en la base de datos.


Cuando se desea acceder a una base de datos, se debe obtener un objeto del tipo java.sql.Connection del mtodo que existe en la interfaz java.sql.DriverManager.getConnection. Este mtodo toma una cadena como parmetro y est tipificada como el URL. La capa de manejo del Driver JDBC tratar de localizar un Driver que pueda conectarse con la base de datos representada por el URL anterior. Esto se hace preguntando a cada Driver de turno, si se puede conectar usando el URL dado. Los Drivers deben examinar el URL para ver si especifica un subprotocolo que est soportado
82

Curso de Java

BASES DE DATOS

por el Driver, y si es as, debera tratar de conectarse con la base de datos especfica. Si es exitoso el establecimiento de la conexin, entonces debe regresar un objeto del tipo java.sql.Connection, con el cual, es posible obtener un objeto del tipo java.sql.Statement, el cual puede ser usado para ejecutar sentencias SQL. La estructura de la cadena debe ser como sigue: jdbc:<subprotocolo>:<identificador_fuente_datos> donde: ? ? subprotocolo: nombre un tipo particular de mecanismo de conexin con una base de datos que puede ser soportado por uno o varios Drivers. identificador_fuente_datos: la sintaxis de ste, depender del subprotocolo.

En este momento es bueno el usar algunos ejemplos para clarificar este punto, el cual es bien importante, ya que en gran parte el que la conexin sea exitosa depende de esta lnea. Supngase que se desea realizar una conexin a una base de datos de nombre prueba hecha con Microsoft Access. Para este tipo de manejador, se usar un Driver del tipo JDBC-ODBC y la cadena de conexin ser como sigue: jdbc:odbc:prueba Comparando esta lnea con lo que se explic anteriormente, el subprotocolo usado es odbc y el identificador, en el caso de las conexiones ODBC es el nombre de la conexin o la fuente de datos como lo llama Windows, que para el ejemplo planteado es prueba. Cabe mencionar que para otro tipo de Driver, la forma de la cadena de conexin puede cambiar, pero este punto se mostrar ms adelante.

18.3Registrar y usar el Driver.


Es importante siempre que el lector est claro en que sea cual fuere la forma seleccionada para realizar la conexin a la base de datos, necesita un Driver. Si se va a usar una conexin ODBC como va de comunicacin, puede usarse el Driver que ya viene ton el JSDK, y que es suministrado por Sun Microsystems. Si este no fuere el caso, ya sea porque el manejador de base de datos no posee una utilidad para registrar un ODBC, o porque la aplicacin en desarrollo requiera otras capacidades, es necesario registrar o cargar el Driver JDBC. La capa de manejo del JDBC necesitar saber cuales Drivers de base de datos estn disponibles, y para ello se proporcionan dos formas de realizar esto: ? Cuando la clase java.sql.DriverManager se inicializa, buscar por la propiedad jdbc.drivers en las propiedades del sistema. Si la propiedad existe, debera consistir en una lista de Drivers separados por punto y coma. Cabe mencionar que cada una de las clases listadas debe implementar la interfaz java.sql.Driver. Luego la clase DriverManager tratar
83

Curso de Java

BASES DE DATOS

de cargar cada nombre de clase de los drivers. Una forma de darle valor a esta propiedad es de la siguiente forma: System.setProperty(jdbc.drivers, sun.jdbc.odbc.JdbcOdbcDriver); Nota: puede ser que la aplicacin al momento de ejecutarse por motivos de permisologa no pueda agregar propiedades al sistema, con lo cual es mejor, si no se est seguro de los permisos de la mquina en la cual ser ejecutado el sistema, usar la segunda opcin. ? Otra forma, es que el programador explcitamente cargue un Driver usando el mtodo estndar Class.forName. Por ejemplo para cargar el driver mc.db.Driver se debera hacer lo siguiente: Class.forName(mc.db.Driver); En ambos casos es la responsabilidad de cada nuevo Driver cargado, registarse con el DriverManager, usando el mtodo DriverManager.registerDriver. Esto permitir al DriverManager, usar el driver cuando se est tratando de realizar conexiones a una base de datos. Una caracterstica til de la clase DriverManager es el mtodo setLogStream. Se puede usar este mtodo para generar informacin de seguimiento como una ayuda para diagnosticar problemas de conexin que normalmente no seran visibles. Para generar dicha informacin del seguimiento, slo se tiene que llamar al mtodo de la siguiente forma: DriverManager.setLogStream(System.out);

18.4Tipos de Drivers.
En el mercado actualmente existen varios Drivers, y es til que el programador pueda en un determinado momento, saber escoger cual usar dependiendo de sus necesidades. Los Drivers JDBC se dividen en cuatro tipos: ?

Tipo 1: estos son Drivers del tipo puente como el JDBC-ODBC. Estos usan un intermediario como el ODBC para transferir las llamadas SQL a la base de datos. Los Drivers de este tipo, cuentan con cdigo nativo, aunque cabe mencionar que la librera del cdigo nativo forma parte de la JVM. Tipo 2: estos usan el API existente de la base de datos para comunicarla con el cliente. Aunque los Drivers de este tipo son ms rpidos que los del tipo 1, los del tipo 2 usan cdigo nativo y requieren permisos adicionales para funcionar en un Applet. Un Driver del tipo 2 podra necesitar cdigo de la base de datos del lado del cliente para conectarse a travs de la red. Tipo 3: estos llaman al API de la base de datos en el servidor. Las peticiones JDBC desde el cliente son primero comprobadas por el Driver JDBC en el servidor para
84

Curso de Java

BASES DE DATOS

ejecutarse. Estos junto con los de tipo 4 pueden usarse en clientes Applets ya que no necesitan cdigo nativo. ? Tipo 4: este es el nivel ms alto de Drivers y reimplementa el API de red para bases de datos en el lenguaje Java. Los Drivers del tipo 4 tambin pueden usarse en clientes Applets porque no necesitan cdigo nativo.

18.5Algunas funcionalidades extras.


Antes del JDBC 2.0, los Drivers JDBC devolvan hojas de resultado de slo lectura con cursores que slo se movan en una direccin, hacia adelante. Cada elemento era recuperado mediante una llamada al mtodo next de la hoja de resultados. JDBC 2.0 introduce las hojas de resultados scrollables cuyos valores pueden ser ledos y actualizados si as lo permite la base de datos original. Con las hojas de resultados de este tipo, cualquier fila puede ser seleccionada de forma aleatoria, y nos podemos mover por la hoja de resultados hacia adelante y hacia atrs. Una ventaja de la nueva hoja de resultados es que se puede actualizar un conjunto de filas correspondientes sin tener que enviar una llamada adicional a executeUpdate. Las actualizaciones se hacen llamando al JDBC y no se necesitan comandos SQL personalizados. Esto aumenta la portabilidad del cdigo de la base de datos que se cree. Los Statements tienen un constructor adicional que acepta un parmetro de tipo scroll y otro de tipo update. El valor del tipo scroll puede ser uno de los siguientes valores: ? ? ? ResultSet.TYPE_FORWARD_ONLY: Comportamiento por defecto en JDBC 1.0, y la aplicacin slo puede llamar a next() sobre la hoja de resultados. ResultSet.SCROLL_SENSITIVE: La hoja de resultados es totalmente navegable y las actualizaciones son reflejadas en la hoja de resultados cuando ocurren. ResultSet.SCROLL_INSENSITIVE: La hoja de resultados es totalmente navegable pero las actualizaciones son slo visibles cuando se cierra la hoja de resultados. Se necesita crear una nueva hoja de resultados para verlos. El parmetro del tipo update puede ser uno de estos dos valores: ? ? ResultSet.CONCUR_READ_ONLY: La hoja de resultados es de slo lectura. ResultSet.CONCUR_UPDATABLE: La hoja de resultados puede ser actualizada.

La hoja de resultados totalmente scrollable devuelve un cursor que puede moverse usando comandos sencillos. Por defecto el cursor de la hoja de resultados apunta a la fila antes de la primera fila en la hoja de resultados. Una llamada a next() recupera la primera fila de la hoja de resultados. El cursor puede tambin moverse llamando a uno de los siguientes mtodos de la interfaz ResultSet:

85

Curso de Java

BASES DE DATOS

? ? ? ? ? ?

beforeFirst(): Posicin por defecto. Pone el cursor antes de la primera fila de la hoja de resultados. first(): Pone el cursor en la primera fila de la hoja de resultados. last(): Pone el cursor antes de la ltima fila de la hoja de resultados. afterLast(): Pone el cursor ms all de la ltima fila de la hoja de resultados. Se llama a previous para mover el cursor hacia atrs en la hoja de resultados. absolute(pos): Pone el cursor en el nmero de fila indicado donde absolute(1) es la primera fila y absolute(-1) es la ltima fila. relative(pos): Pone el cursor en una lnea relativa a la posicin actual donde relative(1) mueve el cursor una fila hacia adelante.

18.6Ejemplo de una conexin.


Luego de la explicacin citada anteriormente, se mostrar un ejemplo especfico sobre como realizar las lneas de cdigo necesarias para conectarse a una base de datos. Para el ejemplo, se supondr que se tiene una base de datos hecha en Microsoft Access cuyo nombre es Primer_BD. En base a esto, se usar el uso del Driver JDBC-ODBC.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import java.sql.*; public class PruebaBD { private Connection conexion; private Statement db; public PruebaBD() { conectar(); } public void conectar() { try { Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); String url = jdbc:odbc:PrimerDB; conexion = DriverManager.getConnection(url); db = conexion.createStatement(); } catch (ClassNotFoundException e) { System.out.println(No pudo cargarse el Driver!); } catch (SQLException e) { System.out.println(No se pudo establecer la conexin!); } } }

Debido a que varios aspectos estn involucrados en las lneas de cdigo antes descritas, es conveniente revisar algunas de ellas. El primer detalle es que se ha declarado como variables miembro un objeto de tipo Connection y otro de tipo Statement. Esto a los efectos de luego poder usarlos en toda la clase, una vez que se haya establecido la conexin. Como
86

Curso de Java

BASES DE DATOS

puede observarse, las lneas que efectan la conexin con la base de datos, se encuentran dentro de un bloque try catch ya que los mtodos Class.forName y el DriverManager.getConnection() pueden, en algn momento, lanzar una excepcin del tipo ClassNotFoundException para el primer mtodo y SQLException para el segundo mtodo. Si la primera de las excepciones es lanzada, significa que no se pudo cargar la clase identificada por el nombre suministrado en esa lnea, es decir, que lo que se encuentra entre las comillas debe tener algn error de tipeo, o puede ser que la clase no se encuentre disponible en el classpath del proyecto, esto ltimo vlido para cuando se est usando cualquier otro Driver distinto al que viene suministrado por Sun. La segunda excepcin que puede lanzar la mquina virtual, es en la lnea 12, en la cual se est intentando establecer una conexin con la base de datos. La excepcin indicara que, en primer lugar, puede estar errneo el no mbre de la fuente de datos, y de no ser as, que la base de datos posee algn tipo de permisologa y debe ser suministrada. Es bien sabido que varios manejadores de bases de datos poseen mecanismos para que otra persona que no posea una clave de acceso, no pueda usarla, asegurando de esta forma que cualquier persona pueda hacer uso de los datos que all se conservan. De ser as el mtodo getConnection(), est sobrecargado para poder dar soporte a esta caracterstica, y si el Administrador de la base de datos ha proporcionado la clave de acceso, debera modificarse de la siguiente forma: conexion = DriverManager.getConnection(url, login, password); Si al modificarse la lnea todava se obtiene un error o excepcin, debe chequearse que el login o clave y el password o contrasea, sean los correctos. Una vez ajustados todos los parmetros obligatorios para realizar una conexin, la misma debera tener un resultado exitoso, logrndose con esto establecer el enlace con la base de datos.

18.7Ejecucin de sentencias SQL y obtencin de datos.


Una vez que se ha observado la forma en la cual se realiza la conexin a la base de datos, posteriormente se mostrarn los mtodos involucrados para ejecutar sentencias y retornar datos de la base de datos. Bsicamente son dos las acciones principales que se efectan en una base de datos: ? ? Ejecucin de sentencias del tipo DELETE, INSERT INTO, UPDATE. Ejecucin de sentencias del tipo SELECT, en la cual est involucrado un retorno de cierta informacin.

La primera es efectuada a travs del mtodo execute(String sql), al cual como puede verse, se le suministra el SQL que se desea ejecutar en la base de datos. Estas sentencias solamente ejecutan una accin en la base de datos y no se espera ningn resultado. La segunda sentencia es cuando se desea retornar una serie de datos o filas de la base de datos, para lo cual se ejecuta el mtodo executeQuery(String sql), el cual si se mira en la documentacin retornar un objeto del tipo ResultSet, el cual no es ms que el conjunto de
87

Curso de Java

BASES DE DATOS

registros que segn el SQL sern devueltos. Es posible que en algunos casos no devuelva ningn registro. La forma de ejecutar el comando sera:
1 2 3 4 5 6 7 8 9 10 ResultSet rs = null; try { rs = db.executeQuery(sql); while (rs != null && rs.next()) { } } catch (SQLException e) { System.out.println(Algn mensaje til!); } finally { rs.close(); }

En este cdigo existen algunas notas o comentarios importantes que ayudan a mejorar el cdigo escrito. Uno de los aspectos es que al ejecutarse la sentencia sobre la base de datos, el mtodo puede, eventualmente, lanzar una excepcin, ya que si el SQL est mal escrito, el manejador de la base de datos lo rechazar. Debido a esto se debe colocar un bloque try catch. Luego como puede verse, existe un bloque finally, dentro del cual se encuentra la llamada al mtodo close() del objeto ResultSet. Existe un requerimiento de que todos los ResultSet abiertos deben ser cerrados, de otra forma quedarn en memoria y en algn momento puede llegar a sobrecargarse la mquina o el manejador de la base de datos. Para evitar eso lo ms til es usar el bloque finally, ya que este tipo de bloque siempre se ejecuta. Cualquier programador pudiera pensar que al colocar la lnea 9 luego de la lnea 6 sera suficiente, pero y si ocurre una excepcin, tambin debera insertarse luego de la lnea 7. Para evitar este tipo de consideraciones, se usa el bloque descrito, ya que ocurra o no ocurra una excepcin, siempre se ejecutarn esas lneas de cdigo, asegurando al programador que se cerrar.

18.8Conexiones con un Driver JDBC.


La otra forma de conectarse a una base de datos como ya se mencion anteriormente, es va un Driver para un manejador especfico, de hecho, en Internet existen Drivers que son vlidos para varios manejadores a la vez, aunque tambin los hay especficos para cada uno. Cabe decir que no difiere en nada el uso de este tipo de Driver al ya explicado para el puente, solamente que las lneas del Class.forName y el DriverManager.getConnection debern ser cambiadas por las correspondientes para el manejador o Driver especificado. Es oportuno mencionar el hecho de que el programador no debe aprender de memoria estas lneas, ya que con cada Driver que se baja de Internet viene la respectiva documentacin de cmo deben ser usadas estas lneas y algunas otras explicaciones propicias para el uso del mismo. Una vez mencionado este hecho, se deja al lector para que busque un ejemplo y lo plasme en el correspondiente cuadro de la pgina siguiente.

88

Curso de Java

BASES DE DATOS

89

Curso de Java

PROGRAMACIN DISTRIBUIDA

CAPITULO XIX 19.- Programacin Distribuida basada en Componentes desde Java 19.1Introduccin a los Servlets.
Un Servlet es un programa del lado del servidor escrito en Java que interacta con clientes y, que por lo general est unido a un servidor HTTP (HyperText Transfer Protocol). Un uso comn para un Servlet, es ampliar un servidor Web proporcionando contenidos Web dinmicos. Este tipo de tecnologa tiene la ventaja sobre otras, en base a que estn compilados, tienen capacidad de programacin multihilo, y proporcionan un entorno de programacin seguro. Tambin se maneja la idea de que es la respuesta Java a la programacin CGI. Debido a que muchas pginas en la actualidad poseen contenidos que cambian dinmicamente, ya sea porque es el usuario quien desea que la informacin sea refrescada para obtener as los ltimos resultados, como por ejemplo partidos de ftbol, ndices econmicos, o porque son formularios para llenados de datos que en un futuro puedan cambiar. Todas estas capacidades de los sitios Web hoy en da las proporciona esta tecnologa que cabe decir que es una de las tecnologas que se encuentran en la plataforma Java 2 Enterprise Edition (J2EE). Bsicamente el modelo del funcionamiento de los Servlets viene del modelo Web de peticin / repuesta (request / response), que se puede visualizar en el siguiente grfico:

Figura 19 Modelo de comunicacin entre un Cliente Web y un Servidor Web

Este modelo es implementado por los Servlets perfectamente, y sus ventajas son bastante notorias, por ejemplo comparado con los Applets, puede decirse que es una buena ventaja si la interfaz grfica no requiere de mucha complicacin, ya que los Servlets no poseen parte grfica, y esta parte puede implementarse con cualquier herramienta como el Macromedia Dreamweaver, Microsoft FrontPage, u otra que sirva para los fines de realizar una pgina Web.

90

Curso de Java

PROGRAMACIN DISTRIBUIDA

Debido a que los Servlets forman parte de la plataforma J2EE, si el IDE en uso no posee la versin enterprise, se debe bajar el archivo jar que contiene estas clases adicionales para poder trabajar. Una vez importadas las clases necesarias, la clase que se est desarrollando debe importar el paquete javax.servlet, en el cual se encuentran las interfaces necesarias para desarrollar aplicaciones con Servlets.

19.2Arquitectura de los Servlets.

Figura 20 Interfaz de un servlet

La abstraccin central en el API de Servlet es la interfaz Servlet. Todos los servlets implementan esta interfaz, bien sea directamente, o mas comnmente, al extender una clase que lo implemente tal como el HttpServlet.

19.3Funcionamiento de los Servlets.


Cuando un cliente realiza una peticin a un Servlet y este la acepta, el Servlet recibe dos objetos en la llamada: ? ? ServletRequest: el cual encapsula la comunicacin del cliente hacia al servidor. ServletResponse: el cual encapsula la comunicacin desde el servidor de vuelta al cliente.

La interfaz ServletRequest, permite al Servlet acceder a informacin tal y como los nombres de los parmetros suministrador por el cliente, el protocolo que est siendo usado por el cliente, y el nombre del host remoto que hizo la peticin y el servidor que la acept. Tambin permite obtener flujos de entrada, de los cuales se obtienen datos desde los clientes que usan protocolos de aplicacin como el HTTP POST y GET.

91

Curso de Java

PROGRAMACIN DISTRIBUIDA

La interfaz ServletResponse, define un objeto que asiste al servlet para las respuestas que enva hacia el cliente. El contenedor del servlet crea un objeto ServletResponse y lo pasa como un argumento hacia los mtodos de servicio del servlet.

19.4Interaccin con los Servlets.


El Servlet HTTP maneja las solicitudes del cliente a travs de los mtodos de servicio. El mtodo de servicio suporta solicitudes del cliente en HTTP estndar al enviar cada solicitud a un mtodo diseado para manejar estas solicitudes.

19.5Manejo de las solicitudes GET y POST.


Los mtodos al cual los mtodos de servicio delegan las solicitudes del HTTP incluyen: ? ? ? ? doGet, para manejar el GET, GET condicional, y solicitudes del HEAD doPost, para el ma nejo de las solicitudes POST doPut, para el manejo de las solicitudes PUT doDelete, para el manejo de las solicitudes DELETE

Por defecto, estos servicios regresan un error del tipo BAD_REQUEST(400). Por ende el servlet debe sobrescribir el mtodo o mtodos diseados para manejar las interacciones que este soporta. Estas secciones muestran como implementar mtodos que manejen las solicitudes ms comunes HTTP GET y POST. Los mtodos de servicios HttpServlet deben tambin llamar al mtodo doOptions cuando el servlet recibe las solicitudes OPTIONS, y doTrace cuando el servlet recibe una solicitud REQUEST. Las implementaciones por defecto de doOptions automticamente determinan que opciones del HTTP son soportadas y cuales retornan dicha informacin. La implentacin de doTrace produce una respuesta con un mensaje conteniendo todas las cabeceras enviadas en la pista de la solicitud. Estos mtodos usualmente no son sobrescritos.

19.6Asuntos de Multihilo.
HTTP servlets son capaces por lo general de servir a mltiples clientes de forma recurrente. Si los mtodos en un servlet que realizan el trabajo para los clientes al acceder recursos compartidos, entonces usted puede manejar la concurrencia al crear servlets que manejen solo una solicitud del cliente a la vez. Para tener a un servlet manejando un cliente a la vez, solo hay que implementar la interfase SingelThreadModel adems de que est extendiendo la clase HttpServlet. El implementar la interfaz SingleThreadModel no significa escribir mtodos extras. Simplemente declara que el servlet implementa la interfaz, y el servidor se asegura de que ejecute un solo mtodo de servicio a la vez.

92

Curso de Java

PROGRAMACIN DISTRIBUIDA

19.7 Ciclo de vida de los Servlets


Cada servlet tiene el mismo ciclo de vida: ? ? ? Un servidor carga e inicializa un servlet El servlet maneja 0 o ms solicitudes de cliente El servidor remueve el servlet

Figura 21 Modelo de ciclo de vida de un Servlet

19.8Inicializacin del Servlet.


Cuando el servidor carga un servlet, este ejecuta el metodo init. La inicializacin se completa antes de que las solicitudes del cliente son manejadas y antes que el servlet sea destruido. Aun as la mayora de los servlets corren en servidores multi- hilos, los servlets no tienen problemas de conc urrencia durante la inicializacin del mismo El servidor llama al mtodo init una vez, cuando este carga al servlet y no lo vuelve a llamar al mtodo init a menos que el servidor vuelva a cargar al servlet. El servidor no vuelve a cargar al servlet sino hasta despus que el servidor lo destruya una vez que llama al mtodo destroy.

19.9Interaccin con el Servlet.


Despus de la inicializacin, el servidor esta en la capacidad de manejar las solicitudes de los clientes.

93

Curso de Java

PROGRAMACIN DISTRIBUIDA

19.10 Destruccin del servlet.


Los servlets se ejecutan hasta que el servidor los destruye, por ejemplo, por solicitud del administrador del sistema. Cuando un servidor destruye un servlet, el servidor ejecuta el mtodo destroy del servlet. El mtodo se ejecuta una vez; el servidor no ejecutar el mtodo destroy de nuevo hasta que el servidor recargue y reinicialice el servlet. Cuando el servidor llama el mtodo destroy, otro hilo (thread) a de estar ejecutando el servicio de solicitud.

19.11 Configuracin del Tomcat.


Descarga e instalacin del Tomcat 4.0 Distribucin binaria: ? Descargue la distribucin binaria del Tomcat desde: http://jakarta.apache.org/builds/jakarta-tomcat-4.0/nightly/ Para Windows necesitara del: jakarta-tomcat-4.0-YYYYMMDD.zip ? Desempaque la distribucin binaria en una localidad conveniente de su disco, tal como jakarta-tomcat-4.0" (por convencin), con la finalidad de recordatorio de este documento, el nombre simblico "${catalina.home}" es usado para referirse al nombre completo en el path del directorio creado para el Tomcat.

19.12 Inicio del Tomcat


Existen dos formas por las cuales el Tomcat 4.0 puede ser iniciado: A travs de las variables de entorno : ? ? Configure la variable de entorno CATALINA_HOME hacia el directorio donde se encuentra instalado el Tomcat 4.0 Ejecute el comando en el shell: %CATALINA_HOME%\bin\startup (Windows)

Al modificar el directorio actual: ? Ejecute lo siguiente en el shell de comando: cd %CATALINA_HOME%\bin startup (Windows) (Windows)

Despus de iniciado, las aplicaciones Web que vienen por defecto incluidas en el Tomcat 4.0 le permitirn navegar en la direccin: http://localhost:8080/

94

Curso de Java

PROGRAMACIN DISTRIBUIDA

Mayor informacin acerca de configuracin y ejecutacin del Tomcat 4.0 podrn ser encontradas en la Documentacin incluida all, as como tambin en el sitio Web: http://jakarta.apache.org/tomcat/

19.13 Detener el Tomcat 4.0


Existen dos tecnicas para poder detener los servicios del Tomcat 4.0 1.? ? Via el entorno de variable: Configure la variable de entorno CATALINA_HOME hacia el directorio donde se encuentra instalado el Tomcat 4.0 Ejecute el comando en el shell: %CATALINA_HOME%\bin\shutdown ? (Windows)

Ejecute lo siguiente en el shell de comando: cd %CATALINA_HOME%\bin shutdown (Windows) (Windows)

19.14 Configuracin Avanzada Mltiple instancias


En muchas circunstancias, es deseable tener una sola copia de la distribucin binaria del Tomcat 4.0 compartida para mltiples usuarios en el mismo servidor. Para hacer esto posible, usted debe configurar la variable de entorno CATALINA_BASE (adicional a CATALINA_HOME descrita arriba) que apunte hacia el directorio que es nico de la instancia. Una vez hecho esto, Tomcat 4.0 calcula todas las referencias relativas por archivos que se encuentran en los directorios basados en el valor dado por CATALINA_BASE en lugar de CATALINA_HOME: 1.2.3.4.conf Archivo de configuracin (incluye server.xml) logs - Log y archivos de salida webapps Carga las aplicaciones web automticamente. work Directorios temporales de trabajo para aplicaciones de web

Si no se establece el valor explicito de la variable CATALINA_BASE, sera inicializado al mismo valor de CATALINA_BASE (lo cual significa que el directorio sera usado para todos las resoluciones relativas al path).

95

Curso de Java

PROGRAMACIN DISTRIBUIDA

19.15 Problemas comunes


Existen en realidad solo tres cosas que pueden salir mal durante la instalacin de la aplicacin Tomcat 4.0: 1) El problema m s comun es cuando otro servidor web (o cualquier proceso para este problema) haya tomado posesion del puerto 8080. Este es el puerto HTTP que por defecto el Tomcat trata de establecer para iniciarse. Para cambiar esto, abra el archivo. $CATALINA_HOME/conf/server.xml y busque por el 8080. Cambiar a un puerto que no este en uso, y que sea mayor al 1024, o puertos menores o iguales al 1024 requiere del acceso del superusuario para lograr el cambio. Reinicie el Tomcat y estamos listos. Asegur ese que usted reemplazo el puerto 8080 en el URL que usa para el acceso del Tomcat. Por ejemplo, si usted cambia al puerto 1977, obtendr respuesta del URL http://localhost:1977/. 2) El error out of environment space cuando se ejecuta un archivo por lotes en sistemas operativos Win9X/ME. Haga click sobre los archivos STARTUP.BAT y SHUTDOWN.BAT. Haga clic sobre las propiedades, click sobre el tab de Memoria, en el campo de Entorno inicial, agregue algo como 4096. Despus de hacer click en aplicar, Windows creara un acceso directo en el directorio con el cual usted puede usar para iniciar o detener al contenedor. 3) El error 'localhost' machine isn't found. Este puede suceder si usted esta detrs de un proxy. Si este es el caso, asegurese de que la configuracin del proxy por parte de su browser conoce que usted esta detrs de un proxy para que pueda acceder al localhost. En Netscape, siga los siguiente: Edicin/preferencias -> Avanzado/proxies Internet Explorer Herramientas -> Opciones de Internet -> Conexiones-> Parmetros LAN.

96

Curso de Java

EJERCICIOS

CAPTULO XX 20.1Ejercicios (Varios).


A continuacin se citan algunos ejercicios para resolver. a) Se desea realizar un programa el cual permita calcular el rea de un Cuadrado y de un Triangulo. Se deben crear dos clases, una para cada figura. Luego en cada clase deben declararse las propiedades de cada una de las figuras, como lado, altura, pero cada propiedad debe ser privada por lo cual se deben declarar los mtodos get y set . Posteriormente en una clase principal, se deben crear dos objetos, uno Cuadrado y otro Triangulo y luego llamar a un mtodo que calcule el rea de las mismas. Se desea realizar un programa en Java en el cual se debern crear las siguientes clases: 1) Clase Persona: esta clase tendr un constructor el cual recibir como parmetros el nombre y el apellido. Deber tener estos campos declarados como protected en el cuerpo de la clase. Clase Estudiante: esta clase tendr dos constructores: uno para ingresar el nombre y el apellido y otro para ingresar nombre, apellido y dos notas. Las notas debern declararse en el cuerpo de la clase y debern tener el identificador protected. Esta clase heredar de la clase Persona. Clase Estudiante de Ciencias: esta ser una clase con dos constructores. Uno para que reciba el nombre y el apellido, y otro para que reciba los parmetros anteriores y dos notas. Esta clase deber heredar de una clase Estudiante. Clase Estudiante de Leyes: esta ser una clase con 3 constructores. Los dos primeros son semejantes al del estudiante de ciencias, pero tendr un constructor adicional para ingresar una tercera nota. Esta clase deber heredar de una clase Estudiante.

b)

2)

3)

4)

Las clases antes mencionadas debern tener los mtodos get y set segn sea necesario, y luego deber crear una clase principal en la cual cree dos estudiantes y muestre sus nombres, apellidos y notas por la consola. c) Realice un programa igual al anterior, pero que permita pasar como parmetros al mtodo main los nombres, apellidos y notas de los estudiantes que desee crear. Se plantea el siguiente ejercicio. Construya una ventana en la cual exista un TextField para introducir una palabra, un Label para mostrar otra palabra, y dos botones. Uno de los botones tendr como nombre toUpper y el otro exit . Lo que se quiere es que el usuario introduzca una palabra, y al presionar el botn toUpper todas las letras cambien a mayscula y se muestre el resultado en el Label. El otro botn es para salir del sistema. Se desea realizar lo siguiente: Construya una ventana con un panel blanco dentro. En ese panel de colocar un TextField en el cual se pueda introducir un texto u oracin.
97

d)

e)

Curso de Java

EJERCICIOS

Luego deben existir 3 Checkbox : uno que se llame negrita, otro cursiva y otro subrayado. Cuando el usuario hace click en alguno de estos el texto debe cambiar segn aplique.

f)

Realice un programa que ejecute las acciones de una calculadora (Visualmente debe parecerse a la calculadora estndar de windows operaciones bsicas). Construir una Agenda que permita realizar las siguientes funciones: En un frame debe existir una calculadora en la esquina superior derecha (previamente hecha). Luego en la esquina superior izquierda, deben existir 4 Label y 3 TextField y un TextArea: Nombre, Apellido, Telfono y Comentarios (TextArea). Luego debe existir en la parte inferior izquierda un List en el cual se puedan aadir los nombres de las personas que se agreguen en los TextField, e incluso permitir que cuando el usuario haga click en la lista, la informacin se refleje en los TextField de arriba. En los comentarios se pueden ingresar operaciones que haga el usuario. Note que debe tambin colocar botones que permitan tanto ingresar los nombres a la lista (List ) como quitar nombres de la lista. A continuacin se muestra un screenshot de como debera quedar la aplicacin:

g)

20.2Toc-Toc.
Se desea realizar una aplicacin en la cual se intercambien mensajes entre un cliente y un servidor. El cliente enviar un mensaje al servidor, y el servidor le responder. Por
98

Curso de Java

EJERCICIOS

ejemplo, el cliente enva un Hola, y el servidor le responde Hola. El cliente enva un Cmo ests?, y el servidor le responde bien. Para ello debe implementar dos reas: una en la cual el usuario pueda escribir el mensaje que quiere enviar el servidor , y otra en la cual se vea tanto el mensaje que el usuario enva, como la respuesta que recibe del servidor.

20.3PhotoView.
Se desea hacer una aplicacin en la cual se pueda mostrar en un panel una serie de imgenes cuando el usuario haga click en un botn. Primero debe seleccionar las imgenes que se van a mostrar. Luego cada imagen debe estar asociada a un archivo de texto, en el cual tenga un comentario acerca de la imagen. Cuando aparece la imagen en el panel, la informacin de la misma, es decir el archivo de texto, debe aparecer en un JTextArea. Esta aplicacin debe hacerse con Swing.

99

Curso de Java

CAPTULO XXI 21.- Literatura.


a) b) c) d) e) f) g) h) i) j) k)
i)

FLANAGAN, David. Java in a Nutshell A Desktop Quick Reference. Segunda Edicin. HOLZNER, Steven. La Biblia de Java 2. Ediciones ANAYA MULTIMEDIA. CAMPIONE, Mary WALRATH, Kathy. The Java Tutorial. Second Edition.
http://java.sun.com http://www.enteract.com/~bradapp/links/java-links.html http://www.javasoft.com http://www.jguru.com http://ibm.software.vajava http://www.sc.echu.es/sbweb/fisica/cursoJava/fundamentos/colecciones/vector.htm http://www1.ceit.es/Asignaturas/Informat2/Clases/Clases9900/Clase05/JavaClasesPredef/sld011.htm http://developer.java.sun.com/developer/onlineTraining/GUI/Swing1/ http://developer.java.sun.com/developer/onlineTraining/GUI/Swing2/

100

You might also like