SE2-w11-Zusammenfassung

Werbung
Slideshow SE 2
In 80 Folien durchs Semester
Engineering?
Softwarekonstruktion ist Ingenieurleistung:





Kenntnis der technologischen Alternativen
Einsatz von Norm- und Fertigteilen
Einsatz von Standardstrukturen
Einsatz von Standardtechniken / Best Practices
Hauptaufgabe: Strukturierung und Kombination
(nicht Programmierung)
Themen der LV





© schmiedecke 10
Java-Web-Technologie
JSF-Framework als Standard-Präsentationsstruktur (MVC-2)
JPA als Persistenzframework
Scaffolding zur Erstellung einer Standard-Architektur (CRUD)
Konstruktionstechniken am Klassenmodell:
Modelldetaillierung, Konstruktionsprinzipien
und Entwurfsmuster
 Produktsteuerung
SE 2
2
Praxis: aus einem Klassenmodell mit 10 Klassen
© schmiedecke 10
SE 2
3
… wird ein System mit
50 Klassen und 28 XML- Dateien!
© schmiedecke 10
SE 2
4
Ist das wirklich nötig?
 Es gibt gute Gründe dafür, dass das die richtige Technik ist!
 Einige der Zauberworte heißen
–
–
–
–
–
–
Referenzarchitektur
Skalierbarkeit
Änderbarkeit
Sicherheit
Stabilität
Fehlervermeidung bei "Boiler Plate Code"
© schmiedecke 10
SE 2
5
Web-Anwendung: Dynamischer Content
 dynamischer Content
CGI
PHP
JSP/
Servlet
ASP
URL
WebClient
Web -
Server
Programm
DB
HTML
+JavaScript
+Applets
Front End
Web Publishing
(c) schmiedecke 11
SE2-2-Java-Webapps
Back End
6
Programmiermodelle
 Programmorientiert (Perl -- Servlets)
– serverseitige Applikation besteht aus Programmen
– erzeugen HTML-Dokument als Ausgabestrom
+ Fachlogik gut strukturierbar, Kontrolle übersichtlich
- Dokumentenstruktur verborgen
- Layout-Veränderungen erfordern Programmänderungen
-
Dokumentenorientiert (ColdFusion – JSP, Facelets)
- serverseitige Applikation ist HTML-Dokument mit eingebetteten
Scripten
+ Dokumentenstruktur gut erkennbar (gestaltbar)
+ einfaches Handling
- (c)
Fachlogische
schmiedecke 11 Struktur verwischt
SE2-2-Java-Webapps
7
Simple JSP
<html>
<head><title>Simple JSP</title></head>
<body>
Your browser is: <%= request.getHeader("User-Agent") %><br>
Your IP address is: <%= request.getRemoteAddr() %><br>
</body>
</html>
(c) schmiedecke 11
SE2-2-Java-Webapps
8
SimpleServlet
public class SimpleServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
// 1. process request-parameters and -headers...
String client = request.getHeader("User-Agent");
String ipAddress = request.getRemoteAddress();
// 2. prepare the response...
response.setContentType("text/html");
// 4. write to Response PrintWriter
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title> SimpleServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Your browser is: "+ client +
"<br> Your IP address is: "+ ipAddress + "<br>);
out.println("</body></html>");
(c) schmiedecke 11
SE2-2-Java-Webapps
9
}
Der JSP-Lebenszyklus (im Web-Container)
1.
Transformieren:
–
–
–
2.
Kompilieren
–
3.
Das Servlet wird "normal" kompiliert. (Benötigt Servlet-API)
Instanziieren
–
4.
Die gesamte JSP-Seite wird in eine Java-Klasse umgeformt
Klasse vom Typ Servlet
Leistet das, was wir intuitiv von der JSP erwarten
und erzeugt ("druckt") HTML-Code
Das Servlet wird geladen und instanziiert.
Der Web-Container verwaltet die Instanz.
Aufruf
–
Bei jeder Client-Anfrage wird eine bestimmte Service-Methode der ServletInstanz gerufen (meistens "doGet" oder "doPost")
 Schritte 1-3 geschehen implizit beim "Deployen"
(c) schmiedecke 11
SE2-2-Java-Webapps
10
Deployment



Genormte Verzeichnisstruktur für Java-Web-Anwendungen
Gesamtes Verzeichnis packen:
WAR-Datei ("Web Archive") == JAR mit fester Struktur
In ein bestimmtes Unterverzeichnis des Web-Containers "schieben"
– bei Tomcat ist das "webapps“
– bei Glassfish "autodeploy"


Ggf. den Web-Container starten (Tomcat, Glassfish, JBoss…)
Der Web-Container realisiert den Lebenszyklus der
Jsp-s, Servlets, Beans
myJsp
myJsp.war
(c) schmiedecke 11
SE2-2-Java-Webapps
11
web.xml – der Deployment Descriptor
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>start</servlet-name>
<servlet-class>myapps.StartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>start</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>
</web-app>
(c) schmiedecke 11
SE2-2-Java-Webapps
12
Java-Web-Technologie: JEE
Ohne EJBContainer:
JSE
(c) schmiedecke 11
SE2-2-Java-Webapps
13
Servlets müssen reentrant sein!
 Servlets werden beim Deployment instanziiert und dann von
verschiedenen Clients genutzt:
Servlet 1
Client 1
Servlet 2
Client 2
Servlet 3
Web-Container
(c) schmiedecke 11
SE2-2-Java-Webapps
14
Was sind Beans?
public class Bohne {
private String prop;
public void setProp(..);
public String getProp();
}
 Beans sind "Pojos"
