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