1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100083.html;106,k100087.html;107,k100089.html;108,k100090.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100087.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100089.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 13 - Strukturierung von Java-Programmen
</table>
<hr>
<!-- Section -->
<a name="javawebstart"></a>
<h2>13.5 Java Web Start<a name="ixa100839"></a> </h2>
<hr>
<ul>
<li><a href="k100088.html#javawebstart">13.5 Java Web Start</a>
<ul>
<li><a href="k100088.html#sectlevel3id013005001">13.5.1 Einleitung und Funktionsweise</a>
<li><a href="k100088.html#sectlevel3id013005002">13.5.2 Erstellen einer WebStart-Applikation</a>
<ul>
<li><a href="k100088.html#sectlevel4id013005002001">Erzeugen der jar-Dateien</a>
<li><a href="k100088.html#sectlevel4id013005002002">Anlegen der Deskriptordatei</a>
<li><a href="k100088.html#sectlevel4id013005002003">Die Anwendung auf dem Web-Server installieren</a>
<li><a href="k100088.html#sectlevel4id013005002004">Starten der Anwendung</a>
</ul>
<li><a href="k100088.html#dasjnlpapi">13.5.3 Das jnlp-API</a>
<ul>
<li><a href="k100088.html#sectlevel4id013005003001">Services</a>
<li><a href="k100088.html#sectlevel4id013005003002">Ein einfaches Beispiel</a>
</ul>
</ul>
</ul>
<hr>
<!-- Section -->
<a name="sectlevel3id013005001"></a>
<h3>13.5.1 Einleitung und Funktionsweise </h3>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Die Ausführungen in diesem Abschnitt können beim ersten
Lesen übersprungen werden. Sie setzen ein grundsätzliches
Verständnis für Applets voraus und verwenden Beispielcode
aus den Abschnitten <a href="k100246.html#jtree">38.3</a> und <a href="k100295.html#experimentwebserver">46.3.3</a>.
Aus systematischen Gründen soll das Thema jedoch an dieser Stelle
behandelt werden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Applets werden ab <a href="k100248.html#kapitelapplets1">Kapitel 39</a>
erklärt. Sie waren es, die mit der Möglichkeit, eigenständige
Programme mit grafischer Oberfläche in Webseiten einzubinden,
einen großen Teil der anfänglichen Begeisterung für
Java auslösten. Später erkannte man noch einen zweiten,
strategischen Vorteil: diese Programme mußten nicht <i>installiert</i>
werden, sondern wurden einfach aufgerufen und waren immer up-to-date.
Das brachte »gute alte Zeiten« in Erinnerung, bei denen
die Anwender an einfachen Terminals saßen, die - wenn sie wirklich
einmal defekt waren - ohne großen Aufwand ausgetauscht werden
konnten.
<p>
Schnell war die Idee geboren, dies mit aktueller (Java-)Technologie
nachzuahmen. Warum nicht alle benötigten Programme als Applets
implementieren, die bei Bedarf von einem zentralen Server geladen
werden? Man hatte nämlich erkannt, dass in den Unternehmen ein
Großteil der durch Computerarbeitsplätze verursachten Kosten
gar nicht bei deren Kauf entstand, sondern erst danach. Etwa durch
Updates, Reparaturen und Wartungen; aber auch durch Probleme, die
durch nicht verfügbare, fehlerhafte oder inkonsistente Programmversionen
entstand. Die aus dieser Idee entstandenen <a name="ixa100840"><i>Java Workstations</i></a>
konnten sich allerdings nicht durchsetzen. Trotz vielversprechender
Anfänge wurden die durch langsame Netzwerkverbindungen oder unzulängliche
Java-Implementierungen in den Browsern verursachten Probleme nicht
gelöst. Die Java-Stations verschwanden ebenso schnell von der
Bildfläche, wie sie zuvor aufgetaucht waren.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Während der Entwicklung des JDK 1.3 brachte SUN eine Technologie
auf den Markt, mit der die Vorteile von Applets und Applikationen
kombiniert werden sollten. Sie wird als <i>Java Web Start</i> (kurz
<a name="ixa100841"><i>WebStart</i></a>) bezeichnet und ist seit dem
JDK 1.4 fester Bestandteil jedes JDKs und JREs. Java Web Start bietet
die Möglichkeit, <i>Applikationen</i> über einen Web-Server
automatisch zu laden und zu aktualisieren, ohne dass dazu eine lokale
Installation oder das manuelle Einspielen eines Softwareupdates erforderlich
wäre. Sie kombiniert so die Installationsfreiheit von Applets
mit der Geschwindigkeit und Flexibilität von Java-Applikationen.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#FF9900">
<tr>
<td><font color="#FFFFFF"> JDK1.1-6.0 </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Wir wollen uns einmal ansehen, wie das Ganze funktioniert:
<ul>
<li>Der Entwickler liefert seine Java-Applikation in dem von WebStart
benötigten Format aus. Dazu muss er alle Bestandteile seiner
Applikation (Klassen und Ressourcen) in einem oder mehreren jar-Archiven
unterbringen. Zusätzlich muss er eine Deskriptordatei zur Verfügung
stellen, in der alle von WebStart benötigten Informationen untergebracht
sind.
<li>Der Administrator stellt eine Webseite zur Verfügung, von
der die WebStart-Applikation geladen werden kann. Er kopiert dazu
alle jar-Dateien und die Deskriptordatei auf den Server und macht
letztere über einen Link den potentiellen Anwendern verfügbar.
Einmalig muss er seinen Web-Server so konfigurieren, dass dieser Deskriptordateien
an ihrer Extension <font color="#660099">.jnlp</font> erkennt und
den Browsern den korrekten Mime-Typ <a name="ixa100842"><a href="index_a.html#ixb100648"><font color=#000080><tt>application/x-java-jnlp-file</tt></font></a></a>
überträgt.
<li>Möchte der Anwender eine Java-Applikation verwenden, die
noch nicht lokal auf seinem Rechner verfügbar ist, ruft er die
vom Administrator zur Verfügung gestellte Webseite auf und klickt
auf den Link mit der Deskriptor-Datei. Diese wird vom Web-Browser
geladen, der WebStart-Anwendungsmanager wird automatisch aufgerufen
und überprüft, ob die gewünschte Applikation bereits
lokal vorhanden und alle Bestandteile auf dem neuesten Stand sind.
Ist das der Fall, wird die Applikation gestartet, andernfalls werden
zuvor die fehlenden Bestandteile nachgeladen. Der Anwender kann mit
der Applikation nun wie mit jedem anderen Java-Programm arbeiten.
<li>Hat der Anwender die Applikation bereits einmal geladen, ist die
Webseite für weitere Aufrufe nicht mehr unbedingt erforderlich.
WebStart speichert die Bestandteile der Applikation in einem Cache
und kann sie auch dann zur Verfügung stellen, wenn keine Verbindung
zu dem Server besteht, von dem sie heruntergeladen wurde. Dazu ruft
der Anwender einfach das (zusammen mit dem JDK oder JRE installierte)
Programm »Java Web Start« auf und wählt aus der Liste
der bereits heruntergeladenen Programme das zu startende aus. Wird
das Programm oft benötigt, kann der Anwender sich eine Verknüpfung
auf dem Desktop oder einen Eintrag im Startmenü erstellen lassen.
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Die hier skizzierte Vorgehensweise beschreibt die Nutzungsmöglichkeiten
von Java Web Start nur in Ansätzen. Tatsächlich bietet diese
Technologie weit mehr Möglichkeiten, als hier erläutert
werden könnte. So ist es beispielsweise möglich, die Anwendung
in separate Teile zu zerlegen, die erst bei Bedarf geladen werden.
Teile von Anwendungen lassen sich versionieren und werden nur dann
aktualisiert, wenn eine neuere Version zur Verfügung steht. Man
kann Applikationen auch signieren, um ihnen den Zugriff auf den kompletten
Arbeitsplatz zu ermöglichen. Ohne Signatur laufen sie - ähnlich
wie Applets - lediglich in einer »Sandbox« ab, in der sie
nur beschränkte Zugriffsmöglichkeiten auf lokale Ressourcen
haben. Weitere Informationen dazu werden in <a href="k100088.html#dasjnlpapi">Abschnitt 13.5.3</a>
gegeben.
<p>
Ein Großteil dieser Möglichkeiten wird im <a name="ixa100843"><i>Java Network
Launching Protocol</i></a> beschrieben, das
über die Download-Seite der WebStart-Homepage heruntergeladen
werden kann. Es findet sich wie alle anderen WebStart-Ressourcen und
-Dokumentationen auf <a href="http://java.sun.com/products/javawebstart/index.html">http://java.sun.com/products/javawebstart/index.html</a>.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel3id013005002"></a>
<h3>13.5.2 Erstellen einer WebStart-Applikation </h3>
<!-- Section -->
<a name="sectlevel4id013005002001"></a>
<h4>Erzeugen der jar-Dateien </h4>
<p>
Wir wollen uns in diesem Abschnitt die Aufgabe stellen, das Beispielprogramm
<i>JTree 3</i> aus <a href="k100246.html#jtreeaenderungen">Listing 38.13</a>
in eine WebStart-Applikation zu verwandeln. Der Übersichtlichkeit
halber erstellen wir dazu ein Unterverzeichnis <font color="#660099">wstest</font>,
in dem wir alle benötigten Dateien sammeln. Auf der DVD zum Buch
befindet sich dieses unterhalb der Beispieldateien, also direkt im
Verzeichnis <font color="#660099">examples</font>. Da es auf der DVD
bereits mit allen benötigten Dateien gefüllt ist, sind die
nachfolgend beschriebenen Schritte (bei Verwendung dieses Verzeichnisses)
redundant. Zum Lernen sollten sie aber dennoch nachvollzogen werden.
<p>
Zunächst kopieren wir die Dateien <font color="#660099">Listing3813.java</font>
und <font color="#660099">WindowClosingAdapter.java</font> in das
Verzeichnis und kompilieren sie:
<font color="#333300">
<pre>
javac *.java
</pre>
</font>
<p>
Nach dem Kompilieren befinden sich die <font color="#660099">.class</font>-Dateien
<font color="#660099">Listing3813.class</font> und <font color="#660099">WindowClosingAdapter.class</font>
in diesem Verzeichnis. Sie werden nun in ein jar-Archiv <font color="#660099">wstest.jar</font>
verpackt:
<font color="#333300">
<pre>
jar cvf wstest.jar Listing3813.class WindowClosingAdapter.class
</pre>
</font>
<!-- Section -->
<a name="sectlevel4id013005002002"></a>
<h4>Anlegen der Deskriptordatei </h4>
<p>
Der nächste Schritt besteht darin, die Deskriptordatei zu unserem
WebStart-Projekt anzulegen. Hierbei handelt es sich um eine XML-Datei
mit der Erweiterung <font color="#660099">.jnlp</font><a name="ixa100844"></a>,
in der alle Informationen untergebracht sind, die der WebStart-Anwendungsmanager
für das Laden, Ausführen und Darstellen der Applikation
benötigt. Sie heißt in unserem Beispiel <font color="#660099">wstest.jnlp</font>
und hat folgenden Inhalt:
<a name="listingid013010"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA"><?xml version=</font><font color="#0000FF">"1.0"</font><font color="#0000AA"> encoding=</font><font color="#0000FF">"utf-8"</font><font color="#0000AA">?></font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#00AA00"><!-- JNLP File fuer HJP3 WebStart Demo-Applikation --></font>
<font color="#555555">004 </font><font color="#0000AA"><jnlp codebase=</font><font color="#0000FF">"http://localhost:7777/"</font><font color="#0000AA"> href=</font><font color="#0000FF">"wstest.jnlp"</font><font color="#0000AA">></font>
<font color="#555555">005 </font>
<font color="#555555">006 </font><font color="#0000AA"><information></font>
<font color="#555555">007 </font> <font color="#0000AA"><title></font>HJP3 WebStart Demo Application<font color="#0000AA"></title></font>
<font color="#555555">008 </font> <font color="#0000AA"><vendor></font>Guido Krueger<font color="#0000AA"></vendor></font>
<font color="#555555">009 </font> <font color="#0000AA"><homepage href=</font><font color="#0000FF">"http://www.javabuch.de"</font><font color="#0000AA">/></font>
<font color="#555555">010 </font> <font color="#0000AA"><description></font>HJP3 WebStart Demo Application<font color="#0000AA"></description></font>
<font color="#555555">011 </font> <font color="#0000AA"><icon href=</font><font color="#0000FF">"wstest.gif"</font><font color="#0000AA">/></font>
<font color="#555555">012 </font> <font color="#0000AA"><offline-allowed/></font>
<font color="#555555">013 </font><font color="#0000AA"></information></font>
<font color="#555555">014 </font>
<font color="#555555">015 </font><font color="#0000AA"><information locale=</font><font color="#0000FF">"de"</font><font color="#0000AA">></font>
<font color="#555555">016 </font> <font color="#0000AA"><description></font>HJP3 WebStart Demo-Applikation<font color="#0000AA"></description></font>
<font color="#555555">017 </font> <font color="#0000AA"><offline-allowed/></font>
<font color="#555555">018 </font><font color="#0000AA"></information></font>
<font color="#555555">019 </font>
<font color="#555555">020 </font><font color="#0000AA"><security></font>
<font color="#555555">021 </font> <font color="#00AA00"><!-- <all-permissions/></font> -->
<font color="#555555">022 </font><font color="#0000AA"></security></font>
<font color="#555555">023 </font>
<font color="#555555">024 </font><font color="#0000AA"><resources></font>
<font color="#555555">025 </font> <font color="#0000AA"><j2se version=</font><font color="#0000FF">"1.3+"</font><font color="#0000AA">/></font>
<font color="#555555">026 </font> <font color="#0000AA"><jar href=</font><font color="#0000FF">"wstest.jar"</font><font color="#0000AA">/></font>
<font color="#555555">027 </font><font color="#0000AA"></resources></font>
<font color="#555555">028 </font>
<font color="#555555">029 </font><font color="#0000AA"><application-desc main-class=</font><font color="#0000FF">"Listing3813"</font><font color="#0000AA">/></font>
<font color="#555555">030 </font>
<font color="#555555">031 </font><font color="#0000AA"></jnlp></font></pre>
</font>
</td>
</tr>
</table>
<i>
Listing 13.10: Eine WebStart-Deskriptordatei</i></p>
<p>
Die Datei besteht aus dem <font color="#000077"><tt>jnlp</tt></font>-Element
und vier Deskriptoren. Das <font color="#000077"><tt>jnlp</tt></font>-Element
enthält die Attribute <font color="#000077"><tt>codebase</tt></font>
und <font color="#000077"><tt>href</tt></font>. In <font color="#000077"><tt>codebase</tt></font>
wird das Basisverzeichnis für alle <i>relativen</i> URLs angegeben,
<font color="#000077"><tt>href</tt></font> ist die Lokation der <font color="#000077"><tt>jnlp</tt></font>-Datei
selbst. <font color="#000077"><tt>localhost:7777</tt></font> bedeutet,
dass auf dem eigenen Rechner ein Web-Server auf TCP-Port 7777 läuft.
Wir werden später noch zeigen, wie der in <a href="k100295.html#experimentwebserver">Abschnitt 46.3.3</a>
vorgestellte <font color="#000077"><tt>ExperimentalWebServer</tt></font>
für diesen Zweck verwendet werden kann. Alle URLs innerhalb der
Datei können entweder absolut oder relativ zur <font color="#000077"><tt>codebase</tt></font>
angegeben werden.
<p>
Die vier Deskriptoren haben folgende Bedeutung:
<ul>
<li>In <font color="#000077"><tt>information</tt></font> werden beschreibende
Angaben zur Applikation gemacht. Neben Titel, Icon, Beschreibung und
Hersteller des Programms kann eine Homepage angegeben werden, auf
der der Anwender weitere Informationen zum Programm finden kann. Wichtig
ist der Eintrag <font color="#000077"><tt>offline-allowed</tt></font>.
Er gibt an, dass das Programm auch ohne Verbindung zum Internet (genauer:
zu seinen Download-Quellen) betrieben werden kann. Das geht natürlich
nur dann, wenn der WebStart-Anwendungsmanager bereits alle Teile der
Applikation geladen und lokal im Cache gespeichert hat. In diesem
Fall würde dann auch nicht geprüft, ob Teile der Anwendung
veraltet sind und ein Update fällig wäre.
<p>
Das <font color="#000077"><tt>information</tt></font>-Element kann
ein optionales <font color="#000077"><tt>locale</tt></font>-Argument
haben und mehrfach vorhanden sein. So lassen sich Angaben machen,
die nur für eine bestimmte Sprachversion gelten. In unserem Beispiel
gibt es ein zweites <font color="#000077"><tt>information</tt></font>-Element,
in dem die <font color="#000077"><tt>description</tt></font> in deutscher
Sprache angegeben wird. Als mögliche Werte für das <font color="#000077"><tt>locale</tt></font>-Argument
können die in <a href="k100118.html#internationalisierung">Abschnitt 17.4</a>
erläuterten Sprachen-/Länderstrings der <a href="index_l.html#ixb100561"><font color=#000080><tt>Locale</tt></font></a>-Klasse
verwendet werden.
<li>Das Element <font color="#000077"><tt>security</tt></font> dient
zur Angabe von sicherheitsrelevanten Informationen. Sein wichtigstes
Element ist <font color="#000077"><tt>all-permissions</tt></font>,
mit dem der volle Zugriff auf alle Systemressourcen gefordert wird.
Analog zu einem Applet wird dieser aber nur dann gewährt, wenn
alle jar-Dateien signiert sind und der Anwender das zum Signieren
verwendete Zertifikat akzeptiert. In unserem Beispiel wurde dieses
Element auskommentiert, und die Anwendung hat daher nur eingeschränkten
Zugriff auf Systemressourcen. Ähnlich wie ein Applet kann eine
unsignierte WebStart-Applikation daher keinen nennenswerten Schaden
am System anrichten. Allerdings sind diese Einschränkungen etwas
weniger ausgeprägt als bei Applets, und es gibt einige APIs,
um in kontrollierter Weise auf diese Systemressourcen zuzugreifen.
<li>Das Element <font color="#000077"><tt>resources</tt></font> dient
dazu, die zum Betrieb der Anwendung erforderlichen Ressourcen zu spezifizieren.
Hier wird angegeben, welche Java-Version zum Starten der Anwendung
verwendet werden soll (jede WebStart-Applikation kann ihre eigene
haben), und welche jar-Dateien oder plattformspezifischen Libraries
benötigt werden. In unserem Beispiel soll die Anwendung mit dem
JRE 1.3 oder höher betrieben werden, und die zum Betrieb erforderliche
jar-Datei <font color="#660099">wstest.jar</font> soll relativ zur
<font color="#000077"><tt>codebase</tt></font> geladen werden.
<li>Das letzte Element <font color="#000077"><tt>application-desc</tt></font>
gibt an, wie die Applikation zu starten ist. In unserem Beispiel wird
lediglich der Name der Klasse mit der <font color="#000077"><tt>main</tt></font>-Methode
benötigt. Zusätzlich könnten hier bei Bedarf <font color="#000077"><tt>argument</tt></font>-Unterelemente
angegeben werden, die beim Aufruf als Parameter an die Anwendung übergeben
werden.
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Anmerkung: das <font color="#000077"><tt>offline-allowed</tt></font>-Element
wird hier nur deshalb dupliziert, weil es auf Grund eines Bugs in
der zum JDK 1.4 gehörenden WebStart-Version 1.0.1 nicht vererbt
wurde. Laut BugParade sollte dieser Fehler ab WebStart 1.2 behoben
sein.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF"> Warnung </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel4id013005002003"></a>
<h4>Die Anwendung auf dem Web-Server installieren </h4>
<p>
Zunächst benötigen wir für unsere Beispielapplikation
einen Web-Server. Der Einfachheit halber wollen wir dazu den in <a href="k100295.html#experimentwebserver">Abschnitt 46.3.3</a>
vorgestellten <font color="#000077"><tt>ExperimentalWebServer</tt></font>
verwenden. Wir kopieren dazu die Datei <font color="#660099">ExperimentalWebServer.java</font>
aus dem Verzeichnis <font color="#000077"><tt>examples</tt></font>
ebenfalls in unser Beispielverzeichnis und übersetzen sie:
<font color="#333300">
<pre>
javac ExperimentalWebServer.java
</pre>
</font>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Soll ein anderer Web-Server verwendet werden, ist es wichtig, den
Mime-Typ für jnlp-Dateien korrekt zu konfigurieren. Der Server
muss eine Datei mit der Erweiterung <font color="#660099">.jnlp</font>
stets mit dem Mime-Typ <a name="ixa100845"><a href="index_a.html#ixb100648"><font color=#000080><tt>application/x-java-jnlp-file</tt></font></a></a>
an den Client übertragen. Andernfalls könnte es sein, dass
der WebStart-Applikationsmanager nicht korrekt aufgerufen wird. In
unserem <font color="#000077"><tt>ExperimentalWebServer</tt></font>
ist dieser Typ bereits vorkonfiguriert, zusätzliche Anpassungen
sind daher nicht nötig.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Wir wollen nun noch eine einfache HTML-Datei <font color="#660099">wstest.html</font>
zum Starten der WebStart-Applikation erstellen. Sie enthält im
wesentlichen einen Link auf die jnlp-Datei:
<a name="listingid013011"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA"><html></font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA"><head></font>
<font color="#555555">004 </font><font color="#0000AA"><title></font>HJP3 WebStart Demo Application<font color="#0000AA"></title></font>
<font color="#555555">005 </font><font color="#0000AA"></head></font>
<font color="#555555">006 </font>
<font color="#555555">007 </font><font color="#0000AA"><body></font>
<font color="#555555">008 </font>
<font color="#555555">009 </font><font color="#0000AA"><h2></font>HJP3 WebStart Demo Application<font color="#0000AA"></h2></font>
<font color="#555555">010 </font>
<font color="#555555">011 </font><font color="#0000AA"><a href=</font><font color="#0000FF">"wstest.jnlp"</font><font color="#0000AA">></font>Anwendung laden/starten<font color="#0000AA"></a></font>
<font color="#555555">012 </font>
<font color="#555555">013 </font><font color="#0000AA"></body></font>
<font color="#555555">014 </font>
<font color="#555555">015 </font><font color="#0000AA"></html></font></pre>
</font>
</td>
</tr>
</table>
<i>
Listing 13.11: Die HTML-Datei zum Aufruf der WebStart-Applikation</i></p>
<p>
Zusätzlich müssen wir die in der jnlp-Datei angegebene Icon-Datei
<font color="#660099">wstest.gif</font> in unser Beispielverzeichnis
kopieren. Anschließend können wir den Web-Server starten:
<font color="#333300">
<pre>
java ExperimentalWebServer 7777
</pre>
</font>
<!-- Section -->
<a name="sectlevel4id013005002004"></a>
<h4>Starten der Anwendung </h4>
<p>
Zum erstmaligen Starten der Anwendung wird die Webseite mit dem Link
auf die jnlp-Datei aufgerufen:
<p>
<a name="imageid013003"></a>
<img src="images/WebStartHtml.gif">
<p>
<p><i>
Abbildung 13.3: Die Startdatei der WebStart-Anwendung im Browser</i></p>
<p>
Wird nun der Link »Anwendung laden/starten« angeklickt,
lädt der Browser die jnlp-Datei und ruft als zugehörige
Applikation den WebStart-Applikationsmanager auf. Dieser liest die
Datei ein und lädt alle darin beschriebenen Ressourcen. Anschließend
wird die Applikation gestartet, und wir sehen das in <a href="k100246.html#aenderbarertree">Abbildung 38.10</a>
gezeigte Programm.
<p>
Beim Herunterladen hat der WebStart-Applikationsmanager alle Dateien
der Anwendung in seinen lokalen Cache kopiert. Die HTML-Datei wird
nun zum Starten nicht mehr unbedingt benötigt. Stattdessen kann
der WebStart-Applikationsmanager direkt aufgerufen werden. Nach einem
Klick auf den Menüpunkt »Ansicht.Heruntergeladene Anwendungen«
stellt er sich wie folgt dar:
<p>
<a name="imageid013004"></a>
<img src="images/WebStartMgr.gif">
<p>
<p><i>
Abbildung 13.4: Der WebStart-Applikationsmanager</i></p>
<p>
Durch Drücken des »Starten«-Buttons wird unsere Anwendung
gestartet. Die internen Abläufe unterscheiden sich dabei nicht
von denen beim Starten über den Link im Browser. Zunächst
wird stets die jnlp-Datei geladen und alle darin beschriebenen Ressourcen
überprüft bzw. aktualisiert. Sind alle Dateien verfügbar,
wird die Anwendung gestartet. Taucht ein Problem auf, bricht WebStart
den Startvorgang ab und gibt eine Fehlermeldung aus. Wir wollen hier
nicht weiter auf Details eingehen; der WebStart-Applikationsmanager
ist einfach aufgebaut, und seine Funktionen sind weitgehend selbsterklärend.
<p>
Wird eine WebStart-Anwendung das zweite Mal gestartet, fragt der Anwendungsmanager,
ob die Anwendung auf dem Desktop bzw. im Startmenü verankert
werden soll. Stimmt der Anwender zu, kann sie anschließend auch
auf diesem Weg gestartet werden.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Nachdem die Anwendung im lokalen Cache gespeichert wurde, kann sie
auch offline betrieben werden, d.h. ohne den auf Port 7777 laufenden
Webserver. Sie kann dann zwar nicht mehr über den Link im Browser
gestartet werden, aber die drei anderen Wege stehen ihr noch offen.
Stellt WebStart beim Aufruf einer Applikation fest, dass die in der
jnlp-Datei genannten Ressourcen nicht erreichbar sind, verwendet er
die lokalen Kopien und startet die Anwendung aus dem Cache. Das ist
allerdings nur möglich, wenn in der jnlp-Datei das Element <font color="#000077"><tt>offline-allowed</tt></font>
gesetzt wurde. War das nicht der Fall, kann die Anwendung nicht offline
gestartet werden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="dasjnlpapi"></a>
<h3>13.5.3 Das jnlp-API </h3>
<!-- Section -->
<a name="sectlevel4id013005003001"></a>
<h4>Services </h4>
<p>
Eingangs wurde schon erwähnt, dass unsignierte WebStart-Applikationen
nur eingeschränkten Zugriff auf lokale Systemressourcen haben.
Zwar ist - anders als bei Applets - der Aufruf von <a href="index_e.html#ixb100651"><font color=#000080><tt>System.exit</tt></font></a>
erlaubt. Dennoch gibt es einige Einschränkungen:
<ul>
<li>Der unkontrollierte Zugriff auf das lokale Dateisystem ist nicht
erlaubt
<li>Alle jar-Dateien müssen von demselben Host geladen werden
<li>Netzwerkverbindungen dürfen nur mit dem Host betrieben werden,
vom dem die jar-Dateien geladen wurden
<li>Native Libraries sind nicht erlaubt
<li>Der Zugriff auf System-Properties ist eingeschränkt
</ul>
<p>
Damit unsignierte WebStart-Anwendungen dennoch ein gewisses Maß
an praxisrelevanter Funktionalität anbieten können, stellt
die WebStart-Laufzeitumgebung einige <a name="ixa100846"><i>Services</i></a>
zur Verfügung, über die Anwendungen in kontrollierter Weise
auf Systemressourcen zugreifen können:
<ul>
<li>Der <a name="ixa100847"><a href="index_b.html#ixb100653"><font color=#000080><tt>BasicService</tt></font></a></a>
stellt (ähnlich dem <a name="ixa100848"><a href="index_a.html#ixb100654"><font color=#000080><tt>AppletContext</tt></font></a></a>)
Methoden zur Interaktion mit der Laufzeitumgebung zur Verfügung
<li>Der <a name="ixa100849"><a href="index_c.html#ixb100655"><font color=#000080><tt>ClipboardService</tt></font></a></a>
bietet Zugriff auf die systemweite Zwischenablage
<li>Der <a name="ixa100850"><a href="index_d.html#ixb100656"><font color=#000080><tt>DownloadService</tt></font></a></a>
erlaubt einer Applikation zu kontrollieren, wie ihre Ressourcen heruntergeladen
und gecached werden
<li>Mit dem <a name="ixa100851"><a href="index_f.html#ixb100657"><font color=#000080><tt>FileOpenService</tt></font></a></a>
kann die Anwendung mit Hilfe eines DateiÖffnen-Dialogs lokale
Dateien lesen
<li>Mit dem <a name="ixa100852"><a href="index_f.html#ixb100658"><font color=#000080><tt>FileSaveService</tt></font></a></a>
kann die Anwendung mit Hilfe eines DateiSpeichern-Dialogs lokale Dateien
schreiben
<li>Der <a name="ixa100853"><a href="index_p.html#ixb100659"><font color=#000080><tt>PrintService</tt></font></a></a>
erlaubt der Anwendung, auf den Drucker zuzugreifen
<li>Der <a name="ixa100854"><a href="index_p.html#ixb100660"><font color=#000080><tt>PersistenceService</tt></font></a></a>
erlaubt das Erzeugen und Lesen lokaler persistenter Daten (ähnlich
den Cookies in Web-Browsern)
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
All diese Services sind insofern als relativ sicher anzusehen, als
sie dem Programm entweder nur sehr beschränkten Zugriff auf Systemressourcen
erlauben (z.B. <a href="index_c.html#ixb100655"><font color=#000080><tt>ClipboardService</tt></font></a>,
<a href="index_p.html#ixb100660"><font color=#000080><tt>PersistenceService</tt></font></a>)
oder der Anwender per GUI-Dialog ihrer Benutzung zustimmen muss und
somit selbst entscheiden kann, welche konkreten Ressourcen verwendet
werden (z.B. <a href="index_f.html#ixb100657"><font color=#000080><tt>FileOpenService</tt></font></a>,
<a href="index_f.html#ixb100658"><font color=#000080><tt>FileSaveService</tt></font></a>,
<a href="index_p.html#ixb100659"><font color=#000080><tt>PrintService</tt></font></a>).
<p>
Dennoch sollten unsignierte WebStart-Applikationen aus potentiell
unsicheren Quellen mit der nötigen Vorsicht verwendet werden.
Einerseits ist nicht auszuschließen, dass man als Anwender im
Eifer des Gefechts einmal unbeabsichtigt einer Service-Nutzung zustimmt,
die später Schaden anrichtet. Andererseits sind <a name="ixa100855"><i>Denial-of-Service-Attacken</i></a>
nicht auszuschließen. Hierbei verwendet eine bösartige
Anwendung eine Ressource in so hohem Maße, dass sie für
den ordnungsgemäßen Betrieb anderer Anwendungen nicht mehr
ausreichend zur Verfügung steht. Beispiele sind etwa Programme,
die 100 Prozent CPU-Last verursachen oder solche, die das Dateisystem
durch Erzeugen riesiger Dateien zum Überlauf bringen. Gegen derartige
Programme bieten auch die Service-Einschränkungen der WebStart-Applikationen
keinen Schutz.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF"> Warnung </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel4id013005003002"></a>
<h4>Ein einfaches Beispiel </h4>
<p>
In diesem Abschnitt wollen wir uns ein einfaches Beispiel für
die Verwendung des jnlp-APIs ansehen. Ein Programm soll dem Anwender
einen DateiÖffnen-Dialog präsentieren und den Inhalt der
darin ausgewählten Datei auf der Konsole ausgeben (sie läßt
sich im WebStart-Applikationsmanager im Dialog »Datei.Einstellungen.Erweitert«
sichtbar machen). Auf die übrigen Services wollen wir nicht weiter
eingehen, denn ihre Anwendung ähnelt der hier beschriebenen.
Weitere Details zu den Services sind in der jnlp-API-Dokumentation
zu finden.
<p>
Soll ein WebStart-Programm auf einen jnlp-Service zugreifen, muss
dieser zunächst mit Hilfe der Klasse <a name="ixa100856"><a href="index_s.html#ixb100662"><font color=#000080><tt>ServiceManager</tt></font></a></a>
aus dem Paket <a name="ixa100857"><a href="index_j.html#ixb100663"><font color=#000080><tt>javax.jnlp</tt></font></a></a>
angefordert werden:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public static java.lang.Object lookup(java.lang.String name)
throws UnavailableServiceException
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/javax/jnlp/ServiceManager.html" onClick="this.href=getApiDoc('javax.jnlp.ServiceManager')"><font color="#660066" size=-1>javax.jnlp.ServiceManager</font></a></td>
</tr>
</table>
<p>
Die Methode <a name="ixa100858"><a href="index_l.html#ixb100664"><font color=#000080><tt>lookup</tt></font></a></a>
erwartet einen <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
mit dem Servicenamen als Argument. Dies muss ein qualifizierter Klassenname
sein, etwa »javax.jnlp.FileOpenService« oder »javax.jnlp.PrintService«.
Kann der Service nicht zur Verfügung gestellt werden (die meisten
Services sind optional und müssen nicht von allen WebStart-Clients
implementiert werden), wird eine Ausnahme des Typs <a name="ixa100859"><a href="index_u.html#ixb100665"><font color=#000080><tt>UnavailableServiceException</tt></font></a></a>
ausgelöst. Andernfalls wird der Rückgabewert auf den gewünschten
Typ konvertiert und kann dann verwendet werden.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Alle Klassen aus dem jnlp-API befinden sich im Paket <a href="index_j.html#ixb100663"><font color=#000080><tt>javax.jnlp</tt></font></a>.
Dieses ist - auch in der Version 1.4 - nicht Bestandteil des JDKs,
sondern muss separat heruntergeladen werden. Es ist wie alle anderen
WebStart-Ressourcen im Download-Bereich von <a href="http://java.sun.com/products/javawebstart/index.html">http://java.sun.com/products/javawebstart/index.html</a>
zu finden. Benötigt wird meist lediglich die Datei <font color="#660099">jnlp.jar</font>,
die zum Kompilieren in den Klassenpfad einzubinden ist. Zur Laufzeit
muss sie nicht explizit angegeben werden, sondern wird vom WebStart-Applikationsmanager
zur Verfügung gestellt.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Die nun folgenden Schritte sind Service-spezifisch. Der <a name="ixa100860"><a href="index_f.html#ixb100657"><font color=#000080><tt>FileOpenService</tt></font></a></a>
stellt beispielsweise folgende Methode zur Verfügung, um einen
DateiÖffnen-Dialog zu erzeugen:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public FileContents openFileDialog(
java.lang.String pathHint,
java.lang.String[] extensions
)
throws java.io.IOException
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/javax/jnlp/FileOpenService.html" onClick="this.href=getApiDoc('javax.jnlp.FileOpenService')"><font color="#660066" size=-1>javax.jnlp.FileOpenService</font></a></td>
</tr>
</table>
<p>
Das erste Argument <font color="#000077"><tt>pathhint</tt></font>
ist ein Vorgabewert der Anwendung für das Verzeichnis, aus dem
die Datei geladen werden soll. Das zweite Argument enthält eine
Liste von Datei-Erweiterungen, die standardmäßig angezeigt
werden. Der Rückgabewert ist entweder <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>,
falls der Dialog abgebrochen wurde, oder er enthält ein <a name="ixa100861"><a href="index_f.html#ixb100666"><font color=#000080><tt>FileContents</tt></font></a></a>-Objekt
für die vom Anwender ausgewählte Datei. Dieses kann verwendet
werden, um Informationen über die Datei abzufragen sowie um Eingabe-
oder Ausgabestreams zum Lesen und Schreiben der Datei zu beschaffen.
<p>
Wichtige Methoden der Klasse <a href="index_f.html#ixb100666"><font color=#000080><tt>FileContents</tt></font></a>
sind:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public java.lang.String getName()
throws java.io.IOException
public long getLength()
throws java.io.IOException
public boolean canRead()
throws java.io.IOException
public boolean canWrite()
throws java.io.IOException
public InputStream getInputStream()
throws java.io.IOException
public OutputStream getOutputStream(boolean overwrite)
throws java.io.IOException
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/javax/jnlp/FileContents.html" onClick="this.href=getApiDoc('javax.jnlp.FileContents')"><font color="#660066" size=-1>javax.jnlp.FileContents</font></a></td>
</tr>
</table>
<p>
<a name="ixa100862"><a href="index_g.html#ixb100667"><font color=#000080><tt>getName</tt></font></a></a>
liefert den Namen der Datei, und mit <a name="ixa100863"><a href="index_g.html#ixb100668"><font color=#000080><tt>getLength</tt></font></a></a>
kann ihre Länge bestimmt werden. Mit <a name="ixa100864"><a href="index_c.html#ixb100669"><font color=#000080><tt>canRead</tt></font></a></a>
und <a name="ixa100865"><a href="index_c.html#ixb100670"><font color=#000080><tt>canWrite</tt></font></a></a>
kann festgestellt werden, ob Lese- bzw. Schreibzugriffe erlaubt sind.
<a name="ixa100866"><a href="index_g.html#ixb100671"><font color=#000080><tt>getInputStream</tt></font></a></a>
beschafft einen <a href="index_i.html#ixb100642"><font color=#000080><tt>InputStream</tt></font></a>,
mit dem die Datei gelesen werden kann, und <a name="ixa100867"><a href="index_g.html#ixb100672"><font color=#000080><tt>getOutputStream</tt></font></a></a>
stellt einen <a href="index_o.html#ixb100673"><font color=#000080><tt>OutputStream</tt></font></a>
zum Schreiben der Datei zur Verfügung. Das Argument <font color="#000077"><tt>overwrite</tt></font>
gibt dabei an, ob der bestehende Inhalt überschrieben oder die
neuen Daten an das Ende der bestehenden Datei angehängt werden
sollen.
<p>
Nach diesen Vorbemerkungen können wir uns nun das Beispielprogramm
ansehen:
<a name="listingid013012"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#00AA00">/* WebStartTest2.java */</font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">import</font> java.io.*;
<font color="#555555">004 </font><font color="#0000AA">import</font> javax.jnlp.*;
<font color="#555555">005 </font>
<font color="#555555">006 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> WebStartTest2
<font color="#555555">007 </font>{
<font color="#555555">008 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
<font color="#555555">009 </font> {
<font color="#555555">010 </font> <font color="#0000AA">try</font> {
<font color="#555555">011 </font> <font color="#00AA00">//FileOpenService anfordern</font>
<font color="#555555">012 </font> FileOpenService fos = (FileOpenService)ServiceManager.lookup(
<font color="#555555">013 </font> <font color="#0000FF">"javax.jnlp.FileOpenService"</font>
<font color="#555555">014 </font> );
<font color="#555555">015 </font> <font color="#00AA00">//DateiÖffnen-Dialog aufrufen</font>
<font color="#555555">016 </font> FileContents fc = fos.openFileDialog(<font color="#006699">null</font>, <font color="#006699">null</font>);
<font color="#555555">017 </font> <font color="#0000AA">if</font> (fc == <font color="#006699">null</font>) {
<font color="#555555">018 </font> System.err.println(<font color="#0000FF">"openFileDialog fehlgeschlagen"</font>);
<font color="#555555">019 </font> } <font color="#0000AA">else</font> {
<font color="#555555">020 </font> <font color="#00AA00">//Dateiinhalt auf der Konsole ausgeben</font>
<font color="#555555">021 </font> InputStream is = fc.getInputStream();
<font color="#555555">022 </font> <font color="#006699">int</font> c;
<font color="#555555">023 </font> <font color="#0000AA">while</font> ((c = is.read()) != -1) {
<font color="#555555">024 </font> System.out.print((<font color="#006699">char</font>)c);
<font color="#555555">025 </font> }
<font color="#555555">026 </font> is.close();
<font color="#555555">027 </font> }
<font color="#555555">028 </font> } <font color="#0000AA">catch</font> (UnavailableServiceException e) {
<font color="#555555">029 </font> System.err.println(<font color="#0000FF">"***"</font> + e + <font color="#0000FF">"***"</font>);
<font color="#555555">030 </font> } <font color="#0000AA">catch</font> (IOException e) {
<font color="#555555">031 </font> System.err.println(<font color="#0000FF">"***"</font> + e + <font color="#0000FF">"***"</font>);
<font color="#555555">032 </font> }
<font color="#555555">033 </font> <font color="#00AA00">//10 Sekunden warten, dann Programm beenden</font>
<font color="#555555">034 </font> <font color="#0000AA">try</font> {
<font color="#555555">035 </font> Thread.sleep(10000);
<font color="#555555">036 </font> } <font color="#0000AA">catch</font> (InterruptedException e) {
<font color="#555555">037 </font> }
<font color="#555555">038 </font> System.exit(0);
<font color="#555555">039 </font> }
<font color="#555555">040 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/WebStartTest2.java"><font color="#000055" size=-1>WebStartTest2.java</font></a></td>
</tr>
</table>
<i>
Listing 13.12: Ein Beispielprogramm für das jnlp-API</i></p>
<p>
Das Programm kann wie im vorigen Abschnitt gezeigt übersetzt,
in eine WebStart-Applikation verpackt und ausgeführt werden.
Wenn die Konsole im WebStart-Applikationsmanager aktiviert wurde,
kann mit dem Programm jede beliebige Datei gelesen werden - vorausgesetzt,
der Anwender stimmt im DateiÖffnen-Dialog zu.
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100087.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100089.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|