–
–
–
–
"plain old java objects"
Attribute heißen "Properties"
und haben Getter- und Setter-Methoden
(ggf. gibt es ein genormtes Event-Modell)
 Durch diese "genormte" Form
– können Attribut-Zugriffe automatisch generiert werden
– können Bean-Objekte durch Werkzeuge "konfiguriert" werden
– und das war's schon!
 Für die Datenspeicherung von JSPs gut geeignet...
(c) schmiedecke 11
SE2-2-Java-Webapps
15
Beans verschiedener Sessions
 Die Beans einer
Session bilden
einen Kontext.
Servlet 1
 Der Zugriff erfolgt
über diesen
Kontext.
 (Das Servlet
bedient jeden
Kunden aus seinem
Konto)
(c) schmiedecke 11
Web-Container
SE2-2-Java-Webapps
16
Beans mit verschiedenen Lebensdauern
Jsp1
Jsp2
Jsp3
request
session
(c) schmiedecke 11
application
SE2-2-Java-Webapps
17
Beans zur Seitendynamisierung
 (Zwischen-)Speichern von Eingaben:
– Eingaben werden als Request-Parameter an die JSP übergeben
– mit <jsp:setProperty> werden sie in einer Bean-Property gespeichert.
– Soll die Eingabe persistent gespeichert werden, so kann in der SetterMethode ein DB-oder Dateizugriff programmiert werden.
 Anzeigen dynamischer Werte:
– Die Getter-Methode der Bean greift auf Anwendungsdaten (z.B. eine
Datenbank) zu oder errechnet einen Wert dynamisch
– Der Wert wird mit <jsp:getProperty> in die JSP eingebunden und so beim
Erzeugen der HTML-Seite dynamisch generiert.
(c) schmiedecke 11
SE2-2-Java-Webapps
18
Sessions?
 HTTP ist zustandslos
 Der Web-Container verwaltet Sessions über ein Session-ID
(generierte Nummer)
 Wird beim ersten Response wenn möglich als Cookie gesendet,
sonst an die URL gehängt
 Wird bei weiteren Anfragen als Request-Parameter "jsessionid"
mitgegeben
 bei GET sichtbar
(c) schmiedecke 11
SE2-2-Java-Webapps
19
Modell-1-Architektur
...damit kann
man ALLES
machen!
Jsp1
JavaAnwendung
Jsp2
Jsp3
DB
request
session
(c) schmiedecke
11
application
SE2-2-Java-Webapps
20
Modell 1
JSP
Bean
JSP
JSP
Client
Bean
Fachlogik
JSP
Bean
JSP



Jede JSP reagiert selbständig auf Benutzeranfragen
erstellt und benutzt Beans, die die Fachlogik aufrufen
verzweigt ggf. für die Response zu einer anderen JSP
(c) schmiedecke 11
SE2-3-JSF
21
MVC - klassisch

Model (auch Domain Model oder Fachlogisches Modell) enthält und
verwaltet die persistenten Daten und die Fachoperationen darauf
 View liest die erforderlichen Daten aus dem Model, bereitet sie auf
und präsentiert sie.
 View registriert sich beim Model, um Veränderungen zu erfahren
 Controller nimmt die Nutzeranfragen entgegen und leitet sie an die
(c) schmiedecke
11
SE2-3-JSF
zuständigen
Stellen weiter.
22
MVC 2 – oder Modell 2
 Front Controller
Front
Controller
Servlet
Bean
Client
Bean
JSP
Bean
JSP
– empfängt alle
Requests
– instanziiert und
füllt Beans
– ruft die Aktionen
– leitet an die
passende
Antwort-JSP
weiter.
 JSP
JSP
– liest Beans
– erzeugt und
sendet Response
(c) schmiedecke 11
SE2-3-JSF
23
Skalierbarkeit von Modell 2
 Modell 2 macht Web-Anwendungen beliebiger Größe prinzipiell
beherrschbar:
–
–
–
–
–
klare Trennung zwischen Darstellung und Kontrolle
alle Komponenten separat entwickelbar
beliebig komplexes Domänen-Modell anschließbar
zentralisierte Ablaufsteuerung
Aufgabenteilung zwischen Designern und Programmierern
(c) schmiedecke 11
SE2-3-JSF
24
Realisierung durch
Web Application Frameworks
 Definieren Objekttypen und ihre Zusammenarbeit:
praktisch immer MVC2
 Bieten (erweiter- oder konfigurierbare) Standardobjekte
 Ersetzen harte Verdrahtung der Seitennavigation durch
Konfiguration
 Unterstützen die Zuordnung von Beans oder entsprechenden
Objekten
 Unterstützen den Aufbau von GUIs
 deutlich verbesserte Wiederverwendbarkeit der Komponenten.
(c) schmiedecke 11
SE2-3-JSF
25
Modell 2 mit dem JSF-Framework
Fertigteil von JSF

– empfängt alle
Requests
– füllt Beans
– leitet an das passende
Antwort-Facelet weiter.
Faces
Servlet
Managed
Bean
Client
Managed
Bean
Facelet
Managed
Bean


Facelet
(XHTML-Datei)
– liest Bean-Daten
– erzeugt und sendet
Response
xml-konfiguriert statt "hart verdrahtet"
(c) schmiedecke 11
FacesContext
– instanziiert die
ManagedBeans
Facelet
Facelet
FacesServlet
SE2-3-JSF
26
JSF - Features
 Klare Model2-Architektur
 Front Controller heißt FacesServlet
 JSF-UI-Komponenten als Bausteine für Seiten




