Collections: HashSet (Set) Konstruktoren gemäß Vereinbarung für Collection HashSet() HashSet(Collection c) Zusätzliche Konstruktoren HashSet(int initialCapacity, float loadFactor) HashSet(int initialCapacity) Load factor 0,75 Web−Anwendungen mit Java 51 Collections: TreeSet (SortedSet) Sortierung implizit gemäß Comparable oder explizit gemäß Comparator Speichert Elemente gemäß compareTo() bzw. compare() Zugriffszeit O(log(N)) Zusätzliche Konstruktoren TreeSet(Comparator c) TreeSet(SortedSet s) Web−Anwendungen mit Java 52 Collections: ArrayList (List) Speichert Elemente in Array Kann wachsen oder schrumpfen null−Elemente erlaubt Zugriffe auf vorhandene Elemente effizient Direktzugriff über Index Einfügen und Löschen teuer Umkopieren erforderlich (Ausnahme: Ende der Liste) Reallokation bei Kapazitätsüberschreitung Zusätzlicher Konstruktor ArrayList(int initialCapacity) Web−Anwendungen mit Java 53 Collections: LinkedList (List) Speichert Elemente als doppelt verkettete Liste null−Elemente erlaubt Listendurchlauf effizient Indexzugriff teuer Einfügen und Löschen effizient Referenzen umsetzen Keine zusätzlichen Konstruktoren Web−Anwendungen mit Java 54 Collections: Vector (List) Prähististorische Klasse aus JDK 1.0 Ursprünglich keine List−Implementierung Ähnlich ArrayList Web−Anwendungen mit Java 55 Collections: HashMap (Map) null−Werte und null−Schlüssel (Singular) erlaubt Kapazität c und Größe s Operationen get(), put(), remove(): Zugriffszeit O(c+s) Voraussetzung: gleichverteilende Hash−Funktion Iteration Ausführungszeit O(c+s) Kapazität nicht zu groß wählen! Ladefaktor nicht zu klein wählen! Nicht auf Voreinstellungen verlassen! Web−Anwendungen mit Java 56 Collections: Hashtable (Map) Prähististorische Klasse aus JDK 1.0 Ursprünglich keine Map−Implementierung null−Werte und null−Schlüssel nicht erlaubt Ähnlich HashMap Web−Anwendungen mit Java 57 Collections: WeakHashMap (Map) HashMap mit schwachen Referenzen Schwache Referenzobjekte: siehe java.ref.WeakReference Schlüssel(−Objekte) können verschwinden, wenn es keine starken Referenzen darauf mehr gibt. WeakHashMap Schlüsselobjekte Weitere Objekte Web−Anwendungen mit Java 58 Collections: Synchronisation Gleichzeitiger Zugriff auf dasselbe Objekt durch mehrere Threads Thread A Thread B read Thread C write read write Thread D Thread A lesen lesen schreiben schreiben Thread B lesen schreiben lesen schreiben Web−Anwendungen mit Java Gleichzeitig möglich? ja nein nein nein 59 Thread−Beispiel package de.rainer_klute.collections; /** * <p>Startet zwei Threads, die jeweils ein Zeichen * ausgeben. Linus Thorvalds machte mit ’a’ und ’b’ * seine ersten Multitasking−Experimente − allerdings * nicht mit Java.</p> */ public class LinusThreads { /** <p>Ein einzelner Thread.</p> */ class MyThread extends Thread { char c; MyThread(char c) { this.c = c; } Web−Anwendungen mit Java 60 Thread−Beispiel /** * <p>Die Arbeitsmethode des Threads.</p> */ public void run() { while (true) { System.out.print(c); try { Thread.currentThread().sleep ((int) (1000 * Math.random())); } catch (InterruptedException e) {} } } } Web−Anwendungen mit Java 61 Thread−Beispiel public static void main(String args[]) { new LinusThreads().doIt(); } /** * <p>Erzeugt zwei Threads und startet sie.</p> */ private void doIt() { new MyThread(’a’).start(); new MyThread(’b’).start(); } } Web−Anwendungen mit Java 62 Collections: Synchronisation String s; // Globale Ressource // So nicht! // Im Thread: public void run() { final String name = getName(); System.out.println(name + " gestartet."); long cnfl = 0; for (int i = 0; i < 1000; i++) { s = name; // Kollisionsgefahr! if (!s.equals(name)) cnfl++; } System.out.println(name + ": " + cnfl + " Konflikte."); } Web−Anwendungen mit Java 63 Collections: Synchronisation String s; // Global Object semaphore = new Integer(42); // Im Thread: public void run() { final String name = getName(); System.out.println(name + " gestartet."); long cnfl = 0; for (int i = 0; i < 1000; i++) synchronized (semaphore) { s = name; if (!s.equals(name)) cnfl++; } System.out.println(name + ": " + cnfl + " Konflikte."); } Web−Anwendungen mit Java 64 Collections: Synchronisation Vorteil von Synchronisation: sichere konkurrierende Zugriffe Nachteil von Synchronisation: kostet Zeit Immer nur ein Thread im kritischen Abschnitt, andere müssen warten. Verwaltungskosten auch ohne konkurrierende Zugriffe Prähistorische Klassen Vector und Hashtable sind synchronisiert Nachteile und Vorteile: siehe oben Web−Anwendungen mit Java 65 Collections: Synchronisation Implementierungen der Collection−Interfaces sind üblicherweise nicht synchronisiert. Vorteil: hoher Durchsatz Konkurrierendes Lesen immer möglich. Konkurrierendes Schreiben unterschiedlicher Elemente immer möglich. Nachteil: explizite Synchronisation bei strukturellen Änderungen erforderlich Elemente hinzufügen oder löschen List l = new LinkedList(); ... synchronized (l) { l.add(someElement) } Web−Anwendungen mit Java 66 Collections: Synchronisation Bei Bedarf aus nicht synchronisierter Collection eine synchronisierte erzeugen. Beispiel: List sList = Collections.synchronizedList(new ArrayList()); Legt keine Kopie der Elemente an. Folge: Alle Zugriffe müssen über die synchronisierte Liste (hier: sList) erfolgen. Weitere Methoden wie synchronizedMap(), synchronizedSet() usw. Web−Anwendungen mit Java 67 Collections: Statische Methoden Klasse Collections enthält eine Fülle statischer Hilfsmethoden. List unmodifiableList (List list) Erzeugt nicht änderbare Liste Entsprechend für die übrigen Typen List singletonList (Object obj) Erzeugt nicht modifizierbare Liste mit obj als Element Entsprechend für manche andere Typen Web−Anwendungen mit Java 68 Collections: Statische Methoden int binarySearch(List list, Object obj) void copy(List dst, List src) Sucht obj in list, liefert Index. Kopiert Element−Referenzen von src nach dst. void fill(List list, Object obj) Füllt Liste mit Referenzen auf obj. Web−Anwendungen mit Java 69 Collections: Statische Methoden Object min(Collection c) Object max(Collection c) void reverse(List list) Sucht Minimum/Maximum. Kehrt die Reihefolge in list um. void sort(List list) Sortiert list. Web−Anwendungen mit Java 70 Übungsaufgaben 2: Collections Schreiben Sie ein Programm, das einen Text aus einer Datei einliest und in einzelne Wörter zerlegt! Ermitteln Sie die Anzahl der Wörter, natürlich mit Hilfe von Collections! Ermitteln Sie die Anzahl der verschiedenen Wörter, natürlich ebenfalls mit Hilfe von Collections! Java−Programme lassen sich über Properties parametrisieren. Beispiel: java −Dname1=wert1 −Dname2=wert2 Anwendung Außerdem stehen weitere Properties als System−Properties zur Verfügung. Schreiben Sie ein Java−Programm, das alle Properties ermittelt und (mit Hilfe von Collections) alphabetisch sortiert ausgibt! (Bestandteil der Aufgabe ist auch die Informationsrecherche.) Erweitern Sie die Anwendung Vereinsvorstand aus der Vorlesung so, daß sich die Vorstandsmitglieder nach Alter sortiert ausgeben lassen! Verwenden Sie dazu die Interfaces Comparator oder Comparable! Web−Anwendungen mit Java 71 Servlets (Teil 1) Servlets (Teil 1) Web−Anwendungen mit Java 72 Funktionsweise eines Web−Servers Web−Browser HTTP−Request HTTP−Response Web−Server HTML, JPEG, PNG, GIF usw. Dateisystem Web−Anwendungen mit Java 73 Crash−Kurs HTTP telnet localhost 8080 GET / HTTP/1.1 Host: localhost:8080 HTTP/1.0 302 Found Content−Type: text/html Location: http://localhost/index.html Content−Length: 160 Servlet−Engine: Tomcat Web Server/3.2.1 (JSP 1.1; Servlet 2.2; Java 1.3.0; Linux 2.2.16 i386; java.vendor=Sun Microsystems Inc.) <head><title>Document moved</title></head> <body><h1>Document moved</h1> This document has moved <a href="http://localhost/index.html">here</a>.<p> </body> Web−Anwendungen mit Java 74 Crash−Kurs HTTP telnet localhost 8080 GET /index.html HTTP/1.1 Host: localhost:8080 HTTP/1.0 200 OK Content−Type: text/html Content−Length: 2572 Last−Modified: Fri, 02 Mar 2001 17:30:54 GMT Servlet−Engine: Tomcat Web Server/3.2.1 (JSP 1.1; Servlet 2.2; Java 1.3.0; Linux 2.2.16 i386; java.vendor=Sun Microsystems Inc.) <!doctype html public "−//w3c//dtd html 4.0 transitional//en"> <html> ... </html> Web−Anwendungen mit Java 75 Crash−Kurs HTTP HTTP: Hypertext Transport Protocol Einfaches Request−/Response−Protokoll: Client baut TCP/IP−Verbindung auf Client sendet HTTP−Request Header Body (optional) Server sendet HTTP−Response Status−Code Header Body (optional) Web−Anwendungen mit Java 76 Crash−Kurs HTTP Beim Zugriff auf den Webserver nutzt der Browser eine HTTP−Methode. GET: Dokument vom Server abrufen HEAD: Wie GET, aber ohne Dokument (liefert nur die Metadaten) POST: Formulardaten zum Server senden PUT: Dokument zum Server senden DELETE: Dokument auf dem Server löschen OPTIONS: Server−Fähigkeiten erfragen TRACE: Weg des Requests (über Proxy−Server) erfragen Web−Anwendungen mit Java 77 Web−Server mit Servlet−Container Web−Browser HTTP−Request HTTP−Response Web−Server Dateisystem Java−Klasse " empfängt HTTP−Request " erzeugt HTTP−Response Servlet−Container Servlet Servlet Servlet Web−Anwendungen mit Java 78 Servlet und Servlet−Container Servlet: Java−Klasse Allgemein: implementiert javax.servlet.Servlet Praktisch alle Servlets sind Unterklassen von javax.servlet.http.HttpServlet. Wir betrachten ausschließlich HTTP−Servlets. Servlet−Container: standardisierte Ablaufumgebung Servlet läuft in jedem Servlet−Container Beispiel: Tomcat (Apache, Sun Microsystems) Standards: Java Servlet 2.3 Java Server Pages 1.2 Web−Anwendungen mit Java 79 Übungen: Miniprojekt E−Shop Produkte präsentieren Übersicht Einzelprodukt Text, Bild (optional), Preis Redaktionssystem Produkt einfügen, ändern, löschen HTML−Generierung URL−Parameter Daten zum Server senden Web−Anwendungen mit Java Servlet− und JSP− Grundlagen 80 HTTP−Methode POST Authentifizierung und Autorisierung Übungen: Miniprojekt E−Shop Warenkorb Session Bezahlfunktion RMI Anbindung an Warenwirtschaftssystem Verschlüsselte Datenübertragung Kundendaten verwalten Unterschiedliche Sprachen Texte Datum, Zahlen, Preise Web−Anwendungen mit Java 81 Serialisierung JNDI JDBC Security Internationalisierung Servlet oder CGI? Common Gateway Interface: Verfahren aus der Webserver−Steinzeit zum Erzeugen dynamischer Inhalte Webserver startet externes Programm (CGI−Skript). CGI−Skript generiert HTML−Seite. Server schickt HTML−Seite zum Browser. Jeder HTTP−Zugriff (Request) erfordert separaten Prozeß Prozeß starten kostet viel Zeit. Jeder Prozeß belegt Systemressourcen. Anzahl der Prozesse im System ist begrenzt. Web−Anwendungen mit Java 82 Servlet oder CGI? Jeder Request erfordert einen separaten Prozeß. Kein neuer Prozeß erforderlich. CGI−Skript muß für jeden Einmal gestartet bleibt Servlet Request neu gestartet werden. im Speicher. Jeder Request erfordert separaten Prozeß. Eine einzige Servlet−Instanz kann alle Requests bearbeiten. CGI−Prozeß läuft typischerweise unter der Kennung des Webservers. Servlet kann in Sandbox mit individuellen Sicherheitseinstellungen laufen. Niedrige Portabilität Hohe Portabilität Web−Anwendungen mit Java 83 Servlet−Lebenszyklus im Überblick Servlet−Container lädt Servlet. initial oder bei Bedarf Servlet−Container ruft Servlet−Methode init(ServletConfig) Bei Request ruft Servlet−Container die Servlet− Methode service(ServletRequest, ServletResponse) HTTP−Servlet verzweigt weiter zu doGet(), doPost(), doHead(), doPut(), doDelete(), doOptions(), doTrace() Beim Entladen des Servlets ruft der Servlet−Container die Methode destroy() Web−Anwendungen mit Java 84 Tomcat Tomcat 4.0: Referenzimplementierung für Java Servlet 2.3 Java Server Pages 1.2 Web−Server Servlet−Container (»Catalina«) JSP−Container (»Jasper«) Stand−alone und/oder als Apache−Modul In Java geschrieben, daher plattformunabhängig http://jakarta.apache.org/tomcat/index.html Web−Anwendungen mit Java 85 Tomcat installieren (Unix) Datei jakarta−tomcat−4.0.3.tar.gz besorgen und auspacken Verzeichnis an geeignete Stelle verschieben mv jakarta−tomcat−4.0.3 /opt/local/tomcat−4.0.3 ln −s /opt/local/tomcat−4.0.3 /opt/local/tomcat Skript /opt/local/tomcat/bin/startup.sh ausführen Tomcat serviert auf Port 8080. http://localhost:8080/ Statische Seiten Servlets Java Server Pages Web−Anwendungen mit Java 86 Tomcat−Startseite Web−Anwendungen mit Java 87 Nächste Schritte Tomcat auf den persönlichen Bedarf des Entwicklers zurechtschneiden Statische Dateien ausliefern Servlet ausführen Web−Anwendungen mit Java 88 Beispiel−Servlet: Hello World package de.rainer_klute.servlet; import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html"); out.print("<!DOCTYPE html PUBLIC \"−//W3C//DTD HTML "); out.println("4.0//EN//\">"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("<p>" + new Date() + "</p>"); out.println("</body>"); out.println("</html>"); } } 89 Web−Anwendungen mit Java Tomcat konfigurieren Ziel: Betrieb... unter eigener Benutzerkennung mit eigener Konfiguration unter Nutzung der zentralen Installation Tomcat−Dokumentation lesen, insbesondere http://localhost:8080/tomcat−docs/config/ Eigenes Basisverzeichnis anlegen mkdir ~/tomcat In das neue Verzeichnis wechseln cd ~/tomcat Web−Anwendungen mit Java 90 Tomcat konfigurieren Individuelle Verzeichnisse anlegen cd ~/tomcat mkdir conf logs webapps work Konfigurationen aus der zentralen Installation kopieren cp −p /opt/local/tomcat/conf/* conf Evtl. Datei conf/server.xml anpassen Zentrale Tomcat−Konfigurationsdatei XML−Format Recht gut kommentiert Alternative Konfigurationsdatei ohne Beispielanwendungen Web−Anwendungen mit Java 91 Tomcat konfigurieren Laufenden Tomcat herunterfahren: /opt/local/tomcat/bin/shutdown.sh Umgebungsvariable CATALINA_BASE setzen CATALINA_BASE=/home/klute/tomcat export CATALINA_BASE Tomcat neu starten /opt/local/tomcat/bin/startup.sh Web−Anwendungen mit Java 92 Tomcat konfigurieren Tomcat nutzt voreingestellte Ports 8080 für HTTP 8005 zum Herunterfahren 8008 und 8009 für Kommunikation mit Apache Konflikt, falls zweite Tomcat−Instanz startet Ports bereits belegt Fehlermeldung in logs/catalina.out: java.net.BindException: Die Adresse wird bereits verwendet:8080 Web−Anwendungen mit Java 93 Tomcat konfigurieren Lösung: Freie Ports herausfinden In Konfigurationsdatei festlegen Tomcat mit alternativer Konfiguration starten: /opt/local/tomcat/bin/startup.sh −config conf/server−9000.xml Wer Tomcat ausschließlich stand−alone betreibt, kann die Apache−Konnektoren streichen. Web−Anwendungen mit Java 94 Tomcat konfigurieren −−− server.xml Fri Mar 1 23:49:40 2002 +++ server−9000.xml Fri Mar 8 21:09:28 2002 @@ −10,7 +10,7 @@ define subcomponents such as "Valves" or "Loggers" at this level. −−> −<Server port="8005" shutdown="SHUTDOWN" debug="0"> +<Server port="9005" shutdown="SHUTDOWN" debug="0"> <!−− A "Service" is a collection of one or more "Connectors" that share @@ −53,7 +53,7 @@ <!−− Define a non−SSL HTTP/1.1 Connector on port 8080 −−> <Connector className="org.apache.catalina.connector.http.HttpConnector" port="8080" minProcessors="5" maxProcessors="75" − port="9080" minProcessors="5" maxProcessors="75" + enableLookups="true" redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="60000"/> <!−− Note : To disable connection timeouts, set connectionTimeout value @@ −71,9 +71,11 @@ −−> Web−Anwendungen mit Java 95 Tomcat konfigurieren + + <!−− Define an AJP 1.3 Connector on port 8009 −−> <!−− <Connector className="org.apache.ajp.tomcat4.Ajp13Connector" port="8009" minProcessors="5" maxProcessors="75" acceptCount="10" debug="0"/> −−> <!−− Define a Proxied HTTP/1.1 Connector on port 8081 −−> <!−− See proxy documentation for more information about using this. −−> @@ −307,7 +309,7 @@ −−> − + <!−− Define an Apache−Connector Service −−> <Service name="Tomcat−Apache"> <Service−off name="Tomcat−Apache"> <Connector className="org.apache.catalina.connector.warp.WarpConnector" port="8008" minProcessors="5" maxProcessors="75" @@ −328,6 +330,6 @@ </Engine> − + </Service> </Service−off> </Server> Web−Anwendungen mit Java 96 Dateien mit Tomcat ausliefern Dateisystemstruktur für Wurzelverzeichnis anlegen Verzeichnis für statische Dateien (HTML, GIF usw.) Verzeichnis WEB−INF für Web−Applikationen anlegen (Details später) mkdir −p webapps/ROOT mkdir −p webapps/ROOT/WEB−INF Minimalen Deployment descriptor erzeugen Datei webapps/ROOT/WEB−INF/web.xml <?xml version="1.0" encoding="ISO−8859−1"?> <!DOCTYPE web−app PUBLIC "−//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web−app_2_2.dtd"> <web−app> </web−app> Web−Anwendungen mit Java 97 Dateien mit Tomcat ausliefern Crashkurs HTML: Beispieldatei Beispiel.html <!DOCTYPE html PUBLIC "−//W3C//DTD HTML 4.0//EN//"> <html> <head> <title>Beispiel</title> </head> <body style="background: #ffffff"> <h1>Beispielseite</h1> <p>Bla, bla, bla...</p> </body> </html> Web−Anwendungen mit Java 98 Dateien mit Tomcat ausliefern Abrufen von http://localhost:8080/ Web−Anwendungen mit Java 99 Dateien mit Tomcat ausliefern Sonderrolle für Datei index.html Bei Zugriff auf Verzeichnis prüft Tomcat, ob index.html existiert. Nein: Verzeichnisinhalt anzeigen Ja: Statt des Verzeichnisinhalts index.html anzeigen Web−Anwendungen mit Java 100