Inizialmente
erano le applet
La
tecnologia Java Web Start è stata rilasciata da Sun allo scopo di
rilanciare la piattaforma client dato che da un po’ di tempo l’attenzione,
sia del mondo Java-oriented ma non solo, si è spostata sul server.
Inizialmente
come noto Java si è affermato come linguaggio di internet grazie
alla possibilità che offriva (e che offre tutt’ora) di realizzare
applicazioni inserite direttamente dentro una pagina HTML ed eseguite dalla
JVM del browser.
Questi
oggetti devono buona parte del loro successo anche alla semplicità
con cui possono essere eseguite: se ci si pensa, la possibilità
di eseguire una applicazione scaricata ed installata automaticamente al
click su un link del mouse è sicuramente una feauture molto interessante.
Come
però si è avuto più volte modo di osservare nelle
pagine di MokaByte, più che le limitazioni tecnologiche, l’errata
valutazione che è stata fatta sulle reali possibilità delle
applet ha di fatto relegato tali oggetti ad un ruolo secondario.
Resta
il fatto che, nonostante i molti problemi legati alla esecuzione delle
applet (tempi di download, compatibilità nei browser, limitazione
al JDK 1.1 sono solo alcune delle attuali limitazioni di tali oggetti),
il concetto di download ed installazione automatica rimane tutt’ora
un obiettivo molto interessante.
Java
Web Start dovrebbe a tal proposito cercare di evitare di incorrere nei
problemi legati alle applet e contemporaneamente utilizzare il vantaggio
del codice scaricato automaticamente dalla rete.
Java
Web Start infatti è un plug-in per il browser, plug-in che permette
il download e l’esecuzione automatica di una applicazione remota semplicemte
tramite un click del mouse su un link ipertestuale di una pagina HTML.
La
differenza fondamentale rispetto alle applet è che in questo caso
il browser viene utilizzato semplicemente ed esclusivamente per il download
dei file necessari alla applicazione per essere eseguita.
L’esecuzione
infatti avviene all’interno di una JVM esterna al browser, in maniera del
tutto analoga ad una applicazione Java installata sulla macchina locale.
Java
Web Start permette inoltre di salvare i file scaricati la prima volta in
locale (cosa non permessa alle applet) in modo da evitare il download le
volte successive: l’applicazione viene quindi installata a tutti gli effetti
in locale, tanto che su Windows ad esempio è possibile aggiungere
una icona sullo sfondo del desktop o nel menu avvio.
Al
momento del download è possibile specificare tutti i parametri di
esecuzione, fra cui anche la JVM da utilizzare: nel caso in cui non sia
installata la versione indicata nel file di configurazione, ne verrà
effettuato il download automaticamente.
Secondo
le dichiarazioni di Sun, le varie versioni del JDK che finiscono per installarsi
nella macchina client possono convivere tranquillamente, anche se tale
assicurazione è tutta da verificare ed al momento mi lascia piuttosto
perplesso.
Trattandosi
di codice scaricato da remoto, sono state adottate, come al solito in Java,
elevate misure di sicurezza, tanto che l’applicazione viene eseguita con
le stesse restrizioni delle applet; anche in questo caso l’utilizzo di
archivi JAR firmati elettronicamente permette di superare le imposizioni
tipiche del modello sandbox.
Nella
figura che segue è mostrato il tipico ciclo di vita di una applicazione
eseguita tramite Java Web Start.
Figura
2:
ciclo di vita di una applicazione web start
Il
meccanismo di base che permette l’installazione automatica e la successiva
esecuzione si basa sul cosiddetto Java Network Launcher Protocol (JNLP),
un protocollo proprietario che si basa sull’utilizzo di un file di configurazione
con estensione .jnp.
Configurazione
ed installazione
Il
client non richiede particolari configurazioni, se non il supporto per
la piattaforma Java 2 e la presenza di un JRE 1.2.0 o successivi.
Al
momento JWS in versione Early Access è disponibile per le
piattaforme Windows 95/98/NT/2000, per Solaris (SPARC ed Intel) e
per Linux (RH6.0/x86).
Sul
server come prima cosa si deve configurare opportunamente il web server
in modo da supportare il nuovo MIME relativo a JNLP.
Infatti
quando il browser del client riceve una risposta con mime type uguale a
application/jnlp, deve essere in grado di inoltrare tale risposta
al plug-in installato, invece di gestirlo direttamente.
La
procedura per attivare questo nuovo MIME dipende dal web server utilizzato:
nel caso di Apache ad esempio è necessario aggiungere nel
file .mime.types
la riga
application/jnlp
JNLP
Fatto
questo è necessario creare un archivio di tipo JAR all’interno del
quale inserire tutti i file necessari per eseguire l’applicazione. Questo
file .jar dovrà poi essere posizionato in una dir opportuna come
specificato nel file JNLP.
Per
la creazione di tale file, la cosa più semplice e consigliabile
è quella di partire da uno già preparato e cambiare solamente
le parti che interessano. La sintassi di un file .jnlp è piuttosto
semplice, e la analizzeremo poco più avanti.
Nella
pagina HTML che verrà inviata al client dovrà essere inserito
il link che attiva tutto il meccanismo: ad esempio
<a
href="MyApp.jnlp">Launch My Application</a>
Per
la configurazione fatta in precedenza, il web server, quando il client
richiede un file con estensione jnlp, restituisce una MIME type application/jnlp.
Non
sono necessarie ulteriori particolari configurazione da effettuare sul
client e sul server.
Sviluppo di applicazioni
JWS
Fondamentalmente
la realizzazione di una applicazione basata su JWS non ha niente di differente
dal caso in cui si tratti di una applicazione normale. Anche in questo
casi si tratta di scrivere una serie di classi, una delle quali dovrà
contenere al suo interno il metodo main.
Tuttavia
si deve tener presente come prima cosa che l’applicazione deve essere composta
di una serie di file contenuti all’interno di un file JAR; per questo motivo
tutte le risorse necessarie al funzionamento della applicazione stessa
dovranno essere contenute all’interno del file .jar ed accedute per mezzo
del metodo getResource().
Ad
esempio se si deve ricavare una immagine per creare una icona, invece di
aprire uno stream di input si dovrà scrivere una cosa del tipo
//
Get current classloader
ClassLoader
cl = this.getClass().getClassLoader();
//
Create icons
Icon
saveIcon = new ImageIcon(cl.getResource("images/save.gif"));
Icon
cutIcon = new ImageIcon(cl.getResource("images/cut.gif"));
...
che
permette di ricavare le due icone per la creazione di pulsanti “salva”
e “taglia” corrispondenti ai file images/save.gif e images/cut.gif impachettati
nell’archivio JAR con path relativo images/.
Sintassi del file
JNLP
Il
formato del file JNLP è attualmente in fase di evoluzione, per cui
quello che vediamo in questo caso non è detto che resti completamente
valido anche in futuro.
In
questo caso faremo riferimento alla versione specificata nella release
1.0 del Public Draft Review del Java Network Launch Protocol and API; dato
che una trattazione completa di tutti gli elementi che possono comporre
un file JNLP richiederebbe molto spazio, vedremo qui solamente quelli
principali, rimandando alla documentazione ufficiale per una trattazione
completa.
Il
file JNLP rappresenta di fatto un documento XML. Ecco un esempio completo
fornito con la documentazione Sun
<?xml
version="1.0" encoding="utf-8"?>
<!-- JNLP File for SwingSet2 Demo Application -->
<jnlp
spec="0.1"
codebase="http://javaweb.eng.com/jaws/apps"
href="swingset2.jnlp">
<information>
<title>SwingSet2 Demo Application</title>
<vendor>Sun Microsystems, Inc.</vendor>
<homepage href="docs/help.html"/>
<description>SwingSet2 Demo Application
</description>
<description kind="short">
A demo of the capabilities of the
Swing Graphical User Interface.
</description>
<icon href="images/swingset2.jpg"/>
<offline/>
</information>
<security>
<unrestricted/>
</security>
<jre version="1.3"/>
<resources>
<jar href="lib/SwingSet2.jar"/>
</resources>
<application-desc main-class="SwingSet2"/>
</jnlp>
Ecco
un elenco del significato dei vari elementi e dei relativi attributi
JNLP
Element
-
Spec:
definisce la versione del JNLP. Per lavorare con la release attuale di
JWS deve essere impostato a 0.1, mentre in futuro dovrà essere sarà
1.0.
-
Codebase:
tutti gli URL relativi rispetto a quello di riferimento specificato dall’attributo
href.
-
Href:
specifica il link al quale deve essere associata l’applicazione JNLP
-
Information
Element: permette di specificare una serie di informazioni sulla applicazione
-
title:
il nome della applicazione
-
vendor:
il nome del vendor della applicazione
-
homepage:
contiene un href all’URL della home page della applicazione dove sia possibile
reperire maggiori informazioni sulla applicazione stessa.
-
description:
una breve descrizione del funzionamento della applicazione stessa. Può
essere specificato se debba essere on-line, short o tooltip.
-
icon l’icona
da utilizzare
-
offline:
parametro opzionale che indica se la applicazione possa essere lanciata
in modalità offline.
Security
Element: nel caso in cui l’applet debba essere eseguita al di fuori
del modello sandbox, qui si devono specificare le policy permesse. Si veda
[1] per maggiori informazioni
JRE
Element : indica la versione del JRE da utilizzare; attualmente
le due versioni permesse sono quelle relative alla piattaforma Java 2 release
1.2 e 1.3, anche se in futuro si potrà specificare anche la minor
version. Maggiori dettagli in [1].
Resource
Element : serve per specificare il file o i file JAR contenenti
le risorse necessarie alla applicazione.
Application-Desc
Element : indica che il JNLP file sta lanciando una applicazione
invece di una applet. Nel caso non sia chiaro è possibile specificare
il nome della classe che contiene il main.
Applet-Desc
Element : questo tag permette di specificare che si stà
facendo riferimento ad una applet. Tale opzione permette di effettuare
le prime prove utilizzando direttamente una applet esistente, piuttosto
che scrivere una applicazione ad hoc. Ha lo scopo di permettere una facile
migrazione delle applicazione e non fa parte della specifica ufficiale,
per cui in futuro verrà abbandonata.
La
sintassi di questo elemento è molto simile a quella utilizzata per
l’insertimento di una applet in una pagina HTML: ad esempio
<applet-desc
documentBase="http://..."
name="TimePilot"
code="TimePilot.TimePilotApp"
width="527"
height="428">
<param name="key1" value="value1"/>
<param name="key2" value="value2"/>
</applet-desc>
La JNLP API, alcuni
esempi di applicazioni
Per
permettere alla applicazione di avere maggiori informazioni relative
al proprio ambiente di esecuzione, è stata rilasciata una API apposita,
la cosiddetta JNLP API,
le
cui funzionalità sono pittosto simili alla AppletContext disponibile
per le applet.
L’esempio
che segue mostra come aprire un URL utilizzando il browser di default grazie
al metodo showURL.
import
javax.jnlp.*;
...
//
Metodo per mostrare un URL
boolean
showURL(URL url) {
try {
// esegue una lookup dell’oggetto
// javax.jnlp.BasicService object
BasicService bs;
bs =(BasicService)ServiceManager.lookup(
"javax.jnlp.BasicService");
// invoca il metodo showDocument
return bs.showDocument(url);
}
catch(UnavailableServiceException ue) {
// Service is not supported
return false;
}
}
In
questo esempio si può osservare come la prima cosa da fare sia l’importazione
del package javax.jnlp che, dopo il download dal sito della Sun, deve essere
aggiunto al classpath.
Un
altro metodo utile messo a disposizione dal package è il importFile,
che permette di importare un file nella applicazione. La sua invocazione
causa l’apertura di una dialog box per la scelta del file (dato che l’applicazione
gira in un sandbox, non può accedere direttamente alle risorse del
file system).
import
javax.jnlp.*;
...
void
importFile() {
try {
// Lookup the javax.jnlp.FileOpenService object
FileOpenService bs;
bs =(FileOpenService)ServiceManager.lookup(
"javax.jnlp.FileOpenService");
// Show the File Open Dialog using default path and
//default set of extensions
FileContents result = bs.openFileDialog(null, null);
if (result != null) {
// User selected file
handleFile(result.getName(), result.getContents());
}
else {
// User pressed cancel button
return;
}
}
catch(IOException ioe) {
// Could not read selected file
...
}
catch(UnavailableExcetion ue) {
// Service not supported
...
}
}
Analogamente
l’esportazione
di un file per mezzo del metodo exportFile permette di salvare file
anche se di fatto l’applicazione non ha i diritti di scrittura sul file
system. Ecco un altro semplice esempio
import
javax.jnlp.*;
...
void exportFile(String name, InputStream contents) {
try {
// Lookup the javax.jnlp.FileSaveService object
FileOpenService bs;
bs = (FileSaveService)ServiceManager.lookup(
"javax.jnlp.FileSaveService");
// Show the File Save Dialog using default
// path and default set of extensions
boolean result = bs.saveFileDialog(null, null, new
FileContents(name,contents));
if (result) {
// User saved file
...
}
else {
// User pressed cancel button
...
}
}
catch(IOException ioe) {
// Could not read selected file
...
}
catch(UnavailableExcetion ue) {
// Service not supported
...
}
}
Conclusioni
Al
solito, al termine di una presentazione di una nuova tecnologia si richiede
al bravo articolista di turno di esprimere un commento in merito alla novità
esaminata.
In
questo caso, benché si tratti di una soluzione ancora troppo giovane
per poter fare una valutazione circa la stabilità, e le performance,
credo che si possa senz’altro affermare che si tratta di una innovazione
senza dubbio molto interessante.
La
possibilità di installare applicazioni da remoto è una delle
caratteristiche più interessanti che internet e Java hanno da sempre
promesso. Se si escludono casi molto particolari come agenti mobili o factory
di oggetti, fino ad oggi in Java questo significava essenzialmente utilizzare
le applet. Le molte difficoltà incontrate per realizzare applicazioni
di un certo livello utilizzando il modello delle applet possono far intuire
le potenzialità di Web Start.
Forse
è ancora un po’ presto per poter capire quali possano essere le
reali possibilità di un oggetto come questo, ma allo stato attuale
credo di poter affermare che si tratti di una innovazione veramente molto
interessante.
Non
resta che attendere ancora qualche mese per capire quali potranno essere
le evoluzioni di Java Web Start.
Bibliografia
[1]
Developer's Guide Java Web Start Version 0.4 Early Access Release
http://java.sun.com/products/javawebstart/docs/developersguide.html
[2]
Home page di Java Web Start
http://java.sun.com/products/javawebstart/
[3]
FAQ su Java Web Start
http://java.sun.com/products/javawebstart/faq.html
[4]
Java Web Start Press release
http://java.sun.com/pr/2000/06/pr000606-03.html
|