verschiedene Renderer möglich (z.B. für Handys)
ein- und ausblendbar
View-Definition-Languages: Facelets und JSP
Ereignisbehandlung
 Datentransfer
 Konfigurierbare Managed Beans
 Einfaches Data Binding an Managed Beans über EL (Expression Language)
 Konvertierung und Validation
 Konfigurierbare Seitennavigation
 Unterstützung von Meldungen
 Internationalisierungs- und Zugänglichkeits-Unterstützung
(c) schmiedecke 11
SE2-3-JSF
27
Faces Servlet-Spezifikation in web.xml
 Faces-Servlet wird als zentraler Einstiegspunkt festgelegt
<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<!-- Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>MyApp/*</url-pattern>
</servlet-mapping>
(c) schmiedecke 11
SE2-3-JSF
28
JSF-Entwicklungsprozess beginnt beim UI
1. Entwirf die UIs und binde die Datenfelder an das Datenmodell
2. Entwickle ein (Interaktions-)Datenmodell aus Beans
3. Entwirf die Seitennavigation abhängig von Ergebnissen
4. Führe die "Verdrahtung" im web.xml und faces-config.xml bzw.
durch Methodenergebnisse durch
(c) schmiedecke 11
SE2-3-JSF
29
JSF-UI-Komponenten
 Ähnlich Swing-Komponenten, grafisch zusammenstellbar
 Instanziierung und Platzierung durch JSF-tags:
<h: form id="customer_form">
<h: panelGrid id="grid" columns="2" >
<h: outputLabel value="First Name:" for "firstnameField"/>
<h: inputText id="firstnameField" value="#{customer.firstName}"/>
…
<h: commandButton id="saveBtn" action="#{customer.save}"
value="Save"/>
</h:panelGrid>
</h:form>
 VDL – View Definition Language
– Facelets sind XHTML-Seiten (erscheinen im Browser mit der Endung .jsf)
– JSP wird auch unterstützt.
(c) schmiedecke 11
SE2-3-JSF
30
Managed Beans




JSF instanziiert und verwaltet alle deklarierten Beans
Managed Beans sind über Managed Properties verknüpfbar
Deklaration in der faces-config.xml oder durch Annotationen
Dependency Injection
@ManagedBean (name="address")
@SessionScoped
class AddressBean {
String surname;
String Address;
}



@ManagedBean (name="mail")
@SessionScoped
class MailBean {
String mailprovider;
String mailaddress;
@ManagedProperty
(value="#{address}")
AddressBean ref;
}
Mithilfe der EL ansprechbar:
#{address.surname} #{mail.ref.surname}
Scopes: none /request / view / session / application
Lazy Creation
(c) schmiedecke 11
SE2-3-JSF
31
Managed Beans und Data Binding
class MailBean {
String mailprovider;
String mailaddress;
AddressBean ref;
JSP
}
class AddressBean {
String surname;
String Address;
}
...
File register.jsp
<f:view> <h:form>
<b>Please provide your name</b><br/>
<h:outputText value="Name*"/></td>
<h:inputText id="name" required="true" value="#{address.surname}" size="20">
<f:validateLength minimum="2" maximum="12"/>
</h:inputText>
<h:message for="name" style="color: red;"/>
ruft
<p> ...
setter
</f:view>
(c) schmiedecke 11
SE2-3-JSF
32
Zugriffschutz
 Authentifizierung
(Authentification)
WER IST DAS?
 Autorisierung
(Authorization)
WER DARF WAS?
 Zugriffsüberprüfung
(Checkpoint)
DARF DER DAS?
(c) schmiedecke 11
33
SE2-4-Authentifizierung
Server-basierte Authentifizierung
 Container unterstützt Authentifizierung:
 Login setzt Identität und Rolle der Session.
 Identität und Rolle können aus dem Session-Kontext jederzeit
abgefragt werden
 Technik ist im Prinzip egal (Fingerprint, Eyescan, …)
 Principal und Rolle werden ermittelt und gespeichert.
Wichtig:
 Credentials werden außerhalb der Anwendung (nämlich im
Container) verwaltet – weniger leicht hackbar!
(c) schmiedecke 11
34
SE2-4-Authentifizierung
Zugriffsschutz-Schema:
Server
Client
user
pw
Authentifi
-cation
role
Authoriza
tion Check
(c) schmiedecke 11
35
user
resource
role
SE2-4-Authentifizierung
Was ist Persistenz?
 Persistenz bedeutet ursprünglich, dass Objekte die
Programmausführung "überleben"
 durch Auslagerung auf externe Speichermedien,
z.B. durch Serialisierung und Dateiausschrieb bei Shutdown
 Für langlaufende Programme:
Zwischenauslagerung nicht benötigter Objekte
"Hibernation" (Winterschlaf)
 Persistenz heute:
Dynamische Ein- und Auslagerung von Objekten
(Materialisierung und Dematerialisierung)
normalerweise in Datenbanken
(c) schmiedecke 11
SE2-5-DB
36
Datenbank-Modellierung
 Datenbanken verwalten Entitäten und ihre Beziehungen
 Datenmodelle auf verschiedenen Abstraktionsstufen
 ERM – Entity-Relationship-Modell
– ähnlich dem UML-Klassendiagramm
aber ohne Vererbung
– unabhängig vom Datenmodell
(m:n-Beziehungen sind möglich)
– kanonische Abbildung auf das Relationale Modell
(Verknüpfungstabellen)
– Notationsfalle:
Kardinalitäten werden an der Quelle notiert (UML am Ziel)
(c) schmiedecke 11
SE2-5-DB
37
ERM-Beispiel (UML-Notation)
class ERM online shop
Produk t
-
Orde r
Produktnummer: int
Preis: double
Name: String
*
Info: String
AnzKolli: int
Gewicht: double
* -
Bestelldatum: Date
Lieferdatum: Date
Versandform: String
Rechnungsnummer: int
Bearbeiter: String
*
*
*
1
*
1
Kunde
Einkaufsw agen
-
Datum: Date
(c) schmiedecke 11
Kreditk arte
1
1 -
Name: String
Strasse: String 1
Ort: String
PLZ: int
SE2-5-DB
1.. *
-
Kartentyp: String
Kartennummer: int
Gültigkeit: Date
38
Das Relationale Datenmodell
 Das Relationale Modell
–
–
–
–
Entitäten als Tupel in Relationen (Zeilen in Tabellen)
Tupel (Zeilen) eindeutig identifizierbar durch Primärschlüssel
alle Attribute (Spalten) skalar (1.NF)
Beziehungen als Verweise in andere Relationen (Fremdschlüssel)
 Integritätsbedingungen
– Entitätsintegrität: Primärschlüssel sind eindeutig
– Referentielle Integrität: Zu jedem Fremdschlüssel existiert ein Ziel.
 Relationale Datenbank-Managementsysteme
– extrem effiziente und zuverlässige Implementierungen
(c) schmiedecke 11
SE2-5-DB
39
ERM  Relationales Modell
 Jedes Tupel benötigt einen Primärschlüssel
– inhärenter Schlüssel: eindeutiges Attribute
oder eindeutige Attributgruppe
– Surrogatschlüssel:
hinzugefügter eindeutiger Wert ohne
eigene Semantik, zumeist ein Zahlenwert
 In der Softwareentwicklung benutzen wir
immer Surrogatschlüssel
– durch inhaltliche Anpassungen der Daten kann sonst die
Eindeutigkeit nachträglich verloren gehen.
(c) schmiedecke 11
SE2-5-DB
40
ERM  Relationales Modell
 Eine unidirektionale m:1-Beziehung wird als Fremdschlüssel
dargestellt
(c) schmiedecke 11
SE2-5-DB
41
ERM  Relationales Modell
 1:m-Beziehungen, m:n-Beziehungen und bidirektionale m:1Beziehungen werden mithilfe einer Verknüpfungstabelle dargestellt.
– Die Verknüpfungstabelle benötigt keinen eigenen Primärschlüssel
– ein eigener Primärschlüssel ermöglicht die Abbildung assoziativer
Klassen (im ORM)
(c) schmiedecke 11
SE2-5-DB
42
ERM  Relationales Schema
 Umformung kann automatisch erfolgen
 Zahl der Tabellen wächst.
– Problem?
– Joins für Zugriffe kosten Zeit
class ERM online shop
Produk t
-
Orde r
Produktnummer: int
Preis: double
Name: String
*
Info: String
AnzKolli: int
Gewicht: double
* -
Bestelldatum: Date
Lieferdatum: Date
Versandform: String
Rechnungsnummer: int
Bearbeiter: String
*
*
*
1
*
1
Kunde
Einkaufsw agen
-
Datum: Date
Kreditk arte
1
1 -
Name: String
Strasse: String 1
Ort: String
PLZ: int
(c) schmiedecke 11
1.. *
-
Kartentyp: String
Kartennummer: int
Gültigkeit: Date
SE2-5-DB
43
Datenzugriffe - SQL
 Datenbanksprache SQL
– deklarative Sprache
– Definition (DDL), Änderung (DML) und Abfrage (QL)
– äußerst effizient implementiert.
SELECT Name, Strasse, Ordernummer, Versanddatum
FROM Kunde, Order
WHERE Kunde.PLZ > 1200 AND Order.kunde = Kunde
AND Versanddatum < 01-10-2010
ORDER BY Versanddatum
(c) schmiedecke 11
SE2-5-DB
44
ODBC - SQL-Nutzung aus Programmen

Open Database Connectivity
– Spezifikation, nicht produktgebunden
– Microsoft-Entwicklung  inzwischen standardisiert
– BS-Bestandteil ab Windows 2000/NT

Programmierschnittstelle (API) für RDBMS
– Registrierung der Verbindungsdaten
(URL, DB-Name, User, PW)
– Weitergabe von SQL-Anweisungen (Strings)
an die Datenbank
– Erzeugung weiterverarbeitbarer Daten
aus dem SQL-Ergebnis.

C++-Programm
C++-ODBC-API
ODBC-Treiber
für Oracle
Breite Unterstützung:
– Es gibt ODBC-"Treiber" für (praktisch) jedes RDBMS
(unter Windows – Unix ist noch nicht so gut unterstützt)
– Objektorientierte Programmiersprachen bieten APIs mit Klassen zum
Umgang mit ODBC-Aufrufen und –Daten.
(c) schmiedecke 11
SE2-5-DB
OracleRDBMS
45
JDBC
 Java Database Connectivity
– Spezifikation, nicht produktgebunden
 Programmierschnittstelle (API) für RDBMS
– Registrierung der Verbindungsdaten (URL, DB-Name, User, PW)
Klasse Connection
– Weitergabe von SQL-Anweisungen (Strings) an die Datenbank
Klasse Statement
– Erzeugung weiterverarbeitbarer Java-Objekte aus dem SQL-Ergebnis.
Klasse ResultSet
 JDBC-"Treiber" für jede RDB-Implementierung
 ODBC-JDBC-"Bridge" als generischer Treiber
(c) schmiedecke 11
SE2-5-DB
46
ORM – Objekt-relationales Mapping
 JDBC ermöglicht den Zugriff auf Daten
 Wir wollen Persistenz von Objekten!
 Die Abbildung von Klassen auf Relationen (Tabellen)
gleicht der Abbildung von ERM-Entitäten auf Relationen
 Nur die Vererbung fehlt noch.
 Automatisierbar!
(c) schmiedecke 11
SE2-5-DB
47
ORM - Vererbung
 Tabelle-je-Klasse
– Für jede Klasse der Hierarchie eine Tabelle
– enthält nur die nicht-geerbten Attribute
– Verweis auf Oberklassentabelle über OID (Primärschlüssel)
– Zusatzspalte mit dem Objekttyp
 Daten eines Objekts auf mehrere Tabellen verteilt
 aufwändige Zugriffe
 Einzeltabelle
– Tabelle enthält eigene und geerbte Attribute
– Polymorphismen nur programmatisch erfassbar
 Tabelle-je-konkrete-Klasse
– Zwischenform, weniger Redundanz,
– einfachere Zugriffe als Tabelle-je-Klasse
– weniger Redundanz als Einzeltabelle
(c) schmiedecke 08
SE2-4-Persistenzmodelle
48
ORM: Einzeltabelle
 Vorteil: einfacher Zugriff ohne Join
(c) schmiedecke 08
SE2-4-Persistenzmodelle
49
ORM: Tabelle-je-konkrete-Klasse

Vorteil:
– einfacher Zugriff ohne Join

Graphik aus: Heide Balzert,
Lehrbuch der Objektmodellierung
Nachteil:
– Änderungen der Oberklasse müssen in mehreren
Tabellen durchgeführt werden.
(c) schmiedecke 08
SE2-4-Persistenzmodelle
50
ORM: Tabelle-je-Klasse

Vorteile:
– Nahe am Klassenmodell
– Änderungen in alle Klassen leicht durchzuführen

Graphik aus: Heide Balzert,
Lehrbuch der Objektmodellierung
Nachteile:
– viele Tabellen
– Zugriffe über Joins
(c) schmiedecke 08
SE2-4-Persistenzmodelle
51
Der "Traum"
Völlige Transparenz
Some
Secret
Mechanis
m

 Nicht alle Objekte müssen persistent sein
  Klassen als "persistent" deklarieren:
persistent class MyClass { ... }
 Nicht alle Attribute müssen persistent sein:
persistent int myAttribute;
 Alles andere könnte "automatisch ablaufen"
(c) schmiedecke 08
SE2-4-Persistenzmodelle
52
Direkte Datenbank-Anbindung per JDBC
class ERM online shop
Produk t
-
Orde r
Produktnummer: int
Preis: double
Name: String
*
Info: String
AnzKolli: int
Gewicht: double
* -

Bestelldatum: Date
Lieferdatum: Date
Versandform: String
Rechnungsnummer: int
Bearbeiter: String
*
*
*
1
*
1
Kunde
Einkaufsw agen
-
Datum: Date
Kreditk arte
1
1 -
Name: String
Strasse: String 1
Ort: String
PLZ: int
JDBC
(c) schmiedecke 11
1.. *
-
Kartentyp: String
Kartennummer: int
Gültigkeit: Date
Beziehung zwischen Klassen
und Tabellen nicht erkennbar
 Regeln für den
"Zusammenbau" von Objekten
aus DB-Daten müssen explizit
programmiert werden

SE2-Zusammenfassung
SQL-Verwendung:
Datenbank enthält Daten, nicht
Objekte, d.h. es kann nicht
direkt nach Objekten gesucht
werden
53
ORM
class ERM online shop
Produk t
-
Orde r
Produktnummer: int
Preis: double
Name: String
*
Info: String
AnzKolli: int
Gewicht: double
* -
Bestelldatum: Date
Lieferdatum: Date
Versandform: String
Rechnungsnummer: int
Bearbeiter: String
*
*
 ORM liefert die
Abbildung
zwischen Klassen
und Tabellen (gruppen)
 Query Language
ermöglicht Suche
auf Objektebene
 Es gibt keine
DML, sondern
Objekte werden
manipuliert und
dann persistiert
*
1
*
1
Kunde
Einkaufsw agen
-
Datum: Date
Kreditk arte
1
1 -
Name: String
Strasse: String 1
Ort: String
PLZ: int
1.. *
-
Kartentyp: String
Kartennummer: int
Gültigkeit: Date
ORM
(c) schmiedecke 11
SE2-Zusammenfassung
54
Das JPA-Persistenzframework
von ArgoUML generierter Code:
komplettierter und annotierter Code:
public class Student
extends Unimitglied {
public int matrikelnummer;
public int semester;
/**
*
* @element-type Dozent
*/
public Vector myDozent;
public Dozent myDozent;
}
(c) schmiedecke 11
@Entity
public class Student
extends Unimitglied {
@Id
Integer id;
int matrikelnummer;
int semester;
@ManyToMany
Collection<Dozent> myDozent;
@ManyToOne
Dozent myTutor;
public
public
…
publíc
public
SE2-Zusammenfassung
…
}
Integer getID() {…}
int getMatrikelnummer() {…}
void setId(Integer id) {…}
void setMatrikelnummer(…){…}
55
Automatisch erzeugtes DB-Schema
Das
Schema hängt von der gewählten
Vererbungs-Strategie ab!
(c) schmiedecke 11
SE2-Zusammenfassung
56
Entity-Annotation
@Entity
@Table(name="T_Student")
public class Student extend Unimitglied{
@Id @GeneratedValue int id;
public int getId() { return id; }
public void setId(int id) { this.id=id; }
…
}
 @Entity deklariert eine Klasse als persistent.
 Die Angabe des Tabellennamens ist optional
