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 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) 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) 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 54
Collections: Vector (List) Prähististorische Klasse aus JDK 1.0 Ursprünglich keine List Implementierung Ähnlich ArrayList 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! 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 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 58
Collections: Synchronisation Gleichzeitiger Zugriff auf dasselbe Objekt durch mehrere Threads Thread A Thread B write read read Thread C write Thread D Thread A Thread B Gleichzeitig möglich? lesen lesen ja lesen schreiben nein schreiben lesen nein schreiben schreiben 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; } 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) {} } } 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(); } } 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."); } 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."); } 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 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) } 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. 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 68
Collections: Statische Methoden int binarysearch(list list, Object obj) Sucht obj in list, liefert Index. void copy(list dst, List src) Kopiert Element Referenzen von src nach dst. void fill(list list, Object obj) Füllt Liste mit Referenzen auf obj. 69
Collections: Statische Methoden Object min(collection c) Object max(collection c) Sucht Minimum/Maximum. void reverse(list list) Kehrt die Reihefolge in list um. void sort(list list) Sortiert list. 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! 71
Servlets (Teil 1) Servlets (Teil 1) 72
Funktionsweise eines Web Servers Web Browser HTTP Request HTTP Response Web Server Dateisystem HTML, JPEG, PNG, GIF usw. 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> 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> 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) 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 77
Web Server mit Servlet Container Web Browser HTTP Request HTTP Response Web Server Java Klasse empfängt HTTP Request erzeugt HTTP Response Dateisystem Servlet Container Servlet Servlet Servlet 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 79
Übungen: Miniprojekt E Shop Produkte präsentieren Übersicht Einzelprodukt Text, Bild (optional), Preis Servlet und JSP Grundlagen HTML Generierung URL Parameter Redaktionssystem Produkt einfügen, ändern, löschen Daten zum Server senden HTTP Methode POST Authentifizierung und Autorisierung 80
Übungen: Miniprojekt E Shop Warenkorb Bezahlfunktion Anbindung an Warenwirtschaftssystem Verschlüsselte Datenübertragung Kundendaten verwalten Session RMI Serialisierung JNDI JDBC Security Unterschiedliche Sprachen Internationalisierung Texte Datum, Zahlen, Preise 81
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. 82
Servlet oder CGI? Jeder Request erfordert einen separaten Prozeß. CGI Skript muß für jeden Request neu gestartet werden. Jeder Request erfordert separaten Prozeß. CGI Prozeß läuft typischerweise unter der Kennung des Webservers. Niedrige Portabilität Kein neuer Prozeß erforderlich. Einmal gestartet bleibt Servlet im Speicher. Eine einzige Servlet Instanz kann alle Requests bearbeiten. Servlet kann in Sandbox mit individuellen Sicherheitseinstellungen laufen. Hohe Portabilität 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() 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 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 86
Tomcat Startseite 87
Nächste Schritte Tomcat auf den persönlichen Bedarf des Entwicklers zurechtschneiden Statische Dateien ausliefern Servlet ausführen 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
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 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 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 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 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. 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 @@ > 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> 96
Dateien mit Tomcat ausliefern Dateisystemstruktur für Wurzelverzeichnis anlegen Verzeichnis für statische Dateien (HTML, GIF usw.) mkdir p webapps/root Verzeichnis WEB INF für Web Applikationen anlegen (Details später) 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> 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> 98
Dateien mit Tomcat ausliefern Abrufen von http://localhost:8080/ 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 100