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