## Crear un Applet desde una Aplicación

Supongamos que el propietario de "The Coffee Break" quiere mostrar los precios actuales de los cafés en un applet en su página Web. Puede asegurarse de que está mostrando los precios actuales haciendo que applet obtenga los precios directamente desde su base de datos.

Para hacer esto necesita crear dos ficheros de código, uno con el código del applet y otro con el código HTML. El código del applet contiene el código JDBC que podría aparecer en una aplicación normal más el código adicional para ejecutar el applet y mostrar el resultado de la petición a la base d edatos. En nuestro ejemplo el código del applet está en el fichero OutputApplet.java. Para mostrar el applet en una página HTML, el fichero OutputApplet.html le dice al navegador qué mostrar y dónde mostrarlo.

El resto de esta página explicará algunos elementos que se encuentran en el código del applet y que no están presentes en el código de las aplicaciones. Algunos de estos ejemplos involucran aspectos avanzados del lenguaje Java. Daremos alguna explicación básica y racional, ya que una explicación completa va más allá de este turorial. El propósito de este applet es dar una idea general, para poder utilizarlo como plantilla, sustituyendo nuestras consultas por las del applet.

#### Escribir el Código del Applet

> Para empezar, los applets importan clases que no son utilizadas por las aplicaciones. Nuestro applet importa dos clases que son especiales para los applets: la clase Applet, que forma parte del paquete java.applet, y la clase Graphics, que forma parte del paquete java.awt. Este applet también importa la clase de propósito general java.util.Vector que se utiliza para acceder a un contenedor tipo array cuyo tamaño puede ser modificado. Este código utiliza objetos Vector para almacenar los resultados de las peticiones para poder mostrarlas después.

> Todos los applets descienden de la clase Applet; es decir, son subclases de Applet. Por lo tanto, toda definición de applet debe contener las palabras extends Applet; como se vé aquí:

>     public class MyAppletName extends Applet {
>         . . .
>     }

En nuestro ejemplo, esta línea también incluye las palabras implements Runnable, por lo que se parece a esto:

    public class OutputApplet extends Applet implements Runnable {
        . . .
    }

Runnable es un interface que hace posible ejecutar más de un thread a la vez. Un thread es un flujo secuencial de control, y un programa puede tener muchos threads haciendo cosas diferentes concurrentemente. La clase OutputApplet implementa el interface Runnable definiendo el método run; el único método de Runnable. En nuestro ejemplo el método run contiene el código JDBC para abrir la conexión, ejecutar una petición, y obtener los resultados desde la hoja de resultados. Como las conexiones a las bases de datos pueden ser lentas, y algunas veces pueden tardar varios segundos, es una buena idea estructurar un applet para que pueda manejar el trabajo con bases de datos en un thread separado.

Al igual que las aplicaciones deben tener un método main, un applet debe implementar al menos uno de estos métodos init, start, o paint. Nuestro ejemplo define un método start y un método paint. Cada vez que se llama a start, crea un nuevo thread (worker) para re-evaluar la petición a la base de datos. Cada vez que se llama a paint, se muestra o bien el resultado de la petición o un string que describe el estado actual del applet.

Como se mencionó anteriormente, el método run definido en OutputApplet contiene el código JDBC, Cuando el thread worker llama al método start, se llama automáticamente al método run, y éste ejecuta el código JDBC en el thread worker. El código de run es muy similar al código que hemos visto en otros ejemplos con tres excepciones. Primero, utiliza la clase Vector para almacenar los resultados de la petición. Segundo, no imprime los resultados, sino que los añade al Vector, results para mostrarlos más tarde. Tercero, tampoco muestra ninguna excepción, en su lugar almacena los mensajes de error para mostrarlos más tarde.

Los applets tienen varias formas de dibujar, o mostrar, su contenido. Este applet, es uno muy simple que sólo utiliza texto, utiliza el método drawString (una parte de la clase Graphics) para mostrar texto. El método drawString tiene tres argumentos: (1) el string a mostrar, (2) la coordenada x, indicando la posición horizontal de inicio del string, y (3) la coordenada y, indicando la posición vertical de inicio del string (que está en la parte inferior del texto).

El método paint es el que realmente dibuja las cosas en la pantalla, y en OutputApplet.java, está definido para contener llamadas al método drawString. La cosa principal que muestra drawString es el contenido del Vector, results (los resultados almacenados). Cuando no hay resultados que mostrar, drawString muestra el estado actual contenido en el String, message. Este string será "Initializing" para empezar. Será "Connecting to database" cuando se llame al método start, y el método setError pondrá en él un mensaje de error cuando capture una excepción. Así, si la conexión a la base de datos tarda mucho tiempo, la persona que está viendo el applet verá el mensaje "Connecting to database" porque ese será el contenido de message en ese momento. (El método paint es llamado por el AWT cuando quiere que el applet muestre su estado actual en la pantalla).

Al menos dos métodos definidos en la clase OutputApplet, setError y setResults son privados, lo que signfica que sólo pueden ser utilizados por OutputApplet. Estos métodos llaman el método repaint, que borra la pantalla y llama a paint. Por eso si setResults llama a repaint, se mostrarán los resultados de la petición, y si setError llama a repaint, se mostrará un mensaje de error.

Otro punto es hacer que todos los métodos definidos en OutputApplet excepto run son synchronized. La palabra clave synchronized indica que mientras que un método esté accediendo a un objeto, otros métodos synchronized están bloqueados para acceder a ese objeto. El método run no se declara synchronized para que el applet pueda dibujarse en la pantalla mientras se produce la conexión a la base de datos. Si los métodos de acceso a la base de datos fueran synchronized, evitarían que el applet se redibujara mientras se están ejecutando, lo que podría resultar en retrasos sin acompañamiento de mensaje de estado.

Para sumarizar, en un applet, es una buena práctica de programación es hacer algunas cosas que no necesitaríamos hacer en una aplicación.

1. Poner nuestro código JDBC en un thread separado.
2. Mostrar mensajes de estado durante los retardos, como cuando la conexión a la base de datos tarda mucho tiempo.
3. Mostrar los mensajes de error en la pantalla en lugar de imprimirlos en System.out o System.err.

#### Ejecutar un Applet

> Antes de ejecutar nuestro applet, necesitamos compilar el fichero OutputApplet.java. Esto crea el fichero OutputApplet.class, que es referenciado por el fichero OutputApplet.html.

> La forma más fácil de ejecutar un applet es utilizar el appletviewer, que se incluye en el JDK. Sólo debemos seguir las instrucciones para nuestra plataforma:

> UNIX

>       javac OutputApplet.java
>       appletviewer OutputApplet.html

> Windows 95/NT

>       javac OutputApplet.java
>       appletviewer OutputApplet.html

> Los applets descargados a través de la red están sujetos a distintas restricciones de seguridad. Aunque esto puede parecer molesto, es absolutamente necesario para la seguridad de la red, y la seguridad es una de las mayores ventajas de utilizar Java. Un applet no puede hacer conexiones en la red excepto con el host del que se descargó a menos que el navegador se lo permita. Si uno puede tratar con applets instalados localmente como applets "trusted" (firmados) también dependen de restricciones de seguridad impuestas por el navegador. Un applet normalmente no puede leer o escribir ficheros en el host en el que se está ejecuando, y no puede cargar librerías ni definir métodos nativos.

> Los applets pueden hacer conexiones con el host del que vinieron, por eso pueden trabajar muy bien en intranets.

> El driver puente JDBC-ODBC es de alguna forma un caso especial. Puede utilizarse satisfactoriamente para acceder a intranet, pero requiere que ODBC, el puente, la librería nativa, y el JDBC esten instalados en cada cliente. Con esta configuración, los accesos a intranet funcionan con aplicaciones Java y con applets firmados. Sin embargo, como los puentes requieren configuraciones especiales del cliente, no es práctico para ejecutar applets en Internet con el puente JDBC-ODBC. Observa que esta limitaciones son para el puente JDBC-ODBC, no para JDBC. Con un driver JDBC puro Java, no se necesita ninguna configuración especial para ejecutar applets en Internet.

Ozito