Tecnologie lato Client: Applet Stefano Clemente [email protected] © 2005 Stefano Clemente Riferimenti bibliografici • Java Tutorial on-line − http://java.sun.com/docs/books/tutorial/applet/index.html • Downloadable Java Tutorial − http://java.sun.com/docs/books/tutorial/download/tutorial.zip 18 Ottobre 2005 Stefano Clemente 2 Introduzione • Permettono di eseguire del codice Java incluso nelle pagine web • Java è platform-independent − non c’è bisogno di sapere quale browser è in uso sui client • Le pagine web sono più potenti • Si possono fornire programmi agli utenti, ma eseguiti sulle loro macchine − minor carico per i server • devono soltanto trasferire il codice − maggior carico per i client • devono disporre della potenza di calcolo necessaria per l’esecuzione dei programmi Java 18 Ottobre 2005 Stefano Clemente 3 Introduzione • Le applet sono soggette ad alcuni limiti, perché − è pur sempre codice scaricato da siti remoti − devono essere eseguiti su macchine di utenti di qualsiasi tipo − è indispensabile la sicurezza e la fiducia − devono essere applicate alcune restrizioni − devono essere eseguite in modo sicuro • L’utente è protetto dall’applet security manager 18 Ottobre 2005 Stefano Clemente 4 Introduzione • Limiti − non possono essere utilizzate per “spiare” il client, ma possono leggere solo alcune informazioni • • • • • − − − − − versione di Java utilizzata nome e versione del sistema operativo i caratteri utilizzati come separatori di linea e di file il linguaggio e le impostazioni locali le valute non possono alterare il sistema dell’utente non possono eseguire programmi residenti sul client non possono comunicare con host diversi dal server di origine non possono leggere/scrivere sul file-system del client le finestre aperte da una applet sono diverse dalle finestre aperte dalle altre applicazioni 18 Ottobre 2005 Stefano Clemente 5 Introduzione • Possibilità delle applet − visualizzazione di immagini − riproduzione di suoni − ricezione di input dall’utente (azioni del mouse e pressione dei tasti della tastiera) − l’input può essere inviato al server − esecuzione di calcoli complessi 18 Ottobre 2005 Stefano Clemente 6 Strumenti • Il programmatore che crea la applet − scrive con un editor il programma − lo compila utilizzando il Software Development Kit – SDK (javac) − crea con un editor la pagina web sorgente • Per eseguire la applet − bisogna disporre di Java Runtime Environment (JRE) − si scarica la pagina web e il codice dell’applet − si visualizza la pagina con un browser o con appletviewer 18 Ottobre 2005 Stefano Clemente 7 HTML: il tag applet <APPLET>...</APPLET> Attributi CODE=<file_java_class> CODEBASE=<URI_base_dei_file_class> WIDTH=<larghezza_applet> HEIGHT=<altezza_applet> ARCHIVE=<file_archivi> ... • In HTML 4.0 è sconsigliato l’uso del tag applet che si intende sostituire con il più generico tag <object> 18 Ottobre 2005 Stefano Clemente 8 Applet • Ogni applet viene implementata mediante la creazione di una sottoclasse della classe Applet • La gerarchia dell’ereditarietà della classe Applet è mostrata nella figura accanto 18 Ottobre 2005 Stefano Clemente 9 Il ciclo di vita dell’applet • Caricamento dell’applet − viene creata un’istanza della classe che controlla l’applet (sottoclasse di Applet) − l’applet si inizializza − l’applet comincia la sua esecuzione • Quando si abbandona la pagina l’applet si arresta e quando si ritorna nella pagina l’applet si riavvia − anche per riduzione a icona e ripristino della finestra • Alcuni browser permettono all’utente di ricaricare l’applet, il che si traduce in − arresto dell’applet − pulizia finale – l’applet rilascia le risorse che detiene − caricamento dell’applet 18 Ottobre 2005 Stefano Clemente 10 Il ciclo di vita dell’applet • Uscita dal browser − arresto dell’applet − pulizia finale – l’applet rilascia le risorse che detiene • Riassumendo, gli eventi del ciclo di vita dell’applet sono − − − − inizializzazione avvio arresto pulizia finale 18 Ottobre 2005 Stefano Clemente 11 Esempio 1 18 Ottobre 2005 Stefano Clemente 12 Esempio 1 18 Ottobre 2005 Stefano Clemente 13 Esempio 1 18 Ottobre 2005 Stefano Clemente 14 Commenti sull’esempio 1 • L’applet Esempio1 è una sottoclasse della classe Applet class • Ridefinisce quattro metodi della classe Applet − init – per inizializzare l’applet ogni volta che viene caricata o ricaricata − start – per avviare l’esecuzione in seguito al caricamento o a una nuova visita da parte dell’utente − stop – per arrestare l’esecuzione in seguito a chiusura del browser o abbandono della pagina da parte dell’utente − destroy – per la pulizia finale in seguito a arresto dell’applet • Non è sempre necessario ridefinire i metodi − es. applet che non fanno altro che disegnarsi 18 Ottobre 2005 Stefano Clemente 15 Commenti sull’esempio 1 • Il metodo init dovrebbe essere ridefinito quando l’inizializzazione è da eseguire una sola volta e non richiede dei tempi eccessivi • Alcuni browser chiamano il metodo init più volte dopo il caricamento dell’applet • Il metodo start dovrebbe essere ridefinito quando l’applet deve eseguire qualcosa dopo l’inizializzazione − Il metodo start può • eseguire il lavoro dell’applet (non molto bello) • avviare dei thread per l’esecuzione del lavoro (meglio) 18 Ottobre 2005 Stefano Clemente 16 Commenti sull’esempio 1 • La maggior parte delle applet che ridefiniscono il metodo start dovrebbero ridefinire anche il metodo stop − Il metodo stop sospende l’esecuzione dell’applet e quindi non impegna risorse se l’utente non visualizza la pagina (es. animazione) • La maggior parte delle applet non hanno bisogno di ridefinire il metodo destroy perché il metodo stop fa solitamente già tutto il necessario. Viene ridefinito per rilasciare risorse aggiuntive 18 Ottobre 2005 Stefano Clemente 17 Metodi di Drawing • Nell’esempio 1 la ridefinizione del metodo paint definisce il modo in cui l’applet visualizza dei messaggi • I metodi che un’applet può ridefinire per la visualizzazione sono − paint – metodo principale per la visualizzazione di informazioni − update – utilizzato in combinazione con paint per migliorare le prestazioni • Sono ereditati dalla classe Applet, che li eredita a sua volta dalla classe Component dell’Abstract Window Toolkit (AWT) 18 Ottobre 2005 Stefano Clemente 18 Eventi • Dalla classe Component è ereditato anche un insieme di metodi per la gestione degli eventi − action − mouseDown − handleEvent – “qualsiasi evento” • Per gestire un evento bisogna ridefinire il relativo metodo nell’applet 18 Ottobre 2005 Stefano Clemente 19 Esempio 2 18 Ottobre 2005 Stefano Clemente 20 Metodi per aggiunta componenti interfaccia utente • AWT fornisce anche le seguenti componenti per l’interfaccia utente Bottoni (java.awt.Button) Single-line text field (java.awt.TextField) Checkbox (java.awt.Checkbox) Larger text display e aree di editing (java.awt.TextArea) Etichette (java.awt.Label) Liste (java.awt.List) Liste pop-up (java.awt.Choice) Slider e scrollbar (java.awt.Scrollbar) Aree di disegno (java.awt.Canvas) Menu (java.awt.Menu, java.awt.MenuItem, java.awt.CheckboxMenuItem) − Contenitori (java.awt.Panel, java.awt.Window e sottoclassi) − − − − − − − − − − 18 Ottobre 2005 Stefano Clemente 21 Metodi per aggiunta componenti interfaccia utente Metodi per l’uso delle componenti Interfaccia Utente • add − Aggiunge la componente • remove − Rimuove la componente • setLayout − Predispone il layout manager 18 Ottobre 2005 Stefano Clemente 22 Esempio 3 18 Ottobre 2005 Stefano Clemente 23 I vantaggi della API Applet • La API applet permette di trarre vantaggi dalla relazione tra applet e browser • La API è fornita dal package java.applet • Grazie a API le applet possono: − ricevere dal browser la notifica su inizializzazione, esecuzione, arresto, ecc. − caricare file di dati relativi alla URL dell’applet o alla pagina nella quale viene eseguita − visualizzare delle brevi stringhe di stato − far visualizzare un documento al browser − trovare altre applet eseguite nella stessa pagina − riprodurre suoni − ricevere parametri specificati nel tag <applet> 18 Ottobre 2005 Stefano Clemente 24 API applet: cercare e caricare i file • • • • • I file che un’applet ha bisogno di caricare sono indicati con una URL relativa; normalmente la applet usa − − code-base – metodo getCodeBase document-base – metodo getDocumentBase A meno di specifiche diverse indicate nel tag <applet> la code-base coincide con la document-base I dati di cui un’applet ha sempre bisogno sono solitamente relativi alla code-base I dati che l’utente che usa l’applet specifica (per mezzo di parametri) sono solitamente relativi alla document-base La classe Applet definisce dei modi convenienti per il caricamento di suoni e immagini relativamente a una URL base; per esempio se una applet è configurata con una delle seguenti strutture di directory per caricare l’immagine a.gif che si trova nella directory imgDir si può scrivere Image image = getImage(getCodeBase(), "imgDir/a.gif"); 18 Ottobre 2005 Stefano Clemente 25 API applet: visualizzazioni di brevi stringhe di stato • Sia i browser che altri visualizzatori di applet (es. programma appletviewer) consentono la visualizzazione di brevi stringhe di stato nella apposita barra di stato in fondo alla finestra − Nei browser le applet e il browser condividono la stessa barra • Questa possibilità non dovrebbe essere utilizzata per visualizzare informazioni critiche − se le informazioni devono essere fornite a molti utenti dovrebbero essere visualizzate nell’area dell’applet − se le informazioni interessano pochi utenti dovrebbero essere visualizzate nello standard-output • Unix = shell • X-windows = finestra terminal • Browser = Console Java • La riga di stato può essere sovrascritta in qualsiasi momento da altre applet o dal browser • Il metodo relativo è showStatus − showStatus("MyApplet: Loading image file " + file); 18 Ottobre 2005 Stefano Clemente 26 API applet: visualizzazioni di documenti all’interno del browser • Un’applet può visualizzare del testo HTML • Attraverso il metodo showDocument di AppletContext l’applet dice al browser quale URL visualizzare e in quale finestra − non funziona con appletviewer • showDocument ha due forme − public void showDocument(java.net.URL url) • dice semplicemente al browser di visualizzare il documento all’URL specificata 18 Ottobre 2005 Stefano Clemente 27 API applet: visualizzazioni di documenti all’interno del browser − public void showDocument(java.net.URL url, String targetWindow) • aggiunge la finestra nella quale il documento deve essere visualizzato; il secondo argomento può assumere i valori: − "_blank" • nuova finestra senza nome. − "windowName" • finestra dal nome “windowName” – se non esiste viene creata − "_self" • stessa finestra o frame che contiene l’applet − "_parent" • Stessa finestra che contiene l’applet, ma nel parent frame – se non esiste il parent frame è uguale a “_self” − "_top" • Stessa finestra che contiene l’applet, ma nel frame principale – se non esiste il frame principale è uguale a “_self” 18 Ottobre 2005 Stefano Clemente 28 API applet: invio di messaggi ad altre applet • Le applet possono parlare con altre applet entro i seguenti limiti − la maggior parte dei browser richiedono che • le applet provengano dallo stesso server • abbiano la stessa code-base • La API richiede inoltre che le applet siano in esecuzione − sulla stessa pagina − sulla stessa finestra del browser • Una applet può individuare un’altra applet − per nome – metodo getApplet di AppletContext − cercando tutte le applet della pagina – metodo getApplets di AppletContext in entrambe i casi vengono restituiti uno o più oggetti Applet sui quali l’applet invocante può richiamare dei metodi 18 Ottobre 2005 Stefano Clemente 29 Esempio 4: Applet Receiver 18 Ottobre 2005 Stefano Clemente 30 Esempio 4: Applet Sender 18 Ottobre 2005 Stefano Clemente 31 Esempio 1: Applet Sender 18 Ottobre 2005 Stefano Clemente 32 Esempio 4: Applet Sender 18 Ottobre 2005 Stefano Clemente 33 Esempio 4: HTML 18 Ottobre 2005 Stefano Clemente 34 Esempio 5: getApplets 18 Ottobre 2005 Stefano Clemente 35 Esempio 5: getApplets 18 Ottobre 2005 Stefano Clemente 36 Esempio 5: HTML 18 Ottobre 2005 Stefano Clemente 37 API applet: Riproduzione di suoni • Il supporto per i suoni è fornito dalla classe Applet è dall’interfaccio AudioClip del package Java.Applet • È supportato un solo formato – 8 bit, µlaw, 8000 Hz, one-channel, file ".au" di Sun • I metodi do Applet relativi ai suoni sono − getAudioClip(URL), getAudioClip(URL, String) • restituiscono un oggetto che implementa l’interfaccia AudioClip − play(URL), play(URL, String) • Eseguono l’AudioClip relativo alla URL specificata • La forma a due parametri prende una URL di base (restituita da getDocumentBase o da getCodeBase) e l’URL del file sonoro relativa alla base. È consigliato utilizzare − la code-base per i suoni distribuiti con l’applet − la document-base per i suoni specificati dall’utente 18 Ottobre 2005 Stefano Clemente 38 API applet: Riproduzione di suoni • I metodi dell’interfaccia AudioClip sono: − play • riproduce il suono una sola volta − loop • ripete continuamente il suono − stop • arresta la riproduzione del suono sia con loop che con play 18 Ottobre 2005 Stefano Clemente 39 Il tag <applet>: i parametri • Finora abbiamo visto la forma più semplice <APPLET CODE=AppletSubclass.class WIDTH=anInt HEIGHT=anInt> </APPLET> • Alcune applet permettono all’utente di personalizzare la loro configurazione attraverso l’immissione di parametri − I parametri non sono altro che tag da inserire all’interno del tag applet secondo la sintassi seguente <APPLET CODE=AppletSubclass.class WIDTH=anInt HEIGHT=anInt> <PARAM NAME=parameter1Name VALUE=aValue> <PARAM NAME=parameter2Name VALUE=anotherValue> </APPLET> 18 Ottobre 2005 Stefano Clemente 40 Il tag <applet>: i parametri • Per leggere i parametri specificati dall’utente le applet usano il metodo public String getParameter(String name) getParameter restituisce sempre stringhe, per cui l’applet deve provvedere alla conversione in altri tipi se necessario (es. Integer.parseInt) − Se necessario bisogna definire nell’applet dei valori di default per i parametri. − getParameter può essere utilizzata anche per recuperare i valori degli attributi del tag applet • CODE, WIDTH, HEIGHT… 18 Ottobre 2005 Stefano Clemente 41 Il tag <applet>: codice HTML e testo alternativo • <APPLET CODE="Animator.class" WIDTH=460 HEIGHT=160 ALT=“Non riesco ad eseguire l’applet"> <PARAM NAME=“..”> <PARAM NAME=“..”> Il browser non conosce il tag applet </APPLET> • La stringa “Il browser non conosce il tag applet” nel tag precedente viene visualizzata nel caso in cui il browser sul quale viene richiamata la pagina non riconosca il tag <applet>. Questo tipo di stringa − è detto codice HTML alternativo − deve essere inserita tra i tag <applet> e </applet> e comunque dopo i tag <param> • Se il browser è in grado di eseguire Java, il codice HTML alternativo è ignorato. In questo caso può essere definito del testo alternativo attraverso attributo ALT del tag applet (nell’esempio la stringa “Non riesco a eseguire l’applet”) − L’uso dell’attributo ALT è per segnalare all’utente che il browser, sebbene abilitato all’esecuzione di codice Java, non è riuscito a eseguire l’applet 18 Ottobre 2005 Stefano Clemente 42 Il tag <applet>: la directory dell’applet • I browser assumono per default che il codice java dell’applet sia nella stessa directory (URL base) del documento HTML in cui l’applet è richiamata • Spesso però il codice Java è in altre directory del server • In questi casi l’attributo CODEBASE dice al browser in quale directory recuperare i file dell’applet <APPLET CODE=AppletSubclass.class CODEBASE=aURL WIDTH=anInt HEIGHT=anInt> </APPLET> • Se aURL è una URL − relativa, allora va intesa relativa alla document-base, cioè alla directory della pagina HTML − assoluta, allora l’applet può essere scaricata da una qualsiasi directory, anche su un altro server 18 Ottobre 2005 Stefano Clemente 43 Il tag <applet>: la directory dell’applet • <APPLET CODE=Simple.class CODEBASE="example/" WIDTH=500 HEIGHT=20> </APPLET> 18 Ottobre 2005 Stefano Clemente 44 Il tag <applet>: la directory dell’applet • In questo caso, l’URL è assoluta e può indicare anche una directory su un altro server 18 Ottobre 2005 Stefano Clemente 45 Il tag <applet>: raggruppare in un unico file i file dell’applet • Se un’applet è composta da più file, potrebbe essere conveniente raggruppare tutti questi in un unico file archivio • Occorre valutare: − la dimensione dell’applet − le performance − l’ambiente che il generico utente potrebbe aver • Il poter disporre di file archivio porta alla riduzione dei tempi del download (minori connessioni HTTP) • Si possono ottenere migliori prestazioni nel download comprimendo l’archivio 18 Ottobre 2005 Stefano Clemente 46 Il tag <applet>: raggruppare in un unico file i file dell’applet • La specifica di file archivio produce il seguente comportamento del browser − il browser cerca prima di tutto i file archivio nella stessa directory dell’applet − successivamente cerca la classe applet all’interno dei file archivio − se non lo trova prova allora a caricarlo come se nessun archivio fosse stato specificato • Il formato standard per gli archivi Java è JAR, introdotto in JDK 1.1 ed è basato sul formato ZIP • Gli archivi sono specificati attraverso l’attributo ARCHIVE del tag applet; archivi multipli sono specificati separando i nomi degli stessi con virgole 18 Ottobre 2005 Stefano Clemente 47 Il tag <applet>: raggruppare in un unico file i file dell’applet <APPLET CODE="AppletSubclass.class“ ARCHIVE="file1, file2" WIDTH=anInt HEIGHT=anInt> </APPLET> • Per creare un archivio JAR che includa le versioni compresse di tutti i file class e gif contenuti nella current directory: jar cvf file.zip *.class *.gif • Per creare un archivio Jar per le classi nel package com.mycompany.myproject: jar cvf file.zip com/mycompany/myproject/*.class *.gif 18 Ottobre 2005 Stefano Clemente 48