standardmäßig wird der Klassenname verwendet.
 Alle Attribute müssen als Properties gekapselt werden.
 Es muss eine numerische @Id – Property eingefügt werden,
 am besten mit generierten Werten.
(c) schmiedecke 11
SE2-Zusammenfassung
57
Vererbungs-Annotation
@Entity
@Table(name="T_Mitglied")
@Inheritance(Strategy=Inheritance.JOINED
public class Unimitglied { ….}




Die Vererbungs-Strategie wird bei der Basisklasse annotiert
Standard ist SINGLE_TABLE
JOINED entspricht Einzeltabellen für alle Klassen der Hierarchie
Die Strategie TABLE_PER_CLASS (Tabelle je konkrete Klasse)
muss nicht auf allen Servern implementiert sein (Testen Sie
Glassfish daraufhin)
(c) schmiedecke 11
SE2-Zusammenfassung
58
ORM: Attributspezifikation per Annotation
 @Basic
– Basisdatentyp
 @LOB
– BLOB oder CLOB nach Bedarf
 @Temporal
– Zeitwert
 @Embedded
– eigebettetes Objekt (strukturiertes Objekt mit 1:1-Beziehung)
(c) schmiedecke 11
SE2-Zusammenfassung
59
Assoziations-Annotation
@ManyToMany
private Collection<Dozent> myDozent;
@ManyToOne
private Dozent myTutor;
@ManyToMany(mappedBy = "myDozent")
private Collection<Student> myStudent;






Annotation entweder immer der Attribute oder immer der Getter.
Annotation entsprechend den Kardinalitäten.
bei @XToMany sollte der Typ eine generische Collection sein (oder eine
Unterklasse von Collection).
Ersatzweise kann der Elementtyp als Attribut targetEntity="Dozent"
angegeben werden.
Bei bidirektionalen Assoziationen muss auf der zweiten Seite in einer
mappedBy-Angabe der Name des bezugnehmenden Attributs der ersten
Seite angegeben werden.
Bei @OneToOne kann das Attribut optional=false gesetzt werden
(c) schmiedecke 11
SE2-Zusammenfassung
60
Der Objekte-Cache
 Sammelbecken für materialisierte Objekte
 Dematerialiserung bei
– Transaktionsende
– Speicherbedarf
– expliziter Speicherung oder Synchronisation
 Transaktionszustände der Cache-Objekte
– Es gibt materialisierte und neu erzeugte Objekte
– Objekte können im Cache verändert oder gelöscht werden
– 6 Transaktionszustände:
new clean, old clean
new dirty,
old dirty
new deleted, old deleted
– pro Transaktionszustand ein Cachebereich
(c) schmiedecke 11
SE2-Zusammenfassung
61
Synchronisation (bei Transaktionsende)
new clean
old clean
new dirty
old dirty
new deleted
old deleted
 Cache-Aktionen abhängig von Transaktionszuständen
(c) schmiedecke 11
SE2-6-7-Architekturübersicht
62
JPA-Arbeitsweise:
Ein paar Vokabeln vorweg
 Persistence Provider
- die JPA-Implementierung
 Persistence Unit
- Umsetzung einer DB-Anbindung
- konfiguriert in der persistence.xml
 Persistence Context
- der Cache
 Entity-Manager
- realisiert (De-)Materialisierung
- setzt die Objektsuche um
- verwaltet den Cache
(c) schmiedecke 11
SE2-Zusammenfassung
63
Entity-Manager
find
query
Applikation
Detached objects
Persistenz-Kontext
persist
remove
(c) schmiedecke 11
SE2-Zusammenfassung
flush
merge
refresh
Entity
Manager
DB
64
Queries in JPA
 Entity Manager ermöglicht Queries
– Dynamisch erzeugte Queries
– Statische "NamedQueries" als Entity-Annotationen
– Flush-Modus: Vor jeder Query wird der Persistenz-Kontext synchronisiert
 JPQL – die Abfragesprache von JPA
– SQL-ähnliche Abfragen auf der Basis von Objekten (nicht Tabellen)
– Nicht unmittelbar DB-tauglich  weniger Hacking-gefährdet
 SQL-Abfragen – sog. "Native Queries"
– eher weniger sinnvoll, da das DB-Schema verborgen ist
– werden als Strings an die DB weitergericht
 Criteria API
– Programmatischer Aufbau von Abfragen
(c) schmiedecke 11
SE2-Zusammenfassung
65
DAO – Data Access Objects

Annahme aus der Analysephase:
–
–
–
–

Klasse verwaltet die Menge ihrer Objekte
würde jetzt bedeuten, dass jede Klasse die DB-Details kennt
nicht transparent
DB-Wechsel sehr aufwändig
Data Access Object – der Objekte-Baumeister:
– Klassenspezifisches Zugriffsobjekt
– kapselt die DB-Details
– liefert und persistiert die
Anwendungsobjekte

Nachteile
 Für jede Klasse ein DAO
 Viel redundanter Code
 Viel Aufwand bei DB-Wechsel
(c) schmiedecke 11
SE2-Zusammenfassung
66
OR-Mapping – Lazy Materialization
 Laden externer Objekte:
– Was ist mit den assoziierten Objekten?
– Objektstruktur kann stark verzweigen...
 Proxy-Entwurfsmuster:
–
–
–
–
Objekt erreichbar über ein Stellvertreterobjekt (Proxy)
Proxy liegt im Speicher
besorgt das Nachladen des Objekts bei Bedarf
enthält das OID
(c) schmiedecke 08
SE2-4-Persistenzmodelle
67
Proxy-Entwurfsmuster

Objektassoziation des Client verweist auf einen Platzhalter
– Proxy,
– imitiert Struktur des realen Subjekts.

Anfrage (request) erzeugt Bedarf:
– Das reale Subjekt wird geladen
– und die Anfrage delegiert.
(c) schmiedecke 08
SE2-4-Persistenzmodelle
68
Referenz-Architektur
IdeenListen
IdeeErstellen
IdeeService
IdeeDAO
Idee
(c) schmiedecke 11
KommentarDAO
Kommentar
Idee
Kommentieren
IdeeEinbringen
WettbewerbService
MitarbeiterDAO
Mitarbeiter
EntityManager
SE2-7-Geamtarchitektur
Wettbewerb
-DAO
Wettbewerb
69
Schichtentrennung durch Fassade
IdeenListen
IdeeErstellen
Idee
Kommentieren
IdeeService
IdeeEinbringen
WettbewerbService
ModellFassade
IdeeDAO
Idee
(c) schmiedecke 11
KommentarDAO
Kommentar
MitarbeiterDAO
Mitarbeiter
SE2-7-Geamtarchitektur
Wettbewerb
-DAO
Wettbewerb
70
Schichtentrennung durch EJB-Injection oder Lookup
IdeenListen
IdeeErstellen
IdeeService
IdeeDAO
Idee
(c) schmiedecke 11
KommentarDAO
Kommentar
Idee
Kommentieren
IdeeEinbringen
WettbewerbService
MitarbeiterDAO
Mitarbeiter
EntityManager
SE2-7-Geamtarchitektur
Wettbewerb
-DAO
Wettbewerb
71
Schritte zum Entwurfsmodell
(c) schmiedecke 11
SE2-7-Geamtarchitektur
72
Grundprinzipien des OO-Entwurfs
 Lose Kopplung – starke Kohäsion
 Kapselung
Client1
SOC
Client2
Client-2
Client-2
 SOC – Sepration of Concerns
<<interface>>
Interface1
– Auftrennung von Schnittstellen
 DIP – Dependency Inversion Principle
Service
<<interface>>
Interface2
Service-
(Nicht: Dependency Injection)
– Programmierung gegen Schnittstellen
 NOC – No Circular Dependencies
– Auflösung zirkulärer Abhängigkeiten
DIP
Client
 OCP – Open Cosed Principle
SE 2
NOC
C
<<interface>>
Interface2
Service-1
Service-2
<<interface>>
A-Interface
C
+aMethod()
A
© schmiedecke 10
<<interface>>
Interface1
Service2
Service1
– offen für Erweiterungen, aber
geschlossen für Veränderungen, d.h.
stabile Schnittstelle
Client-
+aMethod()
B
A
B
73
Kapselung von Abhängigkeiten:
Adapter

Zweck:
Strukturmuster
– Anpassung einer gelieferten Schnittstelle an eine erwartete
– Wiederverwendung von Klassen trotz leichter Inkompatibilitäten
– Verwendung von Bibliotheken

Kontext:
– Klasse hat die gewünschten Daten und das gewünschte Verhalten
– Schnittstelle passt nicht (Namen, Parameter, Ausnahmen...)
Client
<<interface>>
Target
+Request()
Adapter
e.g. a library class
+adaptee
Adaptee
+SpecificRequest()
SE2-7-Entwurfsmuster
74
Kapselung von Abhängigkeiten:
Fassade

Strukturmuster
Zweck:
– Vereinfachter Zugriff auf en
komplexes Subsystem
– Kapseln der inneren Struktur

Client
Client
Kontext:
– Verwendung eines Subsystems
mit wichtigen inneren
Abhängigkeiten
– Verwendung eines Subsystems,
bei dem die Gesamtfunktionalität
sich aus den Schnittstellen
mehrerer Klassen
zusammensetzt
– Alternative Subsysteme mit
unterschiedlicher Struktur
– "Querschnitt-Aufgaben" wie
Logging, Transaktionen oder
Zugangskontrolle
Facade
Package1
Subsystem Class
Subsystem Class
Subsystem Class
Subsystem Class
Subsystem Class
SE2-7-Entwurfsmuster
Subsystem Class
75
Kapselung von Abhängigkeiten:
Proxy

Zweck:
Strukturmuster
– Möglichkeit, ein Objekt durch ein Stellvertreter-Objekt (zeitweise) zu ersetzen

Kontext:
– Zugang zum echten Objekt schwierig oder teuer
– Direkter Zugang zum echten Objekt aus Sicherheitsgründen unerwünscht
<<interface>>
Client.
Subject
+someOperation()
RealSubject
Proxy
SE2-7-Entwurfsmuster
76
Kapselung von Änderungen:
Bridge

Zweck:
– Trennung von funktionaler Abstraktion und Implementierung
– so dass beide unabhängig voneinander verändert werden können

Strukturmuster
Kontext:
– Eine Klasse bietet eine bestimmte Leistung (Service) an
Beispiel: Transport
– Sie benutzt dazu eine andere Klasse als "Betriebsmittel" (Facility) Beispiel: Transportmittel
– Sowohl Service als auch Facility sollen unabhängig weiterentwickelt werden können
<<interface>>
Facility
ServiceAbstraction
+OperationImp()
+Operation()
RefinedService2
RefinedService2
ConcreteFacility2
SE2-7-Entwurfsmuster
ConcreteFacility2
77
Open-Closed-Priciple:
Strategy (schon bekannt)

Zweck:
Verhaltensmuster
– Austauschbarkeit von Algorithmen zur Laufzeit
– unabhängig von den nutzenden Clients

Kontext:
– Ein Dienstmerkmal soll von außen steuerbar ausgetauscht werden können
– sehr wichtig z.B. für Internationalisierung: länderspezifische Funktionalität
Context
+strategy
<<abstract>>
Strategy
+contextOperation()
+operation()
ConcreteStrategy
SE2-7-Entwurfsmuster
ConcreteStrategy
78
DRY:
Template Method

Zweck:
Verhaltensmuster
– Verwendung der Struktur eines Algorithmus mit verschiedenen Einzeloperationen
– "Generischer" Algorithmus

Kontext:
– Ein Algorithmus besteht aus einer globalen Ablaufstruktur (z.B. Iterieren über eine
Liste)
– und innerhalb dieser Struktur Detailoperationen (z.B. Verdoppeln des Elementwerts)
– Die Ablaufstruktur ist unabhängig von den Detailoperationen und wird an
verschiedenen Stellen benötigt.
AbstractClass
+templateMethod()
+Operation1()
+Operation2()
calls abstract operations
Operation1 and Operation 2
ConcreteClass
ConcreteClass
+Operation1()
+Operation2()
SE2-7-Entwurfsmuster
+Operation2()
+Operation1()
79
Kapselung von Abhängigkeiten:
Iterator

Zweck:
Verhaltensmuster
– Ursprünglich in Kombination mit Compositum
– Iteration über die Struktur ohne Kenntnis der Implementierung mit der Möglichkeit,
die in der Schnittstelle angegebene (für Knoten und Blätter implementierte) Methode
an beliebiger Stelle auszuführen.
– Verallgemeinert für traversierbare rekursive Strukturen.
Iterator
Aggregate
+First()
+Next()
+IsDone()
+CurrentItem()
+CreateIterator()
ConcreteAggregate
ConcreteIterator
SE2-7-Entwurfsmuster
80
Weitere sehr wichtige Entwurfsmuster
….die aus anderen Kontexten als bekannt vorausgesetzt werden:




Factory Method, Abstract Factory
Singleton
State
Composite
© schmiedecke 10
SE 2
81
Maßnahmen für die Skalierbarkeit
 Programmieren gegen Interfaces (DIP)
– Interfaces reduzieren die Abhängigkeiten
– Erleichtern die Einführung perfomanterer Lösungen
(Nur die betroffenen EJBs müssen neu deployed werden)
 Lose Kopplung durch Dependency Injection (IoC)
– Reduziert die Kopplung
– stellt dennoch eine feste Beziehung zwischen zwei Objekten her
 Extra-lose Kopplung durch Directory-Lookup
– Bei Bedarf wird ein Service über die Registry gefunden
– Service-Locator-Pattern
 Alle drei Techniken finden Sie im 2. CRUD-Modell
82
PROZESSMANAGEMENT
 Prozessmanagement bedeutet
– Gestaltung und Kontrolle des Entwicklungsprozesses
– nach anerkannten Regeln
 Management ist Voraussetzung für Prozessreife
z.B. nach CMM (Capability Maturity Model) :
–
–
–
–
–
Stufe 1: Initialer Prozess
Stufe 2: Wiederholbarer Prozess
Stufe 3: Definierter Prozess
Stufe 4: Gesteuerter Prozess
Stufe 5: Optimierender Prozess
(c) schmiedecke 11
= Ad-hoc-Prozess
= Intuitiver Prozess
= Qualitativer Prozess
= Quantitativer Prozess
= Rückgekoppelter Prozess
SE2-11-Software-Management
83
Produktsteuerung
Produktsteuerung umfasst
 Anforderungsmanagement
 Konfigurationsmanagement
 Änderungsmanagement
 Qualitätsmanagement
Konfiguration
Anforderung
Reviews
Änderungswunsch
Änderungsauftrag
Anforderung
Anforderung
(c) schmiedecke 11
Bewertung
Änderung
SE2-11-Software-Management
Integrationstest
84
KONFIGURATIONSMANAGEMENT (SCM)
 Eine Konfiguration ist ein "Freeze"
– Projektzustand zu einem bestimmten Zeitpunkt
– freigegeben
– mit zugesicherten Eigenschaften
 umfasst Vielzahl von Software-Elementen
–
–
–
–
Modelle, Spezifikationen, Dokumentationen
Module mit Testfällen
Werkzeuge
Datenbestände
 beschrieben durch ein KID
(Konfigurations-Identifizierungs-Dokument).
 Auslieferung umfasst nur einen Teil einer Konfiguration.
(c) schmiedecke 11
SE2-11-Software-Management
85
... viele, viele Konzepte.
Aber erst, wenn sie die große Linie erkennen,
habe ich mein Ziel erreicht.

Vielen Dank fürs Mitmachen!
Herunterladen