Applets
Carlos Bazilio
Depto de Ciência e TecnologiaPólo Universitário de Rio das OstrasUniversidade Federal Fluminense
Tópicos Abordados
● Paradigma de Requisições Web● Conceito de Applet● Implementação de um Applet● Exemplos de Applets● Limitações● Aspectos de Segurança
Paradigma de Requisições Web
● Cliente envia requisição
para um Servidor● Servidor responde
requisição de um Cliente● Formatos de resposta:
Dados estáticos Dados processados no Servidor Dados a serem processados no Cliente
Paradigma de Requisições Web
Formatos de Resposta● Dados estáticos:
HTML básico, estático● Dados processados no
Servidor
Programas Java que rodam
no servidor e constróem
respostas para requisições (servlets)● Dados processados no Cliente
Programas Java que rodam nos clientes (applets)
Motivação Inicial de Java
● Java foi pensada, inicialmente, como uma linguagem que permitiria a execução de programas sem instalação
● Estes programas (bytecodes) seriam baixados da internet e executados na máquina cliente
● Ou seja, para tal, a máquina cliente necessitaria de acesso à internet e da máquina virtual (JVM) para execução dos bytecodes
● Applets são uma forma de realização deste objetivo
Conceito de Applet
● Um applet é um programa Java que pode ser incluído em uma página HTML da mesma forma que uma imagem ou algum outro recurso.
● Exemplo (HTML básico):
<html> <head> <title>HTML Básico</title> </head> <body> Olá mundo !!! </body></html>
Conceito de Applet● Exemplo (HTML incluindo uma imagem):● O arquivo .html deve estar no mesmo diretório
que a imagem, neste exemplo
<html> <head> <title>HTML com imagem incluída</title> </head> <body> <img src="maca.jpg" title="maca“/> </body></html>
Conceito de Applet
● Exemplo (HTML incluindo um applet):
<html> <head> <title>HTML incluindo um applet</title> </head> <body> <applet code=aulas.MeuApplet width=800 height=600/> </body></html>
Conceito de Applet● Apesar do HTML com a inclusão da imagem ter obtido o
mesmo resultado do applet, o resultado do applet foi obtido pela classe “aulas.MeuApplet”.
● Observe que não fazemos referência explícita ao arquivo “maca.jpg”, como no exemplo da imagem.
<html> <head> <title>HTML incluindo um applet</title> </head> <body> <applet code=aulas.MeuApplet width=800 height=600/> </body></html>
Conceito de Applet
● A tag <applet> possui os atributos code (classe que implementa o applet), width (largura do applet) e height (altura do applet), os quais são obrigatórios
● Outros atributos: align (alinha o applet dentro da página web); name (para ser referenciado dentro da página html); codebase (diretório base para referenciar um applet); archive (o applet é distribuído como um JAR)
<html> <head> <title>HTML incluindo um applet</title> </head> <body> <applet code=aulas.MeuApplet width=800 height=600/> </body></html>
Execução do Applet
● Para execução do applet, crie um arquivo html com o conteúdo apresentado
● Coloque o código java compilado (.class) no mesmo diretório do arquivo html
● Caso o código java seja definido dentro de um pacote (package), inclua o código compilado na hierarquia de diretórios equivalente ao pacote
● Por exemplo, se o código java está definido no pacote “package cursojava.applets;”, e o html está no diretório c:\htmls, os .class deverão estar em: “c:\htmls\cursojava\applets”
Execução do Applet
● Inicialmente, os browsers disponibilizavam internamente pequenos interpretadores para Java
● A tecnologia Java Plug-in estende a funcionalidade de um browser, permitindo que applets e outros recursos sejam executados utilizando a JRE da máquina
● Quando um navegador não reconhece um applet, as tags <applet> são ignoradas e, o que está dentro delas, é exibido
● Com isso, este se torna um local adequado para colocar avisos de mal funcionamento
Execução do Applet
<html> <head> <title>HTML incluindo um applet</title> </head> <body> <applet code=aulas.MeuApplet width=800 height=600> Neste local deveria aparecer um applet !! </applet> </body></html>
Implementação de um Applet
● Para implementar um applet, devemos estender uma das 2 últimas classes da hierarquia abaixo:
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
java.applet.Applet
javax.swing.JApplet
● http://java.sun.com/j2se/1.4.2/docs/api/java/applet/Applet.html
Implementação de um Appletjava.applet.Applet
● Sub-classe de Panel, do pacote gráfico awt● É, essencialmente, um painel inserido em uma
página HTML, num navegador● Embora restrito em algumas funcionalidades
(por uma questão de segurança), pode interagir com o usuário como qualquer aplicação gráfica awt
Implementação de um Applet Alguns métodos da classe
java.applet.Applet● void init() / void destroy()
Métodos duais que inicializam/destróem um applet O método init() é chamado quando uma página com
uma applet é carregada O método destroy() é chamado quando o navegador é
fechado● void start() / void stop()
Métodos acionados quando um applet deve ser executado/interrompido
O método start() é chamado quando uma página que contém um applet é aberta (imediatamente após o init() e nas cargas seguintes da página)
O método stop() é chamado quando o usuário deixa a página que possui o applet
Implementação de um Applet Alguns métodos da classe
java.applet.Applet● URL getCodeBase()
Retorna a URL base do diretório de onde o applet foi executado
● String getParameter(String name) Recupera o valor de um parâmetro passado no HTML
● void play(URL url) Toca um arquivo de áudio referenciado por um url
absolutovoid ● play(URL url, String file)
Toca um arquivo de áudio file referenciado de forma relativa à url
● Image getImage(URL url, String name) Retorna a imagem especificada (pode ser exibida
com o método paint(Graphics g))
Ciclo de Vida de um Applet
init() start() stop() destroy()
● init() e destroy() são usualmente utilizados para alocação e desalocação de recursos, respectivamente, como arquivos, memória, etc.
● start() e stop() são acionados quando um applet é exibido e ocultado no navegador, respectivamente.
Exemplo de Applet
● Neste primeiro exemplo, temos a exibição de um texto no navegador
import java.awt.*;import java.applet.*;public class AppletSimples extends Applet {
public void init() {String msg = "Olá Mundo !!!";Label l = new Label(msg);l.setAlignment(Label.CENTER);setLayout(new BorderLayout());add(l, BorderLayout.CENTER);
}}
Exemplo de AppletSaída no Navegador
Exemplo de Applet (2)● Podemos modificar o primeiro exemplo alterando de
forma aleatória a cor de fundo do painel e passando a mensagem por parâmetro
import java.awt.*;import java.applet.*;public class AppletSimples extends Applet {
public void init() {int c = (int)(Math.random() * 1000000);this.setBackground(new Color(c));Label l = new Label(this.getParameter("Texto"));l.setAlignment(Label.CENTER);this.setLayout(new BorderLayout());this.add(l, BorderLayout.CENTER);
}}
Exemplo de Applet (2)
● HTML com a mensagem passada por parâmetro
<html> <head> <title>HTML incluindo um applet</title> </head> <body> <applet code=aulas.AppletSimples width=200 height=150> <param name="Mensagem" value="Olá por Parâmetro!"> </applet> </body></html>
Exemplo de Applet (2)Saída no Navegador
● Atualize através do navegador para ver as cores se alternando
Exemplo de Applet (3)● Neste exemplo, adicionamos um botão e fazemos a
própria applet tratar os eventos do botão
public class AppletSimples extends Applet implements ActionListener {
public void init() {Label l = new Label(this.getParameter("Mensagem"));this.add(l);Button bt = new Button();bt.setLabel("Teste");bt.addActionListener(this);this.add(bt);
}public void actionPerformed(ActionEvent arg0) {
Color color=new Color ((int)(Math.random()*10000000));this.setBackground(color);
}}
Exemplo de Applet (3)Saída no Navegador
● Clique no botão para alternar a cor de fundo do painel
Testando um Applet
● Do Eclipse:
Selecione o arquivo que contém o applet Clique com o botão direito e, no item “Run As”
aparecerá a opção “Java Applet”● Da linha de comando:
Na instalação do JDK há um aplicativo chamado appletviewer, o qual recebe um arquivo html como parâmetro (página do applet)
● Do browser:
Basta abrir o arquivo html que contém o applet
Testando um Applet
● Há uma cache para carga de classes applet
● Esta cache costuma dificultar a atualização de versões de uma applet em memória
● A primeira alternativa é fechar o browser
● A segunda é disparar uma console do plug-in java e realizar o esvaziamento da cache manualmente
No Firefox, selecione menu “Tools > Error Console” Na caixa de texto digite “java” e tecle <Enter> ou
pressione botão “Evaluate” Daí, basta clicar na tecla “x”
Transformação de Aplicações Swing/Awt em Applets
● O método main é substituído pelo método init do applet
● O frame não precisa ser criado, já que o applet é exibido no navegador
● Copie o conteúdo do construtor da janela do frame para dentro do método init
● Alguns métodos deixam de ter importância quando são utilizados como applets, pois há comandos html específicos: setTitle, setSize, setDefaultCloseOperation,
setVisible
Limitações
● Applets que são executadas remotamente têm comportamento restringido na máquina cliente
Algumas possibilidades: exibição de imagens, reprodução de som, capturar eventos de mouse e teclado, enviar entrada do usuário de volta para o host (máquina que hospeda o applet), etc
Estas restrições visam garantir segurança na execução dessas aplicações
Há um gerenciador de segurança na máquina virtual java que monitora a execução dessas aplicações
● Compatibilidade entre browsers
Melhorou com o surgimento dos plug-ins
Contexto dos Applets
● Ambiente onde o applet executa (usualmente o navegador ou um visualizador – appletviewer)
● Eventualmente, pode ser desejável que um applet comande seu ambiente, por exemplo, pedindo a exibição de uma nova página
● Ou seja, é interessante que o applet se comunique com o navegador
● Para tal, a classe Applet possui o método AppletContext getAppletContext()
● A interface AppletContext possui vários métodos que podem ser úteis a um applet
Contexto dos Applets
● Alguns métodos da interface AppletContext:
Applet getApplet (String name): Retorna uma referência para um applet com atributo name na mesma página
void showDocument (URL url, String target): Requisita ao browser que abra a url fornecida com o parâmetro target (por exemplo, target=“_self” abre na própria página, enquanto target=“_blank” abre numa página nova
void showStatus(String status): Exibe a string fornecida na barra de status do browser (atenção pois pode haver concorrência com o browser!)
Distribuição de Applets e Aplicativos Java
● Applets e Aplicativos Java podem ser distribuídos de forma concisa através de um arquivo JAR
● Um arquivo JAR é um arquivo compactado (formato zip) que possui uma estrutura especial, a qual é considerada pela JVM
● Um arquivo JAR é constituído minimamente de: uma hierarquia de pacotes que compõe a
aplicação (contem os arquivos .class) um diretório chamado “META-INF”, o qual
contém o arquivo de manifesto MANIFEST.MF
JAR – Arquivo de Manifesto
● Um arquivo de manifesto simplesmente descreverá o conteúdo do JAR
● A primeira linha normalmente contém a versão do arquivo de manifesto: Manifest-Version: 1.0
● Este arquivo é dividido em seções, as quais são separadas por linhas em branco; A primeira seção é a principal e define o que vale globalmente
● Quando o JAR é gerado para ser um “executável” do aplicativo, este precisa conter a classe que inicia a aplicação: Main-Class: br.com.siriusnet.cursojava.Navegador
JAR – Arquivo de Manifesto
● Outro atributo importante é o Class-Path● Especifica urls de bibliotecas e/ou extensões
que uma aplicação necessita
Class-Path: MyUtils.jar● Documentação:
http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html
Distribuição de Aplicativos Java – Lacre (Seal)
● Caso nossa aplicação possua membros (campos e métodos) públicos a um pacote, a declaração de uma nova classe com mesmo nome de pacote dá acesso a esse conteúdo público
● Para evitar essa situação, podemos lacrar nosso pacote de forma que nenhuma classe possa ser adicionada a ela
● No arquivo manifesto, um pacote é lacrado com o atributo:
Sealed: true● No Eclipse, na geração do JAR, a caixa de diálogo “JAR
Manifest Specification” contém recursos para o lacre
Exercício
● Exiba a calculadora criada como um applet