107
Ausgew¨ ahlte Implementierungsprobleme

Ausgew¨ahlte Implementierungsprobleme - Uni Bremen · Swing Netzwerk SSL RMI JDBC XML Einf¨uhrung Sowohl f¨ur interaktiv erarbeiten, ... Java kennt die einzelnen Felder der Klassen

  • Upload
    lylien

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Ausgewahlte Implementierungsprobleme

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

EinfuhrungMultithreadingSerialisierung

SwingNetzwerk

SSLRMI

JDBCXML

EinfuhrungSAXDOMDigesterAusblick

Ausblick

Nicht behandelt wurden auf

Encoding

Validierung von XML (Stichwort DTD)

Namespaces

Ausgewahlte Implementierungsprobleme