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