21.2.4 | JNLP-Dienste |
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.
Ü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"));
Ü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);
Ü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);
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);
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);
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 } });
Ü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");
Wenn eine Extension installiert wird, kann dieser Code, wenn vorhanden, auf diesen Service zugreifen und so dem Benutzer beispielsweise Informationen über den Installationsstatus geben.