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!