© 2009 – 2014, Prof. Dr. D. Ratz 17 Applets Programmieren für das Internet 17 - 0 © 2009 – 2014, Prof. Dr. D. Ratz 17.1 Erstellen und Ausführen von Applets Selbständig laufende Anwendung (Programm bzw. Application) Quellprogramm Java-Compiler Java-Bytecode Java-Interpreter Ablauf des Programms Applet (Application im Internet ) Quellprogramm auf dem Server Java-Compiler beim Server Java-Bytecode auf dem Server „eingebettet“ in HTML-Seite Appletviewer oder Browser beim Client Java-Interpreter beim Client Ablauf des Applet Graphische Anwendung, die von - einem HTML-Browser oder - einem Applet-Viewer aufgerufen wird 17 - 1 © 2009 – 2014, Prof. Dr. D. Ratz Erstellen und Ausführen von Applets • Erinnerung: Frame mit Text import java.awt.*; import javax.swing.*; public class FrameMitText extends JFrame { Container c; // Container dieses Frames JLabel beschriftung; // Label, das im Frame erscheinen soll public FrameMitText() { // Konstruktor c = getContentPane(); c.setLayout(new FlowLayout()); beschriftung = new JLabel("Label-Text im Frame"); c.add(beschriftung); } } 17 - 2 © 2009 – 2014, Prof. Dr. D. Ratz Erstellen und Ausführen von Applets • Jetzt alternativ das gleiche Beispiel als Applet import java.awt.*; import javax.swing.*; public class AppletMitText extends JApplet { Container c; // Container dieses Applets JLabel beschriftung; // Label, das im Applet erscheinen soll public void init() { // init-Methode c = getContentPane(); c.setLayout(new FlowLayout()); beschriftung = new JLabel("Label-Text im Frame"); c.add(beschriftung); } } 17 - 3 © 2009 – 2014, Prof. Dr. D. Ratz Erstellen und Ausführen von Applets • Beim Frame: main-Methode public static void main(String[] args) { FrameMitText fenster = new FrameMitText(); fenster.setTitle("Frame mit Text im Label"); fenster.setSize(300,150); fenster.setVisible(true); fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } • Beim Applet: Einbettung in HTML-Seite (z. B. AppletMitText.html) <html> <head> <title> AppletMitText </title> </head> <body> <b> Das Applet AppletMitText </b> <hr></hr> <applet code="AppletMitText.class" width="300" Hier sollte eigentlich ein Applet laufen </applet> <hr></hr> Mit normalem Text geht es weiter ... </body> </html> height="150"> 17 - 4 © 2009 – 2014, Prof. Dr. D. Ratz Erstellen und Ausführen von Applets • Ausführen des Frames: – java FrameMitText • Ausführen des Applets: – appletviewer AppletMitText.html – Aufruf der Seite AppletMitText.html mit einem Browser 17 - 5 © 2009 – 2014, Prof. Dr. D. Ratz 17.2 Methoden der Klasse JApplet • JApplet erbt wichtige Methoden von der Klasse Applet (aus dem AWT) – public void init() wird aufgerufen, wenn das Applet erstmals geladen wird und dient der Initialisierung des Applet-Objekts (sozusagen als Ersatz für entsprechende Anweisungen in einem Konstruktor). – public void start() wird aufgerufen, wenn das Applet gestartet wird (unmittelbar nach init und jedes Mal wenn die HTML-Seite, in die das Applet eingebettet ist, erneut angezeigt wird). – public void stop() wird aufgerufen, wenn das Applet vorübergehend angehalten wird (jedes Mal wenn die HTML-Seite, in die das Applet eingebettet ist, nicht mehr angezeigt wird und unmittelbar vor destroy). – public void destroy() wird aufgerufen, wenn das Applet zerstört wird (weil der Appletviewer oder der Browser beendet wird). • Werden automatisch vom Appletviewer bzw. vom Browser zur Kommunikation mit dem Applet aufgerufen, je nachdem in welchem Zustand ("Lebensabschnitt") sich das Applet gerade befindet. 17 - 6 © 2009 – 2014, Prof. Dr. D. Ratz Methoden der Klasse JApplet • init, start, stop und destroy sind mit einem leeren Rumpf implementiert, so dass sie zwar prinzipiell aufgerufen werden, aber ohne Wirkung bleiben. • Eine eigene Subklasse von JApplet kann bzw. sollte diese Methoden überschreiben, um in den Methoden entsprechende Aufgaben erledigen zu lassen. – In der Methode init sollten alle für das Applet-Objekt wichtigen Initialisierungen (z. B. das Erzeugen aller benötigten Objekte wie SwingKomponenten oder Listener-Objekte) durchgeführt werden. – In der Methode start sollten alle notwendigen Aktionen bzw. Prozesse (z. B. Animationen) des Applets gestartet werden. – In der Methode stop sollten alle Aktionen, die bei nichtangezeigtem Applet nicht benötigt werden, vorübergehend (bis zum nächsten start-Aufruf) angehalten werden. – In der Methode destroy sollten alle Aktionen bzw. Prozesse des Applets endgültig beendet und alle Abschlussarbeiten, die vor der endgültigen Zerstörung des Applets notwendig sind, ausgeführt werden. 17 - 7 © 2009 – 2014, Prof. Dr. D. Ratz Methoden der Klasse JApplet • Beispiel: Konsolen-Ausgabe zur Verdeutlichung import javax.swing.JApplet; import java.awt.*; public class TextApplet extends JApplet { public void init() { System.out.println("init"); } public void start() { System.out.println("start"); } public void paint(Graphics g) { System.out.println("paint"); g.drawString("Applets programmieren in Java",20,100); } public void stop() { System.out.println("stop"); } public void destroy() { System.out.println("destroy"); } } 17 - 8 © 2009 – 2014, Prof. Dr. D. Ratz Methoden der Klasse JApplet • Beispiel (zur Laufzeit) Start mit Appletviewer Minimieren Maximieren Applet-Rahmen verändern Schließen 17 - 9 © 2009 – 2014, Prof. Dr. D. Ratz 17.3 Einbettung in HTML-Seiten • Applets werden grundsätzlich über HTML-Seiten aufgerufen. • Die Einbettung erfolgt durch das „Applet-Tag“, die einfachste Form ist: <APPLET CODE = "AppletSubclass.class" WIDTH = "123" HEIGHT = "456"> </APPLET> • Das Applet-Tag bietet vielfältige Möglichkeiten, z. B. Definition von Parametern <APPLET CODE="Animator.class" WIDTH="460" HEIGHT="160"> <PARAM NAME="backgroundColor" VALUE="0xc0c0c0"> <PARAM NAME="soundSource" VALUE="audio"> <PARAM NAME="soundtrack" VALUE="spacemusic.au"> </APPLET> • Zugriff im Applet-Code mit der Methode – String getParameter(String) 17 - 10 © 2009 – 2014, Prof. Dr. D. Ratz Einbettung in HTML-Seiten • Angabe von Verzeichnissen für Applet-Klassen: <APPLET CODE="AppletSubclass.class" CODEBASE="PfadZumApplet" WIDTH="123" HEIGHT="456"> </APPLET> • der PfadZumApplet wird interpretiert als Pfad relativ zum Verzeichnis, in dem die HTML-Seite des Applets lag. • Ist PfadZumApplet eine vollständige URL, so ist es eine absolute Adresse, von der Klassen geladen werden können, allerdings unter Beachtung der Sicherheitsrestriktionen für Applets. • Verwendung von Archiven – CODE="AppletName.class" ARCHIVE="ArchivName.jar" – größere Applets sollten in Archive verpackt werden (JAR), um den Übertragungsaufwand im Netz zu reduzieren Vorteil: Das Archiv (alle Klassen) wird als ein Stück übertragen 17 - 11 © 2009 – 2014, Prof. Dr. D. Ratz Einbettung in HTML-Seiten • Ein Applet kann den Browser, in dem es gerade ausgeführt wird, eine andere Webseite laden und anzeigen lassen. • Applet hat auf den umgebenden Kontext (den Web-Browser bzw. den Appletviewer, der das Applet ausführt) Zugriff mit der Methode – public AppletContext getAppletContext() liefert eine Referenz auf den Applet-Kontext. • AppletContext ist ein Interface mit der Methode – public void showDocument(URL url) veranlasst die Browser-Umgebung, die durch die URL url spezifizierte Internet-Seite anzuzeigen. Falls der Applet-Kontext kein Browser ist, wird der Methodenaufruf ignoriert. • Webseite muss als URL-Objekt angegeben werden – URL (Uniform Resource Locator): Spezielle Darstellung einer InternetAdresse, die festlegt, welche Datei von welchem Rechner mit welchem Dienst aufgerufen werden soll. – Konstruktor der Klasse URL aus dem Paket java.net • public URL(String spec) throws MalformedURLException erzeugt eine URL aus der angegebenen String-Darstellung spec. 17 - 12 © 2009 – 2014, Prof. Dr. D. Ratz Einbettung in HTML-Seiten • Beispiel import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; public class GoogleButtonApplet extends JApplet { public void init() { Container c = getContentPane(); c.setLayout(new FlowLayout()); JButton button = new JButton("Zu Google surfen"); c.add(button); ButtonListener bL = new ButtonListener(); button.addActionListener(bL); } 17 - 13 © 2009 – 2014, Prof. Dr. D. Ratz Einbettung in HTML-Seiten • Beispiel class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { try { URL google = new URL("http://www.google.de"); getAppletContext().showDocument(google); } catch(MalformedURLException mfue) { System.err.println(mfue); } } } } 17 - 14 © 2009 – 2014, Prof. Dr. D. Ratz 17.4 • Sicherheitseinschränkungen bei Applets Um unerwünschte Angriffe auszuschließen, gelten für Applets, die übers Netz von einem Server geladen wurden, Einschränkungen (Sandkasten-Prinzip), z. B. – keine Programme auf dem lokalen Rechner starten – keine Bibliotheken laden – keine Verbindungen zu anderen Rechnern aufnehmen, außer zum Host, von dem das Applet geladen wurde – keine Systemeigenschaften des lokalen Rechners auslesen – keine Zugriffe auf das Dateisystem des lokalen Rechners • Begründung für diese Einschränkungen: – ohne diese Einschränkungen könnten z. B. Viren, Minen oder trojanische Pferde eingeschleust werden, oder es könnten andere Angriffe auf das System durchgeführt werden • Java erlaubt signierte Applets, für die gewisse Einschränkungen nicht gelten, z. B. dürfen signierte Applets lokal drucken und auf lokale Dateien zugreifen. • Im Appletviewer sind einige der genannten Aktionen jedoch gestattet. 17 - 15 © 2009 – 2014, Prof. Dr. D. Ratz Sicherheitseinschränkungen bei Applets • Beispiel import java.awt.*; import javax.swing.*; public class AppletMitBild extends JApplet { public void init() { Container c = getContentPane(); c.setLayout(new FlowLayout()); Icon bild = new ImageIcon("babycat.gif"); JLabel lab = new JLabel("Spotty", bild, JLabel.CENTER); c.add(lab); } } 17 - 16 © 2009 – 2014, Prof. Dr. D. Ratz Sicherheitseinschränkungen bei Applets • Beispiel public class AppletMitBildBrowse extends JApplet { public void init() { Container c = getContentPane(); c.setLayout(new FlowLayout()); String path = getCodeBase() + "babycat.gif"; URL bildURL = null; try { bildURL = new URL(path); } catch(MalformedURLException mfue) { System.err.println(path + " ist keine korrekte URL"); } Icon bild = new ImageIcon(bildURL); JLabel lab = new JLabel("Spotty", bild, JLabel.CENTER); c.add(lab); } } 17 - 17