Professional Documents
Culture Documents
CURSO DE JAVA
Curso de Java
INDICE
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 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 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
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.
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.
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:
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
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
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.
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.
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
private
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
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
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
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.
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.
21
Curso de Java
JDK
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
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
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.
27
Curso de Java
ESTRUCTURAS
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
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.
Curso de Java
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
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:
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:
? ? ?
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
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.
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
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.
33
Curso de Java
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
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
36
Curso de Java
37
Curso de Java
API
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
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)
42
Curso de Java
API
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:
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
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
//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
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
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.
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:
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
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
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
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.
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){ } } }
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.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
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:
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.
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
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
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
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.
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
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:
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
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
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
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:
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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
93
Curso de Java
PROGRAMACIN DISTRIBUIDA
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/
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
96
Curso de Java
EJERCICIOS
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
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