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