Lección 01
¿Qué es Java?
Java es un lenguaje de programación creado por Sun Microsystems. que ha tenido gran aceptación a nivel mundial y se ha convertido en el standard de facto en muchos ámbitos como el académico y el de grandes proyectos interdisciplinarios.
Java se ha hecho famoso por varias razones. Las tres principales son 1) que es un lenguaje muy adecuado para desarrollar aplicaciones para Internet, 2 ) es un buen lenguaje general de programación orientada a objetos y 3) las aplicaciones desarrolladas en Java son o pueden ser independientes de la plataforma, es decir, del hardware y del sistema operativo.
Hay otras razones que se mencionan frecuentemente cuando se trata de explicar el fenómeno Java como por ejemplo el sistema de seguridad que ofrece, pero probablemente la capacidad de Java para crear applets, los "pequeños" programas que pueden incluirse en páginas Web, es lo que más ha contribuido a la popularidad de Java.
Applets.
Un applet es un programa con una interfaz gráfica que puede insertarse en una página web. Por ejemplo la calculadora que aparece a continuación es un applet.
Como el lector podrá comprobar, no es una imagen estática sino una auténtica calculadora que el lector puede utilizar para realizar operaciones numéricas.
Los applets se escriben en lenguaje Java. El código de un applet lo interpreta el propio navegador. Los primeros navegadores de internet no interpretaban applets pues esto aún no existían cuando la web comenzó a funcionar, pero a partir de las versiones 3 de Internet Explorer y Netscape ambos interpretan applets. La capacidad de los navegadores de internet para interpretar applets es una de las formas más populares y convenientes de incluir interactividad en páginas web, pero es importante mencionar que no es la única, hay otras como por ejemplo JavaScript y la tecnología ActiveX de Microsoft. Los applets tienen virtudes y limitaciones y es importante conocer ambas antes de decidir si es conveniente desarrollar una aplicación concreta en forma de applet o no. Hay aplicaciones para las cuales el formato del un applet puede ser ideal y otras para las cuales resultaría erróneo. Esto debe decidirlo el desarrollador antes de comenzar a desarrollar la aplicación y para ello debe conocer perfectamente las virtudes y limitaciones de los applets.
La mayor virtud de los applets es su universalidad. Un applet insertado en una página web en principio puede utilizarse en cualquier computadora con tal que tenga un navegador de internet que entienda Java. Una persona puede desarrollar un applet usando una PC con windows, insertar su applet en una página web, ponerla en un servidor de internet e instantáneamente su applet puede ser cargado y ejecutado en cualquier parte de mundo desde cualquier computadora conectada a internet. Para que esto ocurra no es necesaria ninguna intalación en la computadora del cliente, basta tener la dirección (URL) del sitio donde etá la página con el applet. Otra importante virtud de los applets es la seguridad que ofrecen al usuario. Un applet, por diseño, no puede acceder a los recursos del sistema del cliente en donde se está ejecutando, por lo cual no puede leeer la información del cliente, ni modificarla ni destruirla.
La mayor limitación de un applet es su prohibición de acceder al disco fijo del cliente, por lo cual desde un applet no se puede guardar información localmente. Otra limitación importante es la prohibición de usar el "clipboard" o "portapapeles" del sistema con lo cual los procesos comunes de copiar y pegar resultan incompletos. Estas limitaciones no se deben a ninguna pobreza del lenguaje Java, un programa Java autónomo no tiene ninguna de estas limitaciones, sino que se deben precisamente al sistema de seguridad de los applets. Sin estas limitaciones un programador mal intencionado podría crear un applet que lea la información del cliente, la altere o la destruya. Así que las limitaciones de los applets se deben precisamente a una de sus principales virtudes, la seguridad que ofrecen al usuario.
El sistema de seguridad de los applets funciona muy bien, se le han encontrado algunos fallos que se han corregido en versiones posteriores. Actualmente se considera imposible crear un applet nocivo. Lo que no es difícil encontrar es un applet molesto. Un applet puede adueñarse temporalmente de los recursos multimedia de una computadora y ocupar intensamente el procesador de tal manera que puede incluso ser necesario apagar la computadora para librarse del problema. Esto puede llegar a ocurrir sin que el programador tenga ninguna mala intención, por error en la implementación. Por este motivo es importante aprender a programar correctamente los applets y éstos deben probarse exhaustivamente antes de ponerlos en Internet al alcance del público.
Hay maneras de saltarse las limitaciones de un applet. En particular existe la posibilidad de firmar un applet y que el cliente decida si permite a un applet con una firma conocida, acceder a los recursos de su computadora. Esta tecnología está muy desarrollada en Java 2 y puede ser muy útil en los casos de aplicaciones a las que el formato de applet es conveniente pero que requiren un acceso menos limitado a los recursos del sistema del cliente.
Aplicaciones autónomas en Java
Java es un lenguaje de programación completo. El hecho de que con Java se puedan crear applets no debe interpretarse como que Java es un lenguaje para hacer applets. Java es un lenguaje de programación muy poderoso que tiene muchas otras virtudes. Las más importantes son:
1) Java es un lenguaje orientado objetos.
2) Java cuenta con una librería de programación muy amplia y completa que lo hace competitivo con cualquier otro lenguaje y que incluye facilidades muy avanzadas para el desarrollo de programas distribuidos en internet.
3) Java es multiplaforma, es decir, un programa (bien) escrito en Java puede ejecutarse en cualquier computadora con cualquier sistema operativo, siempre y cuando cuente con un intérprete actualizado de Java, es decir una JVM (Java Virtual Machine).
4) Java cuenta con un avanzado sistema de seguridad (que no está limitado a los applets).
Un programa Java, ya sea un applet o una aplicación autónoma, puede ejecutarse en cualquier sistema operativo siempre y cuando tenga instalado un navegador que interprete applets o, en el caso de las aplicaciones autónomas, un intérprete de Java. Pero los diferentes navegadores y los intérpretes de Java para distintos sistemas operativos no funcionan exactamente igual y producen resultados desiguales. Por tanto, cuando se hace un programa en Java, ya sea un applet o una aplicación autónoma, antes de publicarlo es conveniente probar su funcionamiento en los navegadores más comunes o en los diversos intérpretes y ajustar las diferencias para que los resultados sean aceptables.
Uno de los defectos que se atribuyen a Java es que es lento por ser un lenguaje interpretado, es decir, el código Java no es código de máquina para una computadora específica sino código para una "máquina virtual" (la Java Virtual Machine) que puede implementarse en diversas computadoras y sistemas operativos. Tradicionalmente se considera que los lenguajes interpretados son lentos. Sin embargo la velocidad de interpretación de Java es muy variable. Por ejemplo es fácil comprobar que el IExplorer de Microsoft 3.0 es notoriamente más rápido para interpretar un mismo código Java que Netscape 3.0. Sin embargo en las versiones posteriores de ambos navegadores las diferencias son menos notorias. Para la mayoría de las aplicaciones la velocidad de ejecución de Java es perfectamente satisfactoria, como podrá comprobarse con los ejemplos que se verán a lo largo del curso. Además, la tecnología JIT (Just In Time compiling) que consiste en que el intérprete de Java no interpreta directamente el código Java sino que antes lo traduce a código ensamblador y luego lo ejecuta, hace prácticamente idéntica la velocidad de proceso de un programa Java y uno escrito en C.
Un problema que existía en la versión 1.0 de Java era la el tiempo que se requería para cargar un applet debido a todos los trámites que la seguridad de Java requiere. Por este motivo los primeros applets tenían que ser simples y pequeños. Sin embargo la aparición en la versión 1.1 del sistema de archivos .jar que pueden contener todas las clases de un applet hizo prácticamente desaparecer este problema.
Todavía es importante tratar de limitar el tamaño total de un archivo .jar para un applet. Más de 30 Kb de código puede ser demasiado en algunos casos. Pero aún esta limitación se hace cada vez menos importante a medida que se instalan líneas de mayor ancho de banda.
Una gran ventaja de los navegadores para la ejecución de applets es que cunado un applet se carga por segunda vez en una misma sesión (sin cerrar el navegador), el navegador ya lo encuentra guardado en el cache y no tiene que realizar los trámites de seguridad ni traerlo del servidor al cliente, con lo cual resulta muy rápido. Esta característica sin embargo puede ser problemática para quienes desarrollan applets, pues los navegadores no distinguen las nuevas versiones que se acaban de crear y para probar una nueva versión es necesario cerrar el navegador y volver a abrirlo, lo cual constituye una gran pérdida de tiempo para el programador. Sin embargo no se trata de un problema grave si se trabaja con una computadora con al menos 64 MB de RAM.
A pesar de las pequeñas dificultades mencionadas, Java es un magnífico lenguaje de programación y creemos que gran parte del software que se desarrollará en los próximos años se escribirá en Java.
Java y JavaScript
Es importante aclarar que JavaScript y Java son cosas diferentes. JavaScript es un lenguaje de programación exclusivamente para páginas Web. JavaScript fue desarrollado por Netscape. De hecho Netscape iba a llamar "LiveScript" a su lenguage de programación para páginas Web, pero ante la popularidad que Java estaba adquiriendo y aprovechando el parecido de la sintaxis de ambos lenguajes, decidieron llamarle JavaScript.
Ambos lenguajes han aprovechado la sintaxis del C++ por lo cual su código es parecido.
JavaScript es especialmente adecuado para enriquecer una página Web pues tiene control sobre ella, puede ofrecer interacciones dentro de una página, puede generar páginas al instante dependientes de lo que el usuario elija e incluso puede controlar applets de Java que se encuentren en la página. Pero las clases que se pueden crear con JavaScript sólo tienen validez dentro de la página Web donde se crearon, por lo tanto no se pueden crear librerías de clases y extender así su poder.
Java no ofrece control sobre una página Web pero en cambio es un lenguaje de programación completo con el que se pueden crear y extender clases, formar paquetes o librerías de clases, crear aplicaciones independientes y además crear applets, que son programas que habitan en páginas Web y pueden enriquecerlas mucho.
Aunque la sintaxis de ambos lenguajes es parecida, en realidad son lenguajes muy diferentes. Java es muy estricto en cuestión de tipos de variables como el Pascal o el C++ mientras que JavaScript no lo es.
Ambos lenguajes pueden colaborar perfectamente dentro de una página Web.
Para utilizar JavaScript basta aprender el lenguaje y usarlo dentro de las páginas Web, en cambio para utilizar Java es necesario usar al menos un compilador de Java. Sun Microsystems ha creado un paquete de desarrollo de aplicaciones en Java que se denomina "Java Development Kit", del cual trata la siguiente lección.
El "Java Development Kit"
El "Java Development Kit" (JDK) es el paquete de desarrollo que ofrece y distribuye gratuitamente Sun Microsystems a los desarrolladores de Java.
El JDK 1.0 apareció al público a principios de 1996 y tuvo varias revisiones, como la 1.02 y la 1.04.
En 1997 apareció la versión 1.1 (http://java.sun.com/products/jdk/1.1/index.html). Esta versión introdujo cambios muy importantes, por ejemplo se mejoró considerablemente el AWT (Abstract Windowing Toolkit), que es la interfaz gráfica de Java, sobre todo en el manejo de los eventos. En Java Development Kit 1.1.x Brochure se presenta una descripción detallada de las novedades que aportó el JDK 1.1. A la fecha de la publicación de este curso (agosto de 2002) la última revisión del JDK 1.1 es la 1.1.8 que se sigue utilizando como el standard para la creación de applets confiables y universales y constituye también el standard en cuanto a las librerías básicas de Java y que sin embargo Sun dejará de distribuir en el año 2002.
En 1998 aparece lo que ahora se llama Java 2, que introduce mejoras en el sistema de seguridad de aplicaciones distribuidas, agrega, entre otras cosas, una interfaz gráfica más potente llamada JFC (Java Foundations Classes) y conocida popularmente como herramientas "swing". La versión vigente de Java 2 en el momento de la publicación de este curso (agosto de 2001) es Java 2 SDK, Standard Edition, v. 1.3 http://java.sun.com/products/j2se/1.3/ (SDK son las siglas de Software Development Kit). Las mejoras introducidas pueden leerse en http://java.sun.com/j2se/1.3/docs/relnotes/features.html.
Muchas de las adiciones que se encuentran en Java 2 aparecieron como paquetes opcionales que podían agregarse al JDK 1.1. Hay muchos paquetes que están en desarrollo y se pueden utilizar pero que aún no han alcanzado la madurez suficiente para pertencer al SDK. El programador de Java debe estar siempre atento a estos desarrollos que pueden consultarse en las páginas de Sun: http://java.sun.com.
Las versiones más recientes en el entorno Windows de los dos navegadores más populares son Internet Explorer 5.5 (http://www.microsoft.com/) y Netscape 6.1 (http://home.netscape.com/). Ninguno de estos dos navegadores da soporte a los applets creados con el Java 2 SDK, por lo cual para ejecutar estos applets es necesario realizar la instalación de un "plug-in" en la computadora del cliente, lo cual resulta muy inconveniente en ciertos medios donde los applets se utilizan frecuentemente. Por este motivo es conveniente conocer bien el JDK 1.1.8 y toda su potencia, que no es poca.
El Java 2 SDK es aún más potente que el JDK 1.1. Por otro lado, Sun dejará de distribuir el JDK 1.1.8 en el año 2002. Por estas dos razones es también muy importante conocer el Java 2 SDK.
Debido a esta situación durante la primera parte del curso se utilizará el JDK 1.1.8 y, como el presente es un curso introductorio y es imposible cubrir la mayor parte de la nueva funcionalidad que ofrece Java 2, sólo en las últimas lecciones se hablará del Java 2 SDK 1.3.
Este curso se centra en las cuestiones básicas del lenguaje Java que aparecen ya completamente desarrolladas en la versión 1.1. Son cuestiones que no cambian en Java 2 y por lo tanto todo lo que cubre el curso es compatible con Java 2.
La instalación el JDK consiste en descargarlo, con lo cual se obtiene un archivo ejecutable (por ejemplo para el JDK 1.1.8 en Windows98, este archivo se llama jdk-1_1_8_008-win.exe) y ejecutarlo, lo cual realiza la instalación. Además de esta instalación se recomienda que en el autoexec.bat de su computadora escriba la línea:
set path=%path%;c:\jdk1.1.8\binsupóniendo que c:\jdk1.1.8 es donde instaló el jdk.
También se recomienda que descargue e instale en su computadora (en el mismo directorio donde se instaló el jdk) la documentación correspondiente (en formato html):
http://java.sun.com/products/jdk/1.1/docs.html.
Esta documentación puede consultarse en línea en:
http://java.sun.com/products/jdk/1.1/docs/index.html
La documentación de Java es excelente y constituye una herramienta imprescindible para el programador. Se recomienda al alumno se familiarice con ella para lo cual conviene que navegue por sus páginas, entienda su organización y lea algunas partes para familiarizarse con su lenguaje.
La documentación de Java 2 http://java.sun.com/j2se/1.3/docs/ es aún mejor que la de Java 1.1 y se puede utilizar aún cuando se trabaje con el JDK 1.1.8 pues en ella se especifica desde qué versión es válida cada clase o método. Conviene que el alumno también se familiarice con la documentación de Java 2 para ir conociendo la nueva funcionalidad que ofrece.
Por otro lado Sun ofrece también un excelente tutorial en línea para aprender Java: http://java.sun.com/docs/books/tutorial/ que utilizaremos como lectura recomendada para este curso.
El JDK consta de un conjunto de programas que hay que llamar desde la línea de comandos (en Windows debe hacerse desde una ventana del DOS). Los más importantes para este curso son java.exe que es el intérprete o "runtime" de Java y javac.exe que es el compilador. Los programas del JDK 1.1.8 se encuentran en el directorio c:\jdk1.1.8\bin (que es la razón por la cual conviene agregar la línea set path=%path%;c:\jdk1.1.8\bin al autoexec.bat.
Los programas Java constan de archivos con extensión .class que contienen el código para la máquina virtual de Java, es decir, un programa que se encarga de convertir en tiempo de ejecución ese código en código del procesador. Por este motivo es necesario usar un intérprete de java para ejecutar los ficheros .class. Este intérprete es precisamente java.exe.
Para ejecutar un programa Java cuyo código comienza en la clase miprograma.class, hay que llamar desde la línea de comandos
java miprograma
Como en muchos lenguajes de programación, un programa Java se escribe en un archivo de texto puro (¡no en formato doc o rtf!) y que tiene extensión .java. El programa que se encarga de compilar el texto, es decir, de convertirlo en código para la máquina virtual es el compilador javac.exe. Para compilar un archivo .java hay que ejecutar javac.exe pasándole como parámetro el nombre con extensión del archivo .java, es decir
javac miprograma.java
Esta llamada creará el archivo miprograma.class, suponiendo que miprograma.java no contien errores. Si hay errores, el compilador los detecta y los escribe en la consola. Cuando hay muchos errores los primeros se pierden arriba de la pantalla. Esta es una de las razones por las que conviene utilizar un entorno de programación más adecuado como el que ofrece el JCreator que es un magnífico programa que tiene una versión de libre distribución (freeware) que puede descargarse de: http://www.jcreator.com. En el subdirectorio: JCreatorFiles del directorio principal de este curso se puede encontrar un "workspace" para todos los "proyectos" del curso y un proyecto para cada lección del curso. Recomendamos a los alumnos utilizarlos para facilitar y agilizar su trabajo. A diferencia de algunos otros entornos de programación Java, éste puede utilizar el compilador y el JDK específicos que el usuario decida por lo que el resultado de la compilación es el mismo que se obtendría utilizando el javac.exe desde la línea de comandos. No es un entorno de programación visual, y precisamente por eso resulta también muy adecuada para este curso pues su objetivo es enseñar la programación Java "dura" que siempre resulta más potente. La programación visual puede ser muy conveniente en algunos proyectos, pero también puede acabar siendo un estorbo en otros proyectos. Esto por supuesto es cuestión de gustos. De cualquier manera, este curso no es sobre programación visual sino sobre programación "dura".
El JDK tiene un visualizador de applets llamado appletviewer.exe que sirve para ejecutar los applets de una página Web sin ver el resto de la página. La llamada
appletviewer pagina.html
hecha desde la línea de comandos, ejecuta los applets que se invocan desde pagina.html. El appletviewer puede ser útil para "debuguear" applets.
Además de java.exe, javac.exe y appletviewer.exe, el JDK tiene: un "debuger" llamado jdb.exe; un programa javadoc.exe que genera documentación automática de cada clase y paquete a partir de unos comentarios especiales que se pueden poner en los archivos con extensión .java. Hay un programa javah.exe que genera encabezados (archivos .h) y código en C (archivos .c) que describen las classes especificadas en un archivo .java. Hay un programa javap.exe que desensambla los archivos .class e imprime una versión en formato de texto más o menos legible. Hay otras herramientas del jdk que pueden consultarse en http://java.sun.com/j2se/1.3/docs/tooldocs/tools.html#basic.
Las herramientas del JDK que utilizaremos son solamente el intérprete java.exe (o jre.exe y jrew.exe que son las versiones para usuarios finales) y ocasionalmente el appletviewer.exe que es útil para ir probando los applets que se están desarrollando.
Es importante saber que Java tiene muchas clases predefinidas que sirven como librerías de programación. Estas clases están organizadas en paquetes que en conjunto se conocen como el API (¿Alguien recuerda de dónde vienen estas siglas?) de Java. La documentación de estos paquetes constituye la mayor parte de la documentación de Java ver
http://java.sun.com/products/jdk/1.1/docs/api/index.html y http://java.sun.com/j2se/1.3/docs/api/index.html.
A lo largo de este curso iremos aprendiendo a usar partes de todos estos paquetes de clases.
En la documentación de Java hay un descripción detallada de la convención de escritura de código recomendada:
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html
Los alumnos del curso deberán aprender y usar esta convención como parte de su aprendizaje. La mayor parte podrán aprenderla imitando el estilo de los ejemplos del curso, pero se les recomienda consultar la documentación cuando tengan dudas.
Paquetes básicos del JDK.
El JDK (Java Development Kit) 1.0 tenía sólo estos ocho paquetes, seis de ellos siguen siendo los paquetes básicos de java y que el programador debe conocer muy bien.
java.applet |
Todo sobre los applets, es una clase pequeña |
java.awt |
Windows y sus controles, es una clase amplia y compleja. |
java.io |
Lectura y escritura de archivos a través de Streams |
java.lang |
Matemáticas, Strings, Hilos y otras cosas básicas. |
java.net |
Todo sobre conexiones a internet |
java.util |
Algunas clases útiles |
Aún este pequeño subconjunto de paquetes es un material muy extenso que no es posible presentar completo en un curso. Lo que haremos es mostrar cómo se usan las principales clases de estos paquetes analizando los ejemplos desarrollados especialmente para el curso. Ponga atención a las importaciones que se declaran al principio de cada archivo java. En ellas se especifican los paquetes que se van a usar. Por ejemplo
import java.applet.*;
indica que se van a usar las clases del paquete java.applet. El paquete java.lang es el único que no necesita importarse nunca.
HelloWorld.
Desde que Kernighan y Ritchie publicaron el lenguaje de programación C, es tradición comenzar el estudio de un nuevo lenguaje con un programa llamado HelloWorld.
Fieles a esta tradición presentamos aquí el contenido del fichero HelloWorld.java que contiene el código Java íntegro de nuestro primer programa.
Este es su contenido:
Hay dos cosas que hacer con este programa, comprender su contenido y ejecutarlo.
Comencemos por ejecutarlo. Para ello antes hay que compilar el archivo HelloWorld.java. En Windows esto se hace abriendo una ventana del DOS, pasando al directorio principal del curso, escribiendo:
javac ejem01\HelloWorld.java
y pulsando intro. Esta serie de instrucciones invoca al compilador de Java y crea el archivo HelloWorld.class que contiene la "clase" ejem01.HelloWorld, es decir, el código del programa.
Ahora el programa ya se puede ejecutar. Esto se hace llamando al intérprete de Java pasándole como parámetro el nombre completo de la clase (sin extensión pero incluyendo como prefijo el paquete al que pertenece). Es decir, hay que escribir:
java ejem01.HelloWorld
y pulsar intro. El programa responde escribiendo la frase: Hello World!
Nota: Java es sensible a mayúsculas y minúsculas, tanto en los nombres de clases, métodos y variables como en los nombres de archivos. Por lo tanto, aunque para el sistema operativo en uso helloworld.class y HelloWorld .class puedan ser iguales, para los programas del JDK son distintos y si Ud. intenta ejecutar helloworld en lugar de Helloworld el intérprete java.exe dará un error.
Analizaremos el contenido del programa. Cada nuevo concepto que aparece en itálicas tiene una importancia fundamental pero no los vamos a definir ni explicar en detalle sino que volveremos a ellos una y otra vez en los ejemplos posteriores para que su significado se vaya aclarando. Algunas apariciones de estas palabras tienen conexiones a las páginas que pueden enriquecer el concepto.
Comenzamos por la primera línea:
package ejem01;
que especifica el "paquete" al que va a pertenecer la clase que vamos a crear. Si la línea del paquete no se incluye en una clase ésta pertenece al paquete por defecto que es el que tiene nombre vacío.
La siguiente línea:
public class HelloWorld
es un encabezado típico de Java en el que se especifica que se va a definir una clase llamada HelloWorld y que ésta es pública. Todos los elementos de un programa Java son clases o partes de una clase. Una clase puede tener variables y métodos. Las variables pueden ser instancias de una clase o variables simples. Los métodos son los elementos que contienen las instrucciones del progama, es decir, lo que en C se llaman funciones y en Pascal se llaman procedimientos y también funciones. Las variables y los métodos de una clase deben definirse entre dos llaves. { abre la lista de estas definiciones y } la cierra.
Nuestra clase HelloWorld tiene un solo método y no tiene variables. La segunda línea del programa define el único método de nuestra clase.
public static void main(String[] args)
Esta línea afirma que se va a definir un método llamado main que es de carácter público y estático y que no devuelve ningún valor (es lo que indica la palabra void). Los paréntesis que aparecen a la derecha de la palabra main encierran los parámetros que se pasan al método main.
El contenido del método main se encierra también entre dos llaves { y }. Un método contiene principalmente llamadas a los métodos de la propia clase o de otras clases. Nuestro método main tiene una sola llamada que se especifica en la línea:
java.lang.System.out.println("Hello World!");
Esta línea es una llamada al método println de la variable out de la clase java.lang.System. out es un objeto o instancia de la clase java.io.PrintStream. Esta terminología irá aclarándose poco a poco a lo largo del curso.
HelloWeb, un primer applet.
Un applet es un archivo con extensión .class como todos los programas de Java, pero que no se interpreta usando java.exe sino que debe ejecutarse usando un navegador de internet (como IExplorer o Netscape). Para ello debe utilizarse necesariamente una página web, es decir, un archivo con extensión .htm o .html escrito en el lenguaje HTML. Dentro del código de la página web debe incluirse la llamada al applet usando un formato como este:
En particular esta ventana es un applet y el texto que muestra es precisamente el que se usa para insertar este applet en esta página. El código del applet se especifica como code="showlib.showText.class".
Vamos ahora a crear nuestro primer applet, lo llamaremos HelloWeb. He aquí una transcripción del fichero HelloWeb.java en el que se define el applet:
Como en los casos anteriores, para ejecutar el programa antes hay que compilarlo con el procedimiento habitual, es decir, hay que pasar a la línea de comandos y hacer la llamada:
javac ejem01\HelloWeb.java
Pero un applet no se puede ejecutar como otras clases de java. Hay que llamarlo desde una página Web o HTML para que cuando un navegador cargue la página, lo ejecute. Para ello hemos aprovechado esta misma página por lo cual aquí abajo verá este applet ejecutándose:
No es muy espectacular pero es muy sencillo. Los otros ejemplos que veremos en el curso le darán una idea más clara de las muchas posibilidades de los applets.
Aquí está el código HTML necesario para incluir este applet en una página web.
Hemos creado otra página HW.html en el subdirectorio ./ejem01/. Entrando a ella podrá ver otra vez el applet HelloWeb ejecutándose.
Este es el código HTML de la página HW.html:
Como el lector podrá comprobar en esta página el codebase ha cambiado de codebase="./" a codebase="../" indicando que se debe comenzar la búsqueda de la clase a partir del nivel superior de donde se encuentra la página.
Hay otra manera de ver un applet en ejecución, pero siempre a través de un archivo html: desde la línea de comandos se puede hacer la llamada:
appletviewer ejem01\HW.html
El programa appletviewer.exe no es un navegador pero ejecuta los applets insertados en el html que se le pasa como parámetro. Lo hace en una ventana especial para cada applet.
Hay muchos detalles sutiles en la forma de insertar un applet en una página Web, pero la idea es muy sencilla. Se comienza con la etiqueta de applet y se le agregan code= y el nombre completo del applet, que como ya hemos explicado es un archivo con extensión .class. El codebase es en general un URL (Unique Resource Locator) que puede expresarse en términos absolutos como http://xxx.com.mx/subdir o en términos relativos a la localización de la página Web, como en los ejemplos anteriores. Luego hay que poner en width y height el ancho y el alto del applet en pixels. Estos son datos obligatorios, excepto el codebase que es opcional y si se omite se interpreta como el mismo URL donde se encuentra la página Web.
En alt puede escribirse el texto que aparecerá si el navegador entiende la etiqueta applet pero no está habilitado para interpretar Java. Luego vienen los parámetros que se le pasan al applet, siempre en forma de cuerdas de texto. El applet recibe estos parámetros si está programado para reconocer los nombres de los mismos y asigna los valores a unas variables internas o toma decisiones usándolos. Finalmente, antes de cerrar la etiqueta applet se puede escribir el texto queaparecerá en lugar del applet si el navegador no entiende la etiqueta applet.
Primeras aplicaciones.
En el resto de esta lección se crean varias aplicaciones y applets que son calculadoras. Se aprovecha la idea de un programa que realiza las operaciones aritméticas básicas para ilustrar la amplia variedad de formas que se pueden dar a una aplicación Java y mostrar cómo se pueden reutilizar las clases de un programa sencillo en versiones más complejas.
En lo que sigue de la lección aparecerán varios términos y conceptos que probablemente el alumno no entenderá. La mayoría de estos términos se explican en otras lecciones del curso. El objetivo de los ejemplos que siguen es dar una primera visión más o menos completa de lo que se estudiará en el resto del curso.
El alumno debe leer estos ejemplos cuidadosamente tratando de entender o adivinar el papel que juegan los diferentes métodos de cada clase y lo que hace cada línea o instrucción, pero sin pretender comprenderlo a fondo. Si tiene curiosodad, tiempo e interés, se le invita a consultar los términos que no entienda en la documentación. Pero sobre todo debe tratar de familiarizarse con la sintaxis y la terminología.
Aplicaciones autónomas para línea de comandos.
Para que una clase Java sea una aplicación autónoma debe tener un método con encabezado
public static void main(String[] args)
que es por donde comienza la ejecución. En tal caso desde la línea de comandos se puede ejecutar la clase escribiendo java seguido del nombre de la clase (sin extensión) y pulsando <intro>. El intérprete de Java comienza la ejecución de la clase precisamente por este método. Si la clase no tiene un método como éste entonces el intérprete de Java dice que no encuentra el método main y no la ejecuta.
Normalmente una aplicación consta de varias clases pero sólo una de ellas es la entrada de la aplicación. Para que una clase sea entrada de una aplicación es necesario que tenga el método main, pero una clase puede tener el método main y no usarse dentro de una aplicación como entrada sino sólo como una clase más.
El ejemplo ejem01.calculadora.class presenta nuestra primera calculadora sobre la que se construirán otras. Es una clase ejecutable que más adelante aprovecharemos sin utilizar su método main.
Para usar esta calculadora el alumno debe usar la línea de comandos de la consola y, desde el directorio principal del curso, hacer llamadas como
java ejem01.calculadora 155 "/" 5
En este caso obtendrá el resultado de la división de 155 entre 5, o sea 31. Es necesaro escribir un espacio entre el primer operando y el operador, así como entre el operador y el segundo operando para separar los argumentos del programa. El alumno puede realizar otras operaciones con llamadas semejantes.
Nota: las comillas alrededor del operador son necesarias sólo para la multiplicación porque un * en la línea de comandos se interpreta como un comodín sobre los archivos del directorio actual. Por ejemplo, *.java usado como parámetro hace que en args aparezca la lista de todos los archivos con extensión .java. Esto es muy útil para crear programas que operen sobre varios archivos. En los ejercicios de la lección 8 el alumno tendrá ocasión de utilizar esta propiedad.
El siguiente ejemplo, ejem01.calcApli.class, utiliza la clase calculadora pero no su método main. calcApli crea una interacción diferente, más parecida a la de una calculadora en donde se va utilizando el acumulador como primer operando.
En este ejemplo se utiliza System.in que es la corriente de entrada (un objeto de la clase InputStream) para leer lo que el usuario del programa escribe. De hecho se crea un objeto de la subclase BufferedReader para leer las cadenas (Strings) que el usuario escribe en la línea de comandos. Todo lo referente a corrientes de entrada y salida se estudiará en la lección 8. Este ejemplo es una aplicación típica de línea de comandos sin marcos ni ventanas. En este tipo de aplicaciones la interacción se realiza pidiendo al usuario, mediante un mensaje en la pantalla , que escriba algún dato al programa, el cual el programa lee usando la corriente de entrada System.in (o alguna subclase construida a partir de ella). Los mensajes al usuario, así como los resultados del programa se escriben en la pantalla usando la corriente de salida System.out.
Para usar calcApli el alumno debe usar la línea de comandos de la consola y, desde el directorio principal del curso, hacer la llamada
java ejem01.calcApli
y a continuación escribir los operandos y operadores que el programa le va pidiendo. El resultado de una sesión con este programa podría ser así:
Las aplicaciones de línea de comandos siguen siendo útiles a pesar de que actualmente se utilizan con mayor frecuencia las aplicaciones con interfaz gráfica, lo que se llaman aplicaciones Windows. El alumno debe adquirir destreza en la creación de aplicaciones de línea de comandos porque constituyen una forma rápida y fácil para resolver muchas dudas y problemas. En particular, a veces es más fácil y práctico resolver una duda de programación escribiendo un programa y viendo lo que hace, que consultarlo en la literatura. También hay muchas aplicaciones que podrían ser Windows pero que por diversas razones puede convenir escribirlas como aplicaciones de línea de comandos. Sin embargo las aplicaciones que requieren una interacción compleja con el usuario deben escribirse como aplicaciones Windows.
Aplicaciones Windows.
Las aplicaciones Windows se caracterizan por tener al menos un marco (Frame). Los marcos se estudiaron en la lección 8. Al igual que las aplicaciones para línea de comandos, la entrada debe realizarse en una clase que tenga un método
public static void main(String[] args)
La diferencia con las aplicaciones de línea de comandos radica en que la interacción se realiza sobre una interfaz gráfica como las que se estudiarán en la lección 4 y usando los eventos que se estudiarán en la lección 5. Para ilustrar esto presentamos el ejemplo siguiente que es una calculadora con interfaz gráfica. La interfaz gráfica está concentrada en la clase calcPanel que es una extensión o subclase de Panel y utiliza la clase calculadora definida en la sección anterior. La clase calcPanel se utiliza para crear la aplicación Windows llamada calcWin. Estos son los códigos de las dos clases.
El alumno debe ir a la línea de comandos del DOS y hacer la llamada
java ejem01.calcWin
para abrir esta aplicación y probar su funcionamiento.
calcPanel es una clase delicada. Su comprensión requiere mayor atención que otras. El alumno debe estudiarla cuidadosamente, sobre todo el método actionPerformed que es el núcleo de la interacción y contiene los detalles más delicados.
Aplicaciones y applets.
En esta sección se utiliza la clase calcPanel de la sección anterior para crear una calculadora en forma de applet. También se creará un applet que puede arrancar calculadoras usando la aplicación calcWin. Es para tener esta posibilidad que se ha definido y utilizado la variable booleana solo dentro de calcWin.
El siguiente ejemplo utiliza la clase calcPanel desarrollada en la sección anterior para crear una calculadora en forma de applet.
También se puede crear un applet capaz de arrancar calculadoras usando la aplicación calcWin, como muestra el siguente ejemplo. Pulse este botón para que aparezca la calculadora:
Éste es el código del applet:
Advertencia: Por alguna extraña razón, si se compila calcPanel.java con Visual J++ el applet de la siguiente sección funciona con el appletviewer y con el IExplorer pero no funciona con Netscape. Hechos como éste muestran la conveniencia de compilar todas las aplicaciones y applets con el compilador oficial de Java (javac.exe) antes de publicarlas. Esto no cancela la conveniencia de utilizar entornos de desarrollo como Visual J++ o JBuilder, pero una última compilación con javac.exe ofrece mayores garantías sobre el buen funcionamiento de la aplicación en diferentes sistemas operativos o navegadores.
Finalmente, veremos que calcApplet puede convertirse en una aplicación Windows. Estudie el código de calcWin2 y luego desde la línea de comandos llámelo y compruebe que funciona igual que calcWin. Observe que en este caso calcApplet se usa sólo en su calidad de Panel, no se utilizan sus métodos específicos de Applet.
Hemos visto que hay muchos caminos posibles para llegar a una aplicación o un applet. Java tiene una gran flexibilidad para la presentación final de una aplicación, en gran medida por ser un lenguaje orientado a objetos. Para poder aprovechar esta flexibilidad es importante diseñar cuidadosamente las clases básicas. Analicemos el ejemplo de este capítulo.
Hay una clase en la que se basan todas las aplicaciones del capítulo: calculadora. Se trata de una clase muy sencilla que no es extensión o subclase de ninguna otra. Posiblemente la primera vez que el alumno la vio encontró algunas cosas extrañas, pero las aplicaciones le habrán demostrado la utilidad de su diseño. La experiencia demuestra que es muy difícil crear una clase tan útil como ésta en un primer intento. Normalmente es necesario crear una primera versión y modificarla muchas veces durante el desarrollo de las aplicaciones para que a la larga resulte verdaderamente útil. El programador debe ejercer una autocrítica constante de su propio trabajo para lograr mejorarlo.
Hay otra clase en la que se basan todas las versiones gráficas de la calculadora: calcPanel. Es una clase un poco más complicada, pero el alumno observará que sólo tiene dos métodos: init(), en donde se define la interfaz gráfica y actionPerformed(ActionEvent ev), en donde se interpretan las acciones del usuario y se convierten en operaciones. Este método es sin lugar a dudas el más difícil de programar. La interfaz gráfica podría haberse construido de muchas otras maneras y su diseño es un tema más bien visual sobre la distribución de los componentes gráficos de una calculadora (un campo de texto y varios botones). Pero en actionPerformed ha sido necesario llevar un cuidadoso control (del número que el usuario va escribiendo y de las operaciones que realiza) para reproducir el funcionamiento típico de una calculadora. El código de actionPerformed es engañosamente simple, en realidad hay varias sutilezas que el alumno sólo podrá comprender si después de estudiarlo un poco trata de reconstruirlo sin mirar. En actionPerformed se hace uso de la clase calculadora y es precisamente en este método donde se pueden apreciar las virtudes del diseño de dicha clase.
Las clases calculadora y calcPanel en mayor medida, pero también calcWin y calcApplet, son clases diseñadas para ser reutilizables y se reutilizan efectivamente en las diferentes aplicaciones.
Una aplicación puede utilizar muchas más clases que las que se utilizan en los ejemplos de esta lección. Cuantas más clases utilice más importante es que estén bien diseñadas, que sean útiles, que no tengan repeticiones ni variables o métodos inútiles, etc... La única manera de aprender a escribir buenos programas es haciéndolo y buscando continuamente mejoras que se le podrían hacer al código y a su organización en clases (y paquetes). Una clase reutilizable no suele ser fruto de una idea genial, casi siempre requiere de muchas horas de análisis, experimentación y modificaciones en el diseño y la implementación.
El lenguaje Java da muchas facilidades para aprovechar las clases que uno ha escrito previamente. Para sacar provecho de estas ventajas es importante repasar las clases creadas cuando se ha terminado la programación y hacer un esfuerzo de reorganización y depuración que arroje como resultado el mayor número de clases reutilizables.
El objetivo de los ejercicios de esta lección es que el alumno cree un conjunto de clases reutilizables y las aproveche en la construcción de algunas aplicaciones y applets.
José Luis Abreu y Marta Oliveró