Collections: HashSet (Set)

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