Prog. 1 Prog. 1 Applets und Servlets • Java eignet sich sehr gut zur Entwicklung dynamischer Web-Seiten Applikationen / Applets • Wichtige Unterschiede zwischen Java-Applikationen und Java-Applets • Web-Seiten können Java-Programme enthalten Java-Applikation – Werden mitsamt der HTML-Seite (über das Internet) geladen – Werden auf dem Rechner des Benutzers ausgeführt Hauptklasse kann von beliebiger Klasse abgeleitet werden Wird immer von der Klasse java.awt.Applet abgeleitet Starten Java-Interpreter ruft die Klassenmethode main auf Web-Browser instanziert die AppletKlasse und ruft die Methoden init und start auf Sicherheit Keine Beschränkungen beim Zugriff auf Dateien und dem Starten externer Programme Kein Zugriff auf Dateien des lokalen Rechners. Keine Möglichkeit externe Programme zu starten. (Ausnahme signierte Applets) Ein-/Ausgabe Ein-/Ausgaben sowohl rein textorientiert als auch über GUI Immer grafik- und ereignisorientiert Hauptprogramm • Als Applets werden Java Programme bezeichnet, die – in eine HTML-Seite eingebettet sind (keine eigenständigen Programme) – innerhalb eines Web-Browsers arbeiten • Benutzer kommuniziert lokal mit dem Applet – Verringerter Netzwerkverkehr • Gegenstück zu Applets sind Servlets (Java-Klassen), die – auf dem Server(-Rechner) laufen, von dem die Web-Seite geladen wurde – mit der Web-Seite auf dem Benutzerrechner kommunizieren • Beispiel: Servlet holt Inhalte aus Datenbank und liefert sie an eine Web-Seite, wo sie dann von einem Applet dargestellt werden Java-Applet • Applets bieten zusätzliche Möglichkeiten im Bereich Benutzerschnittstellen-Design – Ausgabe von Sound ist z.B. standardmäßig auf Applets beschränkt 19.01.2009 Prog. 1 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 1 Prog. 1 java.awt.Applet • Alle Applets sind Subklasse der Klasse java.awt.Applet • Die Klasse Applet – enthält Funktionalität, um ein Objekt der Klasse Applet als Hauptmodul eines eigenständigen Programms laufen zu lassen FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 2 Hallo Applet (in Eclipse) • Ein einfaches Applet import java.awt.*; import java.applet.*; Object – ist konkrete Grafikklasse (keine abstrakte Basisklasse) – erbt von seinen Vaterklassen Component, Container und Panel einen großen Teil der Fähigkeiten, die zur Ausführung benötigt werden 19.01.2009 public class HalloApplet extends Applet { public void paint(Graphics g) { g.drawString("Hallo Applet", 50, 50); } } Component • In Eclipse starten mittels Container • Ein Applet ist ein rechteckiges Bildschirmelement, das – eine Größe und Position hat Panel – Ereignisse empfangen kann – grafische Ausgaben machen kann 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke Applet 3 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 4 Prog. 1 Prog. 1 Ausführen (Einbinden) von Applets • Kompilierte Applets können durch Einbinden in ein HTML-Dokument ausgeführt werden Hallo Applet (im Browser) 1. Ein einfaches Applet HalloApplet.java – Einleiten durch <applet> • Text, der angezeigt wird, wenn das Applet nicht aufgerufen werden kann (wird von applet-fähigem Browser ignoriert) – Beenden mit </applet> 2. Übersetzen (javac HelloApplet.java) Beispiel 3. Einbinden in HTML-Datei <applet code="HelloApplet.class" width=200 height=100> Hier steht das Applet HelloApplet </applet> Appletviewer appletviewer AppletTest.html <html> <body> <applet code="HalloApplet.class" width=200 height=100> Hier steht das Applet HalloApplet </applet> </body> </html> • Das Applet belegt die Größe width x height auf dem Bildschirm FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke Web-Browser AppletTest.html • Applet-Tag wird wie normaler Text in Browser-Ausgabe eingebunden Prog. 1 4. Ausführen import java.awt.*; import java.applet.*; @SuppressWarnings("serial")//or add serial public class HalloApplet extends Applet { public void paint(Graphics g) { setBackground(Color.blue); g.drawString("Hallo Applet", 50, 50); } } • Das Einbinden in HTML-Dokumente erfolgt mit dem Tag <applet> 19.01.2009 Java 1.5 unterstützt Annotations (Anmerkungen) 5 19.01.2009 Prog. 1 Die Parameter des Applet-Tags FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke Parameter von applet (Übersicht) Parameter Bedeutung – Klassenname sollte inklusive der Extension .class angegeben werden code Name der Byte-Code-Datei des Applets – Der Name ist case-sensitive height Höhe der Applet-Fläche in Pixel – Klassendatei muß sich im aktuellen bzw. angegebenen Verzeichnis befinden (oder in einem der in CLASSPATH angegebenen Verzeichnisse) width Breite der Applet-Fläche in Pixel codebase Pfad zu dem Verzeichnis, in dem sich das Applet befindet, das mit code referenziert wurde alt Alternativer Text für Browser, die zwar das Applet-Tag verstehen, aber Java nicht unterstützen hspace Abstand zu anderen Elementen links und rechts neben dem Applet vspace Abstand zu anderen Elementen über und unter dem Applet align Anordnung des Applets in einer Textzeile. Mögliche Werte: • Der Parameter code gibt den Namen der Applet-Klasse an • Zusätzlich zu code müssen die Parameter width und height angegeben werden – Bestimmen die Breite und Höhe des für das Applet reservierten Bildschirmbereichs – Innerhalb des Applets steht ein Rechteck der Größe width x height als Ausgabefläche zur Verfügung 6 left, right, middle, top, bottom, baseline, .. • Mit Hilfe zusätzlicher, optionaler Parameter kann name – die Darstellung des Applets und des umgebenden Textes beeinflusst werden Eindeutiger Appletname. Wird zur Unterscheidung mehrerer miteinander kommunizierender Applets einer Web-Seite verwendet. object Name eines serialisierten Applets – das Applet konfiguriert werden archive JAR-Archiv aus dem die Klassendateien und sonstige Ressourcen des Applets geladen werden sollen 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 7 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 8 Prog. 1 • Prog. 1 Initialisierung eines Applets Nach dem Laden wird ein Applet Starten und stoppen eines Applets 2. Starten eines Applets (public void start()) 1. vom Browser (Appletviewer) zunächst instanziert und dann initialisiert • Nach der Initialisierung wird die Methode public void start() aufgerufen, um die Ausführung des Applets zu starten • Ein Applet kann mehrfach gestartet werden (im Gegensatz zur Initialisierung) 2. anschließend wird es gestartet und erhält GUI-Events 3. Irgendwann wird es gestoppt 4. Schließlich wird es vom Browser nicht mehr benötigt und zerstört • Lädt ein Browser eine andere Web-Seite wird das Applet nicht komplett zerstört, sondern nur gestoppt • Beim erneuten Aufruf der Seite wird das gestoppte Applet durch erneuten Aufruf von start wieder gestartet 1. Instanzieren und initialisieren eines Applets Instanzierung (public Applet()) • • Der Browser erzeugt ein Objekt der von Applet abgeleiteten Klasse, indem er den parameterlosen Default-Konstruktor public Applet() aufruft (üblicherweise nicht überlagert, sondern von Applet geerbt) Initialisierung (public void init()) Nach der Instanzierung ruft der Browser public void init() auf • • In init können Initialisierungen vorgenommen werden • init wird während der Lebensdauer eines Applets genau einmal aufgerufen (nachdem die Klassendatei geladen und das Applet instanziert wurde) • Wird init nicht überschrieben, hat die Methode keine Wirkung • 19.01.2009 Prog. 1 3. Stoppen eines Applets (public void stop()) 9 4. Zerstören eines Applets (public void destroy()) • Wird ein Applet ganz sicher nicht mehr benötigt (z.B. beim Beenden des Browsers), ruft der Browser public void destroy() auf • Die Methode destroy kann überlagert werden, um Aufräumarbeiten zu erledigen Zerstörung eines Threads, der bei der Applet-Initialisierung angelegt wurde import java.applet.*; import java.awt.*; @SuppressWarnings("serial")//or add serial public class HelloWorld extends Applet{ StringBuffer buffer; public void init() { buffer = new StringBuffer(); addItem("Initializing..."); } public void start() { addItem("Starting..."); } 19.01.2009 start und stop können während der Lebensdauer eines Applets beliebig oft aufgerufen werden 19.01.2009 Prog. 1 Zerstören eines Applets Abschieds-Melodie, -Gruß, -Film, ... • • FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke • Durch Aufruf der Methode public void stop() zeigt der Browser dem Applet an, dass gestoppt werden soll • Membervariablen initialisieren, Images oder Fonts laden, Parameter auswerten • • Geschieht immer dann, wenn eine andere Web-Seite geladen wird Es dürfen keine endgültigen Aufräumarbeiten durchgeführt oder bei einem Neustart wieder benötigte Resscourcen entfernt werden FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 10 Die Methode paint() • Die Methode public void paint(Graphics g) der Klasse java.awt.Container dient zur Ausgabe von Grafikelementen in einem Container • Die Appletfläche ist standardmäßig der Container für alle AusgabeElemente von paint() • Die Methode paint() – wird vom Browser (Appletviewer) immer dann ausgeführt, wenn die Appletfläche ganz oder teilweise neu gezeichnet wird public void stop() { addItem("Stopping..."); } public void destroy() { addItem("Preparing for unloading ..."); } void addItem(String s) { System.out.println(s); buffer.append(s); repaint(); } public void paint(Graphics g) { g.drawString(buffer.toString(), 5, 15); } – wird aufgerufen, wenn • das Neuzeichnen der Appletfläche mittels repaint() erzwungen wird • Die Appletfläche durch andere Fenster überdeckt war und wieder sichtbar wird – muss im selbst erstellten Applet überschrieben werden – erhält alle Anweisungen, die beim Neuzeichnen der Appletfläche ausgeführt werden sollen – erfordert als Aufrufparameter ein Objekt der abstrakten Klasse Graphics welche Methoden zur Ausgabe von Grafikelementen auf der Appletfläche enthält } FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 11 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 12 Prog. 1 Prog. 1 Zeichenfläche • Text- und Grafik-Ausgaben erfolgen in Applets mittels paint() auf einer pixelorientierten grafischen Oberfläche x • Nullpunkt des Koordinatensystems ist die linke obere Ecke der Zeichenfläche – ganzzahlige Koordinaten • Auf Appletflächen werden Texte als Grafikelemente dargestellt • void drawString(String s, int x, int y) (0,0) zeichnet den String s an die Postion (x,y) der Zeichenfläche (20,10) • Auflösung: ein Pixel Textausgabe – Anfangskoordinaten des ersten Zeichens auf der Grundlinie des Textes 40 20 y Oberkante • Größe der Zeichenfläche Grundlinie Unterkante – ist mit den Attributen width, height im <applet>-Tag festgelegt – ist abfragbar (seit JDK 1.2) mit den folgenden Methoden aus java.awt.Component • Werden keine weiteren Eigenschaften für die Schrift festgelegt, wird eine Standardschrift verwendet (abhängig vom Java-System) • public int getWidth() • public int getHeight() • Mit Hilfe der Klasse java.awt.Font können die Schriften für die Grafikausgabe verändert werden – In älteren Java-Versionen kann die Größe der Appletfläche mit getSize()und size() („deprecated“ ab JDK 1.1) abgefragt werden 19.01.2009 Prog. 1 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 13 19.01.2009 Prog. 1 Schriftattribute – Font-Attribute können dann mit FontMetrics-Methoden abgefragt werden • Wichtige Methoden von FontMetrics – int getAscent() • Abstand von der Grundlinie bis zur Oberkante – int stringWidth(String s) Ascent Textausgabe Beispiel public void paint(Graphics g) { String s = "Hallo gelbe Welt"; int xMax = getWidth(); int yMax = getHeight(); int xPos, yPos, sWidth, sHeight, asc, des, dMG; Font f = new Font("SansSerif", Font.BOLD, 30); FontMetrics fm = getFontMetrics(f); sWidth = fm.stringWidth(s); asc = fm.getAscent(); des = fm.getDescent(); sHeight = asc + des; dMG = (asc-des > 0) ? (asc-des)/2 : 0; xPos = (xMax-sWidth > 0) ? (xMax-sWidth)/2 : 0; yPos = (yMax-sHeight > 0) ? yMax/2+dMG : yMax-des; g.setFont(f); g.drawString(s, xPos, yPos); } Font f = new Font(“SansSerif“, Font.BOLD+FONT.ITALIC, 30); FontMetrics fm = getFontMetrics(f); Descent 14 @SuppressWarnings("serial") //or add serial public class TextApplet extends Applet { public void init() { Color gelb = new Color(255, 255, 0); setBackground(gelb); } • Objekten der Klasse java.awt.FontMetrics können zur Laufzeit Informationen über die Metrik eines Fonts zugewiesen werden • Abstand von der Grundlinien bis zur Unterkante FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke import java.applet.*; import java.awt.*; • Pixelgenauen Positionierung auf der grafischen Oberfläche erfordert Informationen über Schrifthöhe, Laufweite, Unterlängen, ... – int getDescent() Abcdefg Abcdefg • Pixel-Länge des Strings s } 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 15 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 16 Prog. 1 • • Prog. 1 Farben Mit Hilfe der Klasse java.awt.Color können Farben im RGB(A)-Farbmodell dargestellt werden Es existieren statische Konstanten für gängige Farben: @SuppressWarnings("serial") //or add serial – void drawLine(int x1, int y1, int x2, int y2) Color background, fill; public void init() { • Zeichnet eine Linie von P1=(x1,y1) nach P2=(x2,y2) background = new Color(0,255,255); – void drawRect(int x, int y, int width, int height) fill = new Color(0.0f,0.0f,1.0f); Die mit g.setColor(color) gesetzte Farbe eines GraphicsObjektes gilt bis zum nächsten Aufruf von setColor() für alle Grafikausgaben • Zeichnet ein Rechteck (Linke obere Ecke:(x,y), Breite:width, Höhe:height) setBackground(background); • setBackground(color) setzt die Hintergrundfarbe der Appletfläche Prog. 1 • Einige Methoden von Graphics public class ColorApplet extends Applet { – ... 19.01.2009 • Neben grafikorientierter Textausgabe erlaubt Graphics die pixelorientierte Darstellung einfacher Liniengrafiken (Linie, Kreis, Rechteck) import java.awt.*; – Color.lightGray • • Die Klasse java.awt.Graphics ist der Grafik-Kontext für ein universelles Ausgabegerät import java.applet.*; – Color.red Grafikelemente } – void drawOval(int x, int y, int x2, int y2) public void paint(Graphics g) { • Zeichnet ein Oval (x,y): Linke obere Ecke width, height: Breite, Höhe g.setColor(fill); g.fillRect(10,10,50,50); g.setColor(Color.darkGray); height width – void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) g.fillRect(70,70,50,50); • Zeichnet ein Polygon xPoints: x-Koordinaten der Eckpunkte yPoints: y-Koordinaten der Eckpunkte nPoints: Anzahl der Polygon-Punkte } } FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke (x,y) 17 19.01.2009 Prog. 1 Grafikelemente (Beispiel) import java.applet.*; import java.awt.*; p3 p1 p4 p2 p0 p5 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 18 Parameterübergabe an Applets • Mit Hilfe des optionalen Tags <param> können innerhalb von <applet> </applet> Parameter an ein Applet übergeben werden @SuppressWarnings("serial") //or add serial public class GrafikApplet extends Applet { int x[]; int y[]; public void init() { Color black = new Color(0, 0, 0); setBackground(black); x = new int[100]; y = new int[100]; for(int i=0; i<100; ++i) { x[i] = 2*i; y[i] = (int) (100*(Math.sin(i*2*Math.PI/99)+1)); } } • Jedes param-Tag besitzt die Parameter – name: Gibt den Namen des zu übergebenden Parameters an – value: Gibt den Wert des zu übergebenden Parameters an • Innerhalb des Applets können die Parameter mit Hilfe folgender Methode der Klasse Applet abgefragt werden – public String getParameter(String name) Liefert für jeden angegebenen Parameter den zughörigen Wert als String public void paint(Graphics g) { g.setColor(Color.white); g.drawPolyline(x,y,100); } • Numerische Werte müssen konvertiert werden • Existiert kein Parameter mit namen name wird null zurückgegeben } 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 19 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 20 Prog. 1 Prog. 1 Beispiel Parameterübergabe import java.awt.*; import java.applet.*; @SuppressWarnings("serial") //or add serial public class Rechteck extends Applet { private int xmin, ymin, width, height; Parameterübergabe mit Eclipse Default-Verhalten public void init() { try { xmin = Integer.parseInt(getParameter("xminR")); ymin = Integer.parseInt(getParameter("yminR")); width = Integer.parseInt(getParameter("widthR")); height = Integer.parseInt(getParameter("heightR")); } catch (NumberFormatException e) { xmin = 0; ymin = 0; width = 10; height = 10; } } public void paint(Graphics g) { String text = "Rechteck ("+xmin +","+ ymin+ "," + width+","+height+")"; g.drawString(text, 1, 10); g.drawRect(xmin, ymin, width, height); } } 19.01.2009 Prog. 1 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 21 22 Ein Applet, das ein “Mosaic“ eines Bildes zeigt (I) import import import import • Einbinden des Rechteck-Applets in ein HTML-Dokument java.awt.*; java.applet.*; java.io.*; java.util.Scanner; public class MosaicPicture extends Applet { int row,column,maxGrey,tileSize,gapSize; boolean shadow; int[][] picture; Web-Browser public void init() { String filename = getParameter("filename"); readPicture(filename); try { tileSize = Integer.parseInt(getParameter("tileSize")); gapSize = Integer.parseInt(getParameter("gapSize")); shadow = Boolean.parseBoolean(getParameter("shadow")) } catch (NumberFormatException e) { tileSize = 1; gapSize = 0; shadow = false; } } • Aufruf mit appletviewer 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke Prog. 1 Parameterübergabe mit HTML <html> <head> <title>Rechteck</title> </head> <body> <h1>Rechteck</h1> <applet code="Rechteck.class" width=200 height=100> <param name="xminR" value=10> <param name="yminR" value=10> <param name="widthR" value=50> <param name="heightR" value=50> Hier steht das Applet Rechteck.class </applet> </body> </html> 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 23 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 24 Prog. 1 Prog. 1 Ein Applet, das ein “Mosaic“ eines Bildes zeigt (II) Ein Applet, das ein “Mosaic“ eines Bildes zeigt (III) public void readPicture(String filename) { try { File file = new File(filename); Scanner sc = new Scanner(file); // Forget header and comment of input file sc.nextLine(); // header sc.nextLine(); // comment // Read number of columns and rows from input file column = sc.nextInt(); row = sc.nextInt(); // Read max greyvalue maxGrey = sc.nextInt(); // allocate picture memory picture = new int[row][column]; // read in picture data for (int i = 0; i < row; i++) for (int j = 0; j < column; j++) picture[i][j] = sc.nextInt(); } catch (FileNotFoundException e) { System.out.println(filename+" not found."); System.exit(-1); } } 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke public float getGreyValue(int i, int j, int size) { int gv = 0, ngv = 0; for (int ii = 0; ii < size; ii++) for (int jj = 0; jj < size; jj++) { if (i+ii < row && j+jj < column) { gv += picture[i+ii][j+jj]; j size ngv += 1; } } return (float) gv / (ngv*maxGrey); } i 25 Prog. 1 19.01.2009 Prog. 1 Ein Applet, das ein “Mosaic“ eines Bildes zeigt (IV) FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 26 Ergebnisse public void paint(Graphics g) { int x, y = 0; for (int i = 0; i < row; i += tileSize) { x = 0; for (int j = 0; j < column; j += tileSize) { if (shadow) { g.setColor(Color.black); g.drawRect(j + x * gapSize, i + y * gapSize, tileSize,!tileSize); } float grey = getGreyValue(i, j, tileSize); Color color = new Color(grey, grey, grey); tileSize=8 gapSize=2 tileSize=16 gapSize=2 tileSize=32 gapSize=4 tileSize=64 gapSize=4 g.setColor(color); g.fillRect(j + x * gapSize, i + y * gapSize, tileSize, tileSize); x++; } y++; tileSize=1 gapSize=0 } } } 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 27 19.01.2009 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 28