Applets - auf Matthias

Werbung
Netzprogrammierung
Applets etc.
Robert Tolksdorf und Peter Löhr
Überblick
1.
2.
3.
4.
Nachgeladener Code
Applets
ActiveX Controls
Zusammenfassung
Robert Tolksdorf und Peter Löhr
3
5
38
42
2
Nachgeladener Code
Robert Tolksdorf und Peter Löhr
Nachgeladener JavaScript Code
Zur Erinnerung - einfaches Beispiel aus 14-Web-JS, S. 8:
<html><head>
<script> function check() { ..... } </script>
</head><body>
.....
<input type="button" name="checkButton" value="check input"
onclick=" check(); " >
.....
</body></html>
Skript-Code über URL nachladen statt einbetten:
<html><head>
<script src="check.js"></script>
</head><body> ...
enthält function check() ...
Robert Tolksdorf und Peter Löhr
4
Applets
Robert Tolksdorf und Peter Löhr
Applets
• Applets sind (kleinere) Java-Programme, die in einem
Java-fähigen Web Browser gestartet werden können.
• Ein Element <applet> oder <object> in einer HTML-
Seite enthält eine URL, die angibt, von woher das Applet
nachgeladen werden kann.
• Alle Applets sind Unterklassen von java.applet.Applet .
Applet hat folgende Oberklassen:
•
•
•
•
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
• javax.swing.JApplet, wenn Swing benutzt werden soll.
Robert Tolksdorf und Peter Löhr
6
Dokumentstruktur
... mit Applets:
<html><head> ..... </head>
<body>
.....
<applet .....>
<param ... >
<param ... >
belegt einen Bereich im Fenster
.....
</applet>
.......
<applet .....>
.....
belegt einen Bereich im Fenster
</applet>
weiter unten
.......
</body></html>
Robert Tolksdorf und Peter Löhr
7
Beispiel für ein <applet>-Element
<html><head><title>Kreis-Applet</title></head>
<body><h3>Hier kommt das Kreis-Applet:</h3> <br><br>
<applet codebase="."
(bzw. URL des Klassenverzeichnisses/archivs)
code="Kreis.class"
width="270"
height="150"
alt="Das Kreis-Applet läuft leider nicht!">
<param name="text" value="Netzprogrammierung">
<param name="radius" value="75">
<param name="schritt" value="5">
<p> Hier sollte eigentlich ein <b>Kreis-Applet</b> dargestellt
werden, aber Ihr Browser versteht leider keine Applets.
</p>
</applet>
<br><br>Das war's.
</body></html>
Robert Tolksdorf und Peter Löhr
8
Beispiel für ein <applet>-Element
Robert Tolksdorf und Peter Löhr
9
Applet Viewer
... dient zum Anzeigen von Applets ohne Einsatz eines Browsers.
Anstelle eines regulären HTML-Dokuments genügt auch das
Applet-Element <applet ...> ... </applet>
$ appletviewer Kreis.html &
[1] 11129
$
! Allgemein:
$ appletviewer ...URL... !
Empfehlenswert:
$ man appletviewer
Robert Tolksdorf und Peter Löhr
10
Methoden in Applets
• Zum Verwalten eines Applets werden von einem Browser
oder Applet Viewer bestimmte Methoden aufgerufen.
• Diese Methoden sind in der Klasse
Applet (vor)definiert
und können - müssen nicht! - in eigenen Applets
überschrieben werden.
• public void init()
•
•
•
•
wird vom Browser vor dem Starten des Applet aufgerufen
Initialisierung (Zeichensatz, Vorder- und Hintergrundfarbe)
Übernahme von Parametern (Methode getParameter(), s.u.)
einem Konstruktor vergleichbar
Robert Tolksdorf und Peter Löhr
11
Methoden in Applets
• public void start()
• wird vom Browser nach init aufgerufen
• und immer dann, wenn der Benutzer nach Betrachtung
anderer Seiten zur Seite zurückkehrt, die das Applet enthält
• wird insbesondere für das Starten von Animation eingesetzt
• public void stop()
• wird vom Browser aufgerufen, wenn der Benutzer die Seite
verlässt, die das Applet enthält
• wird insbesondere für das Stoppen von Animation eingesetzt
• Beachte: ein geladenes Applet bleibt bis zur Beendigung
des Browsers geladen. Selbst ein explizites Neu-Laden der
Seite bewirkt i.d.R. kein Neu-Laden des Applet.
Robert Tolksdorf und Peter Löhr
12
Methoden in Applets
• public void paint(Graphics g)
•
•
•
•
•
•
stammt aus der Oberklasse java.awt.Container
wird zur Darstellung von Graphik verwendet
das Graphics-Objekt stellt der Browser zur Verfügung
wird nach jedem start aufgerufen
... und immer dann, wenn durch manuelle Änderungen am
Fenster (Größenveränderung, Ikonisierung) der Inhalt neu
angezeigt werden muss
• ... und immer dann, wenn der Applet-Code ein repaint()
ausführt
public void destroy()
• wird nach Beendigung von stop vom Browser aufgerufen,
wenn das Applet aus dem Browser entfernt wird
• dient zur Freigabe belegter Ressourcen
Robert Tolksdorf und Peter Löhr
13
Methoden in Applets
• public String[][] getParameterInfo()
• überschreibt Methode aus der Klasse Applet (die null liefert)
• liefert ein Feld mit erschöpfende Informationen zu den
Parametern eines Applet. Jedes Element des Feldes
beschreibt einen Parameter, und zwar als 3-elementiges
Feld von
• Parametername
• Parametertyp
• Parameterbeschreibung
• public String getAppletInfo()
• überschreibt Methode aus der Klasse Applet (die null liefert)
• stellt allgemeine Informationen über das Applet zur
Verfügung (AutorInnen, Benutzung, Implementierung usw.)
Robert Tolksdorf und Peter Löhr
14
Anfragen beim Browser
• Die folgenden Methoden kann das Applet einsetzen, um
vom Browser Informationen zu erhalten:
• public String getParameter(String name)
• liefert für name=="par" den Wert "val" eines AppletParameters gemäß <param name="par" value="val">
• public URL getCodeBase() liefert die Codebasis des
Applet
• public URL getDocumentBase() liefert die URL des
Dokuments
• public AppletContext getAppletContext()
liefert ein Kontext-Objekt mit weiteren hilfreichen
Funktionen (s.u.)
• ..... (weitere)
Robert Tolksdorf und Peter Löhr
15
Effekte über den Browser
• public void showStatus(String msg)
gibt eine Nachricht in der Statuszeile des Browsers aus
• public Image getImage(URL image)
lädt das angegebene Image und macht es zur
Darstellung verfügbar
• public void play(URL audio)
lädt das angegebene AudioClip und spielt es ab
• ..... (weitere)
Robert Tolksdorf und Peter Löhr
16
Effekte über den Browser
• Methoden des AppletContext :
• public void showDocument(URL url)
ersetzt das aktuelle durch das angegebene Dokument
• public Applet getApplet(String name)
liefert das Applet mit dem im HTML-Text angegebenen
name-Attribut name (!)
• ..... (weitere)
Resümee: Im Gegensatz zu JavaScript erlauben Applets
keinen direkten Umgang mit den umgebenden HTMLElementen - das ist aber auch nicht ihr Daseinszweck.
Beachte: Interaktion mit Server möglich (Sockets)
(Verbindungen zu anderen Systemen nicht erlaubt!)
Robert Tolksdorf und Peter Löhr
17
Das Applet Kreis.java
import java.awt.*;
// für Graphiken
import java.applet.*; // für Applets
public class Kreis extends Applet {
private String text;
private int radius, schritt;
public void init() {
System.out.println("init...");
// nur Applet Viewer
text = getParameter("text");
if (text==null) text = ".";
radius = getIntParameter("radius");
schritt = getIntParameter("schritt");
}
protected int getIntParameter(String name) {
try { return Integer.parseInt(getParameter(name)); }
catch (NumberFormatException e) { return 1; }
}
Robert Tolksdorf und Peter Löhr
18
Das Applet Kreis.java
public void paint(Graphics g) {
g.setColor(Color.black);
for (int x=-radius; x<=radius; x+=schritt) {
int y = (int)Math.sqrt(Math.pow(radius,2)-Math.pow(x,2));
g.drawString(text, x+radius, y+radius);
g.drawString(text, x+radius, -y+radius); }
}
public String[][] getParameterInfo() {
String[][] info = {{"text", "Zeichenkette", "Ausgabetext"},
{"radius", "natürliche Zahl", "Radius in Pixel"},
{"schritt", "natürliche Zahl", "Schrittweite in Pixel"}};
return info;
}
public String getAppletInfo() {
return "Text-Kreis-Applet\n" +
"von Wilhelm Weisweber([email protected])";
}
}
// Ende der Klasse Kreis
Robert Tolksdorf und Peter Löhr
19
Applets mit Interaktion
• Die Klasse
Applet ist eine mittelbare Unterklasse der
Klasse Component.
• Somit stehen alle Methoden der Klasse
Component zur
Bearbeitung von Ereignissen zur Verfügung:
• zum Überschreiben (pro Ereignisklasse XYZEvent)
• protected void processEvent(AWTEvent)
• protected void processXYZEvent(XYZEvent)
• zum Aufrufen (pro Ereignisklasse XYZEvent)
•
•
•
•
public
public
public
public
void
void
void
void
addXYZListener(XYZListener)
removeXYZListener(XYZListener)
enableEvents(long mask)
disableEvents(long mask)
• Beispiele für Ereignisklassen:
KeyEvent, MouseEvent, ...
(Unterklassen von AWTEvent)
Robert Tolksdorf und Peter Löhr
20
Ein einfaches Beispiel
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Interaction extends Applet {
private TextField text = new TextField();
private Button button = new Button("show");
public void init() {
this.setLayout(new GridLayout(2,1));
this.add(text);
this.add(button);
Rectangle r = this.getBounds();
// aus <applet ... width..
this.setFont(new Font("Helvetica", Font.PLAIN, r.height/4));
ActionListener action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
showStatus(text.getText());
} };
button.addActionListener(action); }
}
Robert Tolksdorf und Peter Löhr
21
Ein einfaches Beispiel
Robert Tolksdorf und Peter Löhr
22
Applets mit Animation
• Unter Verwendung von Threads kann man mit Applets
Animationen realisieren:
• public class Animation extends Applet
implements Runnable
• public void run() { ..... } bereitstellen
• Thread erzeugen mit new Thread(this)
• Es empfiehlt sich, start/stop geeignet zu implementieren!
Robert Tolksdorf und Peter Löhr
23
Beispiel: Applet mit Animation
<html><body>
<applet code="Drop.class“
width="250"
height="250">
</applet>
</body></html>
press me!
Robert Tolksdorf und Peter Löhr
24
Drop.java
import java.applet.*;
import java.awt.*;
public class Drop extends Applet implements Runnable {
private Thread drop = null;
public void start() {
drop = new Thread(this);
drop.start(); }
public void run() {
Graphics g = this.getGraphics();
Rectangle re = this.getBounds(); // Applet-Bereich
int
r=0,
// aktueller Radius
d,
// aktueller Durchmesser
width=re.width/2,
// halbe Applet-Breite
height=re.height/2; // halbe Applet-Höhe
while (true) {
.....
Robert Tolksdorf und Peter Löhr
25
Drop.java
while (true) {
if (r>Math.max(width,height)) r = 0;
d = 2*r;
g.clearRect(0,0,re.width,re.height); // Kreis löschen
g.drawOval(width-r,height-r,d,d); // neuer Kreis
g.drawOval(width-(r-1),height-(r-1),d-2,d-2);
r++;
// 2 Kreise für "Linienbreite 2"
try { Thread.sleep(20); }
catch (InterruptedException e) { break; } }
}
// Ende Methode run()
public void stop() {
drop.interrupt();
drop = null; }
public String getAppletInfo() {
return "Tropfen-Applet\nVon Wilhelm Weisweber"; }
}
// Ende Klasse Drop
Robert Tolksdorf und Peter Löhr
26
JavaScript -> Applet
• JavaScript kann auf public-Elemente von Applets zugreifen:
<html><head><title>JS to Applet</title></head>
<body>
<applet id="applet" code ="Interaction.class"
width="200" height="100" >
</applet>
<script> document.applet.write("hallo"); </script>
</body>
</html>
.....
public class Interaction extends Applet {
private TextField text = new TextField();
private Button button = new Button("show");
public void init() { ..... }
public void write(String s) { text.setText(s); }
}
Robert Tolksdorf und Peter Löhr
27
JavaScript -> Applet
• Stoppen und Neustarten einer Animation:
<html><head><title>Stoppable drop</title></head>
<body>
<applet id="applet" code ="Drop.class"
width="250" height="250" >
</applet>
<form>
<input type="button" value="Start"
onClick="document.applet.start()">
<input type="button" value="Stop"
onClick="document.applet.stop()">
</form>
</body>
</html>
Robert Tolksdorf und Peter Löhr
28
Applet -> JavaScript
• Applet kann auf die DOM-Objekte des Dokuments und auf
die JavaScript-Funktionen zugreifen:
import java.applet.*;
import netscape.javascript.JSObject;
// nicht Java-Standard!
public class ApptoJS extends Applet {
public void init() {
JSObject window = JSObject.getWindow(this);
JSObject document = (JSObject)window.getMember("document");
// get document title:
String title = (String)document.getMember("title");
// call JS function:
String bold = "true";
String args[] = { title, bold };
window.call("fun", args);
}
}
http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/java_js.html
http://www.codeproject.com/KB/scripting/javatojs.aspx
Robert Tolksdorf und Peter Löhr
29
HTML-Element <object>
• Mit <object> kann auf nachzuladende Ressourcen sehr
verschiedener Medientypen verwiesen werden (Text,
Bild, Ton, ...)
• <object> kann auch als Alternative zu <applet>
verwendet werden (sollte auch verwendet werden, weil
<applet> irgendwann ausrangiert wird):
<applet code="Drop.class"
width="250" height="250" ...>
.....
</applet>
Stattdessen auch
<object classid="java:Drop.class" codetype="application/java"
width="250" height="250" ...>
.....
</object>
Robert Tolksdorf und Peter Löhr
30
andere Medientypen (keine Applets)
<html><body><br>
<h4>An die Freude</h4>
<object data="schiller.txt"
type="text/plain"
width="300" height="150" border="1">
</object>
<br><br>
<object data="http://ingeb.org/Lieder/freudesc.mid"
type="audio/midi"
width="100" height="50" >
</object>
Weglassen macht den Regler unsichtbar
</body></html>
• type ist entbehrlich, wenn Dateierweiterung genügt (so hier).
• <embed src="http://ingeb.org/Lieder/freudesc.mid" ... ></embed>
ist veraltetes Netscape, funktioniert aber meistens auch noch.
Robert Tolksdorf und Peter Löhr
31
andere Medientypen (keine Applets)
<object data="http://www.youtube.com/v/NKusg6Jyc9Y&rel=1"
type="application/x-shockwave-flash"
width="425" height="355">
</object>
oder
<embed src="http://www.youtube.com/v/NKusg6Jyc9Y&rel=1"
type="application/x-shockwave-flash"
width="425" height="355">
</embed>
Robert Tolksdorf und Peter Löhr
32
Sicherheit von Applets
• Applets sind „unbekannter Code aus dem Netz“ -
wie sichert man sich vor Trojanischen Pferden?
• Ursprünglicher Ansatz von Java (ähnlich JavaScript):
Applets werden grundsätzlich daran gehindert, auf lokale
Ressourcen zuzugreifen - sie laufen in einer vom Browser
eingerichteten „sandbox“.
• Aktuelle Lösung: Einsatz eines Security Manager (siehe
06-RMI-2, S. 16ff) - die Rechte von Applets werden durch
Richtliniendateien (policy files) festgelegt.
• Zur Erinnerung: Die private Richtliniendatei des Benutzers
ist ~/.java.policy .
• Fehlt diese Datei, so werden durch die globale Richtliniendatei
java.policy nur sehr wenige Rechte zugestanden.
• Ansonsten werden zusätzliche Rechte zugestanden.
Robert Tolksdorf und Peter Löhr
33
Beispiel
Gewinnen Sie hier eine Reise nach Hawaii !
Robert Tolksdorf und Peter Löhr
34
Beispiel: Hawaii-Applet
Gewinnen Sie hier eine Reise nach Hawaii !
• Also Schutz verringern, um Reise zu gewinnen:
.java.policy mit
grant
{ permission java.security.AllPermission };
• Dies liefert
• -> .java.policy nur mit extrem restriktiven Rechten
einsetzen - aber mit welchen??
-> Sicherheits-Spezifikation des Applet erforderlich!
Vertrauen ??
Robert Tolksdorf und Peter Löhr
35
Beispiel: Hawaii-Applet
http://page.mi.fu-berlin.de/lohr/test/hawaii.html enthält
import java.io.*;
<applet codebase="http://page.mi.fu-berlin.de/lohr/classes/"
import java.awt.*;
code="Write.class" width=700 height=50 >
import java.applet.*;
<param name="file" value="/Users/lohr/tmp/text" >
public class Write extends Applet {
</applet>
String file;
PrintWriter out;
public void init() { file = getParameter("file"); }
public void paint(Graphics g) {
try {
Rectangle r = this.getBounds();
g.setColor(Color.pink);
g.fillRect(0,0,r.width,r.height);
g.setColor(Color.black);
out = new PrintWriter(file);
out.println("Kilroy was here.");
out.close();
file = ".keystore";
g.drawString("Ich habe gerade Ihre Datei "
+ file + " überschrieben.", 20, 20); }
catch (IOException e) { g.drawString("IOException: " + e, 20, 20); }
catch (SecurityException e) { g.drawString("SecurityException: " + e, 20, 20); }
}
}
Robert Tolksdorf und Peter Löhr
36
Signierter Code
• In der Richtliniendatei kann eine digitale Unterschrift
gefordert werden (siehe 06-RMI-2, S. 21). Signiert
werden JAR-Dateien - mit Hilfe des jarsigner.
(http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed.html)
• Der Browser warnt den Benutzer vor dem Herunterladen
eines Applet und versucht eine Verifikation der digitalen
Unterschrift (mit Hilfe eines gültigen Zertifikats).
• Erfolgreiche Verifikation garantiert lediglich, dass das
Applet aus der im Zertifikat angegebenen Quelle stammt
und dass es nicht im Netz manipuliert wurde! Es bleibt die
Frage, welche Rechte Sie dem Applet gewähren wollen!
• Verweigern Sie die Annahme des Applet, wenn Sie dem
Eigentümer des Zertifikats nicht hundertprozentig
vertrauen!
Robert Tolksdorf und Peter Löhr
37
ActiveX Controls
Robert Tolksdorf und Peter Löhr
ActiveX Controls
• Das Component Object Model (COM) von Microsoft stellt
eine Plattform für komponentenbasierte Software dar
(entfernt vergleichbar den JavaBeans oder EJB).
• Ein ActiveX Control ist ein COM-Objekt (genauer: ein
OLE Control), das gewissen minimalen Anforderungen
genügt, um in einer geeigneten Container-Umgebung
funktionsfähig zu sein.
• Ein ActiveX Control besteht aus Objektcode (Binärcode)
und ist ausschließlich unter MS Windows einsetzbar. Die
Dateinamen-Erweiterung ist .ocx.
• Beispiel: Der Windows Media Player kann als ActiveX
Control Plug-in in den Internet Explorer geladen werden.
Der Code ist im Windows Registry verzeichnet unter
CLSID:05589FA1-C356-11CE-BF01-00AA0055595A
Robert Tolksdorf und Peter Löhr
39
ActiveX Controls
<object codebase="
...URL..... "
classid="CLSID: ...UUID... "
<param ..... > .....
</object>
z.B. mit bereits lokal vorhandenem Plug-in (hier Media Player)
<object classid="CLSID:05589FA1-C356-11CE-BF01-00AA0055595A"
width="200" height="45" >
<param name="filename"
value="http://ingeb.org/Lieder/freudesc.mid">
</object>
Robert Tolksdorf und Peter Löhr
40
ActiveX Controls: Sicherheit
• ActiveX Controls laufen mit den Rechten des Benutzers
und unterliegen keinerlei weiterer Kontrolle! Sie können
Trojanische Pferde sein!
• Daher werden Controls typischerweise digital signiert.
• Der Browser warnt den Benutzer vor dem Herunterladen
eines Control und versucht eine Verifikation der digitalen
Unterschrift (mit Hilfe eines gültigen Zertifikats).
• Erfolgreiche Verifikation garantiert lediglich, dass das
Control aus der im Zertifikat angegebenen Quelle stammt
und dass es nicht im Netz manipuliert wurde.
• Verweigern Sie die Annahme des Control, wenn Sie dem
Eigentümer des Zertifikats nicht hundertprozentig
vertrauen!
Robert Tolksdorf und Peter Löhr
41
Zusammenfassung
Robert Tolksdorf und Peter Löhr
Zusammenfassung
• Applets
•
•
•
•
HTML-Einbindung mit Element <applet> oder <object>
Steuerelemente, Ereignisse, Grafik-Display benutzen
Methoden init, start, paint, ...
Applets mit Animation
• Threading einsetzen
• start und stop für Kontrolle durch Browser
• Interaktion Applets <-> JavaScript
• ActiveX Controls
• Binärcode
• häufig bereits als Plug-in beim Browser vorhanden
• Sicherheit, Sicherheit, Sicherheit!
Robert Tolksdorf und Peter Löhr
43
Literatur
• St. Münz: Web-Seiten professionell erstellen (3.Aufl.).
Addison-Wesley 2008
(Siehe auch SelfHTML: http://www.selfhtml.org)
• Sun Microsystems: The Java Tutorial. Trail: Writing Applets.
http://java.sun.com/docs/books/tutorial/applet/index.html
• Microsoft: ActiveX Controls. http://msdn.microsoft.com/
en-us/library/aa751968(VS.85).aspx
Robert Tolksdorf und Peter Löhr
44
Herunterladen