Applets

Werbung
© 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
Herunterladen