# Applet Java

Un applet Java es un applet escrito en el lenguaje de programación Java. Los applets de Java pueden ejecutarse en un navegador web utilizando la Java Virtual Machine (JVM), o en el AppletViewer de Sun, applet ya no serán compatibles con Java 9 (2017).
Entre sus características podemos mencionar un esquema de seguridad que permite que los applets que se ejecutan en el equipo no tengan acceso a partes sensibles (por ej. no pueden escribir archivos), a menos que uno mismo le dé los permisos necesarios en el sistema; la desventaja de este enfoque es que la entrega de permisos es engorrosa para el usuario común, lo cual juega en contra de uno de los objetivos de los Java applets: proporcionar una forma fácil de ejecutar aplicaciones desde el navegador web.
En Java, un applet es un programa que puede incrustarse en un documento HTML, es decir en una página web. Cuando un navegador carga una página web que contiene un applet, este se descarga en el navegador web y comienza a ejecutarse. Esto permite crear programas que cualquier usuario puede ejecutar con tan solo cargar la página web en su navegador.
El navegador que carga y ejecuta el applet se conoce en términos genéricos como el "contenedor" de los applets. El kit de desarrollo de software para Java Standard Edition 7 (1.7.1 --Versión más actual, puesta en marcha el 18 de octubre de 2011) incluye un contenedor de applets, llamado appletviewer, para probar los applets antes de incrustarlos en una página web.

## Ventajas

Los applets de Java suelen tener las siguientes ventajas:
* Son multiplataforma (funcionan en Linux, Windows, OS X, y en cualquier sistema operativo para el cual exista una Java Virtual Machine).
* El mismo applet puede trabajar en "todas" las versiones de Java, y no solo en la última versión del plugin. Sin embargo, si un applet requiere una versión posterior del Java Runtime Environment (JRE), el cliente se verá obligado a esperar durante la descarga de la nueva JRE.
* Es compatible con la mayoría de los navegadores web.
* Puede ser almacenado en la memoria caché de la mayoría de los navegadores web, de modo que se cargará rápidamente cuando se vuelva a cargar la página web, aunque puede quedar atascado en la caché, causando problemas cuando se publican nuevas versiones.
* Puede tener acceso completo a la máquina en la que se está ejecutando, si el usuario lo permite.
* Puede ejecutarse a velocidades comparables a las de otros lenguajes compilados, como C++ (dependiendo de la versión de la JVM).
* Puede trasladar el trabajo del servidor al cliente, haciendo una solución web más escalable tomando en cuenta el número de usuarios o clientes.

## Desventajas

Los applets de Java tienen las siguientes desventajas:
* Requiere el plugin de Java, sin embargo los navegadores Chrome y Edge no soportan plugins y Firefox dejará de soportarlos próximamente. En ese sentido también Oracle anunció que abandonará el desarrollo del plugin de Java a partir de la salida de Java 9.
* No puede iniciar la ejecución hasta que la JVM esté en funcionamiento, y esto puede tomar tiempo la primera vez que se ejecuta un applet.
* Si no está firmado como confiable, tiene un acceso limitado al sistema del usuario - en particular no tiene acceso directo al disco duro del cliente o al portapapeles.
* Algunas organizaciones solo permiten la instalación de software a los administradores. Como resultado, muchos usuarios (sin privilegios para instalar el plugin en su navegador) no pueden ver los applets.
* Un applet podría exigir una versión específica del JRE.
* Puede tener vulnerabilidades que permitan ejecutar código malicioso.

## Diferencias entre una aplicación autónoma y un applet

Existen diferencias entre un programa autónomo y un applet:
* Restricciones de seguridad: los applets son considerados código de poca confianza (a excepción de que lleven una firma digital) ya que son compartidos por todos los usuarios de Internet. Por ejemplo, no se permite el acceso a ficheros locales ni conectarse a un servidor distinto al que está alojado el applet.
* Necesitan un navegador para ser visualizados, o un visor de applets como appletviewer.
* No tienen un método principal.

## Creación y ejecución de un applet
### Crear un applet

Para crear un applet es necesario escribir un descendiente de la clase Applet del paquete java.applet.*;
El código anterior declara una nueva clase MiApplet que hereda todas las capacidades de la clase Applet de Java. El resultado es un fichero MiApplet.java.
Una vez creada la clase que compone el applet, se escribe el resto del código y después se compila, obteniendo el fichero MiApplet.class
Si se utiliza la biblioteca gráfica Swing, se puede utilizar la clase JApplet de javax.swing en vez de Applet:

### Ejecución

Para insertar el applet en una página web, se usa la siguiente estructura:

#### Etiqueta <applet>

Siguiendo la estructura anterior, un ejemplo de HTML para ejecutar el applet es:
Pudiéndose usar los siguientes atributos:
| Atributo | Descripción | Ejemplo |
| codebase | Dirección desde donde se puede descargar la clase de Java que va a cargar el applet, el URL de la clase. Si no se especifica, será la ubicación actual de la página HTML. | codebase="http://www.pagina.com/applet/" |
| code | Nombre de la clase que se quiere cargar en el applet. La dirección donde se encuentra es relativa al codebase. Si no se ha especificado codebase, es la misma carpeta donde está la página HTML que carga el applet. | code="NombreClase.class" |
| width | Tamaño en píxels de la anchura. | width=100 |
| height | Tamaño en píxels de la altura. | height=100 |
| alt | Texto que se muestra donde debería cargarse el applet si el navegador no permite su carga. | alt="Su navegador no permite cargar este Applet" |
| name | Establece un nombre único para el applet. | name="MiApplet" |
| archive | Es un listado de clases separados por comas que deben ser cargados en la caché del usuario local antes de poder ejecutarse. | archive="Clase1.class, Clase2.class, Clase3.class" |
| hspace | Establece los márgenes laterales en píxels. | hspace=25 |
| vspace | Establece el margen superior e inferior en píxels. | vspace=25 |
| align | Alineación respecto a otros elementos. Valores: left, center, right, top, middle y bottom | align="center" |
| mayscript | Permite especificar si el applet puede tener acceso al código JavaScript | No tiene valor asociado. Si aparece se aplica. |
Dentro de la etiqueta <applet> puede aparecer la etiqueta <param> que contiene pares clave/valor, que son leídos por el programa Java, tantas veces como se quiera.

#### Etiqueta <object>

A partir de la versión 4.0 de HTML se consideró obsoleto el uso de la etiqueta <applet>, siendo sustituida por <object>.
Esta etiqueta es compatible con los navegadores Microsoft Internet Explorer, Netscape 6 (y versiones superiores) y Mozilla Firefox.
Comparte muchos de los atributos con <applet>, siendo los únicos para esta etiqueta:
| Atributo | Descripción | Ejemplo |
| classid | Identificador del tipo de objeto. | Para Java es: classid="clsid:CAFEEFAC-0014-0001-0000-ABCDEFFEDCBA" |
| codebase | URL que apunta a un fichero .cab en la red del plugin necesario para poder ejecutar el contenido. | codebase="Dirección_del_instalador_de_la_Máquina_Virtual_Java" |
| type | Tipo de archivo que va a reproducirse mediante el objeto. | <param name="type" value="application/x-java-applet;jpi-version=1.5.0"> |

## Ciclo de vida

Cuando un applet se carga, se llaman en este orden a los siguientes métodos;
* init: suele contener instrucciones para inicializar el applet.
* start: como init, se suele usar para inicializar, pero con la diferencia de que este método también se llama cuando se reinicia el applet.
* paint: se encarga de mostrar el contenido del applet. Se ejecuta cada vez que se tenga que redibujar.
Para terminar o pausar la ejecución se llama a los siguientes métodos:
* stop: suspende la ejecución del programa. Se llama cuando el applet se vuelve temporalmente invisible.
* destroy: cuando no se va a necesitar más el applet. Se usa para liberar recursos.