Einfache Webanwendungen basierend auf Java, HTML, JSP, Hibernate Annotations und MySQL 21. November 2012 Taentzer Modellgetriebene Softwareentwicklung 200 Überblick Unsere Referenzanwendung: eine simple Webanwendung für eine Konferenz Verwendete Technologien: Anwendung: Java, HTML, Java Server Pages, Hibernate Annotation, MySQL Anwendungsserver: Jboss Vorstellung der Plattform: Datenhaltung in einer MySQL-Datenbank O/R-Mapping durch Hibernate Annotations Wie erstellt man dynamische Webseiten? Taentzer Modellgetriebene Softwareentwicklung 201 Webanwendungen Client-seitig Server-seitig http-Anfrage Webanwendung http-Antwort AnwendungServer persistente Daten Taentzer Modellgetriebene Softwareentwicklung 202 Funktionsablauf Benutzer startet Webanwendung, gibt die URL des Webanwendung ein. Anwendung-Server leitet die Anfrage an die Webanwendung weiter. Webanwendung generiert den HTML-Code einer Webseite, die vom Anwendung-Server an den Browser des Benutzers zurückgeschickt wird. Browser zeigt die erhaltene Webseite an. Taentzer Modellgetriebene Softwareentwicklung 203 Welche Aspekte von Webanwendungen müssen modelliert werden? Präsentationsschicht: Wie soll die Weboberfläche aussehen? Welche Daten sollen an der Oberfläche angezeigt werden? Services: Welche Services haben wir? Wie sind die Services definiert? Datenzugriffsschicht: Welche Datenstrukturen werden verwendet? Datenbankschicht: Welche Daten soll persistent sein? Wie sollen die Daten in der Datenbank gespeichert werden? aus „AndroMDA.org“ Taentzer Modellgetriebene Softwareentwicklung 204 Aufbau einer Webanwendung Konfigurationsdaten: WebContent\WEB-INF Präsentation: WebContent: JSP-Seiten Webcontent/styles: CSS-Styles Servlets: src/(default package) Datenhaltung: src/daos: CRUD-Operationen src/entities: Entitätsklassen Taentzer Modellgetriebene Softwareentwicklung 205 MySQL Managementsystem für relationale Datenbanken frei verfügbar, plattformunabhängig Anfragesprache: SQL Client-Server-System: Server: Datenbanksystem, das Datenbanken verwaltet und Anfragen zum Inhalt seiner Datenbanken bearbeitet (z.B. MySQL) Client: Anwendung, die eine Datenbank verwendet Eigenschaften: Mehrbenutzersystem mehrere Threads Verwaltung von Zugriffsberechtigungen Taentzer Modellgetriebene Softwareentwicklung 206 Datenbankschema beschreibt die Struktur einer Datenbank Menge von Tabellen Beispiel: Tabelle Vorlesung Tabellenspalten (Datenfelder): Nummer, Titel, Raum, Dozent Tabellenzeilen: einzelne Datensätze (L123, „Software-Praktikum“, D12,..) Beziehungen zwischen Tabellen: durch Schlüssel Vorlesung: (L123, „Software-Praktikum“, D12, 1) Dozent: (1, „Meier“, „Hans“) Taentzer Modellgetriebene Softwareentwicklung 207 MySQL Workbench zur Verwaltung der MySQL-Umgebung Benutzerverwaltung mit Zugriffsrechten Wartung der Datenbank In Server Administration -> Accounts Taentzer Modellgetriebene Softwareentwicklung 208 Überblick über Datenschemata und Tabelleninhalt Taentzer Modellgetriebene Softwareentwicklung 209 Eine kleine Einführung in SQL Anfragesprache für relationale Datenbanken Aufbau einer SQL-Anfrage: SELECT FROM WHERE GROUP BY ORDER BY Auswahl der Attribute Tabellenname(n) Bedingungen für die Auswahl (optional) Gruppieren der Ergebnisse (optional) Reihenfolge der Ausgaben (optional) Ergebnis wird als Tabelle zurückgegeben. SQL Anfragen können im MySQL Query Browser gestellt werden. Auch zum Einfügen und Löschen von Datensätzen INSERT und DELETE Taentzer Modellgetriebene Softwareentwicklung 210 Hibernate Annotations O/R-Mapping innerhalb von Java-Klassen (Entitätsklassen) Ähnliche, aber detailliertere Angaben als in EMFModellen -> integriertes Modell Dokumentation: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/ html/index.html Taentzer Modellgetriebene Softwareentwicklung 211 Hibernate Annotation: Initialisierung Alternativ kann die Deklaration der annotierten Klassen auch direkt auf der SessionFactory in HibernateUtil.java programmiert werden. Taentzer Modellgetriebene Softwareentwicklung 212 O/R-Mapping über Annotationen Mögliche Annotationen: @Entity – Entität induziert Tabelle @Id – Primärschüssel @GeneratedValue – Schlüsselgenerierung @Table – explizite Tabellendefinition @Version – zur Erkennung von konfliktbehafteten Änderungen @Column - Spaltendefinition @Inheritance – Vererbung: strategy= TABLE_PER_CLASS, JOINED, SINGLE_TABLE Taentzer Modellgetriebene Softwareentwicklung 213 Datenzugriffsobjekte Data Access Object (DAO) Der Datenzugriff kann je nach Speichermedium stark variieren. Ziel: Kapselung der Zugriffe auf ein Speichermedium Speziell: Entkopplung einer Anwendung vom Datenbankzugriff aus „java.sun.com“ Taentzer Modellgetriebene Softwareentwicklung 214 Datenzugriffsobjekte BusinessObject: Datenkunde fordert Daten an DataAccessObject: Zugriffsschnittstelle abstrahiert von der unterliegenden Datenimplementierung DataSource: die eigentliche Datenquelle Datenbank, Datei,... TransferObject: Datenträger zum Übertragen von Daten aus „java.sun.com“ Taentzer Modellgetriebene Softwareentwicklung 215 Eigenschaften der Datenzugriffsschicht ermöglicht Transparenz Services und Controller müssen nichts über die eigentliche Datenhaltung wissen. ermöglicht leichtere Migration Die Datenhaltung kann geändert werden. reduziert die Codekomplexität in Service- und Controllerklassen fasst jeglichen Datenzugriff in eine separate Ebene zusammen Die zusätzliche Ebene muss entworfen und implementiert werden. Sie kann auch automatisch generiert werden. Taentzer Modellgetriebene Softwareentwicklung 216 Eine DAO-Klasse Taentzer Modellgetriebene Softwareentwicklung 217 Hibernate: Zugriff auf die SessionFactory HibernateUtil.java: Taentzer Modellgetriebene Softwareentwicklung 218 Welche Aspekte von Webanwendungen müssen modelliert werden? Präsentationsschicht: Wie soll die Weboberfläche aussehen? Welche Daten sollen an der Oberfläche angezeigt werden? Services: Welche Services haben wir? Wie sind die Services definiert? Datenzugriffsschicht: Welche Datenstrukturen werden verwendet? Datenbankschicht: Welche Daten soll persistent sein? Wie sollen die Daten in der Datenbank gespeichert werden? aus „AndroMDA.org“ Taentzer Modellgetriebene Softwareentwicklung 219 Konfiguration einer Webanwendung Konfigurationsdaten: <Hauptverzeichnis>\WEB-INF Konfigurationsdatei: web.xml folgt einem festen Schema <servlet>: Beschreibung der beteiligten Servlets <servlet-mapping>: Einem deklarierten Servlet wird ein URL-Pattern zugeordnet. (Zur Suche eines passenden Servlets.) <filter> können bei der Request-Verarbeitung vor Servlets geschaltet werden. Taentzer Modellgetriebene Softwareentwicklung 220 Model-View-Controller-Architektur aus „publib.boulder.ibm.com“ Taentzer Modellgetriebene Softwareentwicklung 221 Einfache Servlets Ein Servlet ist eine Java-Klasse, die zur Steuerung einer Webanwendung mit Hilfe des Request-Response-Models eingesetzt wird. Das Servlet WorkshopIndexServlet erweitert die Klasse HttpServlet. Für einfache Anfragen wird die Methode doGet() überschrieben. Die Methode doPost() wird überschrieben, wenn auch andere Aktionen (Daten ändern, E-Mail versenden, etc.) durchgeführt werden. Das Objekt vom Typ HttpServletRequest erlaubt den Zugriff auf die Informationen zur Anfrage (URL, Cookies usw.). Das Objekt vom Typ HttpServletResponse dient zum Erstellen der Antwort. Dokumentation: http://docs.oracle.com/javaee/1.4/tutorial/doc Taentzer Modellgetriebene Softwareentwicklung 222 Beispiel:PaperIndexServlet.java Taentzer Modellgetriebene Softwareentwicklung 223 Java Server Pages (JSP) JSP: eine Art Template-Sprache JSP-Seite: ein Textdokument mit zwei Arten von Text (ein Template): statische Daten, die in HTML formuliert sind, und JSP Elemente, die dynamischen Inhalt darstellen. Die Seite kann aus einer obersten Datei, die weitere Dateien enthält, bestehen. Diese sind entweder komplette JSP- Seiten oder JSP-Fragmente. dynamischer Inhalt: Java-Code oder spezielle JSP-Aktionen, sogenannten Scriptlets (in Java geschrieben) Expliziter durch die Verwendung von Tag-Libraries JSP-Dokumentation: http://java.sun.com/products/jsp/docs.html Taentzer Modellgetriebene Softwareentwicklung 224 Scriptlet Enthält ein Code-Fragement, womit dynamische Inhalte produziert werden können. JSP-Syntax: <% code fragment %> oder <jsp:scriptlet> code fragement </jsp:scriptlet> Ein Scriptlet kann beliebig viele Statements, Variablen, Ausdrücke oder Methodendeklarationen enthalten. Einsatzmöglichkeiten: z.B. Variablendeklaration für spätere Nutzung Verwendung von impliziten Objekten (wie session, request, response, etc.) Ausdrücke: <%= expression %> zu String konvertiert (ohne „;“) Taentzer Modellgetriebene Softwareentwicklung 225 JSP-Direktiven: Eine Auswahl Page: Attribute für die gesamte JSP-Seite Syntax: <%@ page attributes %> Beispiel: <%@ page contentType="text/html" pageEncoding="UTF-8"%> Taglib: Angabe einer Tag-Bibliothek mit Präfix für verwendete Tags Syntax: <%@ taglib {uri="URI" | tagdir="/WEB-INF/tags[/subdir]+"} prefix="tagPrefix" %> Beispiel: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Include: zum Einfügen anderer JSP-Seiten Syntax: <%@ include file="relativeURL" %> Beispiel: …The current date and time are <%@ include file="date.jsp" %>… date.jsp: <%@ page import="java.util.*" %> <%= (new java.util.Date() ).toLocaleString() %> Taentzer Modellgetriebene Softwareentwicklung 226 JSP: Verwendung der Core-Tags Statt: <% Collection<Workshop> workshop = (Collection<Workshop>) request.getAttribute(„Workshop"); for (w : workshop) { %> <tr><td><%= w.getAbbreviation() %></td> <td><%= w.getName() %></td></tr> <% } %> Besser: <c:forEach items="${WorkshopEntries}" var=“Workshop" > <tr><td><c:out value='${Workshop.abbreviation}' default="-"/></td> <td><c:out value='${Workshop.name}'/></td> </tr> </c:forEach> Taentzer Modellgetriebene Softwareentwicklung 227 Beispiel: JSP zur Anzeige von Datenbankeinträgen WorkshopIndex.jsp: Taentzer Modellgetriebene Softwareentwicklung 228 Definition von Formularen in HTML Formular: <form> action: URI zur Verarbeitung der Formulardaten method: get| post name: Formularname Eingabeelement: <input> name: Name des Elements type: Typ des Elements value: Wert des Elements Label: <label> for: Eingabeelement Verstecktes Element StandardButton Taentzer Modellgetriebene Softwareentwicklung 229 Definition von Formularen in HTML (2) Text-Element Taentzer Modellgetriebene Softwareentwicklung 230 Servlets und JSP: Best Practices Nicht zu viel Java in HTML-Seiten, besser separate JavaKlassen Include-Mechanismus benutzen: statische Teile wie Header separat halten Kein Mix von Anwendungs- und Präsentationscode: Wiederverwendbare Komponenten Leichte Änderbarkeit der Präsentation Verwendung von Custom-Tags: Weniger Java Code, mehr HTML-artige Syntax Scriptlets sind nicht wiederverwendbar. Taentzer Modellgetriebene Softwareentwicklung 231 Zusammenfassung Erstellung von dynamischen Webseiten nach ModelView-Controller-Prinzip Model: Entitäten und DAOs Controller: Servlets View: Java Server Pages Kein Mix von Anwendungs- und Präsentationscode Klare Trennung von Controller und Views Wiederverwendbare Komponenten Leichte Änderbarkeit der Präsentation O/R-Mapping durch Hibernate Annotations Implizite Modelle Taentzer Modellgetriebene Softwareentwicklung 232