Applets: Applicazioni Java in pagine Web Gli applets sono dei particolari programmi Java studiati per essere eseguiti all'interno delle pagine web. Dal punto di vista dell'utente di un browser (Explorer, Netscape, Firefox,...), gli applet non sono altro che delle zone rettangolari della pagina. Al loro interno viene visualizzato il risultato dell'esecuzione di un programma Java. Dal punto di vista del programmatore, gli applets non sono altro che dei pannelli (JPanels) che vengono inseriti in una pagina invece che in una finestra (Jframe). L'unica differenzarispetto ai pannelli normali, è la presenza di 4 metodi, che vengono eseguiti dal browser, per inizializzare e distruggere un applet. Gli applet funzionano perchè i browsers incorporano una Java Virtual Machine. Insomma quando installate un browser che supporta Java, installare anche una JVM completa. Questo è uno dei motivi per cui i browsers sono molto grandi. Recentemente sia Microsoft che Netscape (e derivati: Mozilla, Firefox) non incorporano più una loro Java Virtual Machine, ma installano in automatico la JVM scaricandola dal sito della SUN. Applet Html page Browser (Explorer, Firefox,...) Applet Java Virtual Machine
La classe JApplet La classe da prendere come riferimento per fare un applet è la classe Japplet. Ecco la sua gerarchia di estensioni: java.lang.object extended by java.awt.component extended by java.awt.container extended by java.awt.panel extended by java.applet.applet extended by javax.swing.japplet Metodi importanti Come si vede eredita le funzioni di un java.awt.panel, dunque si comporta come un panel. Come per il Panel, per disegnare in un applet basta fare overriding del metodo paint: public void paint(graphics g) Inoltre, come già detto, ci sono 4 metodi da implementare che permettono la gestione da parte del browser. Ecco al loro descrizione di seguito (presa dal libro di testo): Method init( ) start( ) stop( ) destroy( ) Operation Automatically called to perform first-time initialization of the applet, including component layout. You ll always override this method. Called every time the applet moves into sight on the Web browser to allow the applet to start up its normal operations (especially those that are shut off by stop( )). Also called after init ( ). Called every time the applet moves out of sight on the Web browser to allow the applet to shut off expensive operations. Also called right before destroy( ). Called when the applet is being unloaded from the page to perform final release of resources when the applet is no longer used
Scrivere un applet Per scrivere un applet basta scrivere una classe che estende JApplet ed implementare i 4 metodi richiesti: import javax.swing.japplet ; public class SimpleApplet extends JApplet { public void init() { System.out.println("Initializing...") ; public void start() { System.out.println("Starting...") ; public void stop() { System.out.println("Stopping...") ; public void destroy() { System.out.println("Destoying...") ; public void paint(graphics g) { g.drawline(10,20,50,60) ;
Eseguire un applet Come si potrà notare, un applet non ha un metodo main. Ma come lo si esegue? Prima di tutto si deve scrivere il codice per una pagina web mostra quell'applet, poi bisogna caricare la pagina con un browser. Il tag <APPLET> Per inserire un applet in una pagina HTML si usa il tag <APPLET>. Che segue la seguente sintassi: <APPLET CODE="classname" WIDTH="larghezza" HEIGHT="altezza"> </APPLET> dove classname è il nome della classe da caricare, mentre larghezza ed altezza sono le dimensioni che l'applet avrà nella pagina web. Esitono altri due parametri: ARCHIVE="nome_archivio.jar". Specifica che la classe da caricare non si trova in un file ma all'interno di un archivio "jar" (simile allo zip). Vedremo l'uso dei jar più avanti. NAME="applet_name". Serve a dare un nome all'applet. Utile per far comunicare applets tra loro, come vedremo più avanti. L'applet dell'esempio che stiamo vedendo si può visualizzare tramite una pagina html minimale come questa: <HTML> <APPLET CODE="SimpleApplet" WIDTH="400" HEIGHT="300"> </APPLET> </HTML> Eseguire in un browser Per eseguire l'applet basta caricare la pagina creata con un browser che abbia la Java Virtual Machine installata. Per vedere l'output testuale dell'applet i browser mettono generalmente a disposizione un'opzione chiamata più o meno Mostra la console di Java. In questo modo, ogni volta che parte un applet Java, viene aperta una finestra di testo che visualizza l'output che normalmente si vede sul prompt dell'ms-dos. Il comando appletviewer Esiste anche la possibilità di vedere gli applets senza dover fare uso di un browser. Tra i comandi installati con il jdk c'è appletviewer. Questo comando prende come parametro una pagina html, ma supporta solo il tag applet. Quando invocato, inserisce l'applet in una finestra ed esegue i metodi init, start, stop e destroy come se fosse un browser. Ad esempio > appletviewer test.html
Parametri di un applet Per passare i parametri ad un applet si usa nell pagine html il tag <PARAM>, che segue la sintassi: <PARAM NAME = "nome_parametro" VALUE = "valore"> Ad esempio: <PARAM NAME="color" VALUE="ff0055"> <PARAM NAME="message" VALUE="ciao"> Leggere i parametri Per leggere i parametri si usa il metodo public String getparameter(string parameter_name ) Il metodo prende in input il nome del parametro e restituisce il valore inserito nella pagina web. Se il parametro non esiste viene restituito null. Esempio Color color ; public void init() { // prendo il parametro colore, mi aspetto un intero in esadecimale String color_string = getparameter("color") ; if(color_string!=null) { System.out.println("Setting color to: "+color_string) ; int color_hex = Integer.parseInt(color_string,16) ; this.color = new Color(color_hex) ; else { this.color = Color.black ;
L'interfaccia AppletContext L'interfaccia java.applet.appletcontext permette di avere informazioni sul contesto di esecuzione di un appet. Per esempio permette di avere i riferimenti agli altri applets in esecuzione in una pagina, o di caricare una nuova pagina web nel browser. Per avere il riferimento all'appletcontext basta invocare il metodo: public AppletContext getappletcontext() Riferimento ad altri applets Tramite il metodo: public Applet getapplet(string name) si può avere il riferimento ad una altro applet in esecuzione nella stessa pagina web. Il nome dell'applet deve essere quello specificato dal parametro NAME del tag APPLET. Il metodo: public Enumeration getapplets() restituisce un'enumerazione di tutti gli applets all'interno della stessa pagina. Show Document Il metodo più utile di applet context è: public void showdocument(url url, String target) Che carica un determinato URL (http://...) e lo mostra nella zona specificata da target. Il parametro url è un'istanza della classe java.io.url, che rappresenta appunto un indirizzo URL. Il parametro target specifica dove caricare il nuovo documento (dalla documentazione Java): Target Argument "_self" "_parent" "_top" "_blank" name Description Show in the window and frame that contain the applet. Show in the applet's parent frame. If the applet's frame has no parent frame, acts the same as "_self". Show in the top-level frame of the applet's window. If the applet's frame is the top-level frame, acts the same as "_self". Show in a new, unnamed top-level window. Show in the frame or window named name. If a target named name does not already exist, a new top-level window with the specified name is created, and the document is shown there. Questo è molto utile, per esempio, per creare i famosi menù in Java. Esempio URL google_address = new URL( http://www.google.it ) ; applet_context.showdocument(google_address, _blank ) ; Vedere applet/simpleapplet.java e applet/test.html
Applet vs Stand-Alone Application E' possibile, con un piccolo accorgimento, far si che un applet funzioni anche senza bisogno di un browser o del comando appletviewer. E' sufficiente creare nell'applet un metodo main che viene invocato quando l'applicazione viene lanciata come applicazione stand-alone. public static void main(string args[]) { // istanzio l'applet JApplet SimpleApplet = new SimpleApplet(); // ustanzio la finestra che lo conterrà JFrame frame = new JFrame("SimpleApplet stand-alone"); // Se premo la X della finestra chiude tutta la virtual machine frame.setdefaultcloseoperation(jframe.exit_on_close); // aggiungo l'applet nella finestra frame.getcontentpane().add(applet); // imposto dimensioni // (potrebbero essere diverse da quelle specificate nel file html) frame.setsize(100,50); // inizializzo e faccio partire l'applet applet.init(); applet.start(); // isualizzo la finestra frame.setvisible(true); Vedere applet/simpleapplet.java e applet/test.html
Gli archivi JAR In Java è possibile impacchettare una serie di classi e files in archivi da distribuire come singoli files. Questo è molto utile se l'applicazione che stiamo sviluppando ha molte classi. Il formato di compressione utilizzato da Java è chiamato Jar. Il nome deriva probabilmente dal fatto che, mentre il Java è una bevanda si beve normalmente in tazzina, un'insieme di classi lo si mette in una caraffa (Jar appunto). Il comando Jar Il comando jar si trova nella stessa directory dei comandi java, javac e appletviewer. La sua sintassi è descritta invocando il comando jar senza parametri: Usage: jar {ctxu[vfm0mi] [jar-file] [manifest-file] [-C dir] files... Options: -c create new archive -t list table of contents for archive -x extract named (or all) files from archive -u update existing archive -v generate verbose output on standard output -f specify archive file name -m include manifest information from specified manifest file -0 store only; use no ZIP compression -M do not create a manifest file for the entries -i generate index information for the specified jar files -C change to the specified directory and include the following file If any file is a directory then it is processed recursively. The manifest file name and the archive file name needs to be specified in the same order the 'm' and 'f' flags are specified. Example 1: to archive two class files into an archive called classes.jar: jar cvf classes.jar Foo.class Bar.class Example 2: use an existing manifest file 'mymanifest' and archive all the files in the foo/ directory into 'classes.jar': jar cvfm classes.jar mymanifest -C foo/.
Esempio: PictureApplet (vedere la directory jar nei sorgenti) Caricare risorse Voglio creare un applet che visualizza un'immagine. Se so di voler caricare durante l'esecuzione un file che si trova dentro un jar, non posso usare i normali metodi di caricamento; devo caricare delle risorse. Lo stesso metodo permette di caricare files non archiviati. Per avere il riferimento ad una risorsa si usa il metodo getresource della classe Class Loader. Per avere il riferimento ad un class loader si usa il metodo.getclassloader() della classe Class; cha a sua volta si prende con il metodo getclass(). In sintesi: ClassLoader cl = this.getclass().getclassloader() ; URL file_url = cl.getresource("pc-airbag.jpg") ; Il riferimento è un URL, che può essere usato come parametro di molti metodi al posto del nome del file da caricare. Ad esempio per caricare le immagini, nel Toolkit c'è una versione di createimage apposta. In sintesi: Toolkit tk = Toolkit.getDefaultToolkit() ; Image immagine = tk.createimage(file_url) ; Creare il jar Compilo la classe (o le classi): > javac PictureApplet.java Impacchetto tutto in un jar: > jar cf pa.jar PictureApplet.class PC-Airbag.jpg Notare che le classi possono stare in packages; in tal caso le classi vanno invocate specificando anche il nome del package (package.classe). Anche i files possono stare in sotto-directories: in tal caso bisogna specificare tutto il path relativo al package di default (ex. immagini/pc-airbag.jpg ). Vedere il jar Per controllare che il jar contenga tutto quello che serve invoco: > jar tf pa.jar META-INF/ META-INF/MANIFEST.MF PictureApplet.class PC-Airbag.jpg Non vi preoccupate della directory META-INF, non ci serve. Eseguire come applicazione Proviamo prima di tutto ad eseguire il nostro programma come applicazione. Devo dire al comando java di usare quel jar come uno dei posti in cui cercare le classi: si usa l'opzione -classpath: > java -classpath pa.jar PictureApplet In pratica il jar viene automaticamente decompresso (in memoria) e le sue classi vengono caricate. Eseguire come applet Bisogna creare il file html con il tag applet. In più serve il parametro ARCHIVE per specificare che tutto l'applet si trova nell'archivio pa.jar: <APPLET CODE="PictureApplet" ARCHIVE="pa.jar" WIDTH="400" HEIGHT="300"> </APPLET> Dopodichè possiamo eseguire l'applet da browser o con il comando appletviewer: > appletviewer PictureApplet.html