Applets Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade 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 <html> <head> <title>HTML incluindo um applet</title> </head> <body> <applet code=aulas.MeuApplet width=800 height=600/> </body> </html> ● ● 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) 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 Applet java.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 Applet Saí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