Die JNLP-Dienste (alle Klassen liegen im Paket javax.jnlp) stellen eine Schnittstelle des Programms zum JNLP-Client dar, mit dem man einfach auf nützliche Funktionen zugreifen kann. So ist es z.B. über den PersistenceService möglich, Dateien in einem vorgegeben Verzeichnis zu speichern, obwohl ansonsten sämtlicher Zugriff auf die lokale Platte verboten ist, solange die Applikation nicht signiert ist.
Ein Applet oder eine Applikation muss diese Services nicht gebrauchen - sie machen nur dann Sinn, wenn die Applikation speziell für den JNLP-Client geschrieben wurde und die Erweiterungen benötigt. Wer sein fertig programmiertes Applet oder seine Applikation einfach nur um eine weitere Ausführungsart erweitern möchte, kann in den meisten Fällen ohne das zusätzliche API auskommen. Insbesondere besteht die Gefahr, eine ClassNotFound-Exception zu bekommen, wenn die Applikation auf JNLP-Services zugreifen will, diese aber nicht in einem JNLP-Client läuft.
Der Zugriff auf die verschiedenen Services geschieht über die statischen Methoden der Klasse javax.jnlp.ServiceManager:
BasicService basicService = (BasicService)
ServiceManager.lookup("javax.jnlp.BasicService");
Eine Liste aller zur Verfügung stehenden Dienste bekommt man über die statische Methode ServiceManager.getServiceNames(). Lediglich der BasicService und der DownloadService sind Pflicht für einen JNLP-Client.
BasicService
Über den BasicService erhält man generelle Informationen über den Kontext der Applikation, z.B. ob die Applikation im Offline-Modus ist (isOffline()) oder ob ein Webbrowser zur Verfügung steht (isWebBrowserSupported()). Über showDocument(URL url) kann entsprechend eine Seite in einem Browser angezeigt werden.
// Service-Exemplar anfordern
BasicService bs = (BasicService)
ServiceManager.lookup("javax.jnlp.BasicService");
// Zeigt eine URL an
bs.showDocument(new URL("http://java.sun.com"));
DownloadService
Über den DownloadService hat der Programmierer größeren Zugriff darauf, welche Ressourcen wann geladen werden. So stehen Methoden zur Verfügung, um herauszubekommen, ob bestimmte parts, extensions oder sonstige Ressourcen schon zwischengespeichert sind, um, falls nicht, den Download-Vorgang zu starten oder diese Caches zu löschen.
DownloadService ds = (DownloadService)
ServiceManager.lookup("javax.jnlp.DownloadService");
// Die Resource
URL url = new URL("http://localhost/images.jar");
// Gucken, ob die Resource in der Version 1.0
// schon gecacht ist
boolean cached = ds.isResourceCached(url, "1.0");
// Die gecachte Version ggf. löschen
if (cached)
ds.removeResource(url, "1.0");
// Resource erneut laden
DownloadServiceListener dsl =
ds.getDefaultProgressWindow();
ds.loadResource(url, "1.0", dsl);
FileOpenService
Über den FileOpenService kann der Benutzer Dateien öffnen, wobei statt eines File-Objektes ein Exemplar der Klasse javax.jnlp.FileContents zurückgegeben wird. Diese Klasse dient als Wrapper um die eigentliche Datei, um z.B. aus Sicherheitsgründen die Information über den Pfad nicht preiszugeben (damit daraus kein Rückschluss auf die gesamte Verzeichnisstruktur gezogen werden kann).
FileOpenService fos = (FileOpenService)
ServiceManager.lookup("javax.jnlp.FileOpenService");
// Datei den Benutzer aussuchen lassen
FileContents fc = fos.openFileDialog(null, null);
FileSaveService
Um eine Datei vom Benutzer auswählen zu lassen, in die gespeichert werden soll, wird dieser Dienst benötigt. Er verhält sich grundsätzlich wie der FileOpenService.
FileOpenService fos = (FileOpenService)
ServiceManager.lookup("javax.jnlp.FileOpenService");
FileSaveService fss = (FileSaveService)
ServiceManager.lookup("javax.jnlp.FileSaveService");
// Datei aussuchen
FileContents fc = fos.openFileDialog(null, null);
// Datei abspeichern
fss.saveFileDialog(null, null, fc);
ClipboardService
Möchte der Entwickler auf die System-Zwischenablage zugreifen, muss er diesen Dienst einbinden. Bei der Benutzung des Dienstes wird der Benutzer kurz über die Risiken der Verwendung informiert.
// Service-Exemplar bekommen
ClipboardService cs = (ClipboardService)
ServiceManager.lookup("javax.jnlp.ClipboardService");
// Einen Text ims Clipboardboard aufnehmen
StringSelection ss =
new StringSelection("Java Web Start!");
cs.setContents(ss);
PrintService
Um indirekten Zugriff auf den Drucker zu erhalten, kann der Programmierer diesen Dienst nutzen.
PrintService ps = (PrintService)
ServiceManager.lookup("javax.jnlp.PrintService");
ps.print(new Printable {
public int print(Graphics g, PageFormat pageformat,
int PageIndex) {
// Entsprechend ausdrucken
}
});
PersistenceService
Über den PersistenceService kann der Programmierer ähnlich wie bei HTTP-Cookies Informationen lokal an einer vordefinierten Stelle ablegen. Dabei wird statt eines Dateinamens eine URL angegeben (also z.B. http://www.dpunkt.de/meineapplikation/daten). In diese Datei kann man beliebige Daten hineinschreiben, wobei es Dateilängenbegrenzungen durch den Service geben kann.
PersistenceService ps = (PersistenceService)
ServiceManager.lookup("javax.jnlp.PersistenceService");
// Ein vorher initialisiertes Objekt einlesen
FileContents fc = get("http://localhost/myapp");
ExtensionInstallerService
Wenn eine Extension installiert wird, kann dieser Code, wenn vorhanden, auf diesen Service zugreifen und so dem Benutzer beispielsweise Informationen über den Installationsstatus geben.
Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.