APPLETS JAVA ¿QUÉ ES UN UN APPLET? APPLET? Un applet es una clase Java que se incrusta en una página HTML y que es descargada y ejecutada por un navegador. Es un tipo específico de contenedor de tecnología Java. Difiere de una aplicación en la manera como se ejecuta: una aplicación comienza cuando se invoca su método mai n; sin embargo el ciclo de vida de un applet es más complejo. Un applet se ejecuta en el entorno de un navegador, es decir, no comienza directamente por la ejecución de un comando. Es necesario crear un fichero HTML que le indica al navegador lo que debe cargar y cómo ejecutarlo; luego se le indica al navegador cómo acceder a la URL que especifica ese fichero HTML. • • • •
El navegador en el cliente carga la URL donde se ofrece el elemento Web. El navegador carga el documento HTML el cual contendrá una referencia al applet. El navegador carga las clases necesarias para ejecutar el applet. El navegador ejecuta el applet.
Restricciones de seguridad de un applet Los applets son trozos de código que representan un peligro potencial, ya que se cargan a través de la red. ¿Qué ocurre si alguien escribe una clase malintencionada que lee ficheros privados y los envía a través de Internet? La profundidad a la que se controla la seguridad se implementa a nivel del navegador. Prohibiciones por defecto en la mayoría de los navegadores: • • • •
Ejecución de otro programa a partir del applet. Entradas/Salidas de ficheros. Invocaciones a métodos nativos. Intentos de abrir un socket en otro sistema distinto al que provee el applet.
Estas restricciones evitan que el applet viole la privacidad o dañe un sistema remoto, restringiéndole el acceso a los ficheros del sistema. Impedir la ejecución de otro programa y prohibir las invocaciones a métodos nativos no permiten que el applet ejecute código que se ejecutaría sin validación de la JVM. La restricción de los sockets impide la comunicación con otro programa, que estaría almacenado en un servidor no confiable.
ESCRITURA DE UN UN APPLET APPLET Para escribir un applet se debe crear una clase pública que sea una sublcase de j ava. app appll et . App ppll et i mpor t j ava. appl et . *; publ i c cl ass He Hel l oWor l d ext ends Ap Appl et appll et . App ppll et es subclase de j ava. awt . Panel . Las jerarquías del La clase j ava. app applet y de clases del AWT se ven en la siguiente figura, mostrando ésta que es posible usar un applet directamente como el punto inicial para un esquema del AWT. Dado que un applet es Layoutt . Los métodos de las clases un Panel , tiene por defecto un gestor Fl owLayou Compo pone nent nt , Con ontt ai ner y Panel son heredados por la clase Appl et .
1
En una aplicación, el programa comienza cuando se invoca el método mai n. Con los applets éste no es el caso: Después de que constructor termine, el navegador invoca un método llamado i ni t para realizar la inicialización básica del applet. Cuando termina i ni t , el navegador invoca el método s t a r t . Este método se invoca en general cuando el applet se hace visible. Los métodos i ni t y s t a r t se ejecutan completamente antes de que el applet esté “vivo” y, por esta razón, ellos no deben usarse para programar un comportamiento continuo. De hecho, a diferencia del método mai n de una aplicación, no existe ningún método que se ejecuta de manera continua a lo largo de la “vida” del applet. Los métodos del usuario adicionales en la subclase applet pueden incluir stop, dest r oy y pai nt .
MÉTODOS Y CICLO DE VIDA El ciclo de vida del applet es más complejo que lo descrito hasta ahora. Existen 3 métodos principales relacionados con su ciclo de vida: i ni t , s t a r t y st op. •
•
•
init: Se invoca cuando se crea y se carga el applet en un navegador capaz de
soportar la tecnología Java (como por ejemplo, appletviewer). El applet puede usar este método para inicializar los valores de los datos. El método i ni t se ejecuta completamente antes de invocar s t a r t . publ i c voi d i ni t ( ) { / / set up GUI } start: Cuando se ha completado el método i ni t se ejecuta el método s t a r t , que hace que el applet “viva”. También se ejecuta cada vez que el applet sea visible, como, por ejemplo, cuando se restaura el navegador después de haber sido minimizado o cuando el navegador vuelve a la página que contiene el applet, después de haberse desplazado a otro URL. Este método es típicamente utilizado para comenzar threads, una animación o para reproducir sonidos. publ i c voi d s t a r t ( ) { mus i c Cl i p. pl ay( ) ; } stop: El método stop se invoca cuando el applet se hace invisible. Esto sucede cuando el navegador es minimizado o sigue un enlace a otro URL. El applet usa este método para detener cualquier funcionalidad que pudiera ocupar la CPU mientras el applet no está en la página que muestra el navegador. publ i c voi d st op( ) { musi cCl i p. st op( ) ; }
2
Mientras que i ni t es un método iniciático que puede considerarse “independiente”, los métodos s t a r t y stop forman una pareja. Típicamente, s t a r t activa un comportamiento del applet y stop desactiva ese comportamiento.
DESPLIEGUE DE UN APPLET Los applets son gráficos por naturaleza; aunque es posible invocar a Syst em. out . pr i nt l n( ) , esto no se hace normalmente. En vez de esto, se despliegan elementos en el entorno gráfico. Para dibujar en el panel de un applet se debe crear un método pai nt . El entorno invoca al método pai nt siempre que necesite redibujar el applet. Por ejemplo, cuando se despliega la ventana del navegador después de haber sido minimizada o iconizada. Se debe escribir el método pai nt para que funcione cuando se invoca de esta manera. La exposición ocurre de manera asíncrona dirigida por el entorno, no por el programa. i mpor t j ava. awt . *; i mpor t j ava. appl et . *; publ i c cl ass Hel l oWor l d ext ends Appl et { pr i vat e i nt pai nt Count ; publ i c voi d i ni t ( ) { pai nt Count = 0; } publ i c voi d pai nt ( Gr aphi cs g) { g. dr awSt r i ng( “Hel l o wor l d”, 25, 25) ; ++pai nt Count ; g. dr awSt r i ng( “Nº l l amadas a pai nt : “ pai nt Count , 25, 50) ; } }
+
DIBUJOS EN EL AWT Además de los métodos básicos de su ciclo de vida básico, un applet tiene métodos importantes relacionados con su despliegue. Estos métodos se declaran y documentan en la clase Component del AWT. Es necesario seguir el modelo correcto para la gestión del despliegue usando el AWT. La actualización del despliegue o dibujo la hace un thread separado al que de ahora en adelante llamaremos thread del AWT. Este thread se invoca para gestionar dos situaciones relacionadas con la actualización del despliegue. Situaciones de actualización: •
•
La primera de esas condiciones es la exposición; cuando el applet se expone por primera vez o cuando parte de él ha sido “dañado” y necesita ser reemplazado. El daño puede ocurrir en cualquier momento y el programa debe ser capaz de actualizar la zona de despliegue en cualquier momento. La segunda condición es cuando el programa redibuja el applet con nuevo contenido. Esta acción puede requerir que se elimine primero la imagen anterior.
3
Métodos básicos de despliegue Los 3 métodos básicos relacionados con el despliegue o dibujo en pantalla del contenido del applet son los siguientes: (heredados de la clase Panel ): •
paint: La gestión de la exposición ocurre automáticamente y genera una invocación
•
del método pai nt . Una facilidad de la clase Gr aphi cs , llamada el rectángulo clip, optimiza el método pai nt de manera que las actualizaciones no se hagan sobre el área completa del gráfico a menos que sea necesario, sino que estas actualizaciones se restringen a la región dañada. Se recomienda sobrescribir el método pai nt para controlar lo que se dibuja en el applet. repaint: Invocar el método r epai nt provoca una notificación al sistema de que se quiere cambiar la zona de despliegue. El método r epai nt causa que el thread del AWT invoque a otro método, updat e. update: El método updat e limpia la zona de despliegue e invoca al método pai nt . Se puede modificar el método updat e, por ejemplo, para reducir el parpadeo invocando pai nt sin limpiar la zona de despliegue.
•
Estrategias de despliegue de applets El modelo del applet requiere que se adopte una estrategia específica para el mantenimiento de su despliegue. Se deberá llevar a cabo lo siguiente: •
•
•
Mantener un modelo del despliegue, el cual define cómo restablecer el despliegue del applet en pantalla. Las instrucciones de cómo hacer esto están contenidas en el método pai nt . Hacer que el método pai nt restablezca el despliegue basado sólo en el contenido del modelo. Esto permite que pai nt regenere el despliegue consistentemente siempre que se invoque, y que gestione la exposición correctamente. Hacer que el programa cambie el despliegue actualizando el modelo e invocando el método r epai nt , para que el método updat e (y finalmente el método pai nt ) se invoque por el thread del AWT.
EJEMPLO DE MODELO DE DIBUJO Con este ejemplo se quiere desplegar la cadena “Hello world!” en el panel del applet siempre que el usuario pulse con el ratón. PRIMERA VERSIÓN: Una implementación sencilla de este requerimiento sería desplegar la cadena “Hello world”” cada vez que el usuario pulse con el ratón en el panel del applet. Esto se 4
puede lograr si se guarda el punto del click en el atributo l ast Cl i ck. Desafortunadamente, el thread del AWT actualiza el applet usando el método updat e, que limpia la pantalla antes de invocar al método pai nt . / /