Post on 08-Aug-2018
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Einfuhrung
Sowohl fur interaktiv erarbeiten, als auch nachschlagen spaterVorgehen:
1 Aufgabenstellung2 Ausgangscode runterladen und verstehen3 Lucke(n) fullen4 Musterlosung runterladen, vergleichen und verstehen
Nur einige Kernprobleme durch Aufgabenstellung, Rest durchAusgangscode bzw. Musterlosung → beides gut durcharbeiten
Sollte Ausgangsbasis fur eigene Experimente sein
auch andere Quellen benutzten (hauptsachlich JavaDoc)
soll Anfangswissen fur technischen Prototypen geben
moglichst zu Hause schon durcharbeiten dann Fragen stellen
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Themenubersicht
1 13. Nov: Multithreading + Serialisierung
2 20. Nov: Swing
3 27. Nov: TCP, Sockets
4 4. Dez: SSL, RMI
5 11. Dez: JDBC, OR-Mapper (Hibernate, JPox, Java Persistence API,Castor, ...)
6 18. Dez: XML-Parser
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Multithreading I
mehrere Aufgaben gleichzeitig bearbeiten:
GUI neu darstellen und gleichzeitig mit dem Server kommunizierenmehrere Clientverbindungen verarbeiten
java.lang.Thread kapselt einen Ausfuhrungsfaden
es gibt immer einen Thread
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Multithreading II
Einsprungpunkt fur neu erzeugte Threads istjava.lang.Runnable.run()
wenn Runnable.run() verlassen wird, stirbt der Thread
entweder von Thread ableiten oder Runnable implementieren
start mit new MyThread().start() bzw. newThread(myRunnable).start()
myThread.start() erzeugt den neuen Thread und ruft dann run()auf
mit myThread.join() wartet der aktuelle Thread, bis myThreadgestorben ist
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Aufgabe 1
Aufgabe: eine bestimmte Anzahl Threads erzeugen, starten undwarten, bis sie ihr Aufgabe beendet haben
WorkingThread :
ist Threadklassees soll work() aufgerufen werdenes fehlt der Konstruktor und die run -Methode
ThreadsTestHauptprogramm, welches die Threads erzeugt, startet und auf das Endewarten solles fehlt die Implementierung der 3 Methoden
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Gemeinsamer Zugriff I
Daten konnen, sollten und werden von mehreren Threads gleichzeitiggenutzt
Thread kann wahrend der Arbeit an den Daten unterbrochen werden
atomare Operation: Arbeit, wahrend der keine Unterbrechungstattfinden kann
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Aufgabe 2 I
erstmal nur Ausgangscode
n Threads erhohen einen Wert um 1, n andere erniedrigen
erwartetes Ergebnis ist 0
ist es aber nicht
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Gemeinsamer Zugriff II
Problem: x = x + y ist keine atomare Operation
Lesen und Schreiben sind atomare Operationen, aber selbst beimlong Type nicht
Losung 1:wahrend man an den Daten arbeitet wird man nicht unterbrochenaka Interrupts sperrenverpont und nicht moglich in Java
Losung 2:ALLE Benutzer der gemeinsamen Daten stimmen einem Protokoll zu:nur maximal ein Benutzer darf mit den Daten arbeiten (lesen und/oderschreiben)Exklusivitat durch Monitore (Feature von Java)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Gemeinsamer Zugriff III
jedes Objekt hat einen Monitor, java.lang.Object reicht
nur maximal ein Thread kann den Monitor haben, andere mussenwarten, bis der erste Thread den Monitor abgegeben hat
Thread verliert keine Monitore, wenn er unterbrochen wird
s y n ch r on i z e d ( ob j e c tA l sMon i t o r ) {// E x k l u s i v e r Be r e i c h
}
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Aufgabe 2 II
Aufgabe: sichere den Bereich der Berechnung (in run ) durch einenMonitor ab, so dass bei jedem Aufruf das Ergebnis das erwarteteErgebnis (0) ist.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Benachrichtigungen I
Beispiel: Produzent (Clientverbindung auf dem Server) undKonsument (Verarbeiter) haben eine Liste von noch offenen Aufgabenals gemeinsame Daten.
Problem: wie kann der Produzent den Konsumenten benachrichtigen,dass es neue Aufgaben gibt? Bzw. wie kann der Konsument auf neueAufgaben warten?
Losung 1:
Busy-waitder Konsument fragt in einer Schleife laufend nach, ob es neue Arbeitgibtbesser: kurzzeitige Selbstunterbrechung (Schlafen legen)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Benachrichtigungen II
Losung 2:Produzent benachrichtigt KonsumentKonsument “legt sich auf dem Monitor schlafen”
s y n ch r on i z e d ( ob j e c tA l sMon i t o r ) {ob j e c tA l sMon i t o r . wa i t ( ) ;
}
Produzent weckt ihn uber den Monitor auf
s y n ch r on i z e d ( ob j e c tA l sMon i t o r ) {ob j e c tA l sMon i t o r . n o t i f y ( ) ;// oderob j e c tA l sMon i t o r . n o t i f y A l l ( ) ;
}Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungGemeinsamer ZugriffBenachrichtigungen
Aufgabe 3
Aufgabe: busy-wait Losung so umstellen, dass sie Benachrichtigungenverwendet
Beachte, dass sowohl die Consumers auf den Producer warten, alsauch ProducerConsumerExample auf die Consumers
die zwei vorhandenen busy-wait Stellen sind an Thread.sleep() zuerkennen.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Persistenzproblem & CSVBinarformatSerialisierung
Einfuhrung
Anforderungen: Zeiterfassung im offline-Modus, keine Datenbank aufdem Klienten
Eingaben mussen bis zur nachsten Serververbindung gespeichertwerden
Losung 1:
eine CSV-Datei (comma seperated values)zum Schreiben java.io.PrintWriterzum Lesen java.io.BufferedReader
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Persistenzproblem & CSVBinarformatSerialisierung
Aufgabe 1
Aufgabe: fulle die 3 Methoden mit Code um in einer Datei alleStudenten im Format
<f i r s t n ame >;< l as tname >;< l o g i n >;<matr iku la t ionNumber >;<mark>
abzuspeichern.
Welche Probleme kann es geben?
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Persistenzproblem & CSVBinarformatSerialisierung
Binarformat
Probleme: bei CSV mussen die speziellen Zeichen Semikolon undNewline verhindert werden
eine mogliche Losung: URL-Format, z.B. %3B statt ;
eine andere: Lange voranstellen: 6:Thomas
Losung 2: Binarformat
schreiben mit java.io.DataOutputStream , lesen mitjava.io.DataInputStreamfur jeden Primitivtype eine readXXX() und writeXXX() MethodereadUTF() und writeUTF() fur Strings
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Persistenzproblem & CSVBinarformatSerialisierung
Aufgabe 2
Aufgabe: fulle die 3 Methoden mit Code um in einer Datei alleStudenten im Binarformat abzuspeichern. Die Datei soll am Anfangdie Anzahl der Eintrage (Studenten) enthalten. Danach sollen dieentsprechenden Felder der einzelnen Eintrage folgen.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Persistenzproblem & CSVBinarformatSerialisierung
Objekte
Geht es einfacher? Ja!Java kennt die einzelnen Felder der Klassen auch selber →SerialisierungLosung 3: Serialisierung
schreiben mit java.io.ObjectOutputStream.writeObject() ,lesen mit java.io.ObjectInputStream.readObject()Klassen mussen das Markierungsinterface java.io.Serializableimplementieren, um zu zeigen, dass sie mit der Serialisierungeinverstanden sindwriteObject() bildet einen Objektgraphen auf einen Bytestrom aballe durch das Startobjekt erreichbaren Objekte werden serialisiert →manchmal wird mehr serialisiert, als man wunschtContainer wie ArrayList implementieren auch Serializable →man kann gleich den ganzen Container serialisieren
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Persistenzproblem & CSVBinarformatSerialisierung
Aufgabe 3
Aufgabe: fulle die 3 Methoden mit Code um alle Studenten zuserialisieren, und dann in einer Datei zu speichern und naturlich auchwieder zu laden.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Einfuhrung
AWT ist das erste GUI-Toolkit fur Java
AWT hat platformspezifisches Aussehen
Swing:
einheitliches Aussehenmehr und machtige Komponenteninsgesamt besserbenotigt mehr Resourcen (etwas langsamer als AWT)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Komponenten
alle in javax.swing.*
JLabel eine Beschriftung
JButton ein Knopf
JCheckBox ein “Hackchen”-Knopf
JPanel ein (per-default) unsichtbarer Container
JFrame ein Hauptfenster
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Generelles Vorgehen
1 Erzeugen der Objekte: einfach mit Konstruktor
2 Setzen von spez. Eigenschaften wie Fonts oder Listeners
3 Zusammenfugen: Objekte werden den Containern hinzugefugt
4 Anzeigen: Top-Level Objekt reicht
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Listener I
Benannte innere Klasse:
c l a s s MyL i s t ene r implements A c t i o n L i s t e n e r {p u b l i c vo i d ac t i onPe r f o rmed ( Act ionEvent e ) {
. . .}
}myComponent . a d dAc t i o nL i s t e n e r ( new MyL i s t ene r ( ) ) ;
Anonyme innere Klasse:
myComponent . a d dAc t i o nL i s t e n e r ( new A c t i o n L i s t e n e r ( ){p u b l i c vo i d ac t i onPe r f o rmed ( Act ionEvent e ) {
. . .}
} ) ;Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Listener II
besser ist es in der Listener-Methode eine andere aufzurufen
p r i v a t e vo i d doSor t ( ) {. . .
}
s o r tBu t t on . a d dAc t i o nL i s t e n e r ( new A c t i o n L i s t e n e r ( ){p u b l i c vo i d ac t i onPe r f o rmed ( Act ionEvent e ) {
doSor t ( ) ;}
} ) ;
weitere Listener:ActionListener fur JButtonKeyListenerMouseListenerMouseMotionListener...
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Container
hauptsachlich JPanel: myPanel.add(someComponent);
jeder Container hat einen LayoutManager; spater mehr
JFrame ist speziell:myFrame.getContentPane().add(myMainPanel);
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Anzeigen
JFrame:
// Opt i ona l : Wenn das X ged r u c k t w i rd −> System . e x i tf rame . s e tD e f a u l t C l o s eOp e r a t i o n ( JFrame . EXIT ON CLOSE ) ;
// Opt i ona l : Z e n t r i e r t au f dem B i l d s c h i rmf rame . s e t L o c a t i o nR e l a t i v eTo ( n u l l ) ;
// Layoutenf rame . pack ( ) ;
// Anze igenf rame . s e t V i s i b l e ( t r u e ) ;
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 1
Wir wollen schrittweise eine Eingabemaske aufbauen, um Pizza zubestellen.
Die erste Aufgabe ist ein kleines Fenster zu erstellen, welche einJLabel und einen JButton enthalt. Wenn auf den Button gedrucktwird, soll das Programm beendet werden.
Beispiel:
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JTextField
JTextField einzeilige Texteingabe
Initialwert uber Konstruktor oder setText
aktueller Wert der Texteingabe mit getText
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Layout
Wh: jeder Container hat einen LayoutManager
Default von JPanel ist java.awt.FlowLayout
setzen im Konstruktor oder mit set-Methode
FlowLayout: wie Worter im Text; Umbruch an bestimmter Stelle
GridLayout:java.awt.GridLayoutm*n Tabellealle Kinder haben gleiche GroßeDimensionen im Konstruktor angebenAuffullen wie Leserichtung (Zeile-fur-Zeile, in der Zeile von links nachrechts)Hinzufugen mit panel.add(component);
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 2
In der zweiten Aufgabe soll 3 JLabels und 3 JTextFields angezeigtwerden. Zusatzlich sollen die Buttons richtigen Namen bekommen.Fur das Layout soll GridLayout eingesetzt werden.
Beispiel:
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDialog
JDialog Dialog als Hauptfenster
kann modal sein (Eingabe in andere Fenster nicht moglich solangemodaler Dialog offen ist)
Anzeigen wie JFrame
auch myDialog.getContentPane().add(myMainPanel); wie beiJFrame
owner im Konstruktor kann null sein
Anmerkung: bei einem modalen JDialog kehrt setVisible erstzuruck, wenn der Dialog zerstort wurde
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 3
In der dritten Aufgabe wollen wir das Ganze in einem entsprechendenRahmen fassen. Dazu gibt ein Datenhaltungsobjekt Order , einenOrderDialog und ein kleines Hauptprogramm.Der Code soll so abgeandert werden, dass OrderDialog die Daten,welche in Order schon enthalten sind als Startwerte fur die Anzeigenimmt. Das Drucken der Escape Taste soll dem Drucken desCancel-Buttons entsprechen.
Beispiel:
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JOptionPane
statische Hilfsklasse um einfach und schnell Dialoge anzuzeigen
moglich sind Meldungen aber auch Entscheidungen
Beispiel: JOptionPane.showMessageDialog(parentComponent,meldung, titel, messageType);
messageType kann z.B. JOptionPane.WARNING MESSAGE sein
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 4
In der vierten Aufgabe sollen die Daten des Benutzers uberpruftwerden. Denkt euch Regeln fur die Eingabe aus, und uberpruft sie,wenn der Benutzer den Send-Knopf druckt. Zeigt den Fehler in einemextra Dialog an. Wenn die Validierung erfolgreich war, soll dasubergebene Order Objekt aktualsiert werden. Dies kann dann vomAufrufer ausgewertet werden.
Beispiel:Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JTabbedPane
Container um einzelne Komponenten als Karteikarten anzuzeigen
Karteikarten bekommen einen Namen
immer nur eine Karteikarte sichtbar
Hinzufugen mit: myTabbedPane.add("name", someComponent);
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Tooltips
fur alle Swing-Componenten moglich
comp.setToolTipText("ein text");
mit null wird der Tooltip geloscht
HTML moglich!!!comp.setToolTipText("<html>Zeile1<br>Zeile2</html>");
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 5
In der funften Aufgabe soll ein JTabbedPane eingesetzt werden, umPlatz fur die eigentliche der Pizza zu bekommen. Diese Karteikartebleibt aber erstmal leer. Desweiteren sollen die Elemente Tooltipsbekommen.
Beispiel:
Beispiel:
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
MVC
MVC (Model-View-Controller) ist ein Architekturmuster zur Trennungvon Daten (Model), der Prasentation (View) und derProgrammsteuerung (Controller)
Swing ist nach MVC aufgebaut
→ fast jede Swingkomponente hat ein Model (ja, selbst das einfachJTextField hat eins)
Modelle werden per Default erzeugt; man kann aber auch ein eigenesangeben
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JComboBox
eine Dropdown-Box: Auswahl von genau einem Wert aus einer Menge
fur JComboBox gibt es das ComboBoxModel
Elemente im Konstruktor oder uber Model ubergeben (Konstruktorreicht sowieso nur durch)
das aktuell ausgewahlte Element mit getSelected* bzw.setSelected* bearbeiten
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JList
eine Liste
entweder nur maximal ein Element selektierbar oder beliebig viele(default)
hat auch ein Model wie JComboBox, gleiches gilt fur das Setzen bzw.Abfragen der Selektion
intern hat JList aber statt eines einfachen Wertes, der die aktuelleSelektion speichert ein ListSelectionModel an die Anfragen wiesetSelectedIndex weitergeleitet werden
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 6
In der sechsten Aufgabe wollen wir uns endlich der eigentlichen Pizzazuwenden. Eine Pizza hat eine Große und eine Menge von Zutaten(Ingredient). Uber eine Dropdown-Box ( JComboBox ) soll derBenutzer die Große auswahlen konnen. In einer Liste sollen dieZutaten erscheinen. Hier kann der Benutzer mehrere auswahlen.Beachte: der Startwert soll dem aktuellen Wert der ubergebenen Orderentsprechen.
Beispiel: Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Mauszeiger
alle Komonenten konnen einen Mauszeiger gesetzt bekommencomp.setCursor(myCursor);
java.awt.Cursor
Menge von vordefinierten Cursortypen
auch moglich eigene Cursor zu definieren
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JProgressBar
Fortschrittsanzeige
minimal und maximal Wert (z.B. 0 und 100)
aktualisieren mit myBar.setValue(24);
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 7
In der letzten Aufgabe soll die Bestellung abgeschickt werden. Dazusoll ein Fortschrittsanzeige benutzt werden. Auch soll der Mauszeigerdes Bestelldialogs in einen Wartezeiger wechseln (und naturlich auchwieder zuruck). Auch soll das Abschicken fehlschlagen konnen(benutzt dazu z.B. das Express flag). In diesem Fehlerfall soll einDialog dieses anzeigen und der Benutzer soll weiter editieren konnen.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Offene Themen
Nicht behandelt aber interessant:
JTable Daten in einer Tabelle darstellen
JTree Baume darstellen
JSlider Zahlenwerte einfach einstellen
JScrollPane Um Listen, Tabellen und Baume zu scrollen
Border beliebige Rahmen (auch benannte) um alle Objekte moglich
weitere Layouts
Menus
Tastaturkurzel
Renderer (List, Tree, Table)
und noch vieles mehr ...Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Netzwerk
wir verwenden TCP-Verbindungen statt UDP
TCP bietet bidirektionale Datenstrome
Identifikation uber Ports (0 - 216 − 1) auf Quell- und Zielrechner
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Vorgehen
1 Server erzeugt einen Socket auf einem bekannten Port ( newServerSocket(port) )
2 Server lauscht auf diesem nach eingehenden Verbindungen (serverSocket.accept() ) accept() blockiert hierbei
3 Client erzeugt einen Socket mit der Serveradresse und dem Serverportund verbindet sich zu diesem ( new Socket(servername,serverport) )
4 auf der Server kehrt accept() mit dem serverseitigen Socket derVerbindung zuruck. Der ServerSocket kann weiter verwendet werden.
5 Kommunikation ( socket.getInputStream() bzw.socket.getOutputStream() )
6 eine der Seiten schliesst die Verbindung ( socket.close() )
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 1
Es soll eine Verbindung zwischen zwei seperaten Programmen (Client undServer) aufgebaut werden.
Der Server soll einen Verdoppelungservice anbieten. Es soll ein Byte lesenund den doppelten Wert zuruckschicken. Der Server soll nicht unbedingtmehrere Clientverbindungen hintereinander bzw. parallel unterstutzen. Dieerste Aufgabe soll einfach sein.
Der Client soll mit java.util.Random eine Menge von Zufallszahlenerzeugen, und diese vom Server verdoppeln lassen. Das Ergebnis des Serversoll der Client lokal uberprufen.
Anmerkung: Es sollen die Methoden InputStream.read() bzw.OutputStream.write() verwendet werden. Diese lesen bzw. schreibenBytes und nicht Integer, wie das die Signatur der Funktionen vielleichtvermuten lassen wurde.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 2
Die zwei Einschrankungen der letzten Aufgabe (keine Clientverbindungenhintereinander, keine parallelen Clientverbindungen) sollen beseitigt werden.
Erweitert den Server, so dass mehrmalige Verbindungen unterstutzt werden.Hinweis hier ist, dass dafur accept mehrmals aufgerufen werden muss.
Erweitern den Server so, dass mehrere Cliente parallel mit der Serverarbeiten konnen. Hinweis: pro Clientverbindung ein Thread.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 3
Das bisherige Serviceinterface fur den Server ist nicht wirklich verstandlichund sicher.
Andert das Interface von 1 Byte hinsenden, 1 Byte zurucksenden auf einStringbasiertes Interface ab. Dabei soll der Client eine Anfrage (Request)schicken (eine Zeile) und der Server eine Antwort (Response). Diese sollauch wieder eine Zeile sein. Die Anfrage soll wie folgt aussehen: "add:23"die Antwort dann "result:46" . Hinweis: Zu verwenden sindPrintStream und DataInputStream .
Der Server soll bei einer fehlerhaften Anfrage die Abarbeitung dieserVerbindung abbrechen.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 4
Alternativ und insbesondere typesicherer kann man die Kommunikation mitHilfe von Serialisierung machen.
Andert die Kommunikation so, dass der Client serialisierte Anfragen an denServer und der Server entsprechende Antwortobjekte zuruckschickt.
Um die Kommunikation allgemein zu halten sollen die Klassen Requestund Response eingefuhrt werden und davon die speziellen KlassenAddRequest sowie ResultResponse abgeleitet werden.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 5
Im bisherigen Server arbeiten alle Klienten zwar parallel aber tauschenkeine Daten aus. Dies ist nicht realistisch. Es soll der Server um eine ModelKlasse erweitert werden, welche alle Daten der Anwendung beinhaltet, nureinmal vorhanden ist und von allen Klienten gemeinsam benutzt wird. Desweiteren soll die Verarbeitung der Anfragen von der ClientConnectionKlasse in die RequestProcessor ausgelagert werden. Bei einer richtigenAnwendung wurde hier ein Teil der Businesslogik stehen.
Uber den ChangeNameRequest ist es moglich, dass mehrere Klientengleichzeitig auf die Daten zugreifen. Dies soll geschutzt werden.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Einfuhrung
transparente Verschlusselung
optionale Authentifizierung beider Parteien uber Zertifikate
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Vorgehen
1 Erzeugen eines Schlussel/Zerifikat-Paares fur den Server
2 Verteilen des Server-Zertifikats an die Clienten (kopieren, per email,...)3 Anpassen der Java-Programme
1 Setzen von KeyStore/TrustStore uber Properties2 Sockets und ServerSockets werden uber Factories statt uber den
Konstruktur erzeugt
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Kryptographie
asymmetrische Verschlusselung
ein offentlicher und ein privater Schlussel gehoren zusammen
Klartext wird mit offentlicher Schlussel verschlussel und kann nur mitdem privaten Schlussel entschlusselt werden
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Zertifikate
Zertifikat enthalt:Identitatoffentlichen SchlusselBeglaubigungen
Beglaubigungen uber Kette von Zertifikaten bzw. Web-of-Trust
Alternativ: Selbstbeglaubigung
X.509 als Standard fur Zertifikate
Zertifikate konnen in verschiedenen Containern liegen
viele Containerformate: PEM, DER, PKCS#10, PKCS#12, RFC 1421usw.
fur Java: Java Key Store (JKS) (ist ein Binarcontainer)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JKS
der Keystore ist mit einem Passwort geschutzt
Eintrage werden uber ein Alias(-Name) referenziert
das Tool keytool vom JDK dient zum berarbeiten
auch wenn der Name KeyStore es nicht nahelegt, kann eine JKS auchZertifikate enthalten
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Schlussel erzeugen
Tool keytool vom JDK
Erzeugen mit keytool -genkey ...
die erstellte Datei enthalt den privaten Schlussel mit einemSelbstzertifikat
Zertifikat muss fur die Verteilung abgetrennt werden: keytool-export ...
gesamter Ablauf in generate ssl key.shErgebnis: zwei JKS Dateien
eine Datei mit dem privaten Schlussel fur den Servereine Datei mit dem Zertifikat zum Verteilen an die Clienten
vergleichbares Vorgehen, wenn SSL-Schlussel fur alle Clienten erstelltwerden sollen
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Bekanntgeben in Java I
die Dateinamen und die Passworter fur die Dateien mussen demJavaprogramm bekannt sein
Zwei Varianten:
uber Zuweisen von Propertiesuber manuelles Erstellen von SSL Klassen und viel mehr Handarbeit(wollen wir nicht)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Bekanntgeben in Java II
auf der Seite, welche den privaten Schlussel hat (bei uns der Server)muss der Keystore gesetzt werden
entweder mit java -Djavax.net.ssl.keyStore=... oder mitSystem.setProperty
System . s e tP r o p e r t y ( ” j a v a x . net . s s l . k e yS to r e ” ,”/ path / to / j k s−with−the−p r i v a t e−key ” ) ;
System . s e tP r o p e r t y ( ” j a v a x . net . s s l . keySto rePassword ” ,” thePassword ” ) ;
auf der anderen Seite muss der Truststore gesetzt werden
siehe Ausgangscode fur Aufgabe 1
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Erzeugen von SSLSockets
Sowohl Socket als auch ServerSocket bisher uber Konstruktur erzeugt
fur SSL uber eine Factory (javax.net.ssl.SSLServerSocketFactory bzw.javax.net.ssl.SSLSocketFactory )
Vorgehen:1 Factoryinstanz besorgen: SSLServerSocketFactory.getDefault()2 Socketinstanz erzeugen lassen:
mySslServerSocketFactory.createServerSocket(...)
Parameter sind vergleichbar zu denen des normalenKonstruktoraufrufes
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 1
Wandelt das erste Netzwerkbeispiel so ab, dass die Kommunikation durchSSL abgesichert wird. An der eigentlichen Funktionaltat soll nichtsgeandert werden.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Einfuhrung
Remote Method Invocation
Verteiltes Objektsystem
Registry als Anker um an Referenzen zu kommen
ahnlich CORBA
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Methodenaufruf
Nicht mehr Client → Server sondern Caller → CalleeCaller und callee konne in der gleichen VM, unterschiedlichen VMs aufdem gleichen Rechner oder auf unterschiedlichen Rechnern sein.Macht keinen Unterschied.Aufruf mit RMI indirekt:
1 Caller hat ein Stellvertreterobjekt (Proxy) vom Callee, welches dasgleiche Interface wie der eigentliche Callee hat
2 Caller ruft Proxy auf3 Proxy marshallt die Daten: serialisiert alle Parameter4 Daten werden uber VM Grenzen zu einem weiteren Hilfsobjekt geschickt5 Hilfsobjekt packt die Daten aus (unmarshalling)6 Hilfsobjekt fuhrt den Aufruf auf dem Callee aus7 Ruckgabewert wird uber den gleichen Weg (Hilfsobjekt, Serialisierung,
Proxy, Caller) zuruckgegebenAusgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Schlusse
der Proxy muss das gleiche Interface wie das aufgerufene Objekthaben → es wird ein interface deklariert und nur Methoden ausdiesem Interface konnen durch RMI verwendet werden
irgendwoher muss das Proxyobjekt kommen, und auch wissen, wo das“richtige” Objekt liegt
→ Referenzen (die Proxies) mussen verteilt werdengeht uber Registry (vergleichbar zu DNS bzw. gelben Seiten)Registry muss auch ein RMI Objekt seinwoher die Referenz fur die Registry nehmen (bootstrapping problem)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Nutzobjekte
Implementieren den eigentlichen Service, der angeboten werden soll
zu jedem Objekt existiert mind. ein Interface
das Interface ist von java.rmi.Remote abgeleitet
die Implementierung des Interfaces leitet vonjava.rmi.server.UnicastRemoteObject ab
alle Methoden des Interfaces werfen java.rmi.RemoteException
p u b l i c i n t e r f a c e Foo ex t end s Remote { . . . }p u b l i c c l a s s FooImpl e x t end s UnicastRemoteObject
implements Foo { . . . }
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Vorgehen
hier Server: stellt einen Service zur Verfugung hier Client: benutz denService durch eine Aufruf
1 Server beschafft sich die Referenz zu einer Registry
2 Server erzeugt ein Objekt, welches zur Verfugung gestellt werden soll
3 Server tragt das Objekt in der Registry unter einem bestimmtenNamen ein
4 Client beschafft sich die Referenz zu der Registry, die auch der Serververwendet hat
5 Client holt sich unter dem gleichen Name von der Registry dieReferenz auf das Nutzobjekt
6 Client verwendet Nutzobjekt
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Registry
Verschiedene Implementierungen moglich und unterstutzt
einfachste ist mitgelieferte
// Se r v e r : C rea teLo c a t eR e g i s t r y . c r e a t e R e g i s t r y ( po r t ) ;
// C l i e n t : GetLo c a t eR e g i s t r y . g e t R e g i s t r y ( ”hostname” , po r t ) ;
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Aufgabe 1
Implementiert den bekannten addiere-zwei-Integer Service mit RMI. DieLosung umfasst die folgenden 4 Klassen:
Adder Interface mit der add Methode
AdderImpl Implementierung von Adder
Server Erzeugt Instanz von AdderImpl und macht diese uber dieRegistry verfugbar
Client Holt sich die Referenz zu Adder uber die Registry und testetdiese mit Zufallszahlen.
Testet eure Losung auch fur dann Fall, dass Server und Client aufverschiedenen Rechnern laufen.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Authentifizierung
Aufrufe sind Stateless → zwei Aufrufe sind nicht verkettbar → keineClientverbindung, die der Server einmalig authentisieren konnte
Alternativen suchen (keine Schone bekannt)
Alternative 1: die Ausgabe der Referenz beschranken, ABER dieReferenzen konnen erraten werden
Alternative 2: die Authentifizierungsinformationen (Login+Passwort)fur bei jedem Aufruf ubertragen, ABER dadurch verliert die RMILosung viel von der Eleganz
Alternative 3: ein Hack, der mit den Sockets, welche RMI verwendet,rumspielt
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
Rest
es ist moglich und auch unterstutzt RMI uber SSL laufen zu lassen
rmiregistry als externer Registry-Prozess
seit JDK 1.5 dynamische Erzeugung der Proxyklassen und derHilfsklassen. Vorher: Erzeugung mit rmic
Bei Ruckgabe von einem Remote-Objekt wir nur der Proxyzuruckgegeben, sonst eine Kopie.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Einfuhrung
JDBC erlaubt Zugriff auf Datenbank
Package java.sql
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Vorgehen
1 Treiber laden Class.forName(...)
2 Verbindung aufbauen DriverManager.getConnection(url,username,password)
3 Beliebig oft parallel:1 Statement erzeugen connection.createStatement()2 Beliebig oft hintereinander:
1 Statement ausfuhren statement.execute() bzw.
statement.executeQuery()
2 Ergebnisse verwenden ( ResultSet )
3 Statement schliessen statement.close()
4 Verbindung schliessen connection.close()
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Datenbanken
fur Projekt MySQL
hier eine embedded Datenbank, da einfacher aufzusetzen
100% Java, nur ein Jar, DB als 3 Dateien
hier H2 (http://www.h2database.com/)
Treibername: "org.h2.Driver"
Url-Syntax: "jdbc:h2:/tmp/testdb" wobei ”/tmp/testdb” derDateiname der DB ist
Username ist "sa" , Passwort leer
Datenbank wird automatisch erzeugt
Webinterface auf dem lokalen Rechner
h2/bin/h2.jar muss zum Classpath hinzugefugt werden
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Aufgabe1
Schreibe eine Anwendung, welche eine Tabelle mit zwei Spalten (eineID-Spalte vom Typ integer, eine Spalte “Name” vom Typ String) erzeugt.
Es sollen dann die Namen “Hello” und “World” sowie alle ubergebenenKommandozeilenparameter der Tabelle hinzugefugt werden.
Der Inhalt der Tabelle soll auf dem Bildschirm ausgegeben werden.
Bei welchen Eingaben gibt es Probleme?
Verwendet fur die SQL-Anfragen der Ausgangscode.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
PreparedStatement
eigentlich Optimiertung von Anfragen, da die Anfrage vorverarbeitetwird
lost auch das Problem der problematischen Zeichen(Anfuhrungszeichen, Komma,...) (war Problem bei letzter Aufgabe)
Platzhalter werden duch Fragezeichen definiert
diese Platzhalter werden dann mit Werte besetzt
wiederverwendbar
Vorgehen:1 PreparedStatement erzeugen connection.prepareStatement(sql)2 Werte setzen preparedStatement.setXXX(platzhalterNr, wert)3 Ausfuhren preparedStatement.execute()
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Aufgabe2
Verandert eure Losung von Aufgabe1 so, dass sie PreparedStatementsverwendet, und damit auch mit ungewohnlichenKommandozeilenparameter keine Probleme hat.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Weitere JDBC-Themen
Transaktionen (notwendig?)
Auto-commit um schneller zu sein
Verschiedene SQL-Datentypen
connection pooling
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Architektur
Was sind die Anforderungen an die Schnittstelle der DB-Komponenteauf dem Server?
einfacher Austausch der DB (MySQL, Postgres, Oracle, ...)einfacher Austausch der Zugriffsart (JDBC, Hibernate, JDO,...)wenige Anderungen, wenn sich die Menge/Art der Objektdaten andert
Losung: POJO und DAO
weite Unterstutzung von den Frameworks
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
POJO
Plain Old Java ObjectKlassen, welche (fast) nur Domainwissen enthaltenmeist nur Datencontainer mit keinen Anwendungslogik (privateAttribute + setter/getter)Vererbung erlaubtVorteil: konnen von allen Schichten (UI, Businesslogik, DB) gleich gutverwendet werdensind also nicht auf spezielle Zugriffsarten bzw. Schichten zugeschnittenhabt ihr schon mit dem Datenmodell definierthaben meist eine ID (int oder String), welche fur die DB notwendigist, aber im engeren Sinne nicht Teil des Domainmodels istsiehe auch DTO (Data Transfer Object)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
DAO
Data Access Object
Interface welches Zugriff auf die DB bereitstellt
bietet meist CRUD (Create, Read, Update, Delete) Funktionalitat an
ein DAO Interface ist fur Objekte einer Klasse zustandig
Durch Interface wird Entkoppelung von der Implementierung erreicht
meist eine Factory, welche DAO-Instanzen erzeugt, Alternative ist dieImplementierungsklassen hart in den Benutzer zu codieren
kein State ausser DB-Verbindung → Singleton
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Aufgabe3
Verandert eure Losung von Aufgabe2 so, dass sie POJOs und DAOsverwendet. Das DAO soll uber folgende Methoden verfugen.
vo i d c r e a t e ( Foo f ) ;Foo read ( i n t i d ) ;Foo [ ] r e a dA l l ( ) ;v o i d update ( Foo f ) ;v o i d d e l e t e ( Foo f ) ;
Erweitert das Programm so, dass es alle neuen Methoden sinnvollverwendet.
Erstellt eine Factory, welche die DAO-Instanzen verwaltet und ausgibt.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Assoziationen I
Beispiel: Es gibt eine Studentengruppe und Studenten. Ein Student istin genau einer Gruppe.
Wie wird das gespeichert?
Jeder Student hat ein Attribute gruppe , welches den Typ derID-Spalte von Gruppe hat.
ist eine 1:n Relation
die 2 Anderen sind 1:1 und m:n
m:n immer mit extra Tabelle
1:1 mit extra Spalte oder mit gleichem primar Schlussel
1:1 wird eher selten gebraucht
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Assoziationen II
Wie soll jetzt der Zugriff darauf im POJO aussehen? (Annahme ID istein Integer)
1 Student hat eine Methode int getGroup()2 Student hat eine Methode Group getGroup()
die erste Methode ist die einfachere
bei der zweiten Methode wird das abhangige Objekt/die abhangigenObjekte auch mit ausgelesen und als POJOs konstruiert → wenigerDAO Aufrufe im restlichen Code aber zusatzliche Probleme
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Assoziationen III
bestimmt mochte man gern alle Studenten einer Gruppe haben
Alternativen:1 Gruppe hat keine solche Methode, muss uber spezielle Methode im
Studenten-DAO gemacht werden2 Gruppe hat eine Methode List<Integer> getStudents()3 Gruppe hat eine Methode List<Student> getStudents()
die Letzte ware schon nicht schlecht, da konnte man ja einfachgroup.getStudents().add(myNewStudent);groupDao.update(gropup); schreiben
die Letzte ist aber auch die Komplizierteste
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Probleme mit Assoziationen
bei der letzten Alternative gibt ein paar Probleme
wenn man beim Laden eines Objektes alle assoziierten Objekte ladt,mussten ja eigentlich auch alle mit den assoziierten Objektenassoziierten Objekte geladen werden. usw.Losung: lazy loading, hier werden die Listen von assoziierten Objektenur bei Bedarf/beim Zugriff darauf geladenerzeugt neue Probleme (asynchron muss eine DB-Verbindungaufgebaut werden)
Was soll passieren, wenn ein Student hinzugefugt wurde, welcher nochgar nicht in der DB gespeichert ist?Losung: Kaskadierung, d.h. der Student wird erstmal in der DBerzeugt
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Einfuhrung
die DAO-Implementierungen sind sehr vorhersagbar und sichwiederholend
Idee: werden von einem Framework ubernommen
Vorteile:1 genaue Spezifikation des Datenmodells (meist in XML)2 wesentlich weniger SQL-Anweisungen3 Transaktionssupport4 vollstandige OO-Modellierung des Datenmodell in Java (immer die
letzte Alternative)
Nachteile:1 Einarbeitungsaufwand2 die Probleme der Assoziationen sind immer noch da
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Warnung
Die Vergangenheit zeigt, dass dieVerwendung von Mapping-Frameworks einhohes Risiko darstellt.Der geplante Aufwand wird meist um ein großeres Vielfaches uberschritten.Hauptproblem sind Relationen/Assoziationen.
Eine Moglichkeit ist das Mapping Framework ohne dieRelationsunterstutzung zu verwenden. D.h. es gibt nur int getGroup()in Student.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Liste – Die großen Drei
Hibernate wird wohl am haufigsten verwendet(http://www.hibernate.org/)
JDO (Java Data Objects) ist ein Standard von SUN(http://java.sun.com/products/jdo/) Implementierungen:
JPOX (http://www.jpox.org/)TJDO (http://tjdo.sourceforge.net/)OJB (http://db.apache.org/ojb/)
Castor (http://castor.exolab.org/)
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Liste – Andere
Torque (http://db.apache.org/torque/)
Ibatis SQL Maps(http://java-source.net/open-source/persistence/ibatis-sql-maps)
Java Ultra-Lite Persistence (http://julp.sourceforge.net/)
JDBCPersistence (http://www.jdbcpersistence.org/)
SeQuaLite (http://sequalite.sourceforge.net/)
viele weitere
Vergleich: http://www.devx.com/Java/Article/33768/0/page/1
ich kann keine Empfehlung geben
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Einfuhrung
Auch mit “Hausmitteln” kann man eine pure JDBC-Implementierungverschlanken.
Zutaten sind:
Reflektion und BeanUtilsmoglichst wenige SonderfalleVerwendung von JDK 1.5 Features
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
BeanUtils
Teil von Apache-Commons (http://commons.apache.org/beanutils/)
Damit ist es moglich Properties in Objekten abzufragen und zu setzen
Map<St r i ng , C la s s> m = BeanUt i l s . d e s c r i b e ( ob j ) ;f o r ( S t r i n g name : m. keySet ( ) ) {
Object v a l u e = m. get ( name ) ;C l a s s type = P r o p e r t yU t i l s . ge tPrope r tyType ( obj , name ) ;System . out . p r i n t f ( ” p r o p e r t y : %−20s type : %−40s v a l u e : %s \n” ,
name , type , v a l u e ) ;}
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
JDBCPOJO und DAOAssoziationenMapping-FrameworksVerbesserung einer JDBC-Implementierung
Weitere Gedanken
Es wird einfacher, wenn Propertyname und Spaltennamen gleich sind.
Es ist moglich einen allgemeinen DAO zu schreiben, der dann, wie eineListe, durch den Nutzdatentyp spezialisiert wird
Uber varargs lassen sich spezifische Filterabfragen implementieren
Foo [ ] f i ndByParamete r ( Object . . . o b j s ) { . . . }. . .x = studentDao . f i ndByParamete r ( ” gruppe ” , 2 3 ) ;
http://www.javaworld.com/javaworld/ \jw-05-2002/jw-0524-sql.html?page=1
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Einfuhrung
XML sind strukturierte hierarchische DatenSchreiben ist einfacher und nicht relevant fur SWPZu losen fur SWP: Einlesen und Extrahieren von Informationen ausXML-Datei
<root−e l ement><!−− This i s a comment −−>
<someElement someAt t r i bu t e=” someva lue ”> <!−− s t a r t−tag −−>some con t en t
</ someElement> <!−− end−tag −−>
<empty :e lement−w i t hA t t r i b u t e s foo=”42”/></ root−e l ement>
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
SAX
Simple API for Xml (SAX) (http://www.saxproject.org/)
Parser parst XML-Datei und ruft bei bestimmten EreignissenFunktionen auf
Vorteile: schnell, wenig Speicher
Nachteile: Kontext nur eingeschrankt vorhanden
Klassen liegen im Package org.xml.sax
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Vorgehen
// E ine SAX−Pa r s e r I n s t a n z be so rgenXMLReader r e a d e r = XMLReaderFactory . createXMLReader ( ) ;
// Unse r e r Hand le r mit den spez . C a l l b a c k sMyHandler h and l e r = new MyHandler ( ) ;
// I n s t a l l i e r e nr e a d e r . s e tCon t en tHand l e r ( h and l e r ) ;r e a d e r . s e t E r r o rHand l e r ( h and l e r ) ;
// Und s t a r t e nr e a d e r . p a r s e ( new Inpu tSou r c e ( new F i l eR e ad e r ( f i l e n ame ) ) ) ;
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Aufgabe1
XMI ist ein Standard zum Austausch von UML-Diagrammen. Mit SAXsollen die Datei WebLog en.uml eingelesen werden und zum Schluss dieListe aller Klassennamen ausgegeben werden.
Klassen sind packagedElement Elemente, wobei das Attribute “type”den Wert “uml:Class” hat.
Die Ausgabe sollte somit [User, BlogEntry, CreateAccount,EditAccount, Login, CreateBlog, ViewBlogs] sein.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
DOM
Document Object Model (DOM) (http://www.w3.org/DOM/)
Parser parst XML-Datei komplett in den Speicher als Baum. Dieserkann dann traversiert werden.
Vorteile: Kontext vollstandig vorhanden (notwendig fur semantischeUberprufung)
Nachteile: langsamer, mehr Speicher
Klassen liegen im Package org.w3c.dom
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Vorgehen
// I n s t a n z be so rgenDocumentBu i lde rFacto ry f a c t o r y =
DocumentBu i lde rFacto ry . new Ins tance ( ) ;DocumentBui lder b u i l d e r = f a c t o r y . newDocumentBui lder ( ) ;
// Parsen . E r g ebn i s i s t Wurze lknotenDocument doc = b u i l d e r . p a r s e ( f i l e n ame ) ;
Document ist ein Node . Damit Traversierung vom kompletten Baummoglich.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Aufgabe2
Aufgabe 1 mit DOM losen.
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Digester
Apache-Commons Digester (http://commons.apache.org/digester/)
Was mochte man eigentlich? Aus XML-Daten Java-Objekte erstellenlassen. Mit moglichst wenig Aufwand.
Digester ist nicht die Erste und nicht die Einzigste Losung.
Benutzer gibt Regeln an. Durch Reflektion wird daraus deranwendungsspez. Objektbaum.
Vorteile: wenig Programmieraufwand, Daten sind danach in spez.Javaklassen, low-level Sachen wie SAX und DOM werden gekapselt,erweiterbare Typkonvertierung
Nachteile: eigentlich keiner (ist nicht beim JDK mit dabei)
baut intern auf SAX auf
Klassen liegen im Package org.apache.commons.digester
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Vorgehen
// I n s t a n z be so rgenD i g e s t e r d i g e s t e r = new D i g e s t e r ( ) ;
// Rege ln zum D i g e s t e r h i n zu f u g en. . .
// S t a r t e nMyTopLevelObject r e s u l t = ( MyTopLevelObject )
d i g e s t e r . p a r s e ( new F i l eR e ad e r ( f i l e n ame ) ) ;
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Regeln
sind Regeln fur eine Stackmaschine
pattern beschreibt, wann die Regeln ausgefuhrt werden.
Beispiele fur pattern sind “xyz/foo” oder “xyz/foo/bar”
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Ubliche Regeln
// e i n e I n s t a n t von className e r zeugend i g e s t e r . addOb jec tCrea te ( ” p a t t e r n ” , ” c lassName” ) ;
// a l l e XML−At t r i b u t ew e r t e// a l s Java−P r o p e r t i e s s e t z t e nd i g e s t e r . a d dS e tP r op e r t i e s ( ” p a t t e r n ” ) ;
// den Body des XML−Elementes un t e r// dem Java−Prope r t y propertyName s p e i c h e r nd i g e s t e r . addBeanPrope r t ySe t t e r ( ” p a t t e r n ” , ” propertyName” ) ;
// au f dem vo r h e r i g e n S t a c kob j e c t w i rd methodName// mit dem akt . Objekt a l s Parameter a u f g e r u f e nd i g e s t e r . addSetNext ( ” p a t t e r n ” , ”methodName” ) ;
Ausgewahlte Implementierungsprobleme
EinfuhrungMultithreadingSerialisierung
SwingNetzwerk
SSLRMI
JDBCXML
EinfuhrungSAXDOMDigesterAusblick
Aufgabe3
Unter sample.xml ist ein Brotbackrezept abgespeichert. Dies soll mit denDigester eingelesen werden. Die Datenklassen Recipe und Ingredientsind schon vorhanden und sollen durch den Digester instantiiert werden.
Fur diese Aufgabe ist es notwenig den Digester und entsprechndenAbhangigkeiten runterzuladen und dem Classpath hinzuzufugen.
Ausgewahlte Implementierungsprobleme