Ausarbeitung 5AHITS

Werbung
Ausarbeitung
Fragenkatalog
VSDB
Verteilte Systeme und Datenbanken
5AHITS
2013/14
1/143
Inhalt
1. DBMS
2. Architektur von Datenbanksystemen
3. Datenmodelle
4. Grundlagen des relationalen Datenmodells
5. Normalformen
6. SQL als DDL und DML
7. ER bzw. EER- Modell
8. Prozedurale Erweiterung von SQL-Datenbanken
9. Wartung/Backup/Restore
10. Servlets: Grundstruktur, Lebenszyklus und Web Container
11. Servlets: Kommunikation und Session Tracking
12. Verteilte Anwendungen: Eigenschaften und Architekturmodelle
13. Java Server Pages JSP: Lebenszyklus und Einbettungskonstrukte in JSP (Art und Funktion)
14. XML-RPC
15. J2EE
16. HTTP-Grundstruktur
17. HTTP-Anwendung
18. HTML/XML
19. CGI-Schnittstelle
20. Layout
22. Softwaretechnik
22. Ajax Web Client
23. JavaScript
24. JavaScript - Framework - Asynchronitäten
25. jQuery
2/143
1. DBMS
Was sind die grundlegenden Funktionen eines Datenbankmanagementsystems (DBMS) unabhängig
vom unterstützen Datenmodell? Was bedeuten die Begriffe Konsistenz, Redundanz und Integrität?
Grenzen sie die Begriffe Datenbank, Datenmodell und Datenbankmanagementsystem voneinander
ab.
Begriffsdefinitionen
Konsistenz
Konsistenz bedeutet die Korrektheit der in der Datenbank gespeicherten Daten. Inkonsistenz ist die
Widersprüchlichkeit von Daten (z.B. Verknüpfungen zwischen Tabellen sind nicht mehr eindeutig,
weil der Primärschlüssel auf keinen oder mehrere Einträge in einer anderen Tabelle verweist).
Beispiel
Im folgenden Beispiel gibt es in der ersten Tabelle für die “Gartenstrasse” eine Einschränkung, in der
zweiten Tabelle ist bei der selben Straße aber keine Einschränkung eingetragen. Die Datenbank ist
nicht konsistent, weil die Einschränkung nicht eindeutig ist. Der Wiederspruch lässt sich verhindern,
indem man die Einschränkungen in eineeigene Tabelle auslagert.
Redundanz
Redundanz bedeutet das mehrfache Abspeichern der gleichen Daten. In einer Datenbank sollten
Informationen nicht mehrfach abgespeichert sein, sie sollte also Redundanzfrei sein. Wenn sich die
Daten ändern, müssen sie nur an einer Stelle geändert werden.
Beispiel
In dieser Tabelle sind Abteilung und Fahrzeug redundant gespeichert. Um Redundanz zu vermeiden,
könnte man die Werte in eine eigene Tabelle auslagern.
3/143
Integrität
Eine Datenbank ist Konsistent, wenn alle Integritätbedingungen erfüllt sind. Beispiele für
Integritätbedingungen sind, die Beziehung zwischen Primär- und Fremdschlüssel oder die
Begrenzung eines Wertes auf Zahlen. Die Integrität wird normalerweise vom DBMS sichergestellt.
Integritätsbedingungen
● Statische Integrität
Statische Integritätsbedingungen entsteht durch die im jeweiligen Schema definierten
Regeln. Dazu gehören Schlüsselbedingungen (primary key, ...), Fremdschlüsselbedingungen,
Attributbedingungen (not null, …) und Bereichsbedingungen (check, …).
● Dynamische Integrität
Dynamische Integritätsbedingungen legen Regeln fest, die beim Ändern eines Zustandes
erfüllt sein müssen (Gehalt darf erhöht aber nicht verringert werden).
Datenmodell
Ein Datenmodell (DM) beschreibt die Abbildung von Sachverhalten und Prozessen aus der realen
Welt in Computertechnischer Form. Es beschreibt die Datenobjekte und die Operationen die darauf
angewendet werden können.
Es beschreibt unter anderem folgende Eigenschaften:
● Objekte/Entitäten und deren Beziehungen (statische Eigenschaften)
● Operationen und Beziehungen zwischen diesen (dynamische Eiganschaften)
● Integritätsbedingugen der Objekte und Operationen
● Konventionen für die Benennung, der physischen Abspeicherung, usw.
Datenbank
Eine Datenbank (DB) ist eine strukturierte Sammlung von Daten, die für einen bestimmten Zweck
entworfen und entwickelt wird. Sie ist eine logische Einheit zusammengehöriger Daten und deren
Metadaten. Physikalisch kann die Datenbank in mehrere Einzelteile aufgeteilt werden, die jedoch
nur gemeinsam eine Datenbank bilden.
Datenbankmanagementsystem
Das Datenbankmanagementsystem (DBMS) ist eine Software zum Anlegen, Verwalten und Befüllen
von Datenbanken. Es kann auch Funktionen zum regelmäßigen Ausführen von Sicherheits- und
Backupstrategien anbieten.
Datenbanksystem
Ein Datenbanksystem (DS) ist die Kombination aus Datenbank, DBMS und der Hardware.
Informationssystem
Ein Informationsystem (IS) erweitert die Datenbank um Werkzeuge (software tools) zur Abfrage,
Darstellung, Transformation und Analyse der Daten.
4/143
Zusammenhang von Datenbank, DMBS, DBS und IS
Datenbankmanagementsystem
Das Datenbankmanagementsystem (DBMS) ist die Software, die die Datenbank bereitstellt. Das
DBMS legt das Datenbankmodell fest, entscheidet maßgeblich über Funktionalität und
Geschwindigkeit des Systems und bietet folgende Funktionen.
Funktionen
●
●
●
●
●
●
Speichern, Ändern und Löschen von Daten
Verwalten von Metadaten
Vorkehrungen zur Datensicherheit, zum Datenschutz und zur Datenintegrität
Ermöglicht den Mehrbenutzerbetrieb (durch Transaktionen)
Optimiert Anfragen
Ermöglicht Stored Procedures und Triggers
5/143
2. Architektur von Datenbanksystemen
Was versteht man unter der „Drei Schichten Architektur“ nach ANSI­SPARC? Wieso hat man sich
überhaupt für mehrere Schichten entschieden? Welche Gründe sprechen für dieses Modell? Welche
Schicht hängt vom Betriebssystem ab? Braucht man ein Filesystem – wenn ja: Wer stellt es zur
Verfügung und inwieweit kann sich dieses auf das Gesamtsystem auswirken? Wo wird die Struktur
der abzuspeichernden Informationen hinterlegt? Inwieweit reflektiert sich diese Struktur in den
Anwendungsprogrammen? Was versteht man unter Transformationsregeln? Wie können komplexe
Strukturen vereinfacht dargestellt werden? Was legt ein Datenbankschema fest? Was versteht man
unter den Begriffen DDL/DML? Wie reflektiert sich DDL/DML in der Architektur eines
Datenbanksystems? Gehen Sie auf einige Modellierungskonzepte ein, die sich aus der
Schichtenarchitektur ergeben.
„Drei Schichten Architektur“ nach ANSI­SPARC
Die Benutzeranwendung und die physikalische Speicherung soll voneinander getrennt werden.
Daher gibt es bei dieser Architektur 3 Ebenen bzw. Schemen. Die meisten modernen DatenbankSysteme besitzen eine Drei-Schichten-Architektur, die dem ANSI/SPARC Datenbank-Modell
entspricht. Die in diesem Modell definierten Schichten beschreiben unterschiedliche
Abstraktionsebenen für die Daten einer Datenbank. Die drei Schichten nach ANSI/SPARC sind das
interne Schema, das konzeptionelle Schema und das externe Schema.
Interne Ebene (internes Schema)
Die interne Ebene beschreibt wie die physikalischen Speicherstrukturen der Datenbank aussehen.
D.h. wie die Daten gespeichert werden und wie man darauf zugreift.
Konzeptuelle Ebene (konzeptuelles Schema)
Das konzeptionelle Schema beschreibt die logische Struktur der Daten in der Datenbank, also die Art
und Menge der gespeicherten Daten, sowie ihre Abhängigkeiten untereinander und
Integritätbedingungen für die Datenbank. Diese logische Struktur wird in der Regel von dem
jeweiligen Datenbank-Administrator angelegt und verwaltet.
Beim Entwurf des konzeptionellen Schemas ist eine Reihe von Rahmenbedingungen zu beachten, die
eine effektive und redundanzfreie Speicherung von Daten in der Datenbank sicherstellen sollen, wie
zum Beispiel die Normalisierung von relationalen Datenbanken. Das hat zur Folge, dass in der
konzeptionellen Sicht in einer Datenbank die Daten häufig nicht so strukturiert sind, wie es den
Anforderungen der Benutzer entspricht.
In dieser Ebene wird das Datenbankschema festgelegt.
Eine Systemunabhängige Datenbeschreibung, d.h. sie ist unabhängig von den eingesetzten
Datenbank- und Computersystemen.
Diese Ebene verbirgt Details wie die Daten physikalisch abgespeichert sind.
6/143
Externe Ebene (View bzw. externes Schema)
Unterschiedliche Benutzer haben häufig unterschiedliche Anforderungen an die Strukturierung
dieser Daten und in der Regel benötigen einzelne Benutzer jeweils nur Zugriff auf einen Teil der
Daten in der Datenbank. Das externe Schema des Drei-Schichten-Modells erlaubt daher die
Definition so genannter Benutzersichten auf die Datenbank, um diesen Anforderungen gerecht zu
werden.
Es wird also nur ein Teil der gesamten Daten gezeigt. Der View sieht wie schon gesagt für jeden
Benutzer (einer anderen Benutzergruppe bzw. je nach den Rechten) anders aus.
Beispiel: verschiedene Views durch SQL - Statements.
Wieso hat man sich überhaupt für mehrere Schichten entschieden?
Das Ziel dieser Drei-Schichten-Architektur besteht aus der Trennung von der physischen Datenbank
und der Benutzeranwendungen. Die Daten sind nur auf der internen Ebene physisch vorhanden. Die
anderen Repräsentationsformen werden bei Bedarf aus dieser internen Ebene berechnet bzw.
abgeleitet.
Der Grund für mehrere Schichten ist es eine Datenunabhängigkeit zu erreichen. Datenunabhängig
selbst bedeutet, dass die arbeitenden Programme und Benutzer weitgehend unabhängig von den
physisch gespeicherten Daten sind. Das heißt ein Anwendungsprogramm muss nicht die Daten- und
Speicherstruktur kennen.
7/143
Datenunabhängigkeit
Wird eine Änderung des Schemas vorgenommen, so muss das übergeordnete Schema nicht
geändert werden.
Physische Datenunabhängigkeit
Es ist möglich das interne Schema (Ebene) zu ändern, ohne dabei das konzeptuelle, externe Schema
oder Anwendungsprogramme ändern zu müssen.
D.h. Änderungen an der physischen Speicher- oder Zugriffstruktur haben keine Auswirkungen auf die
logische Struktur der der Datenbasis (= Datenbankschema).
Beispiel: Datenbanktuning oder eine Erweiterung der Speicherstrukturen haben keine Auswirkung
auf Anwendungsprogramme
Logische Datenunabhängigkeit
Die logische Datenunabhängigkeit ist die Möglichkeit das konzeptionelle Schema zu ändern ohne
dass das externe Schema oder Anwendungsprogramme geändert werden müssen.
D.h. Änderungen im konzeptionellen Schema (Datenbankschema) haben keine Auswirkung auf
Anwendungen (im View).
Welche Gründe sprechen für dieses Modell?
Ein wesentlicher Grund für dieses Modell ist die hohe Robustheit gegeben Änderungen. ANSI-SPARC
macht logische und physische Datenunabhängigkeit durch die drei Ebenen möglich.
Welche Schicht hängt vom Betriebssystem ab?
Das interne Schema ist sehr eng mit dem Betriebssystem verbunden. Das interne Schema bildet die
internen Datenstrukturen des Datenbanksystems auf das Dateisystem des Betriebssystems ab.
Braucht man ein Filesystem – wenn ja: Wer stellt es zur Verfügung und
inwieweit kann sich dieses auf das Gesamtsystem auswirken?
Eine Datenbank speichert seine Daten, also die Tabellen und deren Einträge, in einem Filesystem ab.
Dieses Filesystem wird vom Betriebsystem zur Verfügung gestellt. Im ANSI/SPARC - Modell ist das
interne Schema verantwortlich, die Datenbank auf dem Dateisystem des Betriebsystems abzubilden.
Wo wird die Struktur der abzuspeichernden Informationen hinterlegt?
Die Struktur wird beim Export in einer XML-Schema-Datei gespeichert. Das Schema bestimmt
gleichzeitig den Aufbau der XML-Datei, die die Daten der exportierten Tabellen aufnimmt.
Exportiert werden
●
●
●
●
●
●
Name der Tabelle
Namen der Spalten
Type der Spalten
Länge der Spalten
Default-Werte der Spalten
Primärschlüssel der Tabelle
8/143
●
●
●
●
●
Indizes der Tabelle
Fremdschlüsselbeziehungen zwischen Tabellen
Autoinkrement-Festlegungen für Spalten (falls zutreffend)
Not-Null-Constraints für Spalten (falls zutreffend)
Reaktion auf das Löschen/Ändern eines zu einer Fremdschlüsselbeziehung gehörenden
Primärschlüsselwertes
Inwieweit reflektiert sich diese Struktur in den Anwendungsprogrammen?
Die Struktur der Datenbank hat auf das Modell der Anwendungssoftware Einfluss. Die sogenannten
Entity Klassen haben nur die Aufgabe eine ganz bestimmte Information zu speichern. Sie verfügen
meist über sehr wenige Funktionen neben den "Set"- und "Get"-Funktionen für die gespeicherten
Daten. Alle Funktionen die Sie besitzen haben unmittelbar mit den gespeicherten Daten zu tun.
Was versteht man unter Transformationsregeln?
Durch Transformationsregeln wird die Verbindung der drei Ebenen definiert. Man muss selbst
festlegen, wie die Objekte der verschiedenen Ebenen aufeinander abgebildet werden.
Beispiel: Der Anwendungsadministrator muss festlegen, wie die Daten der externen Ebene und
Daten aus der konzeptuellen Ebene zusammengesetzt werden.
Beispiel Bundesbahn
Gesamtheit der Daten (d.h. Streckennetz mit Zugverbindungen) ist beschrieben im konzeptuellen
Schema (Kursbuch). Ein externes Schema wäre dann ein Ausschnitt mit den Städteverbindungen
Wels-Linz.
Wie können komplexe Strukturen vereinfacht dargestellt werden?
Komplexe Strukturen können durch ER - Modelle vereinfacht dargestellt werden. Das EntityRealtionship-Model (ERM) oder ER - Modell ist ein grafisches Hilfswerkzeug zur Erstellung von
Datenbanken. In einem solchen Modell werden die realen Zusammenhänge von Objekten,
Handlungen und Ereignissen dargestellt. Zwischen jeder einzelnen Instanz eines solchen ER - Modells
gibt es eine Beziehung = Relation. Eine Solche Instanz kann auch Attribute haben (z.B. Instanz
Person: Attribute: Name, Nachname, …).
9/143
Beispiel
Was legt ein Datenbankschema fest?
Bei allen Datenbankmodellen ist es wichtig, zwischen der Beschreibung der Datenbank und der real
implementierten Datenbank zu unterscheiden. Also legt das Datenbankschema die Struktur der
speicherbaren Objekte fest. Das Schema selbst sagt also nichts über die individuellen Datenobjekte.
Das Datenbankschema sind die Metadaten. Als Datenbankausprägung versteht man den momentan
gültigen Zustand, also alle aktuell existierenden Inhalte und Beziehungen und deren Attribute. Das
Datenbankschema wird während des Datenbank-Design-Prozesses festgelegt und ändert sich später
nur sehr selten und nach Möglichkeit nie.
Metadaten
Metadaten oder auch Metainformationen bezeichnet, sind allgemeine Daten, die Informationen
über andere Daten enthalten.
● z.B: Der Spaltenname “Vorname” in einer Tabelle. Diese Spalte oder auch Metainformation
beinhaltet dann mehrere Namen
● Eigenschaften von Objekten, wie sie beschrieben werden sind Metadaten
10/143
Konzeptionales Schema
Ein konzeptionelles Datenschema ist eine systemunabhängige Datenbeschreibung, d.h. sie ist
unabhängig von den eingesetzten Datenbank- und Computersystemen.
Logisches Schema
Ein logisches Datenschema beschreibt die Daten in der Datenbeschreibungssprache (DDL = Data
Definition Language) eines bestimmten Datenbank-Verwaltungssystems. (DBMS)
Was versteht man unter den Begriffen DDL/DML?
Es gibts zwei Teilsprachen bei Datenmodellen. Die Datendefinitionssprache(DDL) und
Datenmanipulationssprache (DML)
DDL (Data Definition Language)
Wer Daten und Datenstrukturen beschreiben will, benötigt dazu ein geeignetes
Beschreibungswerkzeug, die Datenbeschreibungsprache DDL. Diese wird Verwendung um das
Datenbankschema zu definieren und zu ändern.
Typische DDL-Operationen (mit den entsprechenden Schlüsselwörtern in der relationen
Datenbanksprache SQL) sind:
● Erzeugen von Tabellen und Festlegen der Attribute ( “create table….”)
● Ändern von Tabellen durch Hinzufügen oder Entfernen von Attributen (“alter table…”)
● Löschen einer ganzen Tabelle samt Inhalt (“drop table”)
DML (Data Manipulation Languague)
Zusätzlich wird eine Sprache für die Beschreibung der Arbeitsmöglichkeiten mit Daten (Speichern,
Suchen, Lesen, Ändern), den sogenannten Datenmanipulationen, benötigt. Solche Operationen
können mit einer Datenmanipulationssprache durchgeführt werden.
Typische DML-Operationen (in SQL) sind:
● Einfügen von Daten: insert
● Verändern von Einträgen: update
● Löschen von Einträgen: delete
● Datenabfragen: select
Häufig aber sind diese zwei Sprachen für Definition und Manipulation von Datenbanken in einer
umfassenden Sprache zusammengefasst. Ein gutes Beispiel ist die relationale Anfragesprache SQL.
(Structured Query Language)
Wie reflektiert sich DDL/DML in der Architektur eines Datenbanksystems?
DDL - Data Definition Language: Statements werden verwendet, um die Datenbank-Struktur oder
das Datenbankschema zu definieren.
DML - Data Manipulation Language: Statements werden zur Verwaltung der Daten innerhalb der
Schema-Objekte verwendet.
11/143
DML Anweisungen werden nicht automatisch ausgeführt, d. h. ein Rollback kann ausgeführt werden.
Bei DDL Anweisungen ist das nicht möglich, da diese automatisch ausgeführt werden. Der
Unterschied ist allerdings durch den Treiber transparent.
Gehen Sie auf einige Modellierungskonzepte ein, die sich aus der
Schichtenarchitektur ergeben
Zur Modellierung der konzeptuellen Ebene verwendet man das Entity-Relationship-Modell, welches
einen Ausschnitt der Realwelt unter Verwendung von Entities und Relationships beschreibt:
● Entity: Gegenstand des Denkens und der Anschauung (z.B. eine konkrete Person, ein
bestimmter Ort)
● Relationship: Beziehung zwischen den Entities (z. B. wohnen in)
Entities werden charakterisiert durch eine Menge von Attributen, die gewisse Attributwerte
annehmen können. Entities, die durch dieselbe Menge von Attributen charakterisiert sind, können
zu einer Klasse, einem Entity-Typ, zusammengefasst werden. Entsprechend entstehen RelationshipTypen.
Beispiel
Entity-Typ “Studenten” habe die Attribute Mat-Nr., Name, Hauptfach
Entity-Typ “Orte” habe die Attribute PLZ, Name
Relationship-Typ “wohnen in” setzt Studenten und Orte in Beziehung zueinander
Die graphische Darstellung erfolgt durch Entity-Relationship-Diagramme (E-R-Diagramm). EntityTypen werden durch Rechtecke, Beziehungen durch Rauten und Attribute durch Ovale dargestellt.
Das Beispiel würde so aussehen:
Zur Formulierung des logischen Schemas stehen je nach zugrundeliegendem Datenbanksystem
folgende Möglichkeiten zur Wahl:
Netzwerkmodell und Hierarchisches Modell
Sie sind Vorgänger des relationalen Modells. Sie bauen auf individuellen Datensätzen auf und
können hierarchische Beziehungen oder auch allgemeinere Netzartige Strukturen der Realwelt
ausdrücken.
Netzwerk und Hierarchisches Datenmodell
12/143
Netzwerk und Hierarchisches Datenmodell
Relationales Modell
Es ist das bekannteste und in heutigen DBMS am weitesten verbreitete Datenbankmodell. Es stellt
die Datenbank als eine Sammlung von Tabellen (Relationen) dar, in denen alle Daten angeordnet
werden. Dieses Modell befasst sich vorwiegend mit dem relationalen Datenbankmodell und den
darauf basierenden Datenbanksystemen.
Relationales Datenbankmodell
Objektorientiertes Modell
Objektorientierte Modelle definieren eine Datenbank als Sammlung von Objekten mit deren
Eigenschaften und Methoden.
Schematische Darstellung eines objektorientierten Datenbankmodells
Objektrelationales Modell
Objektorientierte Modelle sind zwar sehr mächtig, aber auch recht komplex. Mit dem relativ neuen
objektrelationalen Datenbankmodell wurde das einfache und weit verbreitete relationale
Datenbankmodell um einige grundlegende objektorientierte Konzepte erweitert.
Schematische Darstellung des objektrelationalen Modells
13/143
3. Datenmodelle
Was ist ein Datenmodell? Welche Datenmodelle kennen Sie? Zählen Sie mindestens drei auf und
gehen Sie kurz auf die Strukturmerkmale ein. Wie werden Sie bei der Auswahl des Datenmodells
vorgehen? Erläutern sie an einem Beispiel die Auswahl. Was versteht man unter dem Begriff "ORM"?
Was versteht man unter dem Begriff „impedance mismatch“ in Hinblick auf Programmiersprachen
und Datenbanken?
Was ist ein Datenmodell?
Datenbanken sollen Sachverhalte und Prozesse aus der realen Welt in einer computertechnischen
Form beschreiben und speichern. Die Abbildung der realen Objekte in computertechnischer Form
erfolgt hierbei mit Hilfe von sogenannten Datenmodellen. Es werden sowohl die Datenobjekte, mit
Hilfe der Datendefinitionssprache (DDL), als auch die darauf anwendbaren Operationen, mit Hilfe
der Datenmanipulationssprache (DML) beschrieben.
Man unterscheidet zwischen konzeptuellem Datenmodell, logischem Datenmodell und physischem
Datenmodell, wobei wir uns hier auf das logische Datenmodelle konzentrieren werden.
Zu konzeptuellen Datenmodellen zählen unter anderem ER-Diagramme oder UML-Diagramme. Zu
logischen, die weiter unten erläuterten relationale-, objekt-relationale- Modelle.
Welche Datenmodelle kennen Sie?
Netzwerkmodell und Hierarchisches Modell
Stellen die Vorgänger des relationalen Modells dar. Sie bauen auf individuellen Datensätzen
(sogenannten Records) auf, die durch Beziehungen miteinander verknüpft werden. Beim
hierarchischen Modell hat jeder Datensatz genau einen Vater-Datensatz, mit Ausnahme des WurzelRecords, der keinen Vater besitzt und beliebig viele Kinder-Datensätze. Dadurch ist die Abbildung
einer n:m-Beziehung standardmäßig nicht möglich. Beim Netzwerkmodell kann jeder Datensatz mit
n anderen Datensätzen verknüpft sein. Dadurch wird auch die Abbildung von n:m-Beziehungen
möglich.
14/143
Hierarchisches Modell
Netzwerkmodell
Relationales Modell
Das relationale Modell ist das heute am weitesten verbreitete Datenbankmodell. Es stellt die
Datenbank als Sammlung von Tabellen (sog. Relationen) dar, in denen alle Daten als Zeilen (Tupel)
der Tabellen gespeichert werden. Die verschiedenen Tabellen können über Fremdschlüssel
miteinander verknüpft werden.
15/143
Objektorientiertes Modell
Die Datenbank wird als Sammlung von Objekten im Sinne der Objektorientierung samt deren
Attributen und Methoden abgebildet. Es werden auch objektorientierte Konzepte, wie Vererbung
und Assoziation, unterstützt. Wird relativ schnell sehr komplex und Zugriffe in weiterer Folge
langsam durch die vielen Abhängigkeiten durch Vererbung und Assoziation.
Objektrelationales Modell
Erweitert das relationale Datenbankmodell um einige grundlegende objektorientierte Ansätze,
beispielsweise selbst definierte Datentypen und Vererbung bei Datentypen und Funktionen zu
Tabellen. Auch das Auflösen von Verknüpfungen wird so vereinfacht.
Beispiel
relational
SELECT C.firstname || C.lastname
FROM Customers C JOIN Addresses A ON A.Cust_Id=C.Id
WHERE A.city="New York"
object-relational
SELECT Name(C.Id)
FROM Customers C
WHERE C.address.city="New York"
16/143
Auswahl eines Datenmodells
Beispiel
Ich verkaufe Elektronikprodukte. Ich möchte Daten zu den Produkten, Kunden und Mitarbeitern
speichern. Ich bin ein Einzelhändler und besitze eine Filiale.
Die zu erwartende Datenmenge ist eher gering, die Zahl der Beziehung hält sich in Grenzen. Am
Markt sind relationale Datenbanken am weitesten verbreitet und wären in diesem Beispiel, wie in
wahrscheinlich über 90% der Fälle, zu empfehlen.
Andere Datenbankmodelle kommen entweder in ganz speziellen Anwendungsfällen, beispielsweise
dem Semantischen Web (Graphen Datenbank (Weiterentwicklung der Netzwerkdatenbank) bzw.
eine spezielle Form einer XML-Datenbank) oder Speichern von Koordinaten, die z.B. eine Straße,
bilden (Objektorientierte Datenbank, oder erweiterte objektrelationale Datenbank) zum Einsatz,
aber auch dort, wo sich der Umstieg auf ein relationales Datenbankmodell nicht lohnen würde, bzw.
zu aufwendig wäre. Beispielsweise alte Bankensysteme.
Objekt relationales Mapping (ORM)
ORM – Object-relational Mapping zu Deutsch Objektrelationale Abbildung, bezeichnet eine Technik,
mit deren Hilfe eine in einer objektorientierten Sprache geschriebene Anwendungen ihre Objekte in
einer relationalen Datenbank speichern, verändern und auslesen kann. Dazu werden zumeist
Bibliotheken, wie beispielsweise Hibernate für Java, verwendet. Für Java steht außerdem eine
standardisierte API, die Java Persistance API zur Verfügung.
Grundlegend werden Klassen zu Tabellen, Objekte zu Zeilen und Attribute zu Spalten. Beziehungen
werden mit Hilfe von Fremdschlüsseln realisiert. Für die Abbildung von Vererbung existieren im
Wesentlichen drei Strategien.
● Eine Tabelle pro gesamter Vererbungshierarchie, alle Attribute von Subtypen werden in die
Tabelle übernommen, es entstehen Zeilen mit teilweise leeren Spalte
● Eine Tabelle pro Unterklasse, Jede Klasse, egal ob abstrakt oder konkret, bekommt eine
eigene Tabelle, die Beziehungen zwischen den Klassen werden als 1:1 Beziehung realisiert.
● Eine Tabelle pro konkreter Klasse, die Attribute aus abstrakten Klassen werden in die
Implementierungen dieser übernommen
Was versteht man unter dem Begriff „impedance mismatch“?
Impedance mismatch bezeichnet ein Problem das Auftritt, wenn Objekte aus einer
objektorientierten Programmiersprache in einer relationalen Datenbank gespeichert werden. Das
Problem ist dabei, dass Objektorientierung und relationale Datenbanken unterschiedliche Konzepte
verwenden.
Ein Objekt hat einige grundlegende Eigenschaften:
● Identität, unabhängig von den Daten: Es können zwei unterschiedliche Objekte mit den
exakt gleichen Daten existieren
● Datenkapselung: die Daten von Objekten sind nicht generell sichtbar, es kann seine Daten
durch Modifizierer (private, public, protected) vor Zugriff und Veränderung schützen
● Struktur: Objektorientierung unterstützt das Konzept der Vererbung
17/143
●
Arbeitsweise: eine Objekt besteht sowohl aus Daten, als auch aus Methoden, die mit diesen
Daten arbeiten
Diese Konzepte werden von relationalen Datenbanken nicht unterstützt. Deshalb wird häufig auf ein
ORM zurückgegriffen. Einige dieser Konzepte können aber auch in einer objekt-relationalen
Datenbank realisiert werden. Es ist außerdem vorstellbar generell eine objektorientierte Datenbank
einzusetzen, oder die Programmiersprache um SQL-Funktionen zu erweitern.
Lazy-Loading
Soll ein Objekt aus der Datenbank in das Programm geladen werden, so werden seine
Abhängigkeiten nicht sofort aufgelöst, sondern es wird falls diese benötigt werden, ein neue Anfrage
an die Datenbank gestellt. Dies ist sinnvoll, wenn die Abhängigkeiten eigentlich nicht benötigt
werden. Beispiel: Eine Schule hat zahlreiche Schüler, benötige ich allerdings lediglich die Adresse der
Schule ist es nicht sinnvoll alle Schüler der Schule zu laden.
Eager-Loading
Es werden sofort alle Abhängigkeiten aufgelöst und in die Anwendung geladen. Die ist sinnvoll, wenn
man weiß, dass die Abhängigkeiten sicher benötigt werden.
18/143
4. Grundlagen des relationalen Datenmodells
Auf welchen mathematischen Grundlagen beruht das relationale Datenmodell? Was ist der
Unterschied zwischen einer Relation und einer (mathematischen) Funktion? Was bedeuten
„Attribut“,
„Wertebereich“, funktionale Abhängigkeit“ und voll funktionale Abhängigkeit“? Welche
Eigenschaften
haben Relationen? Was ist ein Primärschlüssel (Synonym: Identifikationsschlüssel), was ein
Fremdschlüssel? Was sind die zwei wichtigsten Eigenschaften eines Primärschlüssels? Welche
sind die im Relationenmodell verfügbaren relationalen Operatoren und welche sind die
Mengenoperatoren. Wie sind diese definiert?
Mathematische Grundlagen
Mengenlehre
Menge: ist eine Zusammenfassung von mehreren unterschiedlichen Elementen (Objekten, Zahlen).
Wichtig ist, dass jedes Element nur einmal in der Menge vorkommen darf. Daraus resultiert, dass
eine Menge keine Aufzählung ist, sondern eine Klassifizierung von Elementen.
Beschreibung von Mengen
● Aufzählendes Verfahren: M={rot, gelb,lila}
● Beschreibendes Verfahren: M={x|x<=3} (gesprochen: M ist die Menge aller x, für die gilt x ist
kleiner gleich 3)
Ob ein Element teil von einer Menge ist wird mit dem ∈ beziehungsweise dem ∉ gekennzeichnet.
Bsp: a ∈ {a,b,c}
Bsp: a ∉ {d,e,f}
Gleichheit von Mengen
Zwei Mengen sind gleich wenn sie die gleichen Elemente enthalten, mehrfach vor kommende
Elemente werden nur einmal gezählt(beziehungsweise gibt es in einer Menge keine gleichen
Elemente(siehe Definition)):
{a,b,c}={c,a,b}
Teilmenge
A ist eine echte Teilmenge von B, wenn jedes Element von A auch in B vorkommt. B wird auch
Obermenge genannt, wichtig ist jedoch dass es mindestens ein Element in B gibt das es nicht in A
gibt! Anders gesagt, alle Elemente von A existieren in B, nur B hat Elemente, die in A nicht existieren.
19/143
Unterschied echte Teilmenge und Teilmenge
Bei der echten Teilmenge hat B noch Elemente die nicht in A enthalten sind, bei der Teilmenge
haben A und B genau, die selben Elemente (Gleichheit).
Durchschnitt (Schnitt/Schnittmenge)
Eine Schnittmenge besteht aus allen Elementen die in beiden Mengen vorkommen, sowohl in
Menge A als auch in Menge B:
Gesprochen: M3 ist die Menge aller m, für die gilt m ist ein Element von M1 und m ist ein Element
von M2
Vereinigung (Vereinigungsmenge)
Diese Menge erhält man in dem man alle Elemente der Menge A und der Menge B zusammenfasst.
Dies sind die Elemente die sowohl in der einen als auch in der Anderen Menge enthalten sind oder in
beiden Mengen enthalten sind.
Gesprochen: die Vereinigte Menge ist die Menge aller x, für die gilt x ist ein Element von der Menge
A oder x ist ein Element von der Menge B
20/143
Differenz zweier Mengen
Die Differenz von M1 und M2, sind die Elemente die in der Menge M1 enthalten sind nicht jedoch in
der Menge M2:
Gesprochen: M3 ist die Menge aller m für die gilt m ist Element von M1 und m ist kein Element von
M2.
Komplement zweier Mengen
Sind die Elemente die in einer der beiden Mengen vorkommen, die jedoch nicht in beiden Mengen
vorkommen. Es kann man mit einem XOR vergleichen:
Gesprochen: das Komplement ist die vereinigte Menge aus der Differenz von A und B und der
Differenz aus B und A
Kartesisches Produkt
Das Kartesische Produkt, A X B, ist die Menge aller geordneten Paare (m1/m2), für die gilt m1 ist
Element von A und m2 ist Element von B.
Gesprochen: das kartesische Produkt ist die Menger aller a,b für die gilt a ist Element von A und b ist
Element von B.
21/143
Beispiel
Wichtig: REIHENFOLGE: (a/1) ist ein Element von M1XM2 zulässig, aber (1/a) ist kein Element von
M1XM2. (1/a) wäre ein Element von M2XM2
Potenzmenge
Eine Potenzmenge P(M) enthält alle möglichen Teilmengen von M, sowie auch die leere Menge:
Gesprochen: die Menge P, ist die Menge aller A, für die gilt A ist eine Teilmenge von M.
Anmerkung: Leere Menge dargestellt einerseits durch {} und andererseits durch ∅
Disjunkte Menge
Ist der Durchschnitt zweier Mengen A und B leer so heißen diese Mengen disjunkt.
Beispiel
A={a,b,c,d} B={1,2,3,4}
A B ={}
A B nennt man also disjunkte Menge
Mächtigkeit
Die Mächtigkeit einer Menge ist die Anzahl ihrer Elemente. Wenn M eine Menge mit 3 Elementen ist
so gilt: |M|=3.
22/143
Unterschied zwischen Relation und (mathematischen) Funktion?
Relation
Eine Relation definiert eine Beziehung zwischen Elementen (Dingen), das heißt Elemente von einer
Menge werden zu einem oder mehreren Elementen in einer anderen Menge in Beziehung gesetzt.
Eine Relation ist somit eine Teilmenge des kartesischen Produktes von zwei Mengen.
Beispiel
A={0,1,3,4,5} B={3,1,5,8,4}
Kartesisches Produkt:
{ (0/3), (0/1), (0/5), (0/8), (0/4),
(1/3), (1/1), (1/5), (1/8), (1/4),
(3/3), (3/1), (3/5), (3/8), (3/4),
(4/3), (4/1), (4/5), (4/8), (4/4),
(5/3), (5/1), (5/5), (5/8), (5/4)}
Relation zwischen A und B: ist Teiler von: (1/3), (1/1), (1/5), (1/8), (1/4), (3/3), (4/8), (4/4), (5/5)
Relation zwischen A und B: beide Elemente gleich: (1/1), (3/3), (4/4), (5/5)
In der Mathematik: einem x werden mehrere y-Werte zugeteilt
Funktion
Eine Funktion ist ein Relation, bei der jedem x-Wert genau ein y-Wert zugeteilt wird.
Beispiel
Kartesisches Produkt von oben mit Relation zwischen A und B: beide Elemente gleich: (1/1), (3/3),
(4/4), (5/5) ist somit auch eine Funktion, denn es ist immer nur ein Wert aus der ersten Menge der
mit einem Wert aus der zweiten kombiniert wird.
23/143
Was bedeuten „Attribut“, „Wertebereich“, funktionale Abhängigkeit und
voll funktionale Abhängigkeit?
Attribut
Ein Attribut ist eine Eigenschaft einer Entität und wird im relationalen Modell als Spalte einer Tabelle
dargestellt.
Wertebereich
Der Wertebereich wird auch Domäne genannt. Eine Domäne besteht immer aus dem Namen D und
einer Menge atomarer, nicht strukturierter Daten.
Beispiel
Buchstabe={a,b,….z, A,B,….Z}
Buchstabe ist der Domänenname und die Klammer ist die Menge atomarer, nicht strukturierter
Daten.
Eine Domäne kann mit einem Datentyp in einer Programmiersprache verglichen werden!!
Funktionale Abhängigkeit
Ein Attribut B ist von dem Attribut A funktional Abhängig, wenn zu jedem Wert von A nur ein Wert
von B auftreten kann. A->B
Das Attribut Name ist funktional abhängig vom Attribut ID! ID->Name
Volle funktionale Abhängigkeit
A ist Primärschlüssel, B ist ein Nicht-Schlüssel-Attribut.
B ist genau dann voll funktional Abhängig von A, wenn B bereits von A funktional Abhängig ist,
jedoch unabhängig von Teilen von A. A==>B!
Das Attribut Note ist voll funktional Abhängig von IDStudent und IDProfessor, weil es sich weder auf
Prof. noch Student bezieht, es bezieht sich jedoch auf beide miteinander.
Ein Attribut B heißt voll funktional abhängig vom Schlüssel A, falls B funktional abhängig ist von A,
jedoch nicht schon funktional abhängig von einer Teilmenge von A ist. Hinweis: ist ein
Primärschlüssel nicht mehrteilig, so ist ein Attribut sofort voll funktionalabhängig vom
Primärschlüssel, wenn es funktionalabhängig ist.
24/143
Primärschlüssel
Dient zur Identifikation und Verknüpfung von Datenbeständen, ein Schlüssel muss ein Tupel
eindeutig identifizieren. Zwei Schlüssel dürfen nicht den gleichen wert haben!
Ein Primärschlüssel kann aus einem oder mehreren Attributen bestehen, es sollten aber so wenig
wie möglich Attribute verwendet werden. Es kann auch künstlich ein Primärschlüssel eingefügt
werden, beispielsweise eine Kundennummer. Der Primärschlüssel kann nicht nach belieben
verändert werden.
Die zwei wichtigsten Eigenschaften sind NOT NULL und UNIQUE, das heißt ein Primärschlüssel muss
eindeutig/einzigartig sein und darf nicht den Wert Null annehmen, denn er wäre somit nicht mehr
eindeutig.
Fremdschlüssel
Bezieht man sich in einer Tabelle auf Werte einer anderen Tabelle, so kann man den
entsprechenden Primärschlüssel als Attribut in die Tabelle einfügen. Wenn man sich auf den
Primärschlüssel einer anderen Tabelle, so nennt man dieses Attribut Fremdschlüssel, der
Fremdschlüssel darf öfter in der referenzierten Tabelle vorkommen. Es kann sein, dass man den
Fremdschlüssel anders bezeichnen muss, wenn man in der aktuellen Tabelle schon einen
Primärschlüssel hat der gleich heißt(Rekursion).
Welche sind die im Relationenmodell verfügbaren relationalen
Operatoren und welche sind die Mengenoperatoren? Wie sind diese
definiert?
Projektion
Bei der Projektion wird aus einer Menge von Attributen nur ein Teil angezeigt:
SELECT name from Kunde
Sonderfall: Anzeigen aller Attribute: SELECT * from Kunde
Projektion beeinflussen: order by ASC/DESC oder distinct
Die Projektion kann man mit einer Teilmenge in der relationalen Algebra vergleichen.
Selektion
Man wählt nur bestimmte Tupeln einer Tabelle aus, diese werden aufgrund des Selektionsprädikats
bestimmt. Die Selektion beschreibt eine Teilmenge in der Relationen-Algebra.
Bsp: SELECT * from R WHERE a1<a2
Union
Dieser Befehl verbindet Datensätze aus zwei Relationen. Es werden alle Tupeln ausgegeben, die
entweder in der einen Menge oder in der anderen existieren. Union entspricht der vereinigten
25/143
Menge. Voraussetzungen: Beide Relationen haben dieselbe Anzahl von Spalten oder man selektiert
die Spalten. Die Spalten haben in ihrer Reihenfolge übereinstimmende Domänen. Die Datentypen
der einen Tabelle müssen die gleichen sein wie in der anderen Tabelle.
Bsp: SELECT * FROM Mitarbeiter UNION SELECT * FROM Kunden
Das Statement selektiert alle Mitarbeiter und Kunden. Doppelte Zeilen werden unterdrückt.
Intersection
Die Intersection entspricht der Schnittmenge in der relationalen Algebra. Der Befehl intersect steht
nicht immer zur Verfügung, kann aber mit verschachtelten SELECT Befehlen nachgebaut werden. Es
werden immer alle Elemente herausgefiltert die in der einen und in der anderen Menge existieren.
Bsp: SELECT * FROM Mitarbeiter INTERSECT SELECT * FROM Kunden
Differenz
Liefert die Zeilen der ersten Menge, die in der zweiten nicht enthalten sind. Es entspricht der
Differenz in der relationen Algebra.
Bsp: SELECT * FROM Mitarbeiter MINUS SELECT * FROM Kunden
JOIN
Mit diesem Befehl kann man mehrere einzelne Tabellen zu einer großen, tatsächlich nicht
existierenden Tabelle verbinden. Ein Join entspricht dem kartesischen Produkt, denn es werden alle
möglichen Kombinationen gebildet, das heißt es wird jede Zeile der ersten Tabelle mit jeder Zeile der
zweiten verknüpft.
Beispiel: SELECT * FROM Verlag, Postleitzahl;
liefert:
Wie man sehen kann wird jede Zeile aus Verlag mit jeder Zeile aus Postleitzahl kombiniert, man kann
erkennen, dass hier auch fehlerhafte Einträge gebildet werden. Deshalb kann die Ausgabe
beschränkt werden:
SELECT *FROM Verlag, Postleitzahl WHERE Verlag.plz = Postleitzahl.plz;
26/143
Attribute qualifizieren: Existieren gleichnamige Attribute in beiden Tabellen, so können diese mit
Tabellenname.Attribut eindeutig identifiziert werden.
Anstelle des obigen Statements kann auch dieses verwendet werden:
SELECT * FROM Verlag INNER JOIN Postleitzahl ON Postleitzahl.plz =
Verlag.plz;
Left Outer Join
Mit einem Left Join wird eine sogenannte linke Inklusionsverknüpfung erstellen, diese schließt alle
Tupeln aus der linken Seite (erste Tabelle) ein, auch wenn kein passender Eintrag in der rechten
Tabelle (Tabelle 2) existiert.
Beispiel
SELECT * FROM Mitarbeiter LEFT JOIN Projekte ON (Mitarbeiter.Nachname =
Projekte.Nachname AND Mitarbeiter.Vorname = Projekte.Vorname)
Right Outer Join
Mit einem Right Join wird eine sogenannte rechte Inklusionsverknüpfung erstellen, diese schließt
alle Tupeln aus der zweiten (rechten) Tabelle ein, auch wenn kein entsprechender Gegeneintrag in
der ersten (linken) Tabelle existiert.
Beispiel
SELECT * FROM Mitarbeiter RIGHT JOIN Projekte ON (Mitarbeiter.Nachname =
Projekte.Nachname AND Mitarbeiter.Vorname = Projekte.Vorname)
27/143
Full Outer Join
Ist eine Kombination von left und right outer Join.
Beispiel
SELECT * FROM Mitarbeiter FULL JOIN Projekte ON (Mitarbeiter.Nachname =
Projekte.Nachname AND Mitarbeiter.Vorname = Projekte.Vorname)
28/143
5. Normalformen (Zeilinger)
Erläutern Sie die Bedingung für die ersten drei Normalformen (1NF, 2NF, 3NF) und die erforderlichen
Schritte zur Transformation in diese Normalformen! Welche Vor­ bzw. Nachteile ergeben sich, wenn
sich ein ER­Modell in der 3. NF befindet? Gibt es noch weitere Stufen von Normalformen? Was
versteht man in diesem Zusammenhang unter „Anomalie“? Welche Anomalien kennen Sie – Führen
Sie dazu Beispiele an!
Warum normalisiert man Daten / Tabellen?
Die Relationen der Datenbank sind daraufhin zu überprüfen, ob sie unerwünschte Abhängigkeiten
der Felder untereinander und somit Redundanzen aufweisen. Dies geschieht indem man
schrittweise überprüft, ob die Relationen den Bedingungen der Normalformen (NF) entsprechen und
die Relationen bei Bedarf dann entsprechend anpasst. Im Verlauf eines solchen
„Normalisierungsprozesses“ kommt es zu einer Reduzierung der Redundanzen, parallel dazu jedoch
auch zur Zerlegung und somit zu einer Vermehrung der Anzahl der Relationen.
1. Normalform
Jedes Feld (Attributwert) darf nur genau eine Ausprägung des Wertebereichs umfassen (d.h. nur
atomare Werte). Beispiel: Die Adresse darf nicht als Attribut verwendet werden, sondern muss –
sofern es der zugrunde liegende Prozess erfordert – in PLZ, Ort, Straße, Hausnummer aufgeteilt
werden.
Gibt es mehrere Werte für ein Attribut (=Wiederholungsgruppe), so müssen diese in einem eigenen
Feld gespeichert werden. (Beispiel: Ein Mitarbeiter kann mehre Vornamen haben, an mehreren
Projekten arbeiten, …).
Feldgruppen (z. B. das Attribut „Name“, welches den Vor- und Nachnamen enthält) müssen als
eigene Felder dargestellt werden („Vorname“, „Nachname“)
Beispiel
Wiederholungsgruppe: Projekte
Feldgruppe: Adresse
Für Wiederholungsgruppen wird jeweils eine neue Zeile angelegt.
Eine Feldgruppe wird aufgelöst, indem ihre Bestandteile eigene Spalten bilden.
29/143
2. Normalform
Eine Tabelle/Relation ist in der zweiten Normalform, wenn die erste Normalform vorliegt und kein
Nichtschlüsselattribut voll funktional abhängig von einer echten Teilmenge eines
Schlüsselkandidaten ist.
Einfach gesagt: Jedes nicht-primäre Attribut (Nichtschlüsselattribute, nicht Teil des Schlüssels) ist
jeweils von allen Schlüsseln(können mehrere Spalten sein) abhängig, nicht nur von einem Teil des
Schlüssels. Wichtig ist, dass die Nichtschlüsselattribute von ALLEN Schlüsseln abhängig sind.
Beispiel
Die Daten in der Tabelle werden in zwei Tabellen aufgeteilt: Mitarbeiter und Projekt, da der
Schlüssel aus 2 Attributen besteht und die Nichtschlüsselattribute nur von einem Teil des
Primärschlüssels abhängig sind und so nicht voll funktional abhängig sind.
Die Tabelle Mitarbeiter enthält nur noch Felder, die voll funktional von Mitarbeiter# abhängen, hat
also Mitarbeiter# als Primärschlüssel. Da keine weiteren (zusammengesetzten) Schlüsselkandidaten
existieren, liegt die Tabelle damit automatisch in der 2. Normalform vor.
Die Tabelle Projekt enthält schließlich nur noch Felder, die voll funktional von Mitarbeiter# und
ProjektNr abhängen, liegt also auch in der 2. Normalform vor. Mit Hilfe dieser verlustfreien
Zerlegung sind auch die genannten Redundanzen der Daten beseitigt.
3. Normalform
Eine Relation/Tabelle befindet sich in der dritten Normalform, wenn
● sich die Relation schon in der 2. Normalform befindet
● jedes Nichtschlüsselattribut nicht transitiv vom Primärschlüssel abhängig ist.
30/143
Was heißt Transitiv?
Allgemein für die Attribute einer Relation formuliert:
Attribut 1 hängt voll funktional vom Primärschlüssel ab;
Attribut 2 hängt von Attribut 1 ab;
dann wird der Rückschluss gezogen, dass Attribut 2 auch vom Primärschlüssel abhängt
==> Attribut 2 bezeichnet man als transitiv Abhängig vom Primärschlüssel.
Schritte zur Transformation in die 3. Normalform
1. Untersuchung, ob aus Nichtschlüsselattributen andere Nichtschlüsselattribute folgen. Falls
nicht liegt bereits die 3. NF vor. Falls Abhängigkeiten gefunden werden, dann
2. Neue Relation bilden, die das Nichtschlüsselattribut (wird nun Primärschlüssel der neuen
Relation) und die von ihm abhängigen Attribute enthält.
3. Löschen der ausgelagerten Nichtschlüsselattribute mit Ausnahme des Attributes, das in der
neuen Relation Primärschlüssel ist.
4. Vorgang ab 2. wiederholen, bis keine Abhängigkeiten mehr bestehen
Beispiel
Die Attribut Vorname, Nachname und Abteilung sind voll funktional abhängig und mit der
Mitarbeiter# indetifizierbar. Der Abteilungsleiter ist von Abteilung abhängig, also von einem
Nichtschlüsselattribut abhängig. Also ist der Abteilungsleiter transitiv vom Primärschlüssel abhängig.
Das heißt es muss nun mit dem 2. Schritt, welcher oben gelistet ist, fortgefahren werden: eine neue
Relation/Tabelle erstellen. Der Abteilungsleiter gehört nun in eine Relation Abteilung mit Abteilung
als Primärschlüssel und den Abteilungsleiter als Attribut. In der Relation Mitarbeiter bleibt nur das
Attribut Abteilung.
Vor- und Nachteile der Normalisierung
Vorteile
●
●
Redundanzfreie Speicherung, d.h. jedes Faktum ist nur einmal in der Datenbank gespeichert.
Sicherung der Integrität. Integrität bedeutet, dass keine sich widersprechenden Fakten in
der Datenbank gespeichert sind.
31/143
Nachteile
●
●
Zum Teil hoher Normalisierungsaufwand
Schlechteres Laufzeitverhalten bei der Zusammenfügung (Join)mehrerer Relationen.
Weitere Normalformen
Ja es gibt noch weitere Normalformen. Es gibt noch die:
● Boyce-Codd-Normalform
● 4. Normalform
● 5. Normalform
Anomalie
Beim Erstellen von Datenbanken kann es zu Problemen kommen, wenn die Datenbank nicht
normalisiert aufgebaut ist. Diese Probleme nennt man Anomalien. Es gibt drei Arten von Anomalien,
die Update-Anomalie, die Insert-Anomalie und die Delete-Anomalie.
Update Anomalie
Die hellblau hinterlegten Zellen dienen zur Veranschaulichung des Problems: Es gibt zwei
Ansprechpartner für die Adresse Hoher Wall 12. Problematisch wird es dann, wenn die ABC GmbH
ihren Sitz verlegt. Nun müsste die Anschrift für dieses Unternehmen in zwei verschiedene Zeilen
geändert werden. Wird nur eine Zeile falsch aktualisiert, kann das schwere Folgefehler für ein
Unternehmen haben. Dieses Problem nennt man die Update-Anomalie.
Um diese Anomalie zu umgehen sollte für den Namen und die Anschrift aller Unternehmen eine
eigene Tabelle angelegt werden. Das ganze würde so aussehen:
32/143
Delete Anomalie
Die hellblau hinterlegten Zellen dienen zur Veranschaulichung des Problems: Werden nun in der
dritten Zeile die Informationen um Frau Haber gelöscht, kann folgender Fall eintreten, dass
jemand mit Hilfe der Datenbank einen Bericht über die Kontakte des letzten Jahres erstellen
möchte? Wenn bei dieser Aufteilung der Tabelle Informationen zu Frau Haber gelöscht werden,
werden auch alle Daten der IT-AG gelöscht. Dieses Problem wird als Delete-Anomalie bezeichnet.
Wenn die Daten jedoch so wie bei der Update-Anomalie getrennt auf zwei Tabellen verteilt sind,
kann die Kontaktperson Eva Haber beruhigt gelöscht werden, ohne wichtige Informationen über die
IT-AG zu verlieren.
Insert Anomalie
Die hellblau hinterlegten Zellen dienen zur Veranschaulichung des Problems:
Die Beispieltabelle ist für die Daten der Kontaktpersonen gedacht und nicht umbedingt für die Daten
der Unternehmen. Wird nun einen weitere Firma in die Datenbank / Tabelle aufgenommen, und es
bestehen keine Informationen zu einer Kontaktperson, muss gewartet werden bis eine
Kontaktperson vorhanden ist, um einen Datensatz einfügen zu können.
Dies nennt man die Insert-Anomalie.
6. SQL als DDL und DML
Was besagt ANSI SQL92 – halten sich die DB­Anbieter daran?
SQL (Structured Query Language) ist eine Sprache zum Abfragen, Manipulieren und Löschen von
Daten (Data Manipulation Language) sowie zum Erstellen, Manipulieren und Löschen der
Datenstrukturen (Data Description Language) einer relationalen Datenbank. Des weiteren können
die Zugriffsrechte auf die Datenbank für verschieden Benutzer über SQL festgelegt werden (Data
Control Language).
Mit SQL 92, der dritten SQL-Version, zweite große Revision, wurden in SQL einige Neuerungen
eingeführt. Viele der SQL-92-Funktionen wurden bereits vorher von verschiedenen Datenbanken
teilweise unterstützt. Neueinführungen mit SQL 92 waren beispielsweise neue Datentypen wie
DATE, TIME, TIMESTAMP oder VARCHAR sowie JOINS (LEFT JOIN, RIGHT JOIN, INNER JOIN) als auch
Operationen zur Differenzmenge, Vereinigungsmenge und Schnittmenge. Außerdem wurde das
Bearbeiten von Schemadefinitionen ersmals Bestandteil von SQL (ALTER ..., DROP …).
33/143
Heutzutage unterstützen fast alle Datenbankanbieter die Funktionen aus SQL-92, wobei sich diese in
der Umsetzung teilweise leicht unterscheiden. So heißt das Schlüsselwort für die Differenzmenge bei
PostgreSQL EXCEPT und bei MySQL MINUS. Auch die Bezeichnung mancher String-Funktionen
unterscheiden sich unter manchen Datenbankanbietern, wie auch die Verwendung von ‘ und “. SQL
92 stellt die letzte SQL-Version dar, die von den meisten Datenbankanbietern umfassend unterstützt
wird.
Wie sind die relationalen und die Mengenoperatoren in SQL umgesetzt?
Vereinigungsmenge
SELECT * FROM A UNION SELECT * FROM B;
oder
SELECT * FROM A FULL OUTER JOIN B ON A.id = B.id;
Schnittmenge
SELECT * FROM A INTERSECT SELECT * FROM B;
oder
SELECT * FROM A INNER JOIN B ON A.id = B.id;
Differenz
SELECT * FROM A MINUS SELECT * FROM B;
oder
34/143
SELECT * FROM A LEFT OUTER JOIN B ON A.id = B.id WHERE B.id = NULL;
Symmetrische Differenz
SELECT * FROM A FULL OUTER JOIN B ON A.id = B.id WHERE A.id IS null
OR B.id IS null;
Wie erfolgt die Gruppen­verarbeitung in SQL?
Gruppierung erfolgt in SLQ über GROUP BY <spaltenname>[,<spaltenname>]{}. GROUP
BY wird in Verbindung mit einer Aggregierungsfunktion verwendet. Die Aggregatfunktion fasst alle
gleichen Werte der in GROUP BY definierten Spalte zusammen. Wird beispielsweise in GROUP BY der
Nachname einer Person angegeben, so wird für jeden unterschiedlichen Nachnamen eine Zeile als
Ausgabe einer Abfrage erzeugt.
Aggregierungsfunktionen
Aggregierungsfunktionen dienen dazu eine bestimmte Spalte einer Abfrage zu einem
aussagekräftigen Wert zusammenzufassen.
Funktion
Beschreibung
AVG
Durschnitt der Werte
MAX
Höchster Wert
MIN
Kleinster Wert
SUM
Summe über alle selektierten Werte
COUNT
Zahl der selektierten Werte
MEDIAN
Median über alle Werte
FIRST/LAST
Erster bzw. als letzter selektierter Wert
Beispiel
Umsatz einzelner Kunden absteigend sortiert:
SELECT Kunden.vorname, Kunden.nachname, SUM(Bestellungen.preis) AS Umsatz
FROM Bestellungen, Kunden WHERE Bestellung.fk_kunde_id = Kunden.id GROUP BY
Kunden.vorname, Kunden.nachname ORDER BY Umsatz DESC;
35/143
Beispielausgabe
Kunden.Vorname
Kunden.Nachname
Umsatz
Franz
Kafka
120.12
Max
Mustermann
56.98
Dorian
Gray
23.1
Was versteht man unter einem Outer­Join, was unter einem Self­Join?
Bei einem Outer Join unterscheidet man prinzipiell zwischen einem FULL OUTER JOIN, LEFT OUTER
JOIN und einem RIGTH OUTER JOIN. Bei einem FULL OUTER JOIN werden alle Zeilen aus Tabelle A
und aus Tabelle B selektiert, unabhängig davon ob A in B oder B in A enthalten ist. Werte die nicht
enthalten sind, werden NULL gesetzt. Bei einem LEFT OUT JOIN werden alle Tupel aus A selektiert
und mit den zughörigen Zeilen aus B kombiniert. Auch hier werden bei Zeilen aus A, die in B nicht
referenziert sind, die enstprechende Spalten auf Null-Werte gesetzt. Der RIGHT OUTER JOIN
funktioniert wie der LEFT OUTER JOIN, mit dem Unterschied, dass alle Zeilen aus B aber nicht aus A
selektiert werden.
FULL OUTER JOIN
Beispiel
CustomerID
CustomerName
ContactName Address
City
PostalCode Country
1
Alfreds Futterkiste
Maria Anders
Berlin
12209
Obere Str.
German
57
2
3
Ana Trujillo
Ana Trujillo
y
Avda. de la México
Emparedados y
Constitució D.F.
helados
n 2222
Antonio Moreno
Antonio
Mataderos
México
Taquería
Moreno
2312
D.F.
05021
Mexico
05023
Mexico
OrderID
CustomerID
EmployeeID
OrderDate
ShipperID
10308
2
7
1996-09-18
3
10309
3
3
1996-09-19
1
10310
77
8
1996-09-20
2
SELECT Customers.CustomerName, Orders.OrderID FROM Customers
FULL OUTER JOIN Orders
36/143
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;
ergibt folgende Tabelle:
CustomerName
OrderID
Alfreds Futterkiste
Ana Trujillo Emparedados y helados
10308
Antonio Moreno Taquería
10309
10310
LEFT OUTER JOIN
Self Join
Von einem Self-Join spricht man, wenn man in einer Tabelle Datensätze aus der selben Tabelle
referenziert und diese selektiert. Als klassisches Beispiel kann hier eine Tabelle Mitarbeiter gesehen
werden, wobei ein Mitarbeiter einen anderen Mitarbeiter als Vorgesetzten haben kann.
Beispiel
Tabelle Employee
EmployeeID FirstName
LastName
Supervisor
10308
Victor
Frankenstein
10309
10309
Vanessa
Ives
10310
10310
Sir Malcolm
Murray
10311
Evan
Chandler
10310
SELECT E1.FirstName, E1.LastName, E2.LastName AS SupervisorName FROM
Employee E1 LEFT OUTER JOIN Employee E2 ON E1.EmployeeID =
E2.Supervisor;
Ergebnis:
FirstName
LastName
SupervisorName
Victor
Frankenstein
Ives
Vanessa
Ives
Murray
37/143
Sir Malcolm
Murray
Evan
Chandler
Murray
Unterabfragen („Subquerys”)
Ein Subquery stellt in SQL eine Abfrage in einer Abfrage dar.
Beispiel alle Personen die in diesem Jahr 18 werden und keinen Führerschein haben:
SELECT firstName, lastName, DATEDIFF(YEAR, dateOfBirth, CURDATE()) AS age
FROM Person
WHERE age >= 18 AND personId NOT IN
(SELECT fkpersonId FROM License);
//subselect
Integritätsbedingungen
Integritätsbedingungen sorgen für konsistente Daten in der Datenbank. Sie umfassen das
Beschreiben von Beziehungen, Schlüssel sowie das Einschränken des Wertebereichs.
Tabellenebene
(hier müssen die Spaltennamen angegeben werden)
Name
Beschreibung
PRIMARY_KEY(Spaltenname(n))
Primärschlüssel -> NOT NULL und UNIQUE
FOREIGN_KEY(Spaltenname) REFERENCES
tabellenname(Spaltenname2)
Fremdschlüssel, wobei die Spalte Spaltenname
eine Spalte Spaltenname2 in der zu
referenzierenden Tabelle referenziert
UNIQUE(Spaltenname)
muss einen eindeutigen Wert in der Tabelle habe,
d.h. derselbe Wert kann nicht zweimal
vorkommen
CHECK(Bedingung)
die Bedingung muss erfüllt sein, Beispiel:
CHECK(gender in (‘m’, ‘f’)) -> Geschlecht als
einzelnen Character m oder f speichern
Spaltenebene
Name
Beschreibung
PRIMARY_KEY
Primärschlüssel -> NOT NULL und UNIQUE
REFERENCES tabellenname(Spaltenname)
Fremdschlüssel, wobei die Spalte Spaltenname in
der Tabelle tabellenname referenziert wird
UNIQUE
muss einen eindeutigen Wert in der Tabelle
habe, d.h. derselbe Wert kann nicht zweimal
vorkommen
NOT NULL
darf nicht null sein
38/143
CHECK(Bedingung)
die Bedingung muss erfüllt sein, Beispiel:
CHECK(gender in (‘m’, ‘f’)) -> Geschlecht als
einzelnen Character m oder f speichern
Constraints
Constraints (Beschränkungen) sind Bedingungen, die Werte und Operationen auf Tabellen und
Spalten einschränken.
In SQL gibt es dabei zahlreiche Möglichkeiten, wobei einige im vorhergehenden Punkt beschrieben
wurden. Zusätzliche Constraints sind die Referenzierungs-Constraints, wie ON DELETE|UPDATE
RESTRICT und ON DELETE|UPDATE CASCADE.
DDL-Data Definition Language: Daten Definitionssprache : Zum Erstellen/Löschen/Ändern der
Tabellenstruktur und der Beziehungen zwischen den einzelnen Tabelle; Beispiel: CREATE TABLE,
ALTER TABLE, DROP TABLE,...
DML-Data Manipulation Language: Datenmanipulationssprache, dient zur Veränderung des
Datenbestandes in einer Tabelle. Beispiel: Einfügen neuer Tupel, Ändern von Attributen oder
Löschen von Datensätzen.
DCL-Data Control Language: zur Bestimmung der Berechtigungen(wer darf in diese Tabelle
schreiben, wer hat einsicht in die Daten, wer nicht….)
Welche Beziehungen (Kardinalitäten) können unmittelbar mit Hilfe von
SQL und den Integritätsbedingungen in einem relationalem DBMS
umgesetzt werden?
Beziehung
Überführung in SQL
1:1
zu einer Tabelle zusammenfassen oder
Primärschlüssel der einen wandert als
Fremdschlüssel zur anderen der beiden
Tabellen mit UNIQUE und NOT NULL
1:m
Primärschlüssel der 1-Tabelle wandert zu als
Fremdschlüssel NOT NULL zur m-Tabelle
mc:nc
neue Tabelle mit den Primärschlüsseln beider
Tabellen als Fremdschlüssel
1:c
wie 1:1 nur ohne NOT NULL, wobei der
Primärschlüssel der c-Tabelle als
Fremdschlüssel zur 1-Tabelle wandert
1:mc
wie 1:m nur ohne NOT NULL
39/143
Bei welchen ist eine Zusatzprogrammierung erforderlich?
Um m:n bzw. m:nc muss ich selbst garantieren, dass jeder m-Datensatz auch einen zusätzlichen nDatensatz und bei der m:n-Beziehung auch in umgekehrte Richtung hat. Dies kann beispielsweise
über eine Stored Procedure realisiert werden, die gleich beide Datensätze hinzufügt, falls noch nicht
vorhanden und die Verknüpfung erstellt.
Was versteht man unter statischen/dynamischen SQL­Statements und wie
werden diese realisiert?
Statische SQL-Statements sind Statements, die keine Variablen enthalten. Diese werden vor
erstmaliger Ausführung übersetzt und anschließend gecached. Bei nächstmaliger Ausführung greift
die Datenbank auf den Cache zurück.
Bei dynamischen SQL-Statements werden Variablen verwendet. Diese Anweisung wird von der
Datenbank vor jeder Ausführung mit neuen Variablen neu übersetzt und ist dementsprechend
langsamer. Dafür wird aber eine höhere Flexibilität erreicht. Die Variablen werden über ? markiert.
Beispiel
EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "INSERT INTO test1 VALUES(?, ?);";
EXEC SQL END DECLARE SECTION;
EXEC SQL PREPARE mystmt FROM :stmt;
...
EXEC SQL EXECUTE mystmt USING 42, 'foobar'; //erstes ? mit 42 zweites mit
‘foobar’ ersetzen
Was versteht man unter einer Transaktion?
Transaktionen sind ein mit SQL92 eingeführter Mechanismus um mehrere SQL-Statements
zusammenzufsassen und im Fehlerfall rückgängig machen zu können. Standardmäßig ist häufig die
Auto-Commit Funktion aktiviert, die jedes ausgeführtes Statements sofort permanent macht. Eine
Transaktion wird mit BEGIN [TRANSACTION] bzw. START TRANSACTION gestartet und COMMIT
bestätigt. Um die bislang durchgeführten Änderungen Rückgängig zu machen steht ROLLBACK zur
Verfügung.
Beispiel
BEGIN;
UPDATE accounts SET balance
WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance
WHERE name = 'Bob';
-- oops ... forget that and
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance
WHERE name = 'Wally';
COMMIT;
= balance - 100.00
= balance + 100.00
use Wally's account
= balance + 100.00
40/143
7. ER bzw. EER- Modell (Friedl)
Was ist eine Entität? Was ist ein Entitätstyp? Was ist eine Beziehung („Relationship“), was ein
Beziehungstyp? Welche Beziehungen können Entitäten eingehen? Was versteht man unter einer
schwachen Entität? Was unter Spezialisierung/Generalisierung? Erklären sie die „Uminterpretation
eines Beziehungstyps“ an Hand eines Beispiels. Was ist die „Connection Trap“ bei „redundanden
zyklischen“ Beziehungen? Erklären sie einstufige­ und mehrstufige rekursive Datenstrukturen im
ER­Modell.
Welche Beziehungen (Kardinalitäten!) können unmittelbar als Relationenschema (im
Relationenmodell) dargestellt werden? Wie können „schwache Entitäten“ als ER­Diagramm bzw. als
Tabellenschema modelliert werden? Warum dürfen/sollen Beziehungen nicht in Beziehung zu
anderen Beziehungen stehen? Was versteht man in diesem Zusammenhang unter
„Uminterpretation“?
Fehlt noch:
Erklären sie einstufige- und mehrstufige rekursive Datenstrukturen im ER-Modell.
Warum dürfen/sollen Beziehungen nicht in Beziehung zu anderen Beziehungen stehen?
Das ER-Modell
Das ER-Modell ist ein Konzeptionelles Modell. Es wird zur abstrakten Modellierung der
Daten der realen Welt verwendet.
Zur Modellierung der konzeptuellen Ebene verwendet man das Entity-Relationship-Modell,
welches einen Ausschnitt der Realwelt unter Verwendung von Entities und Relationships
beschreibt. Das ER-Modell besteht einfach gesagt aus Entitäten (Entities), welche Attribute
(Eigenschaften) und Relationships (also den Beziehungen) haben können.
Beispiel
Hier haben wir die Entitäten Rhetorik und Sokrates und die Beziehung liest, welche die
beiden Entitäten verbindet.
Gelesen wird das ganze wie folgt:
● Eine Vorlesung wird von einem Professor gelesen.
● Ein Professor liest eine Vorlesung.
41/143
Was ist also ein Entitätstyp?
Wir kennen nun bereits die Entitäten. In unserem Beispiel Rhetorik und Sokrates. Der
Entitätstyp stellt einfach eine Typisierung dieser dar. In unserem Beispiel würde das wie
folgt aussehen:
Rhetorik ist vom Typ Vorlesung und Sokrates ist vom Typ Professor. Im ER-Diagramm
werden immer nur die Entitätstypen dargestellt, welche auch einfach nur als Entitäten
bezeichnet werden. Wie bereits erwähnt können Entitäten auch Attribute haben. Diese
beschreiben die Entität genauer.
Beziehungen von Entitäten
Prinzipiell unterscheiden wir zwischen 1:1, 1:N und N:M Beziehungen.
Die 1:1 Beziehung
Ein Mitarbeiter kann eine Abteilung leiten, eine Abteilung wird von einem Mitarbeiter
geleitet.
Die 1:N bzw N:1 Beziehung
Jeder Mitarbeiter gehört zu einer Abteilung. Eine Abteilung kann mehrere Mitarbeiter
42/143
haben.
Die N:M Beziehung
Autoren können mehrere (M) Bücher schreiben. Bücher können mehrere (N) Autoren
haben.
Natürlich gibt es auch noch andere Notationen, wie zum Beispiel die MC-Notation:
Wobei das C hier für 0 oder 1 steht.
Schwache Entitäten (Weak Entities)
Unter schwache Entitäten versteht man Entitäten, die ohne andere Entitäten nicht bestehen
können. Weak Entities sind also von einer anderen Entität abhängig. Sie sind oft nur in
Kombination mit dem Schlüssel der übergordneten Entität eindeutig identifizierbar.
Schwache Entitäten werden im ER-Diagramm doppelt umrandet und haben keinen eigenen
Schlüssel.
Damit der Raum eindeutig identifiziert werden kann ist auch die Gebäudenummer nötig.
Die Tabellenauflösung würde wie folgt aussehen:
Räume{[Gebäude_Nr, Raum_Nr]}
Der Schlüssel des Raumes besteht also aus 2 Attributen.
Spezialisierung/Generalisierung
Die Generalisierung wird zur weiteren Strukturierung der Entitätstypen eingesetzt. Hierbei
werden Eigenschaften von ähnlichen Entitäten einem gemeinsamen Obertyp zugeordnet.
Bei dem jeweiligen Untertyp verbleiben nur die nicht faktorisierbaren Attribute. Somit stellt
der Untertyp eine Spezialisierung des Obertyps dar.
43/143
Connection Trap
Die Connection Trap ist eine Falle in die man leicht hineintritt. Die Beziehung "besucht
Vorlesung" ist redundant da die Verbindung zwischen Student und Professor schon durch
die Beziehungen "besucht" und "hält" über die Vorlesung gegeben sind. Man sollte also
redundante Beziehungen vermeiden.
Warum dürfen/sollen Beziehungen nicht in Beziehung zu anderen Beziehungen
stehen?
Weil diese Modellierung nicht ideal ist und Probleme mit den Schlüssel auftreten können.
44/143
Um dies zu vermeiden sollten die Beziehungen in Beziehungstypen mit eigenem PK
uminterpretiert werden. (Anforderung an Entitäten ist, diese hat einen Primärschlüssel der
für sich alleine existiert)
Das Relationale Modell:
Um das ER-Modell in ein Relationales Modell umzuwandeln gibt es mehrere Regeln.
Zu Beginn werden alle Entitäten in Tabellen umgeschrieben. Der Schlüssel bei Kadinalität 1
wandert dabei zum N. Für N:M Beziehungen werden neue Tabellen angelegt, die den
Schlüssel beider Entitäten beinhalten.
Warum dürfen/sollen Beziehungen nicht in Beziehung zu
anderen Beziehungen stehen? Was versteht man in diesem Zusammenhang unter
„Uminterpretation“?
Laut Chen dürfen Beziehungen nicht mit Beziehungen in Beziehung stehen. Deshalb kann es
sein, dass man eine Relation in eine Entität uminterpretieren muss.
8. Prozedurale Erweiterung von SQL-Datenbanken
Was versteht man unter Prozedurale Erweiterung einer SQL­Datenbank? Wo werden diese
gespeichert und welche Vor­ bzw. Nachteile hat PL/pgSQL? Kann eine JDBC­Anwendung eine
PL/pgSQL ­Funktion nutzen; wenn ja: wie wird eine Nutzung ausschauen? Was versteht man unter
einem View? Welche Operationen können darauf ausgeführt werden? Welche Befehle stehen für das
Einfügen/Updaten von Daten unter SQL zur Verfügung? Grenzen sie Trigger, Stored Procedures und
Functions voneinander ab. Welche unterschiedlichen Parameter gibt es und wie können diese
verwendet werden. Was versteht man unter SQL­Injection und wie kann man sich davor schützen?
Was ist der Unterschied zwischen PreparedStatement , Stored Procedures und Stored Function? Wie
kann aus einer objektorientierten Sprache wie Java PL/SQL genutzt werden (Beispiel)? Was ist ein
Cursor (wofür wird dieser eingesetzt, wie schaut die Struktur aus)? Welche einsetzbaren Tools gibt
es? Gibt es Debugger für PL/SQL­Systeme? Auf welcher Ebene “laufen”
PL/SQL­Funktionen/Prozeduren und wo sind diese gespeichert? Kompatibilität von PL/SQL (z.B.
Oracle PL/SQL ist kompatible zu pgSQL von Postgres?)
Die prozedurale Erweiterung einer SQL-Datenbank wird verwendet um zum Beispiel oft genutzte
Abfrage mit einer Stored Procedure zu übernehmen. Weiters können Datenbanktrigger mittels
prozeduraler Erweiterung erstellt werden. Als Programmiersprache wird PL/SQL (Procedural
Language/SQL) von Oracle benutzt.
Wo werden diese gespeichert und welche Vor- bzw. Nachteile hat
PL/pgSQL?
Gespeichert werden diese direkt im DBMS, wo sie auch ausgeführt werden.
45/143
Vorteile
●
●
●
Weniger Netzwerkverkehr
Schneller
Sicherer
Nachteile
●
●
Höherer Aufwand
Auftrennung der Programmlogik
PL/pgSQL mit JDBC
Beispielcode:
Setzen eines Wertes in einer Tabelle:
try
{
int age = 111;
String poetName = "hutterer thomas";
CallableStatement proc = connection.prepareCall("{ call
set_death_age(?, ?) }");
proc.setString(1, poetName);
proc.setInt(2, age);
cs.execute();
}
catch (SQLException e)
{ // .... }
Was versteht man unter einem View?
Views können als virtuelle Tabellen angesehen werden. Allgemein kann man sagen, dass eine Tabelle
über einen Satz von Definitionen verfügt und Daten physikalisch abspeichert. Eine Ansicht verfügt
ebenfalls über einen Satz von Definitionen, die auf einer oder mehreren Tabellen oder anderen
Ansichten aufbauen, speichert die Daten aber nicht physikalisch ab.
CREATE VIEW "VIEW_NAME" AS "SQL-Anweisung"
Welche Operationen können darauf ausgeführt werden?
Grundsätzlich alle lesenden, aber keine schreibenden, da dies zu Anomalien führen kann. Diese
Abfrage kann durchaus gemacht werden:
SELECT * FROM "VIEW_NAME"
46/143
Welche Befehle stehen für das Einfügen/Updaten von Daten unter SQL
zur Verfügung?
Insert
Einfügen einer ganzen Zeile in eine bestehende Tabelle:
INSERT INTO "Tabellen_Name" ("Spalte1", "Spalte2", ...) VALUES ("Wert1",
"Wert2", ...)
Konkret:
INSERT INTO Store_Information (store_name, Sales, Date) VALUES ('Los
Angeles', 900, '10.Jan.1999')
Update
einer bestehenden Zeile einer bestehenden Tabelle:
UPDATE "Tabellen_Name"
SET "Spalte1" = [Wert]
WHERE {Bedingung}
Konkret:
UPDATE Store_Information
SET Sales = 500
WHERE store_name = "Los Angeles"
AND Date = "08.Jan.1999"
Grenzen sie Trigger, Stored Procedures und Functions voneinander ab?
Trigger wird ausgelöst wenn irgendetwas z.B. unter/über einen Wert oder gelöscht usw wird, dann
passiert dies und dies...
Function hat immer einen Return- Wert und führt eine Menge an Befehlen aus.
Stored Procedure gibt eine Menge zurück.
Welche unterschiedlichen Parameter gibt es und wie können diese
verwendet werden?
IN Parameter
Ist das selbe wie Übergabeparameter bei Programmiersprachen.
CREATE [OR REPLACE] PROCEDURE procedure_name (
param_name1 IN datatype, param_name12 IN datatype ... )
OUT Parameter
Dieser Typ von Parametern wird genutzt um Ergebnisse zu bekommen. Das selbe wie ein Return
Wert.
47/143
CREATE [OR REPLACE] PROCEDURE proc2 (param_name OUT datatype)
INOUT Parameter
Ist das selbe wie IN & OUT zusammen. -> verwendet um Werte zus enden und zu bekommen.
CREATE [OR REPLACE] PROCEDURE proc3 (param_name IN OUT datatype)
Was versteht man unter SQL­Injection und wie kann man sich davor
schützen?
Normaler Aufruf
Aufruf : http://webserver/cgi-bin/find.cgi?ID=42
SQL: SELECT author, subject, text FROM artikel WHERE ID=42;
SQL Injection
Aufruf: http://webserver/cgi-bin/find.cgi?ID=42;UPDATE+USER+SET+TYPE="admin"+WHERE+ID=23
SQL: SELECT author, subject, text FROM artikel WHERE ID=42; UPDATE
USER SET TYPE="admin" WHERE ID=23;
Schutz
Ausfiltern oder Maskieren (sogenanntem Escapen) von Metazeichen in Benutzereingaben
Mittels Prepared Statements können SQL-Injections effektiv verhindert werden, da das
Datenbanksystem die Gültigkeit von Parametern prüft, bevor diese verarbeitet werden.
Was ist der Unterschied zwischen PreparedStatement , Stored
Procedures und Stored Function?
Prepared Statement
Ein Prepared Statement ist eine sogenannte vorbereitete Anweisung für ein Datenbanksystem. Im
Gegensatz zu gewöhnlichen Statements enthält es noch keine Parameterwerte. Stattdessen werden
dem Datenbanksystem Platzhalter übergeben.
Stored Procedure
Mittels gespeicherter Prozeduren können häufiger verwendete Abläufe, die sonst durch viele
einzelne Befehle vom Client ausgeführt werden würden, auf das Datenbanksystem ausgelagert und
durch einen einzigen Aufruf (CALL oder EXECUTE) ausgeführt werden.
48/143
Stored Function
Nicht viel Unterschied zu Stored Procedure, aber die Funktion gibt immer ein Result zurück. Kann in
einem SQL Statement aufgerufen werden wie eine normale SQL Anweisung.
Wie kann aus einer objektorientierten Sprache wie Java PL/SQL genutzt
werden ?
Siehe Frage 3 (Kann eine JDBC-Anwendung eine PL/pgSQL -Funktion nutzen; wenn ja: wie wird eine
Nutzung ausschauen?)
Was ist ein Cursor?
Cursor sind Zeiger.
Ein Cursor stellt einen definierten Umfang von Daten temporär zur Verfügung.
Cursor und Schleifen
Wir wollen nicht immer nur eine Zeile aus der Ergebnismenge eines Cursors bearbeiten, sondern
immer alle Zeilen abarbeiten. Hierfür werden Schleifen genutzt.
CREATE OR REPLACE Function TotalIncome
( name_in IN varchar2 )
RETURN varchar2
IS
total_val number(6);
cursor c1 is
SELECT monthly_income
FROM employees
WHERE name = name_in;
BEGIN
total_val := 0;
FOR employee_rec in c1
LOOP
total_val := total_val + employee_rec.monthly_income;
END LOOP;
RETURN total_val;
END;
Welche einsetzbaren Tools gibt es? Gibt es Debugger für PL/SQL­Systeme?
PL/SQL Beautifier
Command Window
49/143
MYSQL Workbench
Oracle PL/SQL Debugger ist ein Debugger.
Auf welcher Ebene “laufen” PL/SQL­Funktionen/Prozeduren und wo sind
diese gespeichert?
Sind auf der Datenbank gespeichert und können dort ausgeführt werden.
Kompatibilität von PL/SQL (z.B. Oracle PL/SQL ist kompatible zu pgSQL
von Postgres?
Ja ist es.
50/143
9. Wartung/Backup/Restore
Wie kann eine DBank gesichert bzw. wiederhergestellt werden? Was passiert, wenn man von einer in
Betrieb befindlichen DBank einen Snapshot erzeugt – wo liegen die Gefahren? Was ist die Aufgabe
eines DB­Managers? Kann der DB­Hersteller bei einer bestehenden DBank beliebig ausgetauscht
werden (Welche Möglichkeiten der Migration stehen zu Verfügung)? Was versteht man unter einer
Reorganisation der DBank ­ welche Vorsichtsmaßnahmen wirst du hier ergreifen? Wie erzeugt man
unter MySQL ein Backup und wie kann es wieder eingespielt werden?
Wie kann eine DBank gesichert bzw. wiederhergestellt werden
Eine Datenbank wird grundsätzlich in einen Dump gespeichert. Dieser Dump enthält die Daten und
die Struktur der Tabellen. (Kann auch geändert werden. Nur Daten. Nur Struktur).
Ein Dump kann wie im letzten Punkt beschrieben mit einem Tool (phpmyadmin) einfach erstellet
werden.
Es besteht auch die Möglichkeit einen Dump über die Konsole zu erstellen.
Export
mysqldump name_ihrer_datenbank > dateiname.sql -u datenbankbenutzer -p
Import
mysql name_ihrer_datenbank < dateiname.sql -u name_des_datenbankbenutzers p
Wie erzeugt man unter MySQL ein Backup und wie kann es wieder eingespielt
werden?
Nach Auswahl der Datenbank kann in der Leiste oben Exportieren bzw. Importieren ausgewählt
werden.
Im Exportieren Reiter befinden sich 2 Optionen. Eine zum schnell Exportieren und eine wo
Einstellungen vorgenommen werden können.
Bei den Einstellungen können die zu sicherenden Tabellen, Name, Zeichencodierung,
Komprimierung, Format, Daten, Struktur oder beides und einige weitere eingestellt werden.
Um eine Sicherung wieder einzuspielen muss im Reiter Importieren lediglich das File wieder
ausgewählt werden und mit OK bestätigt werden.
51/143
Was passiert, wenn man von einer in Betrieb befindlichen DBank einen
Snapshot erzeugt, wo liegen die Gefahren?
Die Gefahr besteht darin, dass nach Erstellen der Sicherung noch Daten verändert werden und die
Datenbank so inkonsistent wird.
Was ist die Aufgabe eines DB­Managers?
Datenbankmanager/innen sind in Unternehmen, Behörden, Institutionen und Einrichtungen
beschäftigt, die Datenbanken als Basis moderner betrieblicher Informationssysteme einsetzen und
anwenden. Sie managen, administrieren und betreuen konkrete Datenbanken.
In diesem Rahmen ersetzen sie ältere Software durch neue Versionen (Update) und überwachen die
Performance (Leistungsfähigkeit) von Computern oder Netzwerken. Zu ihren Aufgaben zählt zudem
die Betreuung des Datenbank-Designs. Dabei geht es darum, dass Programme oder
Bildschirm-Masken optisch und sachlich richtig gestaltet sind, und der Datenzugriffsschutz
gewährleistet ist.
Im Interesse der Leistungsfähigkeit der Datenbank sollten auch doppelte Datenhaltung sowie
unnötige Platzverschwendung vermieden werden. Außerdem unterstützen
Datenbankmanager/innen die Anwendungsabteilungen und das Rechenzentrum, beispielsweise
hinsichtlich der Programmierstandards und qualitätssichernder Grundlagen. Weiterhin integrieren
sie SAP-Systeme in die Logistikprozesse und -systeme von Kunden oder implementieren
Internet-Vertriebslösungen. Bei Eilaufträgen von Kunden müssen Datenbankmanager/innen ihre
Aufgaben häufig unter Zeit- und Erfolgsdruck bewältigen.
Kann der DB­Hersteller bei einer bestehenden DBank beliebig
ausgetauscht werden?
Es ist möglich einen Datenbankdump in die Datenbank einens anderen Herstellers zu laden. Jedoch
muss dieser umkonvertiert werden und dies kann nur mit kostenpflichtigen Programmen, oder
durch umschreiben des Dumps erledigt werden. Der PostgreSQL to MySQL Converter erledigt dies
für Datenbanken mit bis zu 4 Tabellen kostenlos.
Was versteht man unter einer Reorganisation der DBank (welche
Vorsichtsmaßnahmen)?
Es wird empfohlen eine Datenbank regelmäßig zu reorganisieren. Eine Datenbank reorganisieren
heißt, diese "aufzuräumen" bzw. neu aufzubauen. Eine nicht aufgeräumte Datenbank hat an den
unterschiedlichsten Stellen freien Speicher, denn wenn Daten gelöscht werden, werden an dieser
Stelle keine neuen Daten hineingeschrieben. Sie werden stattdessen an das Ende der
Datenbankdatei angehängt, sodass diese Datei immer größer wird. Ein Neuaufbau bewirkt, dass die
Daten wieder zusammengefasst werden und der Speicherplatz neu strukturiert wird. Die Datenbank
wird dadurch i.d.R. kleiner und die Verarbeitungsgeschwindigkeit der Anwendung wieder erhöht.
Vor einer Reorganisation sollte immer Sicherung gemacht werden um bei auftretenden Fehlern oder
Unterbrechungen (z.B. Stromausfall) eine Rückversicherung hat.
52/143
10. Servlets: Grundstruktur, Lebenszyklus und Web Container
Kommunikationsablauf bei Java Servlets: (Reihenfolge, beteiligte Klassen mit Funktionen, beteiligte
„Dateitypen“ mit Beschreibung, Lebenszyklus eines Java Servlets, Was ist ein Deployment Descriptor?
Wie wird er verwendet? Kann der Deployment Descriptor ersetzt werden? Wie kann ich die
Bearbeitung auf mehrere Servlets aufteilen? Wie verarbeite ich Benutzereingaben in einer
HTML­Seite? Unterschiede zu JSP? Welche Konsequenzen hat die Multithreading­Eigenschaft eines
Servlets (wer kümmert sich um die Ressourcen, start/stop des Threads)? Was versteht man unter
einem „Redirect“, wie kann dies via Servlets realisiert werden und wozu setzt man dies ein? Wie kann
ein Servlet parametrisiert werden und wie werden Ressourcen (z.B. DB­Connection) angefordert bzw.
wieder frei gegeben (Multithreading!). Wie können Annotations eingesetzt werden (Beispiel)? Wie
werden Techniken wie DI (Dependency Injection) in Servlets unterstützt (Beispiel)? Wozu braucht man
bei Servlets einen Kontext? Wodurch unterscheidet sich ein Servlet und ein normales
Java­Programm? Können Servlets parametrisiert werden ­ Beispiele). Aufbau einer URL für den Aufruf
eines Servlets (Beispiel).
Kommunikation und Lebenszyklus
1. Der Benutzer sendet ein ausgefülltes Formular im Browser ab.
2. Der Browser löst die damit verbundene Aktion aus, indem er die Formulardaten an den
Webserver sendet.
3. Der Webserver übersetzt den Aktionsnamen des Formulars in den Namen einer
Servletklasse. Er verwendet dazu Informationen aus dem Deployment-Deskriptor, einer
Datei namens „web.xml“.
4. Der Webserver ruft die Methode doPost, doGet oder service() des Servlets auf und übergibt
dabei die Anfragedaten („request“) als Parameter. Die Methode request erzeugt eine
Ausgabe, die der Webserver an den Browser sendet.
5. Der Browser nimmt die Antwort entgegen und stellt sie dar.
6. Der Benutzer liest die Antwort im Browser.
Das folgende Ablaufdiagramm zeigt einen typischen Ablauf beim Aufruf eines Servlets.
53/143
Lebenszyklus eines Servlets
1. Laden und instantiieren (Entweder beim starten des Containers (Tomcat) oder der ersten
Anfrage)
2. Initialisieren (“init”-Methode wird aufgerufen, DB Verbindung herstellen,
Konfigurationsdatei einlesen)
3. Anfragen bearbeiten (“service”-Methode wird aufgerufen, diese soll nicht überschrieben
werden, da sie den Anfragetyp überprüft und an die jeweilige Methode weiterleitet (doGet,
doPost, …)
4. Entladen der Servlet Klasse (Container (Tomcat) entscheidet, wann die Servlet Instanz
entfernt wird. Die Methode “destroy” wird aufgerufen)
Beteiligte Klassen
●
HttpServlet
Alle Servlets erben von dieser Klasse. Sie stellt Methoden wie doPost, doGet, service(), init,
… zur Verfügung
●
HttpServletResponse
Das Response Objekt wird den Methoden doPost, doGet automatisch übergeben. In dieses
Objekt wird die Antwort des Servlets über einen PrintWriter (res.getWriter())
hineingeschrieben.
54/143
●
HttpServletRequest
Auch dieses Objekt wird automatisch übergeben. Es enthält alle Anfragedaten des Clients
wie zum Beispiel Formulardaten.
●
PrintWriter
Mit dem PrintWriter kann das Servlet Antworten in das Response Objekt schreiben. Was der
PrintWriter ausgibt wird später auf dem Client angezeigt.
●
HttpSession
Diese Klasse wird von der Servlet-API zur Verwaltung von Sitzungen zur Verfügung gestellt.
Im Objekt können Attribute abgespeichert werden.
●
Cookie
Diese Java Klasse stellt ein Cookie dar, welches später auf dem Client gespeichert wird. Man
kann Werte hineinschreiben und die Lebensdauer bestimmen.
Deployment descriptor
Die Struktur jeder Webapplikation unter Tomcat wird mit Hilfe der XML-Datei WEB-INF/web.xml
beschrieben.
Zwei wichtige Elemente beim Arbeiten mit Servlets sind
● servlet
● servlet-mapping
Annotations
Ersetzen des Deployment Descriptors durch Annotationen:
@WebServlet(urlPatterns = { "/ShakespeareServl" }
public class ShakespeareServl extends HttpServlet { … }
55/143
@WebServlet("/my‐address")
public class MyServlet extends HttpServlet { … }
Aufteilen der Bearbeitung auf mehrere Servlets
Mithilfe des Request-Dispatchers kann die Anfrage an ein ein weiteres Servlet weitergeleitet
werden.
Forward Methode
Die Kontrolle wird vollständig an ein anderes Servlet übergeben, es dürfen von aktuellen Servlet
noch keine Daten gesendet worden sein. Die Response wird vom nächsten Servlet erstellt!
getServletContext().getRequestDispatcher("/servlet/ErrorServlet")
.forward(req, res);
Include Methode
Das Resultat eines Weiteren Servlets wird eingebunden (wrapping), die Kontrolle bleibt beim
aktuellen Servlet. Die Response wird vom aktuellen Servlet erstellt!
getServletContext().getRequestDispatcher("/servlet/Item?item="+item)
.include(req, res);
Benutzereingaben
Vom Benutzer in HTML Formulare eingegebene Daten, werden an das im “action”-Parameter
angegebene Servlet weitergegeben. Entweder mit der Methode GET oder POST. Im Servlet sind
diese Argumente dann im Request Objekt gespeichert und können via “getParameter” abgerufen
werden. Der Parametername entspricht hierbei dem Namen des Inputfeldes im HTML File.
HTML:
<input name="adresse" type="text">
Servlet:
String adr = request.getParameter("adresse");
Mit den aus den Formularen gewonnenen Daten, kann nun eine Antwort generiert werden.
Unterschiede zu JSP
JSPs nutzen Servlets als zugrundeliegende Technologie. Der wesentliche Unterschied gegenüber
herkömmlichen Servlets besteht darin, dass Java-Quellcode direkt in einer HTML-Seite eingebunden
werden kann, ähnlich wie bei der Skriptsprache PHP.
Da bei Servlets der gesamte HTML-Code mittels Methodenaufrufen ausgegeben werden muss, geht
bei der Erzeugung der Webseite schnell die Übersicht verloren. Aus den JSP-Seiten werden bei der
ersten Client-Anforferung Servlets generiert. Die Servlets werden dann im Servlet-Container
ausgeführt.
56/143
Multithreading
Servlets sind automatisch multithreaded. Jede HTTP Verbindung wird durch einen eigenen Thread
des Servlets bedient. Die Eigenschaft, dass Servlets automatisch in mehreren Threads ablaufen
zwingt den Entwickler dazu, seinen Code Threadsafe zu gestalten.
out.println(“Deine UID ist: “ + idCount++); // NICHT Threadsafe (idCount)
synchronized(this){
out.println(“Deine UID ist: “ + idCount++); // Threadsafe (idCount)
}
Lokale Variablen sind immer Threadsafe weil jeder Thread einen eigenen Stack hat = eigene Werte.
Membervariablen oder statische Variablen sollten möglichst nicht manipuliert / Verwendet werden.
Wer kümmert sich um die Ressourcen, start/stop des Threads?
Die HTTP Requests, die von einem Client kommen, werden vom Server zum Servlet Container
(Tomcat) weitergeleitet, dieser lädt beim ersten Aufruf das Servlet und ruft dessen init Methode auf.
Nun wird vom Container ein neuer Thread gestartet, welcher auf die Instanz des Servlets zugreift
und dessen service Methode aufruft. Jeder Thread ruft die gleiche Instanz des Servlets auf
Redirect Unterschied Redirect / Forward
●
Redirect
○ Die Web Applikation weißt den Browser an, eine andere URL zu laden
○ Ein Refresh im Browser lädt wieder die zweite URL, nicht die Erste
○ response.sendRedirect("/demo.jsp");
●
Forward
57/143
○
○
Die Web Applikation lädt ein anderes Servlet, der Client bekommt nichts davon mit
(die URL bleibt wie sie ist)
Ein Refresh im Browser lädt die erste URL neu, also das erste Servlet
○
request.getRequestDispatcher("demo.jsp").forward(req, res);
Da bei einem Redirect und anschließendem Refresh eine neue URL geladen wird, sollte Redirect für
ändernde SQL Anweisungen wie INSERT, UPDATE, DELETE verwendet werden.
Ein Forward sollte nur verwendet werden, wenn keine Daten verändert werden (SELECT).
Parameterisierung und Ressourcen Anforderung
Parameterisierung über Deployment Descriptor (web.xml)
Definieren
Außerhalb des “servlet” Elements in der web.xml
<context-param>
<param-name>param1</param-name>
<param-value>Hello param1</param-value>
</context-param>
Zugreifen
Über Servlet Context “getInitParameter”
getServletContext().getInitParameter("param1")
Parameterisierung über Annotationen
Definieren
In der @WebServlet Annotation
@WebServlet(urlPatterns = { "/ShakespeareServl" }, initParams = {
@WebInitParam(name = "param1", value = "Hello param1")
})
Zugreifen
Über Servlet Context “getInitParameter”
getServletContext().getInitParameter("param1");
Anfordern und Freigeben von Ressourcen
Es gibt bei Servlets mehrere Möglichkeiten eine DB Verbindung herzustellen. Die erste Möglichkeit
ist eine manuelle Erstellung mittels DriverManager:
58/143
Connection con = DriverManager.getConnection(URL, USER, PASS);
//Arbeiten mit Connection
con.close();
Diese Variante ist allerdings sehr Ressourcenhungrig, da eine DB Verbindung herzustellen sehr viel
zeit benötigt. Für jeden Thread wird hiermit eine neue Verbindung hergestellt, es gibt keinen
Connection Pool.
DataSource
Die zweite Möglichkeit ist die Verwendung des “DataSource” Interfaces.
Die Implementierung dieses Interfaces wird vom Servlet Container (Tomcat) zur Verfügung gestellt
und kann Connection-Pooling unterstützen oder nicht. Dies liegt in der Hand des Herstellers.
Die Datasource liefert, wie auch der DriverManager, eine Verbindung zur Datenbank. Allerdings
kommt diese Verbindung aus einem Pool von Verbindungen, ist also schon hergestellt
(Ressourcenschonend). Jeder Thread bekommt seine eigene Verbindung aus dem Pool. Dieser hält
immer bereits aufgebaute Verbindungen bereit, damit er diese an ein Servlet weitergeben kann.
DataSource ds;
Connection con = ds.getConnection();
//Arbeiten mit Connection
con.close(); //Connection wandert zurück in den Pool
Ein DataSource Objekt registriert sich im JNDI Naming Service. Sobald es dort registriert ist, kann es
über diesen Naming Service abgerufen werden.
Registrierung in JNDI über “META-INF/context.xml”
<Context crossContext="true">
<Resource name="jdbc/shakespeare" auth="Container"
type="javax.sql.DataSource"
maxActive="11" maxIdle="11" maxWait="10000"
username="BENUTZER"
password="PASSWORT"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://172.16.59.135/ShakespeareDB"/>
</Context>
Abrufen der Datasource
@Resource(name = "jdbc/shakespeare")
DataSource ds;
Annotations und Dependency Injection bei Servlets
Siehe dazu: VSDB Frage 22 - Softwaretechnik
59/143
Kontext
Jede Webapplikation in einem Container (Tomcat) besitzt einen eigenen Kontext. Alle Servlets dieser
Webapplikation können auf diesen Kontext zugreifen. Ein Servlet-context kann also dazu verwendet
werden, Daten unter Servlets in der selben Web-App auszutauschen. Eine Web Applikation wäre in
Eclipse ein gesamtes Web-Projekt mit alles Servlets und Daten.
Daten können mit Methoden in den Kontext geschrieben, aus dem Kontext gelesen und gelöscht
werden.
setAttribute(String name, Object o);
getAttribute(String name);
removeAttribute(String name);
Mit dem Kontext kann auch der absolute Pfad zur Web Applikation bezogen werden:
getServletContext().getRealPath("/");
Ebenfalls im Kontext befinden sich Metadaten zur Web Applikation.
Datenaustausch zwischen Servlets
Obwohl der Datenaustausch über den Context möglich ist, sollte diese Herangehensweise möglichst
vermieden werden, da der Context Webapplikationsweit verfügbar ist. Der Datenaustausch sollte
über ein Session Objekt realisiert werden. Dadurch ist für jeden verbundenen Client ein eigenes
Datenobjekt verfügbar. Die Servlet-API bietet mit der Klasse HttpSession einen Mechanismus zur
Sitzungsverwaltung.
Attribute können in das Session Objekt gespeichert und ausgelesen werden. Die Methoden heißen
gleich wie diejenigen, die auch zur Attributverwaltung im Servlet Context verwendet werden.
request.getSession().setAttribute(“Name”, “Wert”);
request.getSession().getAttribute(“Name”);
request.getSession().revmoveAttribute(“Name”);
Die Servlet-API verwendet für Session Tracking Cookies oder URL Rewriting, natürlich könnte ein
Datenaustausch auch vom Entwickler explizit über Cookies realisiert werden.
Es können auch die in Request und Response gespeicherten Daten über den RequestDispatcher an
ein anderes Servlet weitergegeben werden.
Unterschied Servlet Entwicklung- Java Entwicklung
In einem normalen Java Programm entscheidet allein der Programmierer welche Methode
aufgerufen wird. In einem Servlet entscheidet der Servlet Container (Tomcat) aufgrund der Anfrage
des Clients welche Methode aufgerufen wird.
Ein normales Java Programm läuft innerhalb der Java virtual machine (JVM), ein Servlet benötigt
einen Container in dem es ausgeführt wird.
60/143
Aufbau einer URL für den Aufruf eines Servlets
Beispiel
http://server/WebApp/Servlet?param1=wert1&param2=wert2
Die “WebApp” wäre zum Beispiel konkret ein exportiertes Projekt in Eclipse.
Eine Webapplikation kann aber auch in PHP oder ASP erstellt werden.
61/143
11. Servlets: Kommunikation und Session Tracking
Session Tracking, Möglichkeiten, Servlet API und Session Tracking, Überblick Session
Variablen (implizite Objekte), Request Dispatcher, Methoden, Redirect, Synchronisieren oder
nicht?, Cookies: Definition, Eigenschaften, Lebensdauer, Erzeugen, Löschen, Sicherheit
Multithreading / Kontext
Zugriffe auf den Server von mehreren Clients gleichzeitig:
● Ein Thread pro Client
● Synchronisierung beim Zugriff auf gemeinsam verwendete Objekte, z.B. static- Variablen
● Synchronisation laut J2EE Blueprint nicht nötig
● Bei AJAX Verwendung lieber auf nummer sicher: Synchronisieren auf das Session Objekt
Servlet Variablen sind nicht im Client Kontext:
● Nur ein Servlet Objekt für alle Clients in der Servlet-Engine
● Aber: jeder Client hat sein 'eigenes' Request, Response, Session Objekt
● Daher: Instanzvariablen im Servlet vermeiden => Objekte zu Session oder Request Speichern
Wenn vom Nutzer mehrere Formulare mit Daten nacheinander an den Server geschickt werden,
kann nicht festgestellt werden, welche Datenpakete vom gleichen Nutzer stammen. Es können ja
viele Nutzer quasi gleichzeitig Daten schicken, so dass die verschiedenen Datenpakete der Nutzer
ohne feste Reihenfolge eintreffen. Jedes Abschicken eines Formulars ist eine neue Verbindung, ohne
dass die Identität des Absenders erkennbar ist.
Es gibt viele Lösungen des Problems. Einige Lösungen haben aber eklatante Nachteile.
Zum Beispiel kann man die IP-Nummer des Absenders abfragen. Aber es können mehrere Absender
hinter einer IP-Nummer verborgen sein, z.B. hinter einer Firewall. Man kann auch Cookies benutzen.
Dann werden kleine Datenpakete beim Nutzer gespeichert, und in diesen Cookies kann man Daten
speichern, die den Nutzer eindeutig identifizieren (z.B. Namen oder Kundennummer). Cookies haben
den Vorteil, dass sie über längere Zeit gespeichert werden und eine Identifizierung über mehrere
Sitzungen ermöglichen. Eine sichere Lösung liegt darin, dass man eine Information, die den Nutzer
identifiziert, mit jedem vom Servlet erzeugten Formular in einem verborgenen Feld zurückschickt.
Session Tracking
Problem: Zustandslosigkeit von HTTP (state-less)
● es gibt keine "Sessions", d.h., jeder Request wird individuell und unabhängig von den
anderen betrachtet
● Client Kontext in Anwendungen notwendig
Verschiedene Varianten um Zustandsinformation einem Request (Client) zuzuordnen:
● Versteckte Felder in Formularen
● Zustandsinformation in Link kodieren
● HTTP Cookies
62/143
●
Java Servlet Session Tracking API
Session Tracking API
●
●
●
●
●
●
●
●
●
Ab Java Servlets 2.0
Unterstützung hängt vom verwendeten Server ab, z.B.
○ werden Cookies verwendet, oder
○ URL-Kodierung (falls Cookies nicht verfügbar sind)
○ URL-Kodierung mittels response.encodeURL(url)
Jeder Benutzer eines Servers hat genau ein Session Objekt:
HttpSession session = request.getSession();
if (session.isNew())
○ false: ein neues Session-Objekt mit Session ID wird erzeugt und im Servlet Container
gespeichert, Session ID wird im Response mitgeschickt
○ true: falls mit dem Request eine gültige Session ID mitgeschickt wurde
Session IDs als Cookies
Alternativ kann die Session ID in URLs als Parameter kodiert werden
Im Session-Objekt können sessionspezifische Daten gespeichert werden, z.B. Benutzername,
temporäre Daten, etc.
Eine Session hat eine begrenzte Gültigkeitsdauer
Explizite Invalidierung, z.B. beim Logout, mit session.invalidate()
Automatisch nach einer bestimmten Zeit, Default ist 30 min.:
session.setMaxInactiveInterval(int seconds)
Arten von Servlet-Variablen
ServletContext-Element
Stellt Informationen über die Webapplikation zur Verfügung und mit Hilfe dieses Objektes können
alle Servlets der Webapplikation gemeinsame Daten speichern.
Request Dispacher
Das Interface RequestDispatcher stellt zwei Methoden zum Weiterleiten auf bzw. zum Includieren
von Ressourcen zur Verfügung:
● forward
Leitet den Request auf eine andere Ressource weiter, das den Response generiert.
63/143
●
include
Arbeitet wie forward(), aber der Request wird nur temporär auf die neue Ressource
übertragen und das aufrufende Servlet commited den Response
Redirect
Mit der Methode sendRedirect(String) kann man auf eine neue Seite verweisen.
response.sendRedirect("http://www.google.de/");
Cookies
Cookies speichern Informationen auf der Client Seite. Diese Information wird mit jeder Anfrage an
den Server übertragen. Über einen Cookiewert („Session ID“) kann der Server erkennen, wer die
Anfrage gestellt hat.
Setzen von Cookies
Cookie cookie = new Cookie( "key", "value" );
response.addCookie( cookie );
Auslesen von Cookie
Cookie cookies[] = request.getCookies();
if (theCookie.getName().equals(summe))
{ String cookiewert = theCookie.getValue(); }
Langlebige Cookies
Für Cookies, die länger als eine Sitzung halten sollen, lässt sich mit setMaxAge() eine Zeit setzen, zu
der sie gültig sein sollen.
12. Verteilte Anwendungen: Eigenschaften und
Architekturmodelle
Abgrenzung der Begriffe: Verteiltes System, Verteilte Anwendungen, Middleware, Vorteile und
Eigenschaften von Verteilung, Beispiele Verteilter Systeme, Arten von Middleware, Transparenzarten,
Synchrone und asynchrone Kommunikation, Architekturmodelle: Client­Server Modell, n­Tier Modell,
64/143
P2P Modell, Erläutern Sie den Aufbau und Einsatz der 3­Tier Architektur näher, (Ultra) Thin­ und
Fat­Client Architektur, Was ist Unterschied zwischen zustandsbehafteter und –loser Kommunikation?
Verteiltes System
Definition
Ein verteiltes System ist ein System, in dem Hardware- und Softwarekomponenten, die sich auf
miteinander vernetzten Computern befinden, miteinander kommunizieren und ihre Aktionen
koordinieren, indem sie Nachrichten austauschen.
Anforderungen
●
●
●
●
Knoten (Computer) sind durch ein Netzwerk verbunden
Jeder Knoten kann unabhängig von den anderen Knoten arbeiten
○ Darum hat jeder Knoten eine eigene CPU und eigenen Speicher
○ Die Knoten dürfen keinen gemeinsamen Speicher haben
Kein “single point of failure”
○ Keine zentrale Einheit, die für die Arbeit der Knoten notwendig ist
Verteilungstransparenz
Ziele
●
●
●
●
Benutzer und Ressourcen verbinden
Transparenz
Offenheit
Skalierbarkeit
Vorteile
●
Offenheit
Die Offenheit bestimmt, wie gut sich ein System auf verschiedenen Wegen erweitern lässt,
ohne bereits existierende Dienste zu unterbrechen. Das wird durch die Veröffentlichung der
Schnittstellen erreicht. Beispiel: UNIX als offenes Betriebsystem
●
Nebenläufigkeit (Concurrency)
Nebenläufigkeit bedeutet, dass innerhalb eines Systems mehrere Prozesse gleichzeitig
existieren können. Wenn es nur einen Prozessor gibt, wird dies mit Verzahnung
(Interleaving) erreicht. Wenn es mehrere Prozessoren gibt, können die Prozesse parallel
ausgeführt werden. Ein wichtiges Thema dabei ist die Synchronisation zwischen den
Prozessen.
●
Skalierbarkeit
Skalierbarkeit bedeutet, das Algorithmen, Protokolle und Prozeduren mit wenigen sowie mit
vielen Systemkomponenten funktionieren. Zwar ist es in wegen der höheren Komplexität in
verteilten Systemen teilweise schwerer, Skalierbarkeit zu garantieren, allerdings können
Ressourcen auch leichter hinzugefügt werden.
65/143
●
Sicherheit
Die Sicherheit in verteilten Systemen hat mehrere Aspekte und gehört zu den wichtigsten
Themen bei der Entwicklung von verteilten Systemen.
○ Vertraulichkeit: Daten können nur vom gewünschten Empfänger gelesen werden
○ Integrität: Die Daten wurden während der Übertragung nicht verändert
○ Authentizität: Die Daten wurden tatsächlich von der Person gesendet, die
behauptet, der Sender zu sein
●
Fehlertoleranz
Fehlertoleranz bedeutet, dass beim Auftreten eines Fehlers bereits eine Lösung existiert um
das Problem zu beheben.
Beispiele:
○ Hardware Redundanz - doppelte Komponenten, Standby Maschinen
○ Sofware Recovery - Nach einem Fehler wieder in einen sicheren Zustand
zurückkehren
●
Transparenz
Unter Transparenz versteht man, dass die Benutzer eines verteilten Systems sich nicht zu
sehr der Tatsache bewusst sind, dass es sich um ein verteilten Systemhandelt. Das System
wird als einheitliches System wahrgenommen.
Nachteile
●
●
Das Gesamtsystem ist normalerweise komplexer
Der Aufwand für die Erstellung ist größer als für ein zentrales System
Beispiele für Verteilte Systeme
●
Gemeinsames Dateisystem
Benutzer, die an physisch verteilten Rechnern arbeiten können auf gemeinsame
Verzeichnisse in einem gemeinsamen Dateisystem zugreifen.
●
Verteilte Datenbanken
Daten werden transparent für den Benutzer in unterschiedlichen Datenbanken abgelegt. Der
Zugriff darauf erfolgt ebenfalls transparent. Beispiel LDAP und ADS
●
World Wide Web
Ermöglicht Zugriff auf verteilte Dokumente. Jedes Dokument erhält einen logischen Namen
über den es angesprochen werden kann.
Verteilte Anwendung
Definition
Eine verteilte Anwendung ist eine Anwendung, die ein verteiltes System zur Lösung eines
Anwendungsproblems nutzt. Sie besteht aus verschiedenen Komponenten, die mit den
Komponenten des verteilten Systems sowie den Anwendern kommuniziert.
Eine Verteilte Anwendung wird also dezentral auf mehreren Rechnern ausgeführt und nutzt das
verteilte System um die Aufgabe auf verschiedene Knoten aufzuteilen und Informationen
66/143
auszutauschen. Zwischen den Komponenten müssen definierte Schnittstellen bestehen, um die
Kommunikation zu ermöglichen.
Middleware
Definition
Middleware bezeichnet Programme, die die Vermittlung zwischen Anwendungen übernehmen, um
die Komplexität dieser Anwendungen und der Infrastruktur zu verbergen.
Vorteile
●
●
●
●
Entkopplung von Anwendungen von der Systemplattform
Vorhandene Systeme könnne über eine Middleware leichter an neue Systeme
angeschlossen werden
Plattformübergreifend
Standardisierte Schnittstellen und Protokolle
Arten von Middleware
●
●
●
Anwendungsorientierte Middleware
Im Mittelpunkt steht neben der Kommunikation vor allem die Unterstützung verteilter
Anwendungen. Beispiele: JEE, .NET.
Kommunikationsorientierte Middleware
Hierbei liegt der Schwerpunkt in der Abstraktion von der Netzwerkprogrammierung.
Beispiele sind RPC, RMI, Web Services.
Nachrichtenorientierte Middleware
Nachrichtenorientierte Middleware arbeitet nicht mit Methoden- oder Funktionsaufrufen,
sondern über den Austausch von Nachrichten.
Message Oriented Middleware (MOM) ist teil der Kommunikationsorientierten Middleware
Beispiele für Middleware
●
●
●
Printmanager
Datenbankmanagementsystem
Remote Procedure Call (RPC), Remote Methode Invocation (RMI)
67/143
Transparenzarten
Ein transparentes System präsentiert sich dem Benutzer, den Anwendungen, also würde es sich um
ein einziges, gesamtes System handeln, obwohl die Ressourcen und Anwendungen über mehrere
Computer verteilt sind.
Zugriffstransparenz
Verbirgt die Unterschiede zwischen lokalen und entfernten Ressourcen und Unterschiede in der
Darstellung der Daten.
Ortstransparenz
Verbirgt den Ort einer Ressource, d.h. Benutzer und Programme wissen nicht wo sich eine
Ressource genau befindent (z.B. durch logische Namen, URLs).
Migrations- und Relokationstransparenz
Verbirgt das Verschieben von Ressourcen an eine andere Position, d.h. eine Ressource kann
verschoben werden, ohne dass Benutzer oder Programme beeinflusst werden. Und das Migrieren
kann auch das Ändern auf eine neuere Version bedeuten. (von älterem auf neueres System
umstellen)
Persistenztransparenz
Verbirgt, ob sich eine (Software-) Ressource im Speicher oder auf der Festplatte befindet.
Replikationstransparenz
Verbirgt, dass eine Ressource mehrmals im System vorhanden ist, d.h. es ist für Benutzern und
Programme nicht ersichtlich, dass die Ressource repliziert ist, um Verfügbarkeit und Performanz zu
erhöhen.
Fehler- und Ausfalltransparenz
Verbirgt den Ausfall und die Wiederherstellung einer Komponente, d.h. Benutzer und Programme
können ihre Aufgaben trotz eines Fehlers beenden.
Nebenläufigkeitstransparenz
Verbirgt, dass eine Ressource von mehreren Benutzern oder Programmen gleichzeitig genutzt wird,
d.h. alle Benutzer bzw. Programme haben dann den Eindruck, sie seien alleine im System.
Skalierungstransparenz
Verbirgt Änderungen (Erweiterung, Austausch von Komponenten) des verteilten Systems, d.h. das
System soll einfach erweitert/verändert werden können, ohne dass Benutzer oder Programme es
bemerken.
Prozesstransparenz
Verbirgt auf welchem Knoten des verteilten Systems ein Prozess ausgeführt wird. Im Idealfall sorgt
das System selbst für die Verteilung der Prozesse.
Fragmentierungstransparenz
Verbirgt, dass eine Ressource in verschiedene Teile an verschiedenen Orten gespeichert ist.
68/143
Architekturmodelle
Client­Server Modell
Das Client-Server Modell bezeichnet die Beziehung zwischen zwei Programmen. Der Client Stellt die
Anfragen und der Server beantwortet sie.
P2P Modell
Im Peer-to-Peer Modell sind alle Computer gleichberechtigt, so gibt also keine vordefinierten Clientund Server-Rollen. Jeder Computer kann Dienste anbietet und gleichzeitig welche zur Verfügung
stellen. In diesem Modell wird z.B. die Rechenlast auf mehrere Computer verteilt und bei einem
Ausfall eines Knotens kann das Netzwerk noch weiterarbeiten. Achtung: es gibt aber sehr wohl
lokale Server, der Informationen über die Nachbaren beinhaltet.
n­-Tier Modell
In einem n-Tier Modell (auch Multi Tier Modell) ist ein Programm, dass über mindestens 3 Schichten
aufgeteilt. Dieses Modell wird häufig für die Strukturierung von Anwendungen verwendet. Dabei
werden einzelne Aspekte des Softwaresystems einer Schicht (tier) zugeordnet. Jede Schicht kann nur
mit der jeweils angrenzenden Schicht kommunizieren, das heißt es dürfen keine Schichten
übersprungen werden. Anwendungen die eine Middleware verwenden fallen auch in diesen
Bereich.
Beispiele für verschiedene Schichten sind Präsentation, Steuerung, Verarbeitung, Datenzugriff,
Datenhaltung. Die am häufigsten verwendete Form ist jedoch die 3-Tier Architektur (mit 3
Schichten).
69/143
Vorteile
● Reduktion der Komplexität und der Abhängigkeiten (durch mehrere Schichten)
● Bei Änderungen/Erweiterungen muss nicht die gesamte Anwendung ausgetauscht werden
● Eine einzelne Schicht kann ausgetauscht werden
● Höhere Wiederverwendbarkeit (der einzelnen Schichten)
● Geringere Abhängigkeiten zwischen den Teilen der Anwendung (Schichten)
Nachteile
Applikation könnte langsamer werden (Weiterleitungen/Verarbeitungen über mehrere Schichten)
3­-Tier Architektur
Die 3- Tier- Architektur ist eine spezielle Art des n- Tier- Modells. Mehrschichtige
Systemarchitekturen wie die dreischichtige Architektur sind gut skalierbar, da die einzelnen
Schichten logisch voneinander getrennt sind. So kann z. B. bei verteilten Systemarchitekturen die
Datenschicht auf einem zentralen Datenbank-Server laufen, die Logikschicht auf Workgroup-Servern,
und die Präsentationsschicht befindet sich auf der jeweiligen Workstation des Benutzers. Häufig wird
die Anwendung in die Präsentationsschicht, die Verarbeitungsschicht und die Datenschicht
unterteilt.
3-Tier Architektur in der Software Entwicklung
Die Architektur lässt sich auch innerhalb eines Software-Systems umsetzen, indem die SoftwareModule, welche für Präsentation, Anwendungslogik und Speicherung von Daten zuständig sind, den
einzelnen Schichten zugeordnet werden und voneinander entkoppelt werden. Neben einer
Strukturierung gemäß dem Model- View- Controller-Architekturmuster stellt eine solche DreiSchichten-Architektur in der modernen Software-Entwicklung das Mindestmaß an architektonischer
Strukturierung dar, insofern keine nachhaltigen Gründe für andere Architekturentscheidungen
vorliegen.
70/143
ThinClient
Als Thin Client wird ein Client im 3-Tier Modell genannt, wenn er nur die Präsentationsschicht
übernimmt. Die gesamte Verarbeitung und Speicherung der Daten wird dabei am Server ausgeführt.
Ein Vorteil von Thin Clients ist der einfache Betrieb, denn am Client läuft nur die Software, die für
den Zugriff auf den Server notwendig ist. Nachteile sind eine hohe Last am Server und für das
Netzwerk. Diese Art des Clients wird hauptsächlich bei Anwendungen eingesetzt, bei denen
Anwendungs- und Datenschicht stark verflechtet sind oder wenn auf den Clients nicht genügend
Rechenleistung zur Verfügung steht.
Ein Beispiel wäre ein Webbrowser, denn er muss die Daten nur anzeigen, die gesamte Aufbereitung
und die Datenhaltung laufen am Server ab.
Fat­Client
Im Gegensatz zum Thin Client wird am Fat Client die Präsentation und die Verarbeitung der Daten
ausgeführt. Nur das Datenmanagement wird auf den Server ausgelagert. Ein Vorteilt dieses Modells
ist, dass die Last auf die Clients verteilt wird. Ein Nachteil von Fat Clients ist die komplexe Verwaltung
solcher Systeme, da die Anwendungslogik bei Änderungen auf allen Clients angepasst werden muss.
Hier muss man öfters die Software am Client updaten(bei schwerwiegenderen Änderungen)!!
Kommunikation
Synchrone / Asynchrone Kommunikation
Synchrone Kommunikation
Bei einer synchronen Kommunikation sendet der Client eine Anfrage an den Server und wartet dann
auf die Antwort. Während dieser Zeit arbeitet der Client nicht.
Asynchrone Kommunikation
Bei einer asynchronen Kommunikation sendet der Client eine Anfrage an den Server und arbeitet
danach weiter. Wenn der Server die Antwort zurücksendet, verarbeitet sie der Client.
71/143
Zustandslose Kommunikation
Bei einem zustandslosen Protokoll (stateless protocol) wird jede Anfrage des Clients als einzelne
Anfrage bearbeitet. Also auch wenn der selbe Client mehrere Anfragen sendet, werden alle
unabhängig voneinander beantwortet. Das bedeutet auch, dass keine Sitzungsinformationen (z.B.
bei Logins) gespeichert werden.
Beispiele
● HTTP
Sitzungsinformationen werden erst in den Anwendung verwaltet (z.B. Cookies)
● IP
Vorteile/Nachteile
Vorteile der zustandslosen Kommunikation sind das einfachere Server Design und der geringere
Speicherverbrauch (keine Sitzungsinformationen am Server). Ein Nachteil ist, dass eventuell
zusätzliche Informationen in jeder Anfrage übertragen werden müssen.
Zustandsbehaftete Kommunikation
Im Gegensatz zur zustandslosen Kommunikation wird bei zustandsbehafteten Protokollen (stateful
protocol) Information über den Client auf dem Server gespeichert (z.B. Anmeldeinformationen,
Arbeitsverzeichnis, …).
Beispiele
● FTP
Am Anfang einer Verbindung wird eine Authentifizierung durchgeführt. Die LoginInformationen und weitere Variablen (Arbeitsverzeichnis, Übertragungsmodus, ...) werden
am Server gespeichert.
● TCP
Vorteile/Nachteile
Ein Vorteil ist, dass z.B. Authentifizierung bereits im Protokoll vorgesehen ist und nicht bei jeder
Übertragung zusätzliche Information gesendet werden muss.
Nachteile sind, das im Gegensatz zur zustandslosen Kommunikation das Server Design etwas
komplexer ist und der Server wegen der Speicherung der Benutzerdaten eventuell mehr Ressourcen
benötigt.
72/143
13. Java Server Pages JSP: Lebenszyklus und
Einbettungskonstrukte in JSP (Art und Funktion)
Besonderheiten von JSP? Vorteile/Nachteile JSP, Unterschiede zu Servlets, Lebenszyklus,
Einbettungskonstrukte, Direktiven, Scopes, implizite Objekte, Aktionen, JavaBean in einer JSP
verwenden; Was versteht man unter der JSP Standard Tag Library (JSTL)? Wofür kann diese
verwendet werden?
Besonderheiten von JSP
JSP ist eine serverseitige Skritsprache, so wie ASP und PHP und wird direkt in HTML-Seiten
eingebettet. Hierbei werden die dynamischen Teile von statischen Code durch gesonderte Tags
getrennt. Die meisten dieser Tags beginnen mit <% und enden mit %>.
Dies hat den großen Vorteil, dass die Logik (also der Java-Code) unabhängig vom Design
implementiert werden kann.
Beispiel
JSP-Seiten müssen nicht vom Entwickler kompiliert werden. Sie werden bei der ersten ClientAnforderung übersetzt. Desweitereen werden JavaServer Pages unter Verwendung eines speziellen
JSP-Compiler in Java-Quellcode (Servlet) umgewandelt. Dies hat eine leichte Verzögerung beim
ersten Aufruf zu folge. Um das zu verhindern können JSP-Seiten auf Wunsch auch kompiliert
werden.
Kurz gesagt sind JSP-Seiten normale HTML-Seiten (statischer Teil), vermischt mit ein wenig Java
(dynamischer Teil). Der Java Teil kommt in <% …. %> Tags. JSP-Dateien müssen die Endung .jsp
haben. JSP wird in ein Java-Servlet übersetzt, welches dann kompiliert wird.
Vorteile
●
●
Man kann die volle Vielfalt von Java nutzen
Normales HTML ist in JSP bequemer zu schreiben
73/143
●
●
●
●
Und ist somit auf andere Systeme portable
Viele API’s vorhanden
Wenn man Java kann muss man nicht noch eine neue Sprache erlernen.
JSP ist absolut serverseitig (zugleich Nachteil: wenn dynamische Informationen von der
Client Umgebung benötigt werden)
Nachteile
●
Weißt kaum Nachteile auf
Unterschiede zu Servlets
JSPs nutzen Servlets als zugrundeliegende Technologie. Der wesentliche Unterschied gegenüber
herkömmlichen Servlets besteht darin, dass Java-Quellcode direkt in einer HTML-Seite eingebunden
werden kann, ähnlich wie bei der Skriptsprache PHP.
Da bei Servlets der gesamte HTML-Code mittels Methodenaufrufen ausgegeben werden muss, geht
bei der zu erzeugenden Webseite schnell die Übersicht verloren. Aus den JSP-Seiten werden bei der
ersten Client-Anforferung Servlets generiert.
Die Servlets werden dann im Servlet-Container ausgeführt.
Der wesentliche Unterschied zwischen Servlets und JSP-Seiten ist der, dass bei JSP Java in HTML
eingebunden wird (eben mit dem <% …. %> Tag) und bei Servlets wird HTML in Java eingebunden.
Dies funktioniert mittels dem PrintWriter Objekt wie wir es schon kennen.
Lebenszyklus von JSP-Seiten
Der Lebenszyklus von JSP-Seiten entspricht dem Zyklus von Servlets. Der Body einer JSP-Seite wird in
eine _jspservice-Methode umgesetzt die von der service-Methode des Servlets aufgerufen wird.
In einer JSP-Seite definierte jspInit bzw. jspDestory-Methoden werden von dem init bzw. destroyMethoden des Servlets aufgerufen.
Bei jeder Änderung der JSP-Seite wird der Quellcode des Servlets generiert (Generierung).
74/143
Bei jeder Änderung der JSP-Seite wird der Quellcode des Servlets in das Servlet übersetzt
(Übersetzung).
Bei jeder Anfrage wird das Servlet ausgeführt welches in HTML dargestellt wird (Ausführung).
Einbettungskonstrukte
Neben dem regulären HTML gibt es noch drei weitere wichtige JSP-Konstrukte, die Sie in
eine Seite einbetten:
● Skriptingelemente
Damit kann man Java Code spezifizieren, der Teil des resultierenden Servlets
werden soll. Man unterscheidet: Ausdrücke, Scriptlets und Deklarationen
● Direktiven
Damit kann man die Gesamtstruktur des Servlets kontrollieren.
● Aktionen
Damit kann man spezifizieren, welche bestehenden Komponenten benutzt werden
sollen, sowie das Verhalten der JSP-Engine steuern.
Direktiven
Die page Direktive gibt an:
● Welche Klassen importiert werden
● Von welcher Klasse geerbt wird
● MIME Type der geniert wird
● Multithreading
● Ob das Servlet einer Session angehört
● Welche Seite unerwartete Fehler behandelt
Das import Attribut
<% page import=”KLASSENNAME.class”%>
Es können mittels Beistrich getrennt auch mehrere Klassen aufeinmal importiert werden. Dies
bewirkt die Generierung des Import Statements am Anfang des Servlets.
Wichtig: Klassen die von JSP Seiten genutzt werden, müssen im classes Ordner sein.
z.B.: .../WEB-INF/classes
75/143
Beispiel
Content-Type und Page-Encoding
Legt den MIME type der generierten Seite fest.
<%@ page contentType=”MIME-TYPE” %>
<%@ page pageEncoding=”Character-Set” %>
ContentType auf Exelformat festlegen:
<%@ page contentType=”application/vnd.ms-excel” %>
Der ContentType kann leider nicht bedingungsabhängig gesetzt werden.
Session Attribute
<%@ page session=”true” %>
<%@ page session=”false” %>
Standardmäßig auf true.
Macht die Seite teil einer Session. Alle abhängigen Seiten müssen es verwenden damit es sinnvoll ist.
errorPage Attribut
<%@ page errorPage=”Relative URL”%>
Gibt eine JSP Seite an, die Ausnahmen behandeln sollte, die geworfen aber auf der aktuellen Seite
nicht behandelt werden.
Die Ausnahme wird automatisch auf der Fehlerseite durch die "exception„ Variable zugreifbar. In der
web.xml Datei kann man applikationsspezifische Fehlerseiten definieren, wenn bestimmte Fehler
oder HTTP Status Codes auftreten. Das errorPage Attribut ist für seitenspezifische Fehler.
76/143
isErrorPage Attribut
<%@ page isErrorPage=”true”%>
<%@ page isErrorPage=”false”%>
Zeigt an ob die Seite eine Fehlerseite für andere JSP-Seiten ist. Also eine Seite die nur Fehler der
anderen Seiten anzeigt. Ist standardmäßig auf false.
Es wird eine vordefinierte Variable exception, die von Fehlerseiten zugreifbar ist erzeugt. Dies soll
jedoch nur eine Notfalllösung sein. Querydaten sollen immer auf Fehler überprüft werden.
Beispiel
Hier wird die errorPage angegeben.
Die ErrorPage für die andere Seite:
extends Attribut
<%@ page extends=”package.class”%>
77/143
Gibt die Oberklasse der Servletklassse an. Dies soll jedoch sehr eingeschränkt verwendet werden,
denn es kann das System davon abhalten High-Performance Oberklassen zu verwenden.
isThreadSafe Attribut
<%@ page isThreadSafe=”true” %>
<%@ page isThreadSafe=”false” %>
Dem System wird mitgeteilt dass SingleThreadModel zu implementieren. Dies soll jedoch vermieden
werden. Es kann abnorme Ergebnisse erzeugen.
Implizite Objekte
Implizite Objekte sind automatisch vom Server erzeugte Objekte, auf die die JSP-Autoren zugreifen
können. Sie ermöglichen Zugang zu den wichtigen Ressourcen des Servers.
Betrachten wir hier die wichtigsten:
request
Es kapselt alle Informationen über die Anfrage an die aktuelle JSP-Seite. Es ermöglicht den Zugang zu
den HTTP-Headern, zu Cookies und zu den Anfrageparametern.
response
Repräsentiert die Antwort auf die Anfrage. Es dient zum Setzen der HTTP-Header für die Antwort. Es
können auch Cookies an die Antwort angehängt werden.
session
Es wird für sitzungsorientierte Anwendungen benötigt.
pageContext
Es ermöglicht den Zugriff auf die Objekte in den verschiedenen Gültigkeitsbereichen einer JSP-Seite.
application
Es ermöglicht das Schreiben von Meldungen in die Log-Datei des JSP-Servers. Es können
78/143
Informationen über den JSP-Server und die verwendete Servlet-Version abgefragt werden.
config
Es erlaubt den lesenden Zugriff auf Konfigurationsparameter des Servers.
out
Es ist ein Ausgabeobjekt und unterstützt keine Pufferung. Für alle primitiven Datentypen stehen
überladene Versionen der Methoden print und println zur Verfügung.
exception
Das exception-Objekt steht nur in JSP-Fehlerhseiten zur Verfügung.
Aktionen:
Die Aktion forward:
<jsp:forward page =”Relative URL” />
Ermöglicht die Weiterleitung einer Anfrage an eine andere Seite oder an ein Servlet. Diese Aktion
beendet die Ausführung der aktuellen Seite, sie wird auch nicht wieder aufgenommen.
JavaBean in JSP verwenden
Mittels jsp:useBean werden Java Beans in JSP eingebunden. Es wird nur eine ID (also quasi ein
Name) und die Klasse angegeben:
<jsp:useBean id =”beanName” class=”bean.Class”/>
Mit jsp:setProperty bzw jsp:getProperty können Eigenschaften gesetzt bzw gelesen und ausgegeben
werden.
<jsp:setProperty name="beanName" property="propertyName" value="Value" />
jsp:useBean hat 2 Vorteile
● Es ist einfacher Objektwerte von Request Parametern abzuleiten.
● Es ist einfacher Objekte zwischen Servlets und Seiten auszutauschen.
Scopes=Gültigkeitsbereich
Das Scope Attribut kann verwendet werden, um die Lebensdauer des Beans zu spezifizieren.
Dies funktioniert wie folgt: <jsp:useBean id=”...” class=”...” scope=”...”/>
Dafür gibt es verschiedene so genannte Scope Attribute die angegeben werden können:
● page
<jsp:useBean … scope=”page”/>
Ist der eingestellte Defaultwert für die Scopes von Beans. Das Bean Objekt wird im
PageContext Object für die Dauer des aktuellen Requests gespeichert.
●
application
Das Bean wird im ServletContext gespeichert (Zugriff über eine Applikationsvariable oder
getServletContext()). Auf den ServletContext ist von allen Servlets in derselben Web
Applikation zugreifbar.
79/143
●
session
Das Bean wird im HttpSession Objekt abgelegt. Der Zugriff erfolgt mit getAttribute und
setAttribute.
●
request
Das Bean Objekt wird in einem ServletRequest Objekt für die Dauer des aktuellen Requests
abgelegt.
Zugriff: getAttribute()
Was versteht man unter der JSP Standard Tag Libary (JSTL):
Die JSP Standard Tag Libary ist eine Sammlung von vier Custom-Tag-Bibliotheken, die für die
Erstellung von JSP-Seiten hilfreich sind. Die JSTL wird im Rahmen des Java Community Process (JCP)
unter JSR 052 verwaltet. Innerhalb des Jakarta-Projektes gibt es zu dieser Spezifikation
Referenzimplementierungen.
In der Version 1.1 sind folgende Bibliotheken vorgesehen:
● core: iteraktive, konditionale, URL-spezifische und allgemeine Tags
● xml: Tags aus dem Bereich XML und XML-Transformation
● sql: Tags zur direkten Datenbankverarbeitung
● i18n: Tags zur Formatierung und Internationalisierung
80/143
14. XML-RPC
Was ist Middleware? Welche Arten gibt es? Was ist XML­RPC, Vor­ und Nachteile, Wie
funktioniert es und welche Schwierigkeiten können sich bei der Parameterübergabe ergeben?
Gibt ein einfaches Codebeispiel an, Was ist ein Handler/Stub? Was ist ein dynamischer Proxy
und wie wird er realisert? Welche plattformunabhängige Alternative bietet sich als Ersatz für
XML­RPC an?
Was ist Middleware? Welche Arten gibt es?
Middleware ist die Kommunikationssoftware, die den Austausch zwischen den verschiedenen
Komponenten eines verteilten, heterogenen Systems unterstützt. Es wird von der verteilten
Anwendung als Zugriffsschnittstelle zum verteilten System genutzt.
Das Ziel ist das Verbergen der Verteilungaspekte vor der Anwendung. Middleware setzt auf dem
Transportprotokoll (z.B. TCP) und der Zugriffsschnittstelle (z.B. Sockets) des verteilten Systems auf.
Wir unterscheiden 2 Arten:
Kommunikationsorientierte Middleware
Diese Middleware setzt direkt auf dem Protokoll des verteilten Systems auf und dient als
Kommunikationsinfrastruktur.
Aufgaben
● Bereitstellung einer Schnittstelle zur Kommunikationsinfrastruktur
● Datentransformation
● Fehlerbehandlung
Beispiele
Sun RPC, Java RMI, MQSeries(Websphere MQ von IBM)
Anwendungsorientierte Middleware
Diese setzt auf der kommunikationsorientierten Middleware auf und erweitert diese um eine
Laufzeitumgebung.
● Erweitert die Funktionalität des Betriebssystems z.B. verbesserte Ressourcenverwaltung,
Verbindungverwaltung, Verfügbarkeit, Sicherheitmechanismen
81/143
●
●
Dienste: Namensdienst, Sitzungsverwaltung, Transaktionsverwaltung, Persistenz
Komponentenmodell: Komponete-basierte Entwicklung
Beispiele
CORBA, J2EE, .Net
XML-­RPC
RPC: Remote Procedure Call
Kernkonzepte entfernter Aufrufe
●
●
●
●
●
Entkopplung von Client und Server durch Schnittstellendefinition
Einführung von Stub und Skeleton als Zugriffschnittellen auf Client und Serverseite.
Stub und Skeleton werden aus der Schnittstellenspezifikation generiert.
Sind verantwortlich für Marshalling und Unmarshalling
Stub und Skeleton ermöglichen die Zusicherung von Zugriffs und Ortstransparenz
Ermöglicht einem Clinetprozess den entferten Aufruf einer Prozedur auf einem Serverprozess. Dabei
erfolgt die Kommunikation nach dem Anfrage/Antwort Prinzip.
Vorteile
●
●
●
●
●
●
einfaches, sprachunabhäniges Protokoll
XML kodierte Informationen
Übertragung erfolgt über HTTP(HTTP-Post)
Unterstützt eine Vielzahl von Programmiersprachen (z.B. Java Python, Perl, Tcl, ASP, COM)
Einfacher Punkt-zu-Punkt Nachrichtenaustausch zwischen Java Programmen auf
unterschiedlichen Netzwerkkonten
Einfacher Nachrichtenaustausch in heterogenen Umgebungen
○ RMI nur für verteilte homogene Java-Umgebungen
82/143
●
○ CORBA für heterogene verteilte Umgebungen ist komplex und teuer
geringer Traffic da nur Parameter(xml-codiert über http) ausgetauscht werden, und keine
Objekte.
Nachteile
●
●
●
●
Nur wenige Datentypen als Parameter möglich (skalare Typen, Array und Struktur)
Für komplexe Systeme nicht sehr geeignet (Fehlersuche bei Punkt-zu-Punkt Verbindungen)
Referenzparameter sind kompliziert zu implementieren, und selten verfügbar (In Java
sowieso kein “Call by Reference)
Client muss wissen, wer den Dienst anbietet und wie die Schnittstelle zum Funktionsaufruf
aussieht.
Die Daten werden bei XML-RPC im XML-Format übertragen.
Schwierigkeiten bei Parameterübergabe?
Es können nur Standardparameter Strukturen und Arrays genommen werden da selbst deffinierte
Klassen nicht am Anderen System bekannt sind.
Gibt ein einfaches Codebeispiel an, Was ist ein Handler/Stub?
Handler
Ein so genannter Handler ist eine entfernt aufrufbare Methode. Die Methode muss public sein,
@a nicht static sein und darf nicht den Rückgabetyp void haben.
Die Klassen org.apache.xmlrpcserver.PropertyHandlerMapping kann mehrere Handler verwalten.
void addHandler(String key. Class typ) throws XmlRpcException
Fügt die Handler-Klasse typ mit dem Namen key hinzu. Hierzu wird das Class-Objekt der HandlerKlasse angegeben.
void removeHandler(String key)
Entfernt alle Handler mit dem Namen key.
Mit dem Aufruf der XMlRpcServer-Methode setHandlerMapping werden die Handler für das
XmlRpcServer-Objekt registriert.
83/143
Stub
Beim Marshalling/Unmarshalling, darunter versteht man die Transformation von Daten in ein
Übertragungsformat, wird mit Stub und Skeleton gearbeitet.
Unter dem Unmarshalling versteht man die Rücktransformation eines Zeichen oder Bytestroms in
Daten einer konkreten Programmiersprache.
Beispiel: EchoServer
Interface das sowohl Client als auch Server kennen müssen
public interface EchoService {
public String getEcho(String msg);
}
Implementierung am Server
public class Echo implements EchoService{
public String getEcho(String s){
return s;
}
}
Server
public class Server {
public static void main(String[] args) throws Exception {
int port = 2345;
PropertyHandlerMapping phm = new PropertyHandlerMapping();
phm.addHandler("echo",Echo.class);
WebServer webServer = new WebServer(port);
XmlRpcServer server = webServer.getXmlRpcServer();
server.setHandlerMapping(phm);
webServer.start();
}
}
84/143
Client
public class Client {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
URL url = new URL("http://localhost:2345");
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(url);
XmlRpcClient d = new XmlRpcClient();
d.setConfig(config);
Object[] params ={"Hallo123"};
String s = (String) d.execute("echo.getEcho",params);
System.out.println(s);
}
}
Was ist ein dynamischer Proxy und wie wird er realisert?
Mit Hilfe so genannter dynamischer Proxies kann die Programmierung des Clients vereinfacht
werden. Ein Dynamischer Proxy ist eine Klasse, die erst zur Laufzeit dynamisch generiert wird.
Ziel ist es, die entfernte, vom Server implementierte Methode wie eine “normale” lokale Methode
auf der Clientseite aufzurufen.
Dazu muss zunächst die Handler-Klasse ein Interface implementieren. Dasselbe Interface wird auch
vom Client verwendet.
Welche plattformunabhängige Alternative bietet sich als Ersatz für
XML­RPC an?
SOAP und REST
85/143
15. J2EE
Erkläre die Grundstruktur von J2EE. Was ist ein API – welche werden von J2EE verwendet. Was
versteht man unter einem Lastenausgleich und wie wird dieser in einer J2EE­Umgebung realisiert?
Was versteht man unter einem Applikationsserver und welche Funktionalität bietet dieser an. Was ist
ein Verzeichnisdienst und wie kann man diesen nützen. Was versteht man unter einem
Web­Container und welche Sorte von Software braucht einen solchen? Welche Implementierungen
von WebContainern gibt es; gehe genauer auf Tomcat ein. Wie ist der WebContainer aufgebaut,
gehe
auf die einzelnen Bestandteile näher ein. Was versteht man unter einem Deployment (was passiert
Client­ und serverseitig); was ist ein Deployment Descriptor? Was versteht man unter dem Begriff
“Referenzimplementierung”?
API=Applikation programming interface = Programmierschnittstelle; Bereitstellung von bestimmten
Funktionen (Bsp.: Java API)
API’s von J2EE:
● Enterprise Java Beans EJB
● Java Server Pages JSP
● Java Servlet API
● Java Naming and Directory Interface -JNDI
● Java Persistance API - Persisitieren von Objekten (mit Winkler geübt)
● Java Server Faces JSF
● Context and Dipendency Injection CDI
Lastenausgleich: Evt. Applikationgateway und Aufteilen auf mehrere Server / Servlets die eine
entsprechende Teilaufgabe übernehmen→ Franz fragen! Lastenausgleich bei J2EE: Weiterleitung
(Redirect)
Applikationsserver: Komponente die eine bestimmte Funktion übernimmt; Beispiel:
Authentifizierungsserver, Datenbankserver; JBoss als Beispiel;
Login/Logout/Benutzerauthorisierung/Mail oder Replizieren wären Beispiele für Applikationsserver
→ JBoss JBoss kann eventuell auch Lastenausgleich übernehmen.
Verzeichnisdienste: Dienen der Verwaltung von Informationen in einer Datenbank (z.B.
Netzwerkressourcen wie Rechner, Drucker, Personen, …); hierachische Datenbank
Ein Verzeichnisdienst kann mittels Protokollen angesprochen werden (Ändern von Daten,...) Beispiel:
LDAP Protokoll zur Bearbeitung des Verzeichnisdienstes
LDAP plattformunabhängig und man kann hinterlegen wer welches Programm benutzen...
Beispiel: ADS
86/143
WebContainer:Server der API Spezifikationen implementiert; Der Webcontainer kann auch als
Servlet-Engine verstanden werden, die dem Server erlaubt mit den Servlets zu kommunizieren.
Weiters wird das Starten/Beenden der Servlets mit Hilfe des WebContainers realisiert.
Der Server sendet Client-Anforderungen an den WebContainer weiter und dieser ruft dann die post
oder get Methode des gewünschten Servlets auf(spezifiziert durch Benutzer-Request → URL). Im
Servlet wird der Code ausgeführt und die Antwort wird an den Server weitergegeben. Der Server ist
nun zuständig für das Weiterleiten der Ergebnisse an den Client. Der WebContainer ist zuständig
dafür, dass der Servlet-Lebenszyklus stattfinden kann.
Der WebContainer wird von Servern gebraucht, die eine Servlet-Anbindung zur Verfügung stellen
möchten.
Beispiele für Webcontainer: GlassFish, JBoss, Tomcat, Jetty
Tomcat: ist ein freier Webserver und Servlet-Container. Tomcat wird von Apache Systems
implementiert. Tomcat implementiert die Java Servlet und die JavaServer Pages (JSP) API. Tomcat ist
ein sogenannter "pure Java" HTTP Webserver und in seiner einfachsten Form ist er ein einzelner
Betriebssystem Prozess.
Komponenten Tomcat:
● Catalina: WebContainer
● Coyote: HTTP(v1.1)-Kontroller: empfängt die Benutzer-Anfragen und sendet sie wieder
richtig zurück
● Jasper: JSP Engine: zum Kompilieren von JSP-Seiten in Servlets
● Cluster: Loadbalancing Komponente (Lastenausgleich)
Deployment(Ausliefern): Servlet wird in Context geladen!!!! Ant(Werkzeug) zum Automatisch
deployen→ automatisieren von Ausliefern
WAR(Web Archive) File auf Tomcat laden→ FTP,
Deployment Descriptor→ Annotations
Referenzimplementierung: Funktions-Spezifikationen werden komplett implementiert (Tomcat
Apache viele Referenzimplementierung)
16. HTTP-Grundstruktur
Was versteht man unter einem Protokoll? Was versteht man unter einem RFC? Wer ist wie
zuständig für die http­Spezifikation (kann diese einfach erweitert werden)? Wie ist das http­Protokoll
in das OSI­Schichtenmodell einzuordnen? Was versteht man unter einem Socket? Ist ein Socket von
der Programmiersprache/Betriebssystem abhängig? Was ist ein UDP­Socket und wofür wird dieser
gebraucht? Was versteht man unter dem Request­Response­Modell? Was ist der Unterschied
zwischen den einzelnen HTTP­Protokollversionen? Welche Eigenschaften hat das http­Protokoll?
Wofür ist https geeignet? Wie unterscheiden sich http und https beim Aufbau des
Kommunikationskanals?
87/143
Was versteht man unter einem Protokoll
Ein Protokoll, auch Netzwerkprotokoll, dient zum Austausch von Daten zwischen Computern oder
auch Prozessen welche in einem Netzwerk miteinander verbunden sind. Die Vereinbarung besteht
aus einem Satz von Regeln und Formaten (Syntax), die das Kommunikationsverhalten der
kommunizierenden Instanzen in den Computern bestimmen. Der in einem Protokoll beschriebene
Aufbau eines Datenpakets enthält für den Datenaustausch wichtige Informationen über das Paket
wie beispielsweise:
● dessen Absender und Empfänger
● den Typ des Pakets (z. B. Verbindungsaufbau, Verbindungsabbau oder reine Nutzdaten)
● die Paketlänge
● eine Prüfsumme
Diese Informationen werden den Nutzdaten als Header vorangestellt.
Was versteht man unter einem RFC
RFCs (Request for Comments) sind eine durchnummerierte Serie von Dokumenten, die verschiedene
tatsächliche und vorgeschlagene Gewohnheiten beschreiben, die einen Bezug zum Internet haben
und von der IETF herausgegeben werden.
Wie ist das http Protokoll in das OSI-Schichtenmodell einzuordnen
Es wird ab der 5. Schicht, der Sitzungsschicht eingesetzt. Auch die darüber liegenden Schichten
verwenden es (Darstellungsschicht und Anwendungsschicht) Weitere Protokolle auf dieser Schicht
sind HTTPS, FTP, LDAP, SMTP.
Was versteht man unter einem Socket
Das ist eine Softwarekomponente, mit der sich ein Computerprogramm mit einem
Rechnernetz/Netzwerk verbinden kann und Daten austauschen kann. Sockets werden auch
verwendet um auf demselben Computer zwischen Prozessen Daten zu verschicken. Die
Kommunikation über Sockets erfolgt bidirektional, das heißt es können sowohl Daten gesendet als
auch empfangen werden.
88/143
Ist ein Socket von der Programmiersprache/Betriebssystem abhängig
Sockets bilden eine plattformunabhängige, standardisierte Schnittstelle (API) zwischen der
Netzwerkprotokoll-Implementierung des Betriebssystems und der eigentlichen
Anwendungssoftware. Ein Computerprogramm fordert einen Socket vom Betriebssystem an. Das
Betriebssystem hat die Aufgabe, alle benutzten Sockets sowie die zugehörigen
Verbindungsinformationen zu verwalten. Java als plattformunabhängige Programmiersprache
unterstützt im Paket java.net unmittelbar die Socket-Programmierung. Das zeigt die
Betriebssystemunabhängigkeit des Socket-Konzeptes. Die Implementierung der Sockets für die
verschiedenen Plattformen (Linux, Windows, Spezialsysteme) erfolgt in der Klassenbibliothek der
virtuellen Maschine.
Was ist ein UDP-Socket und wofür wird dieser gebraucht
Dieser wird bei Datagram Sockets benötigt. Diese kommunizieren über einzelne Nachrichten. Das
heißt es wird keine Verbindung aufgebaut. Bei UDP kann nicht sichergestellt werden, ob das Paket
angekommen ist.
Was versteht man unter dem Request-Response-Modell
Request Response ist eine der grundlegenden Methoden, die Computer verwenden, um miteinander
zu kommunizieren. Bei der Verwendung von Request-Response, fordert der erste Computer einige
Daten und der zweite Computer reagiert auf die Anfrage. Normalerweise gibt es eine Reihe von
solchen Austausch bis die gesamte Nachricht gesendet wird. Durchsuchen einer Web-Seite ist ein
Beispiel für Request-Response-Kommunikation.
Was ist der Unterschied zwischen den einzelnen HTTP-Protokollversionen
Bei HTTP/1.0 wird vor jeder Anfrage eine neue TCP-Verbindung aufgebaut und nach Übertragung der
Antwort standardmäßig vom Server wieder geschlossen. Sind in ein HTML-Dokument beispielsweise
zehn Bilder eingebettet, so werden insgesamt elf TCP-Verbindungen benötigt, um die Seite auf
einem grafikfähigen Browser aufzubauen. Bei HTTP/1.1 kann ein Client durch einen zusätzlichen
Headereintrag (Keep-Alive) den Wunsch äußern, keinen Verbindungsabbau durchzuführen, um die
Verbindung erneut nutzen zu können (persistent connection). Mittels HTTP-Pipelining können in der
Version 1.1 mehrere Anfragen und Antworten pro TCP-Verbindung gesendet werden. Für das HTMLDokument mit zehn Bildern wird so nur eine TCP-Verbindung benötigt. Zusätzlich können bei
HTTP/1.1 abgebrochene Übertragungen fortgesetzt werden.
Die IETF-Arbeitsgruppe HTTP beschäftigt sich mit der Überarbeitung von HTTP, das die
Versionsnummer 2.0 tragen soll. Google (SPDY) und Microsoft haben jeweils eigene Vorschläge für
HTTP/2.0 eingereicht und teilweise schon in ihren Browsern umgesetzt. Ein erster Entwurf, der sich
weitgehend an SPDY anlehnte, wurde im November 2012 publiziert und seither in mehreren
Schritten angepasst.http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol - cite_note-6
Mit HTTP/2.0 soll die Übertragung beschleunigt und optimiert werden. Dabei soll der neue Standard
jedoch vollständig abwärtskompatibel zu HTTP/1.1 sein.
89/143
Welche Eigenschaften hat das HTTP-Protokoll
Bei HTTP gehen Informationen aus früheren Anfragen verloren da es ein zustandloses Protokoll ist.
Über Cookies in den Header-Informationen können aber Anwendungen realisiert werden, die
Statusinformationen wie Benutzereinträge und Warenkörbe benötigen.
Wofür ist https geeignet
Das HTTPS-Protokoll wird zur Verschlüsselung und zur Authentifizierung der Kommunikation
zwischen Webserver und Browser im World Wide Web verwendet. Ohne Verschlüsselung sind WebDaten für jeden, der Zugang zum entsprechenden Netz hat, als Klartext lesbar. Mit der
zunehmenden Verbreitung von Funkverbindungen, die etwa an WLAN-Hotspots häufig
unverschlüsselt ablaufen, nimmt die Bedeutung von HTTPS zu, da hiermit die Inhalte unabhängig
vom Netz verschlüsselt werden. Es stellt dabei das einzige Verschlüsselungsverfahren dar, das ohne
gesonderte Softwareinstallation auf allen Internet-fähigen Computern unterstützt wird.
Wie unterscheiden sich http und https beim Aufbau des Kommunikationskanals
Bei HTTPS erzeugen die beiden an der Verbindung beteiligten Computer zunächst jeweils den
geheimen Schlüssel, den nur die beiden Kommunikationspartner kennen. Dies geschieht durch
komplexe Berechnungen auf der Basis vorher ausgetauschter Daten zum Beispiel mit RSA. Diese
Daten sind für jeden, der die Verbindung "belauscht" einsehbar, lassen jedoch keinen Schluss auf
den resultierenden Schlüssel zu. Anschließend tauschen die beiden Kommunikationspartner noch
einen öffentlichen Schlüssel aus, mit dem dann die zu sendenden Nutzdaten verschlüsselt werden.
Dieser öffentliche Schlüssel ist ebenso für jeden einsehbar. Da er jedoch nur zur Verschlüsselung
dient und nicht zum Entschlüsseln der Daten, ist er für sich allein nutzlos.
90/143
17. HTTP-Anwendung
Was sind Funktionen/Methoden des http­Protokolls? Welche gibt es und wofür werden diese
verwendet. Was ist der Unterschied zwischen einem GET­ bzw. POST­Request (client­ und
serverseitig) .Wie ist ein GET­Request strukturiert/aufgebaut? Was sind Formulare und wie können
diese konventionell (ohne Frameworks) zum http­Server übertragen werden. Welche Rolle spielt der
WebServer bei der Übertragung von Formulardaten? Was versteht man unter URL­Rewriting,
wofürkann es eingesetzt werden und wie kann dies realisiert werden. Was sind Cookies (Definition,
Eigenschaften, Lebensdauer, Erzeugen, Löschen, Speicherort, wie manipulierbar).. Welcher
Unterschied besteht zwischen REST(http)­Service und einem RMI­Service (Client + Server, kann
WebClient auf RMI­Server zugreifen? Wer stellt welche Ressourcen zur Verfügung?). Was ist eine
Session (warum braucht man eine solche überhaupt, wo liegen die Daten, serverseitige
Unterstützung). Kann man für einen http­Request einen Debugger einsetzen? Wird wird man unter
Linux(Ubuntu) einen Webserver(Apache) betreiben? Welche Security­Maßnahmen wird man unter
Ubuntu(Apache) setzen, damit keine Sicherheitslücke entsteht.
Was sind Funktionen/Methoden des http-Protokolls? Welche gibt es und wofür werden
dieseverwendet. Was ist der Unterschied zwischen einem GET- bzw. POST-Request
(client- und serverseitig) . Wie ist ein GET-Request strukturiert/aufgebaut?
Jeder HTTP-Request durch den Client wird durch die Angabe einer Methode eingeleitet. Die
Methode weißt den Server an, was er mit dem Request machen soll.
Die HTTP Version 1.1 sieht die folgenden Methoden vor:
GET
Die mit Abstand wichtigste Methode ist GET, diese dient der Anforderung einer HTML-Datei oder
einer anderen Quelle. Die Quelle wird durch die URL adressiert wobei man Bedingungen hinterlegen
kann. Hier werden die Parameter-Wertepaare durch das Zeichen ? in der URL eingeleitet. Oft wird
diese Vorgehensweise gewählt, um eine Liste von Parametern zu übertragen, die die Gegenstelle bei
der Bearbeitung einer Anfrage berücksichtigen soll. Häufig besteht diese Liste aus Wertepaaren,
welche durch das &-Zeichen voneinander getrennt sind. Die jeweiligen Wertepaare sind in der Form
Parametername=Parameterwert aufgebaut. Seltener wird das Zeichen ; zur Trennung von Einträgen
der Liste benutzt. (Achtung: URL begrenzte Anzahl an Zeichen.)
Beispiel
Die Antwort könnte folgendermaßen aussehen:
91/143
POST
Die POST-Methode funktioniert ähnlich wie die GET-Methode. Sie dient dazu Formulardaten vom
Client an den Server zu übermitteln. Da sich die Daten nicht in der URL befinden, sonder im HTTPBody, so dass sie in der URL nicht sichtbar sind, können per POST auch sehr große Datenmengen, z.
B. Bilder, übertragen werden. POST ist auch ein wenig sicherer, da die gesendeten Parameter weder
in log files, noch in der Browser History protokolliert werden.
Beispiel
Dieses Formular wird per POST abgeschickt und sendet die Daten an das Script: /send.php
Hier wird nun der Inhalt , wie bereits erwähnt, nicht in der URL, sondern durch eine Leerzeile
getrennt,an den Header angehängt.
Die Anfrage könnte so aussehen:
Die Daten werden dabei zusätzlich in das URL-codierte Format umgewandelt.
Zur Kodierung werden nur bestimmte Zeichen des ASCII-Zeichensatzes verwendet. Ohne diese
Kodierung wären einige Informationen nicht in einer URL darstellbar. Beispielsweise wird ein
Leerzeichen in aller Regel vom Browser als Ende der URL interpretiert, nachfolgende Zeichen würden
ignoriert bzw. führen zu einem Fehler. Mit der URL-Kodierung kann ein Leerzeichen durch die
Zeichenfolge %20 übergeben werden. RFC 3986 definiert einen Standard, wie eine URI (und damit
92/143
auch eine URL) syntaktisch aufgebaut sein sollte und unter welchen Bedingungen die URL-Kodierung
Anwendung findet.
HEAD
Diese Methode ist GET in seiner Funktionsweise sehr ähnlich. Einziger Unterschied: HEAD fordert
lediglich den Header eines Dokuments oder Quelle an. Im Gegensatz zu GET übermittelt der Server
aber nicht die eigentlichen Daten. HEAD eignet sich insbesondere dazu, die Größe von Quellen, Typ
oder Objektattribute ausfindig zu machen. Der Server übermittelt auf eine HEAD-Anfrage die
Metainformationen, die identisch mit den Informationen der GET-Request sind.
Der Vorteil einer HEAD-Anfrage besteht darin, Informationen sammeln zu können ohne jedes mal
die eigentliche Datei abrufen zu müssen.
Beispiel
Die Antwort könnte so aussehen:
PUT
Die PUT-Methode ähnelt der POST-Methode. Sie ermöglicht es eine Datei auf den Server zu laden.
Im Gegensatz zur POST-Methode ist der Server hier nicht angewiesen die übertragene Datei an ein
Script zu übergeben, sondern vielmehr die Datei an der benannten Stelle zu platzieren. die URL
innerhalb der ersten Anfragezeile gibt dabei die Adresse an, unter der die Datei gespeichert werden
soll. Existiert dort bereits eine Datei, ist der Server angewiesen diese zu ersetzen - existiert sie nicht,
wird sie erstellt. Aus Sicherheitsgründen wird diese Methode jedoch bei den meisten Servern
abgeschaltet. Der Inhalt ansich wird, wie bei der POST-Methode, durch eine Leerzeile getrennt an
den Header angehängt. In diesem Beispiel wird die Datei /neu.html erstellt bzw. ersetzt.
Beispiel
93/143
DELETE
Die DELETE-Methode ist das Gegenstück zur PUT-Methode. Sie veranlasst, dass die Datei, die unter
der angegebenen Adresse zu finden ist, vom Server gelöscht wird. Auch diese Methode ist aus
Sicherheitsgründen bei den meisten Servern abgeschaltet. Die Anfrage könnte entsprechend so
aussehen: Im Beispiel wird hier die Datei /neu.html gelöscht.
Beispiel
OPTIONS
Mit der OPTIONS-Methode fragt der Client beim Server an, welche Methoden er für ein
Dokument unterstützt. Will der Client z.B. per PUT eine Datei hoch laden, kann er mit dieser
Methode erst mal prüfen, ob PUT hier überhaupt unterstützt wird. Außerdem kann der Client
statt einer konkreten Datei auch das Sternchen (*) verwenden. Wird dieser verwendet, gibt
der Server Auskunft darüber welche Methoden allgemein auf dem gesamten Server zur
Verfügung stehen.
Beispiel
Der dazugehörige Response:
CONNENCT UND TRACE MUSS NICHT GELERNT WERDEN
CONNECT
Wird von Proxyservern implementiert, die in der Lage sind, SSL-Tunnel zur Verfügung zu stellen.
TRACE
Die TRACE-Methode dient der Zurückverfolgung eines Requests bzw. des Responses. Wird eine
TRACE-Anfrage vom Client abgesandt, so ist der Ziel-Server angewiesen, den ankommenden Request
so wie er ankam als Response-Daten zurück zu geben. Außerdem sind Proxy-Server, an denen eine
TRACE-Anfrage vorbei geht, angewiesen einen Vermerk auf Ihre Existenz zu den Header-Daten hinzu
zu fügen. Das letzte Glied der Kette generiert die Antwort.
94/143
Der Request / Response sieht an den einzelnen Stellen entsprechend wie folgt aus:
Was sind Formulare und wie können diese konventionell (ohne Frameworks) zum http-Server
übertragen werden.
Welche Rolle spielt der WebServer bei der Übertragung von Formulardaten?
Ein typisches HTML-Formular kann aus folgenden Feldern bestehen: Name, E-Mail-Adresse und
Kommentartext. Bei der Übertragung eines ausgefüllten Formulars an den Server müssen die Daten
so übertragen werden, dass es der Server imstande ist, zu erkennen, aus welchen Feldern das
Formular besteht, und welche Daten der Anwender in welches Feld eingetragen hat.
OHNE Framework: in HTML z.B. im < form action =”demo_form.html" method="get">
MIT Framework: Mittels eines Skripts(php, cgi, ajax usw..) kann bei einer Aktion z.B. bei einer
interaktion dies abgefragt werden und an den Server übermittelt werden..
Was versteht man unter URL­Rewriting, wofürkann es eingesetzt werden und wie kann dies realisiert
werden.
URL-Rewriting wird verwendet um “unleserliche” URLs zu verfeinern bzw lesbarer zu machen.
Viele dynamische Seiten besitzen Variablen in deren URL um zu zeigen was für Informationen dem
Benutzer dargestellt werden soll.
Hier wird dem Script gesagt dass wir das Produkt Nr 5 angezeigt haben wollen
http://www.test.com/show_a_product.php?product_id=5
95/143
Um diese URL zu kürzer und einfacher bzw leichter lesbar zu machen kann man sie auf folgende
umschreiben:
http://www.test.com/products/5/
Zwar ist die URL nun lesbarer, jedoch gibt sie wenig Information bekannt was sich nun für ein
Produkt dahinter befindet.
http://www.test.com/bmw/f10m5/
(awesome car!!)
Nun wird ersichtlich welches Produkt sich auf der folgenden Seite befindet. Suchmaschinen können
nun die URL in Wörter teilen, wodurch sie die Informationen bekommen welche benötigt werden,
um die Seite bei einer dementsprechenden Suche auch auflisten zu können.
Ein weiterer Vorteil ist, dass die kurzen URLs z.B. auf Mobilen Endgeräten mit kleinen Bildschirmen
lesbarer sind und leicht merkbar sind.
Was ist mod_rewrite
mod_rewrite ist ein Apache Modul für die URL Manipulation. Mit der RewriteEngine des ApacheWebservers ist es möglich die angeforderte URL anhand von Regeln "umzuschreiben". Basierend auf
einem Parser für Reguläre Ausdrücke kann die angeforderte URL manipuliert werden.
Einsatzgebiete für mod_rewrite
●
●
●
●
●
●
●
●
●
Suchmaschinenoptimierung / Suchmaschinenfreundliche URL's
Spambots ausschliessen (und damit Guestbook-Spam, Blog-Spam, Foren-Spam eindämmen
oder ganz verhindern)
Schutz vor "Hackern" und/oder "Script-Kiddies" ;)
Content-Klau verhindern
Weiterleitung oder Sperrung nach bestimmten Client-Kriterien wie z.B. Referer, Client, IPAdresse, etc.
Content-Regeneration bei Umstrukturierung der Webseite(n)
Zeitabhängige Weiterleitungen
Dynamische Mirrors
und vieles mehr...
Einfaches Beispiel: Statt dateiname.php => dateiname.html
Der Besucher soll also aufgrund der angezeigten URL denken er hätte eine statische HTML-Seite vor
sich.
.htaccess-Code
RewriteEngine on
RewriteRule dateiname.html$ dateiname.php
96/143
Cookies
Was sind Cookies (Definition,Eigenschaften, Lebensdauer, Erzeugen, Löschen, Speicherort, wie
manipulierbar)..
Definition
Cookies sind persönliche Anmeldedaten oder Textinformationen von besuchten Websites, die am
Rechner des Clients gespeichert werden. Das Cookie wird entweder vom Webserver an den Browser
gesendet oder von einem Skript (etwa JavaScript) in der Website erzeugt. Der Client sendet die
Cookie-Information bei späteren, neuen Besuchen dieser Seite mit jeder Anforderung wieder an den
Server.
Eigenschaften
Größe
Browser haben meist eine Obergrenze für die Größe von Cookies. (4096 Zeichen)
Je nach Beschaffenheit des Cookies sind davon etwa 100 Byte für die Cookie-Definition (Name,
Domain, Verzeichnis, Verfallsdatum) zu reservieren.
Geltungsbereich
Cookies sind an die Domain des erzeugenden Webservers gebunden. Skripte oder Programme, die
auf anderen Domains oder anderen Servern ablaufen, können nicht darauf zugreifen. Standardmäßig
stellt dabei auch eine Subdomain schon eine andere Domain dar. Diese Sicherheitseinstellung kann
bei Bedarf deaktiviert werden, sodass Skripte der Domain “domain.tld” auch auf Cookies der Domain
“subdomain.domain.tld” zugreifen können.
Cookies, die mit dem Parameter secure geschrieben werden, können nur übertragen werden, wenn
tatsächlich eine sogenannte Sichere Verbindung (HTTPS) vorliegt.
Haltbarkeit
Cookies unterliegen einem Verfallsdatum. Ein Verfallsdatum, das in der Vergangenheit liegt, bewirkt
eine Deaktivierung / Löschung des Cookies. Er wird dann nach einer gewissen Zeit von einem
anderen Cookie überschrieben oder von der Festplatte des Clientcomputers entfernt.
Anzahl der Cookies
Pro Domain und Server können maximal 20 Cookies definiert werden. Insgesamt 300.
Aktuell gibt es 3 Cookies Standard. Cookies nach RFC 2109, 2965 und 6265.
(6265 besitzt Spezifikationen , die nur der Opera-Browser unterstützt)
Trotzdem ist der Aufbau grundsätzlich bei allen Cookies gleich.
Jedes Cookie hat folgende Attribute
●
"Comment" = "value" (optional)
Kommentar zur näheren Beschreibung des Cookies
●
"Domain" = "value" (optional)
97/143
Domain oder Bestandteil des Domainnamens, für den der Cookie gilt. Falls dieses Attribut
nicht angegeben wird, wird der aktuelle Domainname verwendet. Falls diese Attribut jedoch
angegeben wird, muss der Wert mit einem Punkt beginnen; falls nicht, wird der Punkt vom
Client hinzugefügt.
●
●
●
●
"Max-Age" = "value" (optional)
Ablaufzeit in Sekunden – 0 für sofortige Löschung. Der Client darf den Cookie auch nach
dieser Zeit benutzen, der Server kann sich also nicht darauf verlassen, dass der Cookie nach
dieser Ablaufzeit gelöscht wird.
"Path" = "value" (optional)
"Secure" (optional)
"Version" = "1*DIGIT" (notwendig)
Gibt die Cookie-Management-Spezifikation in einer Dezimalzahl an Beispie
Welcher Unterschied besteht zwischen REST(http)-Service und einem RMI-Service (Client + Server,
kann WebClient auf RMI-Server zugreifen? Wer stellt welche Ressourcen zur Verfügung?).
pls help :/
Der Vorteil bei der Benutzung von REST gegenüber einem RMI Service ist, dass RMI einen weiteren
Port zur Kommunikation benötigt. REST hingegen kommuniziert über den HTTP Port 80, welcher bei
den meisten Firewalls ohnehin freigeschalten ist. Ein Weiterer Vorteil ist, dass mit REST die
Programmiersprache, in welcher der Client geschrieben ist keine Einschränkungen ergibt. Ein RMI
Service am Server in Java ist hingegen nur schwer an einen RMI Client in .NET anzubinden.
RMI ist tatsächlich ein entfernter Methodenaufruf, REST benutzt hingegen die HTTP Befehle
GET,PUT,DELETE,... was mehr mit SQL Anweisungen (INSERT, UPDATE, DELETE) vergleichbar ist.
Sessions
Was ist eine Session (warum braucht man eine solche überhaupt, wo liegen die Daten,
serverseitige Unterstützung).
Während Cookies Daten auf der Client-Seite speichern, arbeiten Sessions auf Server-Seite. Wie
bereits angesprochen handelt es sich bei HTTP um ein zustandsloses Protokoll.
Daher, der Webserver beantwortet eine Anfrage, damit ist der Fall für ihn erledigt. Kommt die
nächste Anfrage, kann er nicht zuordnen, ob sie von jemandem kommt, der bereits eine andere
Seite abgerufen hat. Für Webanwendungen, die einem Benutzer Daten zuordnen müssen (z.B. ein
Warenkorb oder ein Login-Status), ist das natürlich nicht hinnehmbar. Aus diesem Grund wurde das
Konzept der Sessions (Sitzungen) erdacht. Damit können beliebige Daten (z.B. der Inhalt eines
Einkaufskorbs) in einer Session gespeichert werden. Jeder Benutzer bekommt seine eigene Session,
so dass sie sich nicht in die Quere kommen. Während in Cookies nur Text gespeichert werden kann,
können in Sessions auch Objekte abgelegt werden. Die Speicherung erfolgt auf dem Server in einem
Verzeichnis, das in der Konfiguration festgelegt wird. Sessions gelten nur während der Besuchszeit
eines Anwenders. Problem hierbei ist, dass der Server natürlich nicht wissen kann, ob der Besucher
die Seite gerade noch in seinem Browser betrachtet und in ein paar Minuten eine neue Anfrage
98/143
stellen wird oder ob er die Seite bereits verlassen hat. Sessions werden deshalb mit einem Time-Out
versehen. Kommt einen bestimmten Zeitraum lang (standardmäßig 20 Minuten) keine neue Anfrage
des Besuchers, geht der Server davon aus, dass er die Seite verlassen hat, und löscht die Session.
Vorteil von Session ist, dass sie immer funktionieren. Cookies können vom Anwender jederzeit
gelöscht oder gar gänzlich blockiert werden.
Mit session.invalidate() kann die Session explizit beendet werden und mit
session.setMaxInactiveInterval() kann die maximale Inaktivitätszeit eines Benutzers definiert
werden.
Kann man für einen http­Request einen Debugger einsetzen?
Es gibt mehrere Möglichkeiten einen http Request, sei es nun ein GET oder POST Aufruf, zu
“beobachten”. Um einen http Request aber zu debuggen, müssen im Browser oder am jeweiligen
Router Tools installiert werden. Einer der bekanntesten Debugger ist der Firebug von Firefox. Dieser
protokolliert sämtliche Übertragungen und man bekommt jegliche Veränderungen, seien diese im
HTML, CSS, Javascript oder selbst im http request, mit.
Apache unter Ubuntu
Wie wird man unter Linux(Ubuntu) einen Webserver(Apache) betreiben?
Man muss folgende Pakte installieren:
Apache2
apt-get install apache2 apache2-doc
php5 , php5-mysql
apt-get install php5 php5-mysql
Welche Security­ Maßnahmen wird man unter Ubuntu(Apache) setzen, damit
keine Sicherheitslücke entsteht.
Im Internet öffentlich erreichbare Webserver sind oft Ziel von Angriffen, welche versuchen, den
Webserver zu kompromittieren und/oder nicht verfügbar zu stellen. Diese Angriffe können in der
Regel auf folgende Muster reduziert werden:
● Denial of Service (DoS) und DDoS
● SQL-Injection
● Cross-Site-Scripting (XSS)
Es gibt mehrere Maßnahmen Sicherheitslücken unter Ubuntu zu schließen. Generell helfen
spezifische Firewalls, wie sie innerhalb von großen Unternehmen auch betrieben werden.
Einer der großen Gefahren sind die Benutzerberechtigungen an sich. Oft sind Ordner und Dateien
mit falschen Rechten gesetzt oder Benutzer sind in Gruppen drinnen, die wiederrum falsche
Berechtigungen haben.
99/143
Webserver sind auch über Module erweiterbar. Über die offiziellen Paketquellen werden vier
Module zur Sicherung des Webservers zur Verfügung gestellt, welche in ihrer Summe eine starke
Verteidigung darstellen.
mod_security
Arbeitet ähnlich einem IPS*. Die Entwickler des Moduls nennen die Regeln corerules. Wird gegen
eine dieser corerules verstoßen, so wird dies vom Modul aktiv gemeldet. Hier ist zwischen einer
Warnung und einem Fehler zu unterscheiden. Fehler werden mit einer ID versehen. Bei einem Fehler
wird der Netzwerkverkehr des anfragenden Clients blockiert. Die Meldungen werden in der
/var/log/apache2/error.log ausgegeben. Zudem führt das Modul unter
/var/log/apache2/modsec_audit.log eine ausführliche Protokolldatei.
*Intrusion Prevention System
Das Intrusion Prevention System (IPS) kontrolliert den Traffic. Das IPS-System ist direkt in die
Datenleitungen geschaltet und überwacht die ein- und ausgehenden Datenpakete der NetzwerkKomponenten. Angriffe und vom normalen Datenverkehr abweichende Bitmuster werden über
Signaturen erkannt und blockieren den Datenverkehr. Unterstützt wird diese Sperrfunktion durch
intelligente Verhaltensmuster und anomale Algorithmen, die auf der Applikationsebene arbeiten.
IPS-Systeme sollten die Datenanalyse in Hochgeschwindigkeit ausführen können und dürfen selbst
unter Hochlast nicht den legitimen Datenverkehr blockieren. Die Schutzmechanismen wie
Signaturanalysen, das Erkennen von Protokollabweichungen, Firewall-Funktionen und
Zugriffskontrollen müssen robust sein.
mod_evasive
Ist ein Modul, welches ähnlich einem IPS Muster eines möglichen Angriffs im Netzwerk erkennt.
Dieses Modul konzentriert sich auf Denial of Service (DoS) und Brute-Force-Attacken über das HTTP
Protokoll .
Erkennt dieses Modul einen Angriff über eine IP-Addresse, so wird diese zeitbegrenzt auf allen Ports
gesperrt. Zudem wird der Serveradministator per E-Mail informiert. Dies setzt einen
funktionierenden MTA(mail transfer agent) voraus.
Beispiel:
Gibt man in einem beliebigen Browser die URL/IP-Addresse eines Servers ein und hält die Taste F5
für eine Minute gedrückt, so wird diese Seite immer neu geladen. Multipliziert man dies nun mit die
Anzahl von anfragenden Clients (z.B. 100 oder 1000), simuliert man einen klassischen DDoS-Angriff,
welcher in einem möglichen Bufferüberlauf des Servers enden kann.
mod_spamhaus
Ist ein Modul, welches eine DNS-based Blackhole List (DNSBL) verwendet, um Spam-Relay über WebFormulare zu blockieren, URL-Injektion zu verhindern, DDoS-Angriffe von Bots über das Protokoll
HTTP zu blockieren und den Zugang von einer bekannten IP-Adresse, die in der DNSBL von Spamhaus
geführt wird, zu verweigern.
In den meisten DNSBLs werden IP-Adressen von Rechnern gelistet, die in der Vergangenheit durch
100/143
häufigen Versand unerwünschter Spamnachrichten aufgefallen sind. Einige Listen enthalten auch
Quellen von Computerviren und anderer Malware. Heute handelt es sich bei diesen Rechnern meist
um trojanisierte PCs oder seltener offene Mail-Relays, die von Spammern missbraucht wurden.
mod_geoip2
Ist ein Modul, welches die Suche nach dem Land, aus dem eine Web-Anfrage stammt, ermöglicht. Es
nutzt die Bibliothek und Datenbank GeoIP, um eine Suche durchzuführen. Das Modul ermöglicht die
Bearbeitung der Clientzugriffe basierend auf ihrem Ursprungsland. Ursprungsländer werden anhand
ihrer Ländercodierung identifiziert. Darüber hinaus kann man mit entsprechenden Datenbanken
auch per Städtecode selektieren.
Problembehebung
Diese Module arbeiten nur mit dem Webserver Apache. Fehler sind in den folgenden Log-Dateien
ersichtlich:
● /var/log/syslog
● /var/log/apache2/access.log
● /var/log/apache2/error.log
● /var/log/apache2/modsec_audit.log
● /var/log/apache2/modsec_debug.log
● /var/log/mod_evasive
● /var/log/apache2/error.log - in diese Datei loggt mod_spamhaus die access denied Einträge
101/143
18. HTML/XML
Was versteht man unter einer Auszeichnungssprache? Was versteht man unter SGML? Wofür ist ein
DTD? Was versteht man unter HTML bzw. XML? Was sind HTML­Tags und wo sind diese spezifiziert?
Wodurch unterscheidet sich eine HTML­Seite von einer von einem Textverarbeitungsprogramm (z.B.
Windword) erzeugten? Was versteht man unter dem MIME­Typ (wer braucht dies, wer wertet dies
aus)? Wofür war HTML usprünglich gedacht? Woher bezieht der Browser die Layout­Informationen
der einzelnen Tags? Welche zusätzlichen Techniken werden wie eingesetzt, das Layout der
HTML­Tags zu steuern?
Probleme unterschiedlicher Browser bei der Anzeige eines HTML­Files. Wofür wird XML
hauptsächlich eingesetzt? Kann XML oder muss XML mit einem DTD verarbeitet werden? Welche
Arten der XML­Verarbeitungen können eingesetzt werden (Vor­/Nachteile). Wer bestimmt die
Struktur
eines http­Files bzw. XML­Files. Wieso gibt es Standards? Was sind die wesentlichen Änderungen in
HTML5?
Was versteht man unter einer Auszeichnungssprache?
Eine Auszeichnungssprache (markup language) dient zur Beschreibung des Inhalts eines
Dokumentenformates. Bei Auszeichnungssprachen werden die Eigenschaften und Zugehörigkeiten
von bestimmten Wörtern, Sätzen und Abschnitten eines Textes oder einer Datenmenge beschrieben
und zugeteilt, in der Regel indem sie mit Auszeichnungselementen (Tags) markiert werden.
Was versteht man unter SGML?
SGML (Standard Generalized Markup Language) ist eine Metasprache (Sprache über Sprachen), mit
deren Hilfe man verschiedene Auszeichnungssprachen für Dokumente definieren kann.
Wofür ist ein DTD?
Eine DTD (Document Type Definition, DOCTYPE) ist ein Satz an Regeln, der benutzt wird, um
Dokumente eines bestimmten Typs zu deklarieren (beschreiben). Ein Dokumenttyp ist dabei eine
Klasse ähnlicher Dokumente, wie beispielsweise Telefonbücher oder Schülerlisten. Die
Dokumenttypdefinition besteht dabei aus Elementtypen, Attributen von Elementen, Entitäten und
Notationen. Konkret heißt das, dass in einer DTD die Reihenfolge, die Verschachtelung der Elemente
und die Art des Inhalts von Attributen festgelegt werden. Kurz gesagt, die Struktur des Dokuments.
Was versteht man unter HTML bzw. XML?
HTML (Hypertext Markup Language) ist eine textbasierte Auszeichnungssprache zur Strukturierung
von digitalen Inhalten, wie Texten, Bildern und Hyperlinks, in elektronischen Dokumenten. HTMLDokumente sind die Grundlage des World Wide Web. HTML enthält zusätzliche Angaben in Form
102/143
von Metainformationen, die über die im Text verwendete Sprache und/oder dessen Autor Auskunft
geben oder die den Inhalt des Textes zusammenfassen.
XML (EXtensible Markup Language) (erweiterbare Auszeichnungssprache) ist eine
Auszeichnungssprache zur Darstellung hierarchisch strukturierter Daten in Form von Textdateien. Ein
XML-Dokument besteht aus Textzeichen. Binärdaten enthält es per Definition nicht.
Was sind HTML­Tags und wo sind diese spezifiziert?
HTML-Tags werden zu der Formatierung von HTML-Seiten verwendet. Dem Text wird durch
Auszeichnungen (Tags) von Textteilen eine Struktur verliehen. Die Auszeichnung erfolgt durch SGMLElemente. Die meisten dieser HTML-Elemente werden durch ein Tag-Paar markiert, das heißt durch
einen Starttag und einen Endtag. Ein Starttag beginnt immer mit dem Zeichen <. Es folgt der
Elementname (z. B. p für einen Absatz) und optional eine Liste seiner Attribute (z. B.
class="gruenertext"). Mit einem > wird der Starttag geschlossen. Ein Endtag besteht aus den Zeichen
</, dem Elementnamen und dem abschließenden >.
<p>Ein Textabsatz, der ein <b>fettes</b> Wort enthält.</p>
Die HTML-Tags sind von World Wide Web Consortium (W3C) in einen DTD spezifiziert.
Wodurch unterscheidet sich eine HTML­Seite von einer von einem
Textverarbeitungsprogamm (z.B. Windword) erzeugten?
HTML-Dateien sind textbasiert und daher von Menschen lesbar. Eine .doc-Datei ist eine Binärdatei
und daher nicht von Menschen lesbar.
Was versteht man unter dem MIME­Typ?
MIME (Multipurpose Internet Mail Extensions) sind Erweiterungen des Internetstandards der das
Datenformat von E-Mails definiert. Die MIME schaffen Kompatibilität für zusätzliche Zeichen wie
Umlaute sowie für Multimedia. MIME findet Anwendung bei der Deklaration von Inhalten in
verschiedenen Internetprotokollen wie etwa HTTP. MIME ermöglicht es, zwischen Sender und
Empfänger Informationen über den Typ der übermittelten Daten auszutauschen. MIME besitzt
verschiedene Media Types wie z.b. text, image, audio oder video. Im Falle von HTTP wertet der
Browser den MIME Type aus. Wird auch generell unter Windows verwendet.
Wofür war HTML ursprünglich gedacht?
HTML wurde ursprünglich vom CERN entwickelt um Forschungsergebnisse zwischen den Standorten
Frankreich und Schweiz auszutauschen. Das CERN benötigte eine Textauszeichnungssprache für
diese Aufgabe. Erfinder: Tim Berners-Lee
Woher bezieht der Browser die Layout­Informationen der einzelnen
Tags?
Das Layout der einzelnen Tags wurde von dem World Wide Web Consortium (W3C) definiert. Z.b das
der Tag <h1> eine Überschrift mit Schriftgröße 15px ist.
103/143
Welche zusätzlichen Techniken werden wie eingesetzt, das Layout der
HTML­Tags zu steuern?
CSS (Cascading Style Sheets) kurz CSS genannt, ist eine deklarative Sprache für Stilvorlagen von
strukturierten Dokumenten.
CSS ermöglicht es extern Klassen zu definieren mit bestimmten Eigenschaften. Diese Klassen können
dann in einem Starttag angegeben werden.
Probleme unterschiedlicher Browser bei der Anzeige eines HTML­Files.
Alle Eigenschaften von HTML-Tags wurden vom World Wide Web Consortium (W3C) festgelegt. Ob
die Browserhersteller dies jedoch einhalten oder nicht ist ihnen überlassen.
Wofür wird XML hauptsächlich eingesetzt?
XML wird u. a. für den plattform- und implementationsunabhängigen Austausch von Daten zwischen
Computersystemen eingesetzt, insbesondere über das Internet.
Kann XML oder muss XML mit einem DTD verarbeitet werden?
XML kann mit einer DTD verarbeitet werden, muss aber nicht. Durch die DTD wird lediglich die
Grundstruktur festgelegt, dadurch kann z.b. vor dem einlesen/bearbeiten der XML überprüft werden
ob diese gültig ist. XML-Validator zum prüfen ob XML dem DTD entspricht.
Welche Arten der XML­Verarbeitungen können eingesetzt werden?
Baum-basierte Verarbeitung
D.h man liest zuerst die ganze XML-Datei in den Speicher ein.
● + einfache Benutzung, freier Zugriff auf alle Daten in konstanter Zeit
● - hoher Speicherverbrauch, hohe Initialisier Zeit
Event-basierte Verarbeitung
D.h. man schaut sich immer nur eine Zeile der XML-Datei an.
● + geringer Speicherverbrauch, Ergebnisse während Verarbeitung anzeigen
● - kein Zurückschauen/Vorschauen, man hat immer nur eine Zeile
Wer bestimmt die Struktur eines http­Files bzw. XML­Files.
Die Struktur eines HTML-Files wurde damals vom Cern festgelegt. Die Grundstruktur ist bis heute
gleich.
Die Struktur eines XML-Files wird von einer DTD bestimmt. Diese ist je nach Verwendung
verschieden und wird von den Personen die es benutzen selbst bestimmt.
104/143
Wieso gibt es Standards?
Standards ermöglichen, dass man z.b. sich mit jedem Browser jede Internetseite ansehen kann.
Würde es keine Standards geben würde man für jede Internetseite einen eigenen Browser
benötigen.
Was sind die wesentlichen Änderungen in HTML5?
●
●
●
●
●
●
Doctype <!DOCTYPE html> damit kann jeder Browser umgehen und HTML 5 ist damit
abwärtskompatibel. (DTD jetzt im Browser fest implementiert)
Auszeichnung / semantische Divs dienen dazu Suchmaschinen zu sagen was die Funktion
dieses Abschnittes ist. (header, footer, section, article, aside)
Neue HTML5-Formularelemente wie z.b. telephone, url oder email
Canvas Elemente zum performanten Zeichnen von Grafiken.
WEBGL für 3D Anwendungen (kann mit CSS gelayoutet werden)
Einbindung von SVG (Scaleable Vector Graphics)
105/143
19. CGI-Schnittstelle
Was versteht man unter CGI und wie wird es verwendet . Warum wurde CGI überhaupt eingeführt?
Wie werden bei einer CGI­basierten Kommunikation die Daten übertragen (Bereitstellung von
Ressourcen)? Ist eine CGi­basierte Anwendung an eine Programmiersprache gebunden
(Begründung)? Kann eine CGI­basierte Web­Applikation Sessions realisieren (Begründung,
Vorgehensweise). Wie kommunizieren http­Server und CGI­Programm? Wie wird man unter Linux
eine CGI­Schnittstelle betreiben (Rechte, Verzeichnisse..). Vor­/Nachteile von CGI­Programmen.
Was versteht man unter CGI und wie wird es verwendet?
CGI (Common Gateway Interface) ist ein Standard für den Datenaustausch zwischen einem
Webserver und dritter Software, die Anfragen bearbeitet.
CGI wird verwendet um Webseiten dynamisch zu machen. Ein Webserver, der CGI unterstützt, stellt
der externen Software eine Laufzeitumgebung zur Verfügung. Diese Laufzeitumgebung besteht aus
Umgebungsvariablen und Ein- und Ausgangskanäle.
Warum wurde CGI überhaupt eingeführt?
Man wollte Webseiten erstmals dynamisch bzw. interaktiv gestalten. Erste Überlegung 1993.
Wie werden bei einer CGI­-basierten Kommunikation die Daten
übertragen?
Der Client sendet ein HTTP-GET an den Webserver. Anhand der Meta-Variablen im HTTP-GET erstellt
der Webserver die Webseite. Die Webseite ist vor dem Zeitpunkt des Aufrufes noch nicht am Server
vorhanden. Die Daten werden über das HTTP Protokoll übertragen.
Ist eine CGI-­basierte Anwendung an eine Programmiersprache gebunden?
CGI-Programme sind nicht an eine Programmiersprache gebunden. CGI-Programme müssen lediglich
den CGI Spezifikationen entsprechen. Daher können CGI-Programme in Programmiersprachen wie C,
Perl oder Java geschrieben werden.
Kann eine CGI­-basierte Web­Applikation Sessions realisieren?
CGI-basierte Web-Applikation sind in der Lage Sessions zu realisieren. Für jeden neuen Benutzer wird
eine einzigartige ID erzeugt. Diese wird entweder über ein Cookie an den Benutzer gesendet oder an
die dynamische URL in Form eines Query Strings angehängt.
106/143
Wie kommunizieren http­Server und CGI­Programm?
Wenn nun über einen http-Server ein CGI-Programm angefordert wird, startet der Server dieses
Programm. Die benötigten Informationen bekommt das CGI-Programm über Umgebungsvariablen
und dem Standard Input Stream. Über den Standard Output Stream sendet das Programm die
erzeugte Seite an den Server.
Wie wird man unter Linux eine CGI­Schnittstelle betreiben?
Es wird für die CGI-Programme ein eigener Ordner angelegt z.b. cgi/bin. Dort werden alle CGIProgramme abgelegt. Es wird ein spezieller CGI-Benutzer angelegt der nur die Rechte an diesem
Ordner hat um nur diese Programme auszuführen kann.
Vorteile
●
●
●
Kommerziell unabhängigen, kostenlosen und produktübergreifender Standard
Einfache Konfiguration
Geringe Serverlast, da Seiten nicht gespeichert werden müssen
Nachteile
●
●
Geringe Geschwindigkeit, jede Anfrage ein neuer Thread
Sicherheit
107/143
20. Layout
Welche Technologien stehen für das Layout einer HTML­ Seite zur Verfügung – erläutere dies kurz an
Hand eines Beispiels. Was ist aus technischer Sicht der Unterschied zwischen den
Layout­Informationen eines Textverarbeitungsprogramms (z.B. Winword) und einem HTML ­File –
gehe
auf die Vor­ und Nachteile ein. Was ist CSS und welche Hilfestellung bietet es beim Layout an? Was
sind Selektoren und welche gibt es? Was sind zusammengesetzte Selektoren und wie können diese
eingesetzt werden (Beispiele)? Wo liegt das Problem bei einem via HTML­Tags tabellenorientierten
Design und wie kann hier CSS Abhilfe schaffen? Welche Ansätze gibt es, unterschiedliche Medien
und Bildschirmgrößen zu unterstützen. Wie können CSS­Formate eingesetzt werden (wie schauen
CSS­Anweisung in einem externen File, wie im HTML­File und wie im HTML­Tag aus). Was passiert,
wenn mehrere CSS­Files verwendet werden? Wie unterstüzt das Box­Modell von CSS das Design?
Was ist der Unterschied zwischen class/div/iframe (Wann nimmt man welches Konstrukt)? Wie
können überlagerte CSS­Formatierungen erkannt werden bzw. gibt es einen Debugger bei der
praktischen Anwendung? Wie kann das Layout dynamisch ausgetauscht werden? Wie kann CSS
verschachtelt werden?
Welche Technologien stehen für das Layout einer HTML­Seite zur
Verfügung?
HTML-Tags werden zu der Formatierung von HTML-Seiten verwendet. Dem Text wird durch
Auszeichnungen (Tags) von Textteilen eine Struktur verliehen. Die meisten dieser HTML-Elemente
werden durch ein Tag-Paar markiert, das heißt durch einen Starttag und einen Endtag. Ein Starttag
beginnt immer mit dem Zeichen <. Es folgt der Elementname (z. B. p für einen Absatz) und optional
eine Liste seiner Attribute (z. B. class="gruenertext"). Mit einem > wird der Starttag geschlossen. Ein
Endtag besteht aus den Zeichen </, dem Elementnamen und dem abschließenden >.
<p>Ein Textabsatz, der ein <b>fettes</b> Wort enthält.</p>
Die HTML-Tags sind vom World Wide Web Consortium (W3C) spezifiziert.
Was ist aus technischer Sicht der Unterschied zwischen den
Layout­Informationen eines Textverarbeitungsprogramms (z.B. Winword)
und einem HTML­File?
In einem HTML File werden die Informationen zur Formatierung im Klartext gespeichert. D.h. wenn
ein HTML File im Texteditor geöffnet wird, so kann man die Formatierungsinfomationen klar
erkennen und verändern.
Ein Textverarbeitungsprogramm hingegen speichert den Text und die Formatierung in einem
speziellen Format ab (z.b. *.doc). Diese Files können nur von einem Programm gelesen werden,
welches mit dem Format kompatibel ist.
Folglich ist das HTML Format flexibler wenn es darum geht, die Formatierung zu ändern, während
ein Textverarbeitungsprogramm einfach übersichtlicher ist.
108/143
Was ist CSS und welche Hilfestellung bietet es beim Layout an?
CSS (Cascading Style Sheets) ist eine deklarative Sprache für Stilvorlagen von strukturierten
Dokumenten. CSS ermöglicht es extern Klassen zu definieren mit bestimmten Eigenschaften. Diese
Klassen können dann in einem Starttag angegeben werden.
Was sind Selektoren und welche gibt es?
Selektoren sind Muster, nach denen zu Formatierende Elemente ausgewählt werden können.
Selektoren:
.class
.intro
Selects all elements with class="intro"
#id
#firstname
Selects the element with id="firstname"
*
*
Selects all elements
element
p
Selects all <p> elements
Was sind zusammengesetzte Selektoren und wie können diese eingesetzt
werden?
Ein Schema für ein Element kann aus mehreren Selektoren zusammengesetzt werden.
Mögliche Verknüpfungen:
element,element
div,p
Selektiert alle <div> Elemente und alle <p> Elemente
element element
div p
Selektiert alle <p> Elemente innerhalb von <div> Elementen
element>element
div>p
Selektiert alle <p> Elemente deren Eltern Element ein <div>
Element ist
element+element
div+p
Selektiert alle <p> Ellemente die direkt nach einem <div> Element
platziert sind
element~element
p~ul
Selektiert alle <ul> Elemente deren Vorgänger ein <p> Element ist
Wo liegt das Problem bei einem via HTML­Tags tabellenorientierten
Design und wie kann hier CSS Abhilfe schaffen?
Problem:
●
●
●
●
Vermischt Layout mit Inhalt.
Seiten werden unnötig groß
Layout muss jedesmal neu geladen werden
Neudesign extrem kompliziert
109/143
●
Es ist schwer ein gleiches Layout für alle Seiten beizubehalten
Lösung: CSS
●
●
●
●
Klare Trennung von Layout und Inhalt
Layout muss nicht bei jeder Seite neu geladen werden
Redesigns werden einfacher
Einfacher wiederzuverwenden
Welche Ansätze gibt es, unterschiedliche Medien und Bildschirmgrößen
zu unterstützen.
CSS3 Media Queries machen es möglich, direkt im Stylesheet für unterschiedliche Displaybreiten
oder -höhen angepasste CSS-Klassen zu deklarieren.
@media screen and (min-width: 480px) and (max-width: 600px) {
.mediaquery {
background: #FF0000;
}
}
●
●
●
Per @media wird das Medium deklariert, z.B. screen oder print.
Nach dem Verknüpfungswort and folgt in runden Klammern ein Vergleichsstatement. Dies
kann z.B. die maximale oder minimale Breite (min-width oder max-width) oder Höhe (minheight oder max-height) festlegen, in dem eine bestimmte Klasse gelten soll.
Es können auch mehrere Statements per and miteinander kombiniert werden.
Wie können CSS­Formate eingesetzt werden?
External CSS
Das CSS File wird mit Folgendem Tag in das HTML File eingebunden:
<link rel="stylesheet" href="mystylesheet.css" type="text/css">
Im CSS File wird die Formatierung beschrieben. Hierfür wird das ganze File vom <style> Tag
umgeben:
<style type=”text/css”>
h1 {color:red;}
p {color:blue;}
...
</style>
Im HTML File (Embedded CSS)
Beim Embedded CSS befindet sich der <style> Tag, welcher die Formatierungsanweisungen umgiebt
nicht in einem Externen File sondern im HTML Files selbst.
110/143
im HTML Tag (InlineCSS)
Wie beim Hinzufügen eines Attributes
<tag style="color: red; margin-left: 17px;">
Was passiert, wenn mehrere CSS­Files verwendet werden?
Wenn mehrere CSS Files verwendet werden, so kann mittels dem media Attribut festgelegt werden,
wan welches File zur Anwendung kommt:
<LINK href="bildschirm.css" rel="stylesheet" type="text/css"
media="screen">
Mögliche Argumente für das media Attribut: all,screen, projection, print, handheld, tv
Wie unterstützt das Box­Modell von CSS das Design?
Box Modell: Für jedes Element wird eine rechteckige Fläche in CSS reserviert.
Aufbau von innen nach außen:
● Inhalt: für den Inhalt kann eine Breite (width) und eine Höhe (height) definiert werden
● Innenabstand: definiert den Platz zwischen Inhalt und Rahmen
● Rahmen: dem Rahmen kann eine Stärke mitgegeben werden, die Strichart und eine Farbe
(auch der Rahmen unsichtbar sein)
● Außenabstand: Abstand zu anderen Elementen
Was ist der Unterschied zwischen class/div/iframe?
●
class
Wird verwendet, wenn ein Layout mehrmals verwendet werden soll
111/143
●
●
div
Wird verwendet, wenn ein Layout nur einmal vorkommen soll
iframe Wird verwendet, wenn ein anderes Dokument in das momentane HTML File
eingebunden werden soll
Wie können überlagerte CSS­Formatierungen erkannt werden bzw. gibt
es einen Debugger bei der praktischen Anwendung?
Die meisten Browser bieten ein Inspect Element Tool an, mit dem man jedes Element einer Website
betrachten kann.
Wie kann das Layout dynamisch ausgetauscht werden?
CSS Eigenschaften können als Variable zu beginn des CSS-Files angelegt werden. Diese Variablen
können dann wiederum geändert werden, was zur Folge hat, dass alle Anwendungen dieser Variable
geändert werden.
z.B.: Farbe Speichern:
@server constants {
myColor: #FF00FF
}
h1 {
color: myColor
}
Link Tags für die CSS Files mit JS/jQuery suchen $(“link”)
Attribut “title” vergleichen linktags[i].title = CSS_STYLE1
Link Tags aktivieren / deaktivieren linktags[i].disabled = “true” /
”false”
Wie kann CSS verschachtelt werden?
Soll z.B. innerhalb eines Menüs eine unterschiedliche Formatierung vorgenommen werden, so kann
dies wie folgt erzielt werden:
P { color: red;}
.menue { border: 1px solid black;}
.menue P { color: blue;}
Befindet sich nun ein p Tag innerhalb eines Menüs, so wird dieser anders Formatiert als ein p-Tag
außerhalb eines Menüs. Der Vorteil liegt hier nicht unbedingt innerhalb der CSS- sondern in der
HTML-Datei. Man spart sich nämlich die Definition diverser Klassen.
Das Verschachteln von CSS Anweisungen bietet eine Menge Raum für Optimierungen.
21. Softwaretechnik (Oberauer)
Erkläre den Unterschied zwischen einem prozeduralen, objektorientierten und deklarativen
Paradigma? Was ist eine SW­Komponente, welches Modell steht hier Java zur Verfügung und wo
setzt Java dieses ein. Schnittstellentechnik unter Java (Eigenschaften, Einsatzbereich, Vorteil,
112/143
erfolgreicher Einsatz). Was versteht man unter einem POJO (Struktur, Verwendung, Abhängigkeiten,
Gründe für den Einsatz)? Was versteht man unter Inversion of Control (Erklärung, Beispiel,
Begründung für dessen Verwendung). Was versteht man unter Dependency Injection (DI) , wieso und
wie kann es eingesetzt werden (Beispiel). Annotationen unter Java (Definition, Vorteile,
Einsatzbereiche, DI , Beispiel). Wie können Abhängigkeiten vermieden/reduziert werden (Ansätze)?
Was versteht man unter dem „Seperation Of Concerns“­Ansatz? Was sind Generics unter Java und
wie kann diese Technologie helfen, die Softwarequalität zu verbessern? Wann sollen Generics
eingesetzt werden?
Paradigma
Ein Programmierparadigma unterstützt beim Erstellen von Algorithmen, kann aber auch eine
Herangehensweise voraussetzen / aufzwingen.
Prozedural
Beispiele: C, BASIC.
In der Prozeduralen Programmierung wird die Problemstellung in kleine Teilaufgaben aufgespalten.
Ein großes Programm besteht darum aus kleinen Unterprogrammen (Funktionen / Module) die jede
für sich einfacher zu beschreiben und testen ist als das Gesamtprogramm. Durch die Modularität
können auch Programmteile wiederverwendet werden. Module, die zu einem Aufgabengebiet
gehören werden oft in Bibliotheken zusammengefasst und werden somit für andere Projekte
wiederverwendbar.
Deklarativ
Beispiele: Haskell, LISP
Imperative Programmierung (prozedural und objektorientiert sind Teil dieser) gibt Befehle an, um
eine (manchmal virtuelle) Maschine zu steuern. Deklarative Programmierung (Funktional ist Teil
dieser) beschreibt lediglich wie man mit dem Eingabewert zum gewünschten Ergebnis kommt. Zur
Beschreibung werden Funktionen verwendet, welche man sich als eine Mathematische
Funktionsdefinition vorstellen kann. Deklarative Sprachen benutzen keine Variablen, außer die
Übergabeparameter deren Wert innerhalb der Funktion nicht verändert wird. Es gibt auch keine
äußeren Einflüsse auf die Funktionen (wie globale Variablen in C). Der Rückgabewert der Funktion ist
ausschließlich von den übergebenen Werten abhängig. Es ist weniger fehleranfällig und leichter zu
Testen.
Objektorientiert
Beispiele: JAVA, C#, C++
Auch hier wird wie bei der prozeduralen Programmierung das Programm in mehrere Module
unterteilt. Dadurch erreicht man auch eine hohe Wiederverwendbarkeit und Modularität wodurch
Unit-Tests erleichtert werden. Die Module werden Objekte genannt. Objekte sind selbstkontrolliert,
denn sie allein entscheiden, ob sie ihren Zustand ändern oder nicht. Man kann ein Objekt durch
Aufruf einer der Methoden auffordern den Zustand zu ändern aber es bleibt in dessen Hand, ob es
dies auch macht. Der Bauplan eines Objektes ist die Klasse. Es gibt immer nur eine Klasse zu den
113/143
selben Objekten, aber mehrere Objekte dieser Klasse.
Objektorientierte Programmierung erfüllt Kriterien, die die Entwicklung beschleunigen und die
Qualität verbessern können:
● Datenkapselung
○ Daten können nicht unkontrolliert von außen verändert werden
○ Das Objekt entscheidet, ob die Daten geändert werden oder nicht
● Austauschbarkeit
○ Objekte verbergen ihre tatsächliche Implementierung vor der Außenwelt, dadurch
sind sie austauschbar
● Vererbung
○ Eigenschaften und Funktionen können an andere Objekte weitergegeben werden
○ Das erbende Objekt kann diese übernehmen, verändern und überschreiben
● Polymorphie
○ Unterstützt die Austauschbarkeit
○ Die selbe Nachricht kann an unterschiedliche Objekte gesendet werden und damit
unterschiedliche Aktionen bewirken
Softwarekomponente
Eine SW-Komponente ist ein Teil einer Software, der mit anderen Softwareteilen zusammenwirken
kann. Zur Verbindung mit anderen Komponenten werden definierte Schnittstellen verwendet. Bei
Java ist eine solche Schnittstelle ein Interface. Eine Schnittstelle kann als Vertrag zwischen der
Komponente und dem Rest der Software betrachtet werden, denn sie definiert, wie andere
Softwareteile mit dieser Komponente interagieren können.
Arten von Schnittstellen:
● GUI (Graphical User Interface): Schnittstelle zwischen Mensch und Maschine
● CLI (Command Line Interface): Schnittstelle für das System, wenn Aufgaben ohne das Zutun
des Benutzers erledigt werden sollten
● Daten-Schnittstellen: Erlauben das Ein- und Auslesen von Daten der Komponente (Zugriff
Programmintern)
● API (Application Programming Interface): Ermöglicht die von der Komponente angebotenen
Funktionalitäten durch Programmierbefehle in Anspruch zu nehmen
Vorteile bei der Verwendung von SW-Komponenten ergeben sich bei der Flexibilität in der
Entwicklung, sowie aus der sich ergebenden Wiederverwendbarkeit von Komponenten.
Bei der Wiederverwendung gibt es mehrere Formen:
● Blackbox
○ Der Interne Aufbau der Komponente ist nicht bekannt
○ Die Komponente kann nicht angepasst werden, sondern muss so verwendet
werden wie sie zur Verfügung steht
● Whitebox
○ Der Interne Aufbau ist bekannt
○ Die Komponente kann verändert werden und an die Anforderungen angepasst
114/143
●
werden
Greybox
○ Ist eine Mischform aus den beiden oben genannten Formen
Java verwendet JavaBeans, um wiederverwendbare Softwarekomponenten zu erstellen. Ein Bean ist
eine Java-Klasse, welche den Bean-Konventionen folgt.
1.
2.
3.
4.
Die JavaBean Klasse muss Serializable oder Externalizable implementieren
Die JavaBean Klasse muss einen öffentlichen argumentlosen Konstruktor haben
Veränderung von Instanzvariablen geschieht über Getters und Setters
Alle Instanzvariablen sind private
Beispiele wo JavaBeans eingesetzt werden: Grafische Benutzeroberflächenkomponenten, DBSchnittstellen, Repräsentanten von Geräten (Schalter, Sensoren, ...).
Schnittstellen in Java (Interfaces)
Ein Interface ist eine Schnittstellendefinition und wird durch das Schlüsselwort “interface” definiert.
Klassen können Interfaces implementieren (Schlüsselwort “implments”) und müssen damit die im
Interface definierten Methoden implementieren. Eine Klasse kann mehrere Interfaces
implementieren und ein Interface kann von mehreren Klassen implementiert werden.
Ein großer Einsatzbereich für Interfaces in Java ist bei der GUI-Entwicklung. Hier gibt es vordefinierte
Interfaces zum Reagieren auf Benutzereingaben (Drücken eines Buttons, Maus über etwas bewegen,
…). Interfaces sind gut, um Softwareteile wiederverwenden zu können, aber auch die
Austauschbarkeit von Softwareteilen kann mit ihnen gewährleistet werden. So ist ein weiterer
Einsatzbereich von Interfaces bei der Bereitstellung von Daten. Ein Interface wird definiert als
Lieferant von Daten. Wird die Implementierung im Hintergrund von einem Dateizugriff auf eine DB
umgeschrieben, merkt die Software nichts davon, da diese nur das Interface und dessen Methoden
kennt. Interfaces werden auch benötigt um zum Beispiel Dependency Injection durchzuführen.
Pojo (Plain Old Java Object)
Ein Plain Old Java Object ist ein Java-Objekt, welches sich nur an die Vorgaben der grundlegenden
Java-Spezifikation hält, und somit unabhängig von äußeren Strukturen und Vorgaben ist. Ein POJO
sollte darum die folgenden Dinge nicht machen:
1. Throws Klauseln beinhalten
2. Die Vorgabe ein Callback Interface zu implementieren
3. Erweiterung bereits vorhandener Klassen (extends)
4. Spezifizierte Annotationen verwenden (teilweise nicht umgehbar)
5. Implementierung bereits vorhandener Interfaces
Ein Beispiel für ein POJO kann ein JavaBean sein, denn ein einfaches Bean hat keine Abhängigkeiten.
Verwendet werden POJOs oftmals zur Übertragung von Daten. Zum Beispiel verwendet Hibernate
POJO-Klassen um Tabellen darzustellen. Die Instanzen dieser Klasse sind dann die DB-Einträge.
115/143
Je unabhängiger Komponenten vom Rest der Software ist, umso besser ist die
Wiederverwendbarkeit realisierbar. Ein POJO hängt nicht von irgendwelchen Libraries oder
Interfaces ab.
Inversion of Control
Bei Inversion of Control und Dependency Injection geht es darum, Abhängigkeiten zu vermindern.
IoC wird mit der Verwendung des “Hollywood Prinzips”: “Don’t call us, we call you!” realisiert.
Ein Beispiel:
In einen TextEditor soll eine Rechtschreibprüfung integriert werden.
Ohne DI / IoC
Mit DI / IoC
public class TextEditor
{
private SpellChecker checker;
public TextEditor()
{
checker = new
SpellChecker();
}
}
public class TextEditor
{
private ISpellChecker checker;
public TextEditor(ISpellChecker
checker)
{
this.checker = checker;
}
}
Bei dem Beispiel ohne DI / IoC wird eine Instanz der Konkreten Klasse “SpellChecker” angelegt. Die
Kontrolle liegt beim TextEditor und dieser ist auch abhängig von SpellChecker. Mit IoC wird die
Kontrolle, welche Rechtschreibprüfung verwendet wird, abgegeben an die Klasse, welche den
TextEditor anlegt. Die Abhängigkeit des TextEditors von der konkreten Rechtschreibprüfungs-Klasse
wird entfernt durch die Verwendung eines Interfaces “ISpellChecker”. Wir injizieren die Abhängigkeit
in den TextEditor.
Die Verwendung von DI / IoC rechtfertigt sich damit, dass nun verschiedene SpellChecker verwendet
werden können, und nicht dauerhaft festgelegt ist, welcher verwendet wird.
Dependency Injection
Arten von DI:
● Setter Injection: Das DI-Framework sorgt über die Setter-Methode dafür, dass ein
benötigtes Modul injiziert wird.
● Constructor Injection: Beim Constructor Injection werden die benötigten Module als
Argument des Konstruktors einer Klasse übergeben.
● Interface Injection: Hier erfolgt die Injektion über explizit implementierte Schnittstellen
(interfaces) sowohl auf Seiten des genutzten Moduls als auch vom nutzenden Modul. Diese
Möglichkeit der Injektion wird in der Praxis jedoch vermieden, da sich durch die
Implementierung der Interfaces wiederum Abhängigkeiten ergeben.
116/143
Beispiel Resource Injection:
@Resource(name="jdbc/shakespeare")
DataSource ds;
Über Java Naming and Directory Interface (JNDI) wird der Variable “ds” eine Instanz zugewiesen.
Dies geschieht zur Laufzeit ohne Zutun des Benutzers. Die nötigen Parameter und Informationen, die
JNDI braucht um ein passendes Objekt anzulegen sind in der “WebContent/META-INF/context.xml”
Datei definiert. Die Namen müssen hierbei übereinstimmen, da mehrere Ressources definiert
werden können und es somit gut ist, wenn diese eindeutig identifizierbar sind.
<Context crossContext="true">
<Resource name="jdbc/shakespeare" auth="Container"
type="javax.sql.DataSource"
maxActive="10" maxIdle="30" maxWait="100"
username="myservice"
password="!1”2§3$4%5"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://172.16.59.135/myserviceDB"/>
</Context>
Annotationen
Eine Java-Annotation wird mit dem “@” Zeichen eingeleitet und liefert dem Java Code Metadaten.
Neben Annotationen können diese Daten auch via XML bezogen werden. Eine Annotation kann
Elemente (Parameter) enthalten, muss aber nicht:
● @Entity
● @Deprecated
● @WebServlet(urlPatterns = { "/ShakespeareServl" })
● @Resource(name = "jdbc/shakespeare")
Die Vorteile, die sich aus der Benutzung von Annotationen ergeben ist dass der Compiler überprüfen
kann wo und wann Annotationen verwendet werden können wenn diese definiert sind. Auch der
Quellcode wird leichter lesbar, da die Metadaten wirklich im Quellcode zu sehen sind. Ein Nachteil
ist, dass bei Änderungen an Annotationen das Programm erneut kompiliert werden muss, was bei
XML nicht nötig ist.
Ein Anderer Vorteil ist, dass Annotationen dem Entwickler helfen, eventuelle Fehler aufzuspüren.
Wenn zum Beispiel eine Library aktualisiert wird, und sich der Name einer Methode, die
überschrieben wird geändert hat, zeigt der Compiler einen Fehler an weil die Subklasse die Methode
überschreiben soll und dazu die Annotation @Override angegeben ist. Wäre diese nicht da, würde
kein Fehler auftreten und die Fehlersuche dauert länger.
Annotationen werden eingesetzt, um
1. Compileranweisungen zu geben
2. Build-time Anweisungen zu geben
3. Laufzeitanweisungen (Runtime) zu geben
Der Build Prozess besteht aus: Sourcen generieren, Sourcen compilieren, XML Dateien generieren,
Packen in JAR File, …
117/143
Java besitzt bereits eingebaute Annotationen wie @Deprecated, @Override, @SuppressWarnings
Separation of Concerns
Separation of Concerns befasst sich mit dem Aufteilen der Software in Bereiche, die voneinander
unabhängig sein sollten. Die Datenhaltung sollte unabhängig von der Darstellung sein. Wenn man
zum Beispiel von einer Datei auf eine Datenbank umstellt, sollte der Code, der für die Darstellung
zuständig ist nicht geändert werden müssen. Ein Beispiel ist das MVC-Modell welches beschreibt, in
welche Teile Software gegliedert wird, um Abhängigkeiten zu vermeiden.
Java Generics
Generics vermindern das Risiko für Laufzeitfehler, da eventuelle Typenfehler bereits bei der
Kompilierung in den Bytecode erkannt werden. Gefährliche Casts (Typumwandlungen) sind nicht
mehr nötig, da garantiert ist, dass sich keine anderen Typen beispielsweise in einer Liste befinden.
Generics sollten immer eingesetzt werden, wenn eventuelle Typenfehler auftreten können, aber
auch, wenn Code widerverwendet werden soll. Generische Algorithmen können für verschiedene
Datentypen verwendet werden. Ein Beispiel wäre eine Klasse, die Werte aus 2 Listen in eine neue
Liste einfügt.
public class ListenZusammenfueger
List<Integer> addiereAlle(List<Integer> l1, List<Integer> l2);
Wenn man diese Implementierung verwendet, kann der Code nur für Integer Listen verwendet
werden.
public class ListenZusammenfueger<T>
List<T> fuegeZusammen(List<T> l1, List<T> l2);
Diese Implementierung kann für Listen mit allen Datentypen verwendet werden.
22. Ajax Web Client
Was versteht man unter statisches/dynamisches HTML? Wo bzw. wie können HTML­Seiten generiert
werden? Was versteht man unter dem DOM­Modell und wofür wird es verwendet – erläutere dies an
Hand des DOM­Modells für die Struktur eines HTML­Files. Was ist der Nachteil von konventionellen
bzw. generierten Web­Seiten und wie kann dieser behoben werden. Was versteht man unter Ajax –
auf
welchen Komponenten basiert es? Welche Vorteile bietet eine asynchrone Kommunikation; welche
Voraussetzungen müssen gegeben sein? Welche sicherheitstechnische Probleme müssen beim
Einsatz der Ajax­Technologie bedacht werden. Welche Vor­/Nachteile ergeben sich aus dem Einsatz
von Ajax? Welche Voraussetzungen/Ressourcen müssen für den Einsatz von Ajax erfüllt/vorhanden
sein (client­/serverseitig)?
118/143
Was versteht man unter statisches/dynamisches HTML?
Statisches HTML
Es werden hier das Aussehen und der Inhalt einer HTML-Seite fest im Code verankert.
Der Client lädt diese Seite vom Server herunter, bei Änderungen und neuem Inhalt muss die
gesamte Seite erneut vom Webserver geladen werden.
Dieses Verfahren sollte am besten bei fixen Texten und Seiten deren Inhalt länger bestehen bleibt
angewendet werden. Auch bei kleinen Firmenauftritten, die nur Informationen bereitstellen ist diese
Verfahren durch aus anwendbar.
Statische HTML-Seite = Zeitung
Um neue Informationen in einer Zeitung lesen zu können, muss man sich die neueste Ausgabe
kaufen. Die neueste Ausgabe muss jedoch zuvor geschrieben und gedruckt werden.
Bei statischen Webseiten ist es ähnlich: für Änderungen muss der Quellcode geändert werden und
am Server bereitgestellt werden. Außerdem muss der Client die Webseite herunterladen.
Dynamisches HTML
Bei dynamischen HTML wird die Seite (oder Teile der Seite) mit den neuesten Daten zur Laufzeit
generiert.
Hierfür kann ein Servlet eingesetzt werden. Der Client macht eine Anfrage und der Server lädt, dann
die angeforderten Daten aus verschiedenen Datenbanken und anderen Datenquellen. Hat der Server
die Daten, so baut dieser ein HTML-Dokument individuell für den Client zusammen und schickt es
dem Client.
Das Servlet/Skript oder der Eingangsserver werden auch Applikation-Gateway genannt. Wichtig: hier
laufen alle Anfragen ein und können auf verschiedene andere Server/Anwendung weitergeleitet
werden, die dann ihre entsprechende Arbeit erledigen und ihre Ergebnisse dem Gateway zurück
senden.
Bei dynamischem HTML kann auch auf Benutzereingaben reagiert werden. Beispielsweise gibt der
Benutzer ein Suchwort ein und es wird in der Datenbank nach allen Einträgen gesucht die dieses
Wort enthalten. Diese Einträge werden dem Benutzer wieder zurückgesendet. Der Benutzer
bekommt eine individuell angepasste HTML-Seite (oder Teilseite) zugesandt.
Beispiele für dynamische Effekte am Client:
● das Erscheinen („Aufklappen“) eines Menüs
● die Hervorhebung eines Textes
● die Möglichkeit, Objekte durch Drag & Drop auf dem Bildschirm zu verschieben
● Formularfelder automatisch in Abhängigkeit von anderen Feldern zu belegen
● Webseiten, die sich wie clientseitige Anwendungsprogramme bedienen lassen.
Wo beziehungsweise wie können HTML Seiten generiert werden?
Die HTML Seiten können an verschiedenen Servern und von verschiedenen Servlets/Skripten
generiert beziehungsweise erweitert werden. Diese werden meist an einer gesammelten Stelle
119/143
(Applikation Gateway) zusammengestellt.
Es können aber auch Teilaufgaben vom Client erledigt werden, zum Beispiel mit JavaScript. Zum
Beispiel kann die Richtigkeit eines Formulareintrages bereits am Client geprüft werden. Somit wird
eine Anfrage nur an den Server gesendet, wenn die Einträge richtig sind. Der Server muss nicht auf
die Richtigkeit prüfen und dass spart wiederum Verarbeitungszeit am Server.
Weiters kann auch das DOM-Modell manipuliert werden und es kann der Inhalt von einzelnen DOMModell Einträgen angepasst werden.
Was versteht man unter dem DOM-Modell und wofür wird es verwendet –
erläutere dies an Hand des DOM-Modells für die Struktur eines HTMLFiles.
DOM steht für Document Object Modell und beschreibt eine Schnittstelle für den Zugriff auf HTML
oder XML-Dokumente. Das DOM-Modell wird zur Manipulation von Daten in einem HTML/XML File
verwendet, es kann somit zur Laufzeit ein bereits existierendes HTML/XML File verändert und
individuell angepasst werden.
Beispiel
Diese obige Verschachtelung kann man sich auch als Baum denken:
Das Root (Wurzel) Element ist hierbei table, dessen Kinder (children) sind thead und tbody und so
weiter. Jedes Element hat nur ein Parent (Eltern) Element, bis auf die Wurzel die hat kein Eltern
Element. Weiters sind thead und tbody Geschwister, weil sie beide das gleiche Elternelement
120/143
besitzen.
Der Aufbau des DOM-Modell variiert von Webseite zu Webseite und die einzelnen Browser können
auch HTML-Befehle intern anders darstellen. Der Programmierer muss aber seine eingene Seite
kennen und wissen wie sie aufgebaut ist, so kann er das Modell richtig bearbeiten.
Was ist der Nachteil von konventionellen bzw. generierten Webseiten
und wie kann dieser behoben werden?
Vorteile/Nachteile statisches HTML
●
●
Schnelles Laden
Einfache Entwicklung
●
●
Änderungen müssen im Quellcode vorgenommen werden → schnell veraltete Daten
Nicht an Benutzer anpassbar
Vorteile/Nachteile dynamisches HTML
●
●
●
Individuell anpassbar
Kann auf Benutzer reagieren
Nur noch der Teil muss geladen werden, der verändert wird
●
Generierung der Seite kann länger dauern, weil Inhalt erst zusammen gesammelt werden
muss. Abhilfe: Verteiltes System und Parallelisierung von Servern und Ressourcen.
Was versteht man unter Ajax?
AJAX-Asynchronous JavaScript and XML; AJAX bezeichnet ein Konzept der asynchronen
Datenübertragung zwischen dem Browser und dem Server. Das heißt es ist möglich, HTTP-Anfragen
durchzuführen, während eine HTML-Seite angezeigt wird, und die Seite zu verändern, ohne sie
komplett neu zu laden.
Kommen die Daten beim Client an, so werden diese verarbeitet, der Client wartet nicht nur auf die
Antwort (Busy-Waiting) sondern kann derweil seine Aufgabe fortsetzen.
121/143
Beim AJAX-Modell wird am Client eine JavaScript Funktion eingeschoben, die den AJAX Call absetzt
und die Daten anschließend für den Client aufbereitet, in dem sie mittels DOM-Modell das geladene
HTML-Dokument bearbeitet.
Am Server wird ein HTML oder XML File zusammengestellt und dem Client gesendet. Es kann aber
auch ein JSON (JavaScript Object Notation) Format angewendet werden.
Komponenten von AJAX
Eine Ajax-Anwendung basiert auf folgenden Web-Techniken:
● HTML (oder XHTML)
● Document Object Model (DOM) zur Repräsentation der Daten oder Inhalte, damit kann die
aktuelle Seite verändert werden und muss nicht neu geladen werden
● JavaScript zur Manipulation des Document Object Models und zur dynamischen Darstellung
der Inhalte. JavaScript dient auch als Schnittstelle zwischen einzelnen Komponenten.
● Das XMLHttpRequest-Objekt, Bestandteil vieler Browser, um Daten auf asynchroner Basis
mit dem Webserver austauschen zu können.
Vorteile asynchrone Kommunikation
Man kann Teile einer Webseite austauschen und muss nicht die gesamte Seite austauschen, wenn
neue Informationen verfügbar sind.
Der Client muss nicht aktiv auf die Antwort des Servers warten, sondern kann währenddessen etwas
anderes tun.
122/143
Voraussetzungen für Asynchrone Kommunikation
Es muss bestimmte Befehle geben, die dem Client das Ankommen der Daten signalisieren und
verdeutlichen, dass die Daten angekommen sind. Weiters muss es möglich sein vom Client aus
mehrere Anfragen periodisch abzusetzen.
Welche sicherheitstechnischen Probleme müssen beim Einsatz der Ajax­
Technologie bedacht werden?
Da JavaScript verwendet wird kann auch Schadcode am Browser ausgeführt werden
(XMLHttpRequest Objekt).
Cross-Site-Scripting (XSS; deutsch Websiteübergreifendes Scripting) bezeichnet das Ausnutzen einer
Computersicherheitslücke in Webanwendungen, indem Informationen aus einem Kontext, in dem
sie nicht vertrauenswürdig sind, in einen anderen Kontext eingefügt werden, in dem sie als
vertrauenswürdig eingestuft werden. Aus diesem vertrauenswürdigen Kontext kann dann ein Angriff
gestartet werden. Das heißt es kann Schadcode als harmlose AJAX-Daten getarnt werden.
XSS–Angriffe vor Ajax hatten grundsätzlich eine sehr kurze Lebensdauer in der Applikation. Klickte
ein Benutzer auf einen von einem Angreifer modifizierten Link, so wurde der darin eingebettete
Script–Code einmalig ausgeführt. Wollte man dem Scriptcode jedoch eine längere Lebenszeit im
Browser ermöglichen, musste man mit allerhand Tricks arbeiten – was wiederum sowohl das Risiko
der Angriffserkennung durch den Benutzer als auch die Komplexität des Angriffs und somit dessen
Fehleranfälligkeit erhöhte.
Mit Ajax ist es wesentlich einfacher möglich, Scriptcode so in den Browser einzubetten, dass dieser
so lange im Hintergrund läuft, bis der Browser beendet wird. Damit sind beispielsweise Angriffe
denkbar, die mittels einer XSS–Attacke alle beim Surfen des Benutzers anfallenden Daten im
Hintergrund zum Angreifer sendet.
Es können Daten regelmäßig vom Server auf den Client gesendet werden, somit kann auch
Schadcode sehr einfach an den Client übertragen werden. Der Benutzer bekommt von dem ganzen
nichts mit und kann auch nicht in die Übertragung des Schadcodes eingreifen.
Weiters sollte nicht alles auf den Client ausgelagert werden (Preisberechnungen), denn diese können
von Client manipuliert werden. Außerdem ist es ratsam die Benutzereingaben zu kontrollieren und
so minimal wie möglich zu halten.
Wie auch beim synchronen Zugriff kann auch beim asynchronen Zugriff eine Denail of Service
Attacke oder SQL Injection vorgenommen werden.
Die Daten werden bei AJAX nicht automatisch verschlüsselt sondern werden im Klartext versandt
(Man in the Middle Attacke).
123/143
Welche Vor-/Nachteile ergeben sich aus dem Einsatz von Ajax?
Vorteile
●
●
●
Dynamisches Laden von Inhalt, ohne die komplette Seite neu zu laden.
Kein eigenes Browser-Plugin notwendig, da nur JavaScript verwendet wird.
Weniger Datenverkehr, da nur Teile der Daten geladen werden.
Nachteile
●
●
●
Schadcode kann sehr einfach über JavaScript injiziert werden und der Benutzer bekommt
das nicht mal mit.
AJAX verschlüsselt nicht automatisch den Inhalt.
AJAX-Verwendung bei größeren Webseiten komplex und schwerer zu verstehen.
Welche Voraussetzungen/Ressourcen müssen für den Einsatz von Ajax
erfüllt/vorhanden sein (client­/serverseitig)?
Serverseitig
Am besten es existiert ein verteiltes System und die Anfragen können auf mehrere Server verteilt
werden. Wenn Daten aus einer Datenbank angefragt werden, sollten StoredProcedures
implementiert werden, damit hier eine schnellere Anbindung möglich ist. Weiters muss am Server
die richtige Formatierung der Daten vorgenommen werden (JSON-Formatter).
Clientseitig
Hier wird jQuery (also eigentlich JavaScript) benötigt, das heißt es muss erlaubt sein JavaScript im
Browser auszuführen. Es muss auch nicht unbedingt JQuery lokal als Bibliothek vorhanden sein, oder
am Server liegen, es reicht, wenn man auf eine Google-Libary verweist.
124/143
23. JavaScript
Warum wird JavaScript bei WebClients so häufig eingesetzt? Gehe auf die Sprachkonstrukte von
JavaScript näher ein. Wie unterscheidet sich ein JavaScript­Objekt von einem Java­Objekt?
Unterstützt Java­Script das objektorientierte/prozedurale oder beide Paradigmen (Begründe deine
Antwort). Was versteht man unter einem Closure generell und wie wird dies in JavaScript eingesetzt?
Können unter JavaScript Java­Objekte genutzt werden? Gibt es einen Debugger für JavaScript? Was
ist der Unterschied zwischen einer Funktion und einem Object? Wie kann unter JavaScript ein Objekt
erzeugt werden. Kann ein JavaObject zur Laufzeit verändert werden (Begründung). Wie unterstützt
JavaScript das HTML­DOM­Objekt. Wie können einzelne Tags gefunden und manipuliert werden?
Kann man JavaScript­Code schützen (d.h. Kopierschutz)? Was versteht man unter dem
Closure­Konzept ­ erkläre dies an Hand eines Beispiels. Wie unterstützen andere
Programmiersprachen wie Java oder C/C++ dieses Konzept? Was versteht man unter einer anonymen
Funktion ­ erkläre dies an Hand eines Beispiels. Was versteht man unter einem
Callback­Mechanismus ­ wie unterstützt JavaScript dieses Konzept ­ erkläre dies an Hand eines
Beispiels.
Warum wird JavaScript bei WebClients so häufig eingesetzt?
JavaScript ist eine Script-Sprache, die innerhalb von HTML-Dokumenten verwendet wird. Es
ermöglicht es, Nutzerinteraktionen auszuwerten und Inhalte zu verändern, nachzuladen oder zu
generieren und erweitert so die Möglichkeit von HTML/CSS. Java-Script ist eine sehr kompakte
Sprache; der Umfang von JavaScript ist überschaubar, darüber hinaus benötigt es keinen Compiler
und ist somit sehr beliebt zum generieren von dynamischen Web-Seiten.
Gehe auf die Sprachkonstrukte von JavaScript näher ein:
Die Sprache an und für sich ist universell, Rekursion ist möglich, allerdings wird die Sprache nur
innerhalb einer HTML-Seite oder von den meisten Webservern unterstützt. Stand-alone
Anwendungen kann man mit JavaScript-Anwendungen nicht realisieren - einfach, da die JavaScriptInterpreter nur in Browsern bzw. Webservern implementiert sind und die Sprache mit ihren
Objekten auch nur für diesen Zweck vorgesehen ist.
Gerade durch das enge Zusammenspiel von HTML und JavaScript sind Syntaxfehler, hervorgerufen
durch unterschiedliche Groß- und Kleinschreibung, vorprogrammiert:
●
●
HTML ist NICHT casesensitiv, so dass der Programmierer mit der Schreibweise großzügig
umgehenkann. Ob <hTml>, <HTML> oder <Html> ist den Browsern und somit auch den
meisten Programmierern egal.
JavaScript hingegen ist casesensitiv und versteht bei unterschiedlicher Groß- und
Kleinschreibung keinen Spaß: a und A ist hier nicht die selbe Variable.
JavaScript weist übliche Sprachkonstrukte auf:
125/143
●
●
●
●
●
●
Variablen und Werte
○ Beispiel: var wert = 12; var wert = „String“, var wert = 12.34;...
Funktionen
○ Beispiel: function konto(Nr, Betrag){}, function abheben(limit, betrag){};
Operatoren:
○ Zuweisungsoperatoren, Bit-Operatoren, Logische Operatoren,
Berechnungsoperatoren
Bedingte Anweisungen
○ Entweder-Oder Anweisung -> if-else Fallunterscheidungen -> Switch
Schleifen
○ while, do-while, for,
Event-Handler
○ Zum Beispiel: oncklick, onchange, onmousemose, onreset, onerror...usw.
Wie unterscheidet sich ein JavaScript-Objekt von einem Java-Objekt?
In einem Javascript Objekt können alle möglichen Daten gesammelt werden – von einfachen ganzen
Zahlen bis hin zu Arrays und zu anderen Objekten. Die Eigenschaften eines Javascript-Objekts
können wir uns als besondere Variable einer Javascript- Funktion vorstellen, auf die von außerhalb
der Funktion zugegriffen werden kann. Um es einfach zu machen: Was außerhalb von Objekten als
Variable definiert wird, heißt innerhalb von Objekten »Eigenschaft«. Der Unterschied zu Java ist,
dass für ein Java-Objekt immer eine Klasse (ein Modell) vorhanden sein muss. Diese Klasse definiert
die Eigenschaften und Funktionen eines Objektes. In JavaScript benötigt man keine Klasse und kann
einer einfachen Variable alle Eigenschaften (wieder Variablen) und Funktionen hinzufügen.
Zusammengefasst, basiert das Objekt-Modell von JavaScript nicht auf Klassen, sondern auf
Prototypen. Das heißt, es gibt keine Klassen, sondern nur Objekte. Wenn man z. B. eine Funktion
definiert, so wird implizit mit der Funktion auch direkt ein Objekt angelegt.
Unterstützt Java-Script das prozedurale/objektorientierte oder beide
Paradigmen?
In JavaScript kann man prozedural entwickeln, also ganz einfach über Funktionen. Es gibt aber auch
die Möglichkeit, objektorientiert/-basiert zu programmieren. Zur prozeduralen Programmierung
muss nicht viel gesagt werden. In Java-Script kann man eine Prozedur (einen Ablauf; zum Beispiel,
dass auslesen eines Formulars) ausprogrammieren mit verschiedenen Anweisungen und Funktionen.
Man kann auch Objektorientiert Programmieren mit Java-Script, der Ansatz dafür ist jedoch anders,
als bei den meisten objektorientierten Sprachen. Mit JavaScript formt man sich ein Objekt mithilfe
einer Variable, dieser werden verschiedene Variablen (Eigenschaften) und Funktionen (Methoden)
hinzugefügt.
126/143
Was versteht man unter einem Closure?
( HINWEIS: Im folgenden Link findet ihr eine weitere Erklärung bzw Beispiele zu Closure falls dieses
hier unklar sein sollte. Möchte nicht weiteren Text in die Ausarbeitung kopieren.
https://developer.mozilla.org/de/docs/JavaScript/Guide/Closures )
Ein Closure (oder Funktionsabschluss) ist eine Funktion, die Zugriff auf den Erstellungskontext einer
anderen Funktion hat. Beim Aufruf greift die Funktion dann auf diesen Erstellungskontext zu, selbst
wenn der Kontext außerhalb der Funktion nicht mehr existiert. Ein Closure ist somit ein Zugriff auf
eine sonst nicht mehr vorhandene Speicherstruktur (closed term). Erreicht wird dies meist durch
zwei verschachtelte Funktionen - die Hauptfunktion wird mit einer weiteren Funktion
„abgeschlossen“, die auf den Erstellungskontext der Hauptfunktion zugreift und ihn damit erhält. Ein
Closure ist ein Ausdruck in der Variablen vorkommen, welche an eine bestimmte LaufzeitUmgebung gebunden sind.
Im Beispiel verwendet die Funktion InnerFunction die lokale Variable localVar und das Argument arg
der äusseren Funktion OuterFunction, in welcher sie definiert ist. Nun wird aber InnerFunction nicht
in OuterFunction aufgerufen, sondern als Returnwert zurückgegeben und an f1 bzw. f2 zugewiesen.
Wird nun InnerFunction durch Aufruf von f1() bzw. f2() ausgeführt, stellt sich die Frage, welche
Werte haben nun die Variablen arg und localVar in diesem Moment? OuterFunction ist ja in diesem
Moment nicht aktiv, wird nicht ausgeführt und die Variablen arg und localVar sind eigentlich zu
diesem Zeitpunkt nicht existent! Gibt es eine Fehlermeldung?
Closures
Closures erlauben inneren Funktionen (Funktions-Definitionen und Funktions-Ausdrücke innerhalb
einer äußeren Funktion) auf alle lokalen Variablen, Argumente und deklarierten inneren Funktionen
innerhalb der äußeren Funktion zuzugreifen. Ein Closure wird erzeugt, wenn eine dieser inneren
Funktionen außerhalb der äußeren Funktion referenzierbar gemacht wird, so dass die innere
127/143
Funktion aufgerufen werden kann, nachdem die äußere Funktion beendet worden ist. Die so
aufgerufene innere Funktion InnerFunction hat dann immer noch Zugriff auf all die lokalen
Variablen, Argumente und inneren Funktionen von OuterFunction. Diese lokalen Variablen,
Argumente und inneren Funktionen haben dann die Werte, die sie hatten, als die äußere Funktion
ausgeführt worden ist, und diese Werte können von InnerFunction gelesen und verändert werden.
Für jede Instanz von InnerFunction (f1 und f2 im Beispiel) wird ein eigener Satz der lokalen
Variablen, Argumente usw. mit den Werten gespeichert, die beim Aufruf von OuterFunction gerade
aktuell waren!
Wie wird das gemacht?
Zum Zeitpunkt, wo OuterFunction ausgeführt wird, wird auch die Deklaration von InnerFunction
ausgeführt. Dabei wird InnerFunction kompiliert und es entstehen intern Referenzen auf die lokalen
Variablen und Argumente von OuterFunction (arg, localVar). Wenn OuterFunction beendet ist,
werden normalerweise alle Argumente und lokalen Variablen gelöscht. Da aber InnerFunction noch
Referenzen auf diese Variablen hat, können diese erst gelöscht werden, wenn InnerFunction
gelöscht wird. InnerFunction wird jedoch den globalen Variablen f1 bzw. f2 zugewiesen und deshalb
nicht gelöscht. So bleiben auch die Variablen arg und localVar mit ihren aktuellen Werten erhalten
und InnerFunction bzw. jetzt f1 oder f2 können darauf zugreifen.
Interessant ist, dass f1 und f2 zwei verschiedene Instanzen von InnerFunction enthalten. Jede dieser
Instanzen hat ihren eigenen Satz von arg und localVar mit den Werten, die beim Erzeugen der
Instanzen von InnerFunction aktuell waren!
Verwendung
Eine Hauptanwendung von Closures sind Callback-Funktionen oder Event-Handler. Oftmals vermisst
man die Möglichkeit, einem Event-Handler ein Objekt mitzugeben, für welches er dann aufgerufen
wird. Über Closures kann man dies elegant machen.
Callback Funktion
Eine Callback-Funktion ist eine Funktion, die als Prototyp von einer anderen Funktion definiert wird.
Diese andere Funktion kann man dann mit einem Funktionszeiger aufrufen, der auf eine Funktion
zeigt, die diesem Prototypen entspricht und dann unsere Funktion aufruft.
Können unter JavaScript Java­Objekte genutzt werden?
Die meisten Browser beinhalten inzwischen die "Java Virtual Machine ", die nicht nur dafür zuständig
ist, Java-Programme auszuführen, sondern auch die unterschiedlichen Programmiersprachen Java
und JavaScript befähigt, miteinander über den Browser zu kommunizieren. Dies hat den Zweck, die
Vorteile der jeweils anderen Sprache verfügbar zu machen. Netscape schuf hierfür in Anlehnung an
den ursprünglichen Namen von JavaScript – LiveScript – den werbewirksamen Begriff "LiveConnect".
Der unmittelbare Konkurrent, der Microsoft Internet Explorer, versteht wie der Netscape Navigator
sowohl Java als auch JavaScript. Allerdings wird im Internet Explorer die Kommunikation mit Java
nicht über LiveConnect, sondern über spezielle Objekte ausgeführt.
128/143
Eine Weitere Form bietet die Möglichkeit mit JavaScript auf Java Programmierten Servlets zu
kommunizieren.
Gibt es einen Debugger für JavaScript?
Auch für JavaScript gibt es Debugger, welches ein Werkzeug zum Diagnostizieren und Auffinden von
Fehlern in Computersystemen ist. Diese sind Browser abhängig:
● Firefox – Firebug
● Internet Explorer – Microsoft Script Debugger, DebugBar, Companion.JS
● Opera – Opera Dragonfly
● Safari – Drosera JavaScript Debugger, Web Inspector
Was ist der Unterschied zwischen einer Funktion und einem Objekt?
Objekte sind Behälter für logisch zusammen gehörende Variablen und Funktionen, die als
Eigenschaften und Methoden des Objekts bezeichnet werden. Objekte kapseln Daten und Logik nach
außen ab und bieten eine einfache Schnittstelle zu ihren Elementen.
Funktionen sind ein Block von Anweisungen mit einem Namen. Der Funktionsblock wird einmal
definiert: Dann können die Javascript-Befehle der Funktion über den Namen mehrfach im Programm
aufgerufen werden.
Das Zusammenfassen von Befehlen in einer Funktion verbessert obendrein die Lesbarkeit des
Scripts.
Wie kann unter JavaScript ein Objekt erzeugt werden.
Um ein eigenes Objekt anzulegen, sind zwei Schritte nötig. Zuerst müssen Sie das Objekt selbst und
seine Eigenschaften "deklarieren". Im zweiten Schritt können Sie anschließend eine Instanz dieses
Objekts definieren. Mit dieser Objektinstanz können Sie dann Programmprozeduren durchführen.
Ein Objekt fasst Daten und Funktionen unter einem Namen zusammen, z.B. ein Objekt Konto:
Objekte werden in einem zweistufigen Prozess erzeugt:
1. Die Deklaration eines Objekts legt eine Vorlage für ein Objekt an.
129/143
2. Der new-Operator erzeugt die Datenstruktur – man sagt dazu das Objekt wird instanziert.
Das erzeugt ein Javascript-Objekt mit den Eigenschaften betrag und text.
Die Elemente werden über den Namen des Objekts gefolgt von einem Punkt gefolgt von dem Namen
der Variablen oder Funktion angesprochen.
Wie unterstützt JavaScript das HTML-DOM-Objekt?
Das Document Object Model (DOM) ist eine vom W3-Konsortium verabschiedete Norm, die
zunächst einmal den Programmiersprachen-Zugriff auf beliebige Elemente eines
Auszeichnungssprachen- Dokuments beschreibt. Das DOM ist also weder selber eine eigene
Programmiersprache, noch ist es auf HTML beschränkt. Es definiert lediglich Objekte, Eigenschaften
und Methoden, die eine Programmiersprache umsetzen sollte, wenn sie sich DOM-fähig bezeichnen
will. Anwendbar sollen diese Objekte, Eigenschaften und Methoden auf alle Dokumente sein, die in
einer XML-gerechten Auszeichnungssprache geschrieben sind. Das W3-Konsortium betont
ausdrücklich, dass das DOM nicht einfach nur eine Norm für "Dynamic HTML" sein soll. Das DOM ist
auch nicht auf die Client- Seite, also etwa den Web-Browser beschränkt. Ebensogut lässt es sich in
serverseitigen Programmen, z.B. in CGI-Scripten einsetzen, um Dokumente dynamisch zu erzeugen.
1998 erstmals als offizielle W3C-Empfehlung herausgegeben, wurde es im Internet Explorer 5.0 und
in dem von der Mozilla-Entwicklergemeinde völlig neu programmierten Netscape-Browser, den
Netscape selber unter der Version 6.0 anbot, implementiert (JavaScript-Version 1.5). Die
Implementierung ist in den heutigen Browsern noch nicht vollständig. Immer wieder wird man als
Programmierer auf rätselhafte Verhaltensweisen im einen oder anderen Browser stoßen. Dennoch
ist die Richtung damit vorgegeben, wie Dynamisches HTML in Zukunft programmiert werden wird.
Die Methoden und Eigenschaften des DOM erzeugen neue Tags, manipulieren die Attribute, hängen
Elemente mitsamt allen verschachtelten Elementen an eine andere Stelle des Dokuments und
steuern den Fluss der Ereignisse, wenn das Dokument bereits im Fenster des Benutzers geladen ist
und ersparen so das aufwändige Neuladen des Dokuments.
130/143
Wie können Tags gefunden und manipuliert werden?
Diese Javascript-Methoden des DOM greifen direkt auf ein Element oder eine Gruppe von
Elementen zu: getElementById, getElementByTagName und getElementsByName.
Diese Methoden bedienen sich eines eindeutigen ID-Attributs (getElementById), des mehrdeutigen
NAME-Attributs (getElementsByName) oder sie sammeln alle Elemente mit einem HTML-Tag
(getElementByTagName).
Dabei werden zwei Methoden auf dem Document-Objekt ausgeführt:
● document.getElementById(“id des Elements”) DOM Core
● document.getElementsByName(“name-Attribut des Elements”) DOM HTML name-Attribut
von Formularfeldern wie <input type="radio" name="activ" value="active" />
Diese Methoden gehören dem Element-Objekt und können sowohl für einen Elementknoten node
als auch document aufgerufen werden.
● element.getElementsByTagName(tagName)
z.B. element.getElementsByTagName('tr') für den Zugriff auf alle Tabellenzeilen unterhalb
des Knotenelements element
● document.getElementsByClassName(<class des Elements>) HTML5 z.B. für
Die Methode childNodes gelangt an alle Knoten unterhalb eines Elements.
Kann man JavaScript­Code schützen (d.h. Kopierschutz)?
Es ist nicht möglich, den Code hundertprozentig zu schützen. Es gibt mehrere Ansätze, und manche
Programmierer behaupten tatsächlich, ihr Ansatz würde funktionieren. Bis jetzt konnte aber noch
niemand nachweisen, dass seine Lösung auch wirklich funktioniert. Denken Sie daran: JavaScript ist
eine clientseitige Skriptsprache. Das heißt, sie wird vom Client, also vom Webbrowser, interpretiert.
Die Daten müssen daher irgendwie beim Browser ankommen. Man kann die Daten auf mehrere
Arten und Weisen abfangen; manchmal bietet der Browser sogar Möglichkeiten an, auf den
Quellcode zuzugreifen.
Verschieden Ansätze wären
Verhindern von Mausklicks, Optisch verschleiern(keine Kommentare, wirre Zugriffe, unnötige
Funktionen usw...), JavaScript Quellcode auslagern, Code serverseitig generieren,
Verschlüsselungstools.
Wie unterstützen andere Programmiersprachen wie Java oder C/C++
dieses Konzept?
Auch die objektorientierte Programmiersprache Java unterstützt eine limitierte Variante von
Funktionsabschlüssen in Form anonymer und lokaler Klassen. Apple hat den gcc und Clang um
Closures – genannt Block-Literals – für C erweitert und dies zur Standardisierung vorgeschlagen.
131/143
Was versteht man unter einer anonymen Funktion?
Anonyme Funktionen sind Funktionen ohne Namen, die sofort ausgeführt werden.
Wenn Funktionen sehr einfach sind, verbessern anonyme Funktionen die Lesbarkeit und halten den
Code besser zusammen.
Eine anonyme Funktion hat Zugriff auf jede Variable, die bei der Definition der Funktion sichtbar
war, einschließlich lokaler Variablen. Das macht anonyme Funktionen so schön einfach.
Beispiel
Ein klassischer Rollovereffekt, der die Hintergrundfarbe von Tabellenreihen beim hovern mit der
Maus ändert, ruft zwei Funktionen auf: beim Ereignis onmouseoverdie Funktion over() und beim
Ereignis onmouseout die Funktion out().
Normaler Funktionsaufruf
var rows = document.getElementsByTagName( 'tr' );
for (var i=0; i<rows.length; i++) {
rows[i].onmouseover = over;
rows[i].onmouseout = out;
}
function over() {
this.style.backgroundColor = "silver";
}
function out() {
this.style.backgroundColor = "white";
}
Anonyme Funktion
var rows = document.getElementsByTagName( 'tr' );
for (var i=0; i<rows.length; i++) {
rows[i].onmouseover = function() {
this.style.backgroundColor = "silver";
}
rows[i].onmouseout = function() {
this.style.backgroundColor = "white";
}
}
Die beiden anonymen Funktionen ersetzen den Funktionsaufruf, werden aber ansonsten genauso
notiert wie normale Funktionen: Zwischen der öffnenden und schließenden geschweiften Klammer
stehen dieselben Anweisungen, die auch in der normalen Funktion gestanden hätten. Da sie innere
Funktionen sind, gewähren sie Anweisungen außerhalb der Funktion, in der sie liegen, keinen
Zugriff.
Eine anonyme Funktion kann auch innerhalb eines Ausdrucks definiert werden.
132/143
Was versteht man unter einem Callback­Mechanismus ?
Eine Rückruffunktion (englisch callback function) bezeichnet in der Informatik eine Funktion, die
einer anderen Funktion als Parameter übergeben und von dieser unter gewissen Bedingungen
aufgerufen wird. Dieses Vorgehen folgt dem Entwurfsmuster derInversion of Control.
Callbacks bzw. Callback-Funktionen werden in JavaScript sehr häufig eingesetzt. In JavaScript wird
dabei auch meistens von Event-Handlern gesprochen.
Oft verwendet werden solche Callbacks in JavaScript z.B. beim Einsatz von AJAX oder um auf
bestimmte Events, wie z.B. dem Klick auf einen Button, zu reagieren.
Beispiel: Callback für Klick-Event
Am Beispiel eines Klick-Events wird die Funktionsweise von Callbacks verdeutlichen. Nehmen wir als
Beispiel an, wir haben einen ganz normalen Button:
<input id="button" type="button" value="Klick" />
Klickt nun ein Nutzer auf diesen Button, möchten wir darauf reagieren können und z.B. in der
Konsole einen Hinweis ausgeben lassen. Um das zu erreichen, müssen wir für das click-Event,
welches beim Klick auf den Button ausgelöst wird, eine Callback-Funktion angeben:
$('#myButton').click(function()
{ console.log('Button wurde geklickt!');
});
Mithilfe von jQuery haben wir nun eine anonyme Callback-Funktion definiert.
133/143
24. JavaScript - Framework - Asynchronitäten
Was ist ein Framework (erläutere dies an Hand von jQuery)? Was ist der Unterschied zwischen einem
Framework und einer Bibliothek? Vor­ und Nachteile von Frameworks. Entscheidungskriterien für die
Auswahl eines Frameworks. Erläutere den Unterschied zwischen synchroner und asynchroner
Kommunikation aus Sicht des Clients und des Servers. Was versteht man unter dem
Technologiebegriff “Ajax”? Gehe auf die zugrunde liegende Technologie von Ajax ein. Erkläre, wie
unter jQuery ein Ajax­Aufruf verwendet werden kann ( Voraussetzungen, Übertragung von
(Formular­)daten, Übertragung von einzelnen Parametern, Aufbereitung der von einem Server
gelieferten Daten). Welche Technik muss die verwendete Programmiersprache (z.B. JavaScript) zur
Verfügung stellen, damit asynchrone Kommunikation verwendet werden kann? Wohin kann man sich
wenden, wenn ein ausgewähltes Framework nicht im dokumentierten Ausmaß funktioniert? Wer ist
bei solchen Frameworks für die Fehlerbehebung zuständig? Wie können Fehler gemeldet werden.
Inwieweit besteht ein Rechtsanspruch auf Fehlerbehebung ?
Framework
siehe 25. jQuery
Synchrone Kommunikation
Kommunikationspartner warten (blockieren) nach jedem Senden/Empfangen bis die Kommunikation
abgeschlossen ist.
Asynchrone Kommunikation
Kommunikationspartner warten nicht auf eine Antwort und arbeiten weiter. Antwort wird
verarbeitet sobald sie eintrifft.
Ajax
Siehe 22. Ajax Web Client
Welche Technik muss die verwendete Programmiersprache (z.B. JavaScript)
zur Verfügung stellen, damit asynchrone Kommunikation verwendet werden
kann?
JavaScript bietet eine Event queue an. D.h. nachdem ein Befehl ausgeführt wurde wird überprüft, ob
sich ein Event (z.B. Mausklick oder AJAX response…) in dieser Queue befindet. Ist dies der fall, so
wird dieses Event abgearbeitet.
134/143
Wohin kann man sich wenden, wenn ein ausgewähltes Framework nicht im
dokumentierten Ausmaß funktioniert?
Hersteller/Community
Wer ist bei solchen Frameworks für die Fehlerbehebung zuständig?
Hersteller/Community (bei Open Source)
Wie können Fehler gemeldet werden?
Supportmöglichkeiten die vom Hersteller zur Verfügung gestellt werden, Bugtracker
Inwieweit besteht ein Rechtsanspruch auf Fehlerbehebung ?
Kein Anspruch
135/143
25. jQuery
Wie erleichert ein Framework wie jQuery die Realisierung eines Web­Clients? Erkläre das
Event­Management von Java­Script und vergleiche es mit dem von jQuery angebotenen. Was
versteht
man unter dem Begriff “Selektor” und wie wird dieser in jQuery eingesetzt (Beispiele).
Was bzw. wofür wird das JSON­Format eingesetzt (clientseitige Verwendung, serverseitige
Aufbereitung, Zugriff auf JSON­Strukturen)? Welche Möglichkeiten bietet jQuery an, (größere) Daten
strukturiert in einen HTML­File einzubetten. Inwieweit unterstützt jQuery die GUI­Gestaltung (welche
Widgets gibt es, wie erfolgt das Layout, gehe näher auf ein Widget deiner Wahl ein). Was sind
Plugins unter jQery und wie können diese verwendet werden (zeige dies beispielsweise für die
Unterstützung der Navigation). Kann jede beliebige HTML­Struktur von jQuery modifiziert werden
(Begründung+Beispiel). Was versteht man unter der „Same Origin Policy“ – Problematik und wie
kann dies gelöst werden? Unterstützt jQuery den „Separation of Concerns“­Ansatz(Begründung,
Beispiel)? Was versteht man unter einem Selector? Wieso kann jQuery überhaupt einen Html­File
verändern? Wann wird man Frameworks wie jQuery nicht einsetzen?
Framework
Ein Framework ist ein “Programmiergerüst”, dass die Entwicklung von Software erleichtert, indem es
dem Programmierer bestimmte Strukturen (z.B. Funktionen, Designstrukturen, …) zur Verfügung
stellt.
Vorteile
●
●
●
●
●
Wiederverwendung von Code
Grundfunktionalitäten, die in jeder Anwendung vorkommen, müssen nicht immer wieder
neu implementiert werden
Der Einsatz eines Frameworks in mehreren Anwendungen minimiert die Fehlerquote im
Quellcode.
Bessere Übersichtlichkeit im Code
Erleichterung der Programmierung
Nachteile
●
●
Eventuell lange Einarbeitungszeit
Großes Framework für kleine Programme (Programmieroverhead)
jQuery Framwork
Das Framework jQuery stellt Funktionen bereit, die das Entwickeln von Java Script Programmen
vereinfachen. Außerdem entfällt im Fall von jQuery das anpassen des Codes an verschiedene
Browser, da dass bereits vom Framework erledigt wird.
136/143
Hauptfunktionen von jQuery
●
●
●
●
●
●
Selektieren von Elementen über das DOM Modell
Manipulieren von HTML Elementen
AJAX Aufrufe
Event Managemant
Animationen, Effekte
Hilfsfunktionen (z. B. each, extend, trim, …)
Beispiel
Schriftfarbe rot für aller <div> Elemente mit class=”simple” in Java Script und jQuery.
Java Script
var allDivs = document.getElementsByTagName('div');
for (i=0; i<allDivs.length; i++) {
if (/simple/.test(allDivs[i].className)) {
allDivs[i].style.color='red';
}
}
jQuery
$('div.simage').css(
'color', 'red');
Funktionen
Für die genaue Verwendung siehe jQuery Dokumentation: http://api.jquery.com/.
Eventmanagement
Um mit JavaSctip eine Funktion zu einem Event hinzuzufügen wird die Funktion
addEventListener verwendet. Wobei die Art des Events “click” als Parameter übergeben
werden muss. In JavaScript ist nicht jedes Element Eventfähig.
x.addEventListener('click', function, false)
jQuery vereinfacht das Hinzufügen eines Eventhandlers durch spezielle Grundfunktionen für jedes
Event. Durch jQuery kann auf jedes Element ein Event registriert werden.
x.click(funktion);
Selektoren
Mit den Selektoren lassen sich bestimmte Elemente des DOM auswählen. Wenn der Selektor für
mehrere Elemente gilt, wird ein Array der Elemente zurückgegeben.
Mögliche Selektoren (Auswahl)
●
●
Element nach ID auswählen
$("#id")
Selektiert das Elemente mit der id “id”.
Element nach Klasse auswählen
$(".klasse")
Selektiert alle Elemente mit der CSS-Klasse “klasse”.
137/143
●
●
●
Mehrere Elemente auswählen
$("div, p, a")
Selektiert alle div, p und a Elemente.
Verknüpfte CSS Selektoren
$("ul > li:even")
Selektiert alle “geraden” li Elemente die genau eine Ebene (>) unter einem ul Element.
Element mit Attribut auswählen
$("input[name='f_name']");
Selektiert alle input Elemente mit name=”f_name”.
jQuery UI
jQuery UI ist eine Sammlung von Widgets, Effekten und Animationen, die auf jQuery aufsetzen.
Damit wird die Entwicklung von Web GUIs vereinfacht. Es gibt vorgefertigte Widgets (z.B. Button,
Dialog, Menu, …) die einfach verwendet und mit Aktionen und Animationen versehen werden
können. Außerdem werden vorgefertigte CSS Designs und weitere Funktionen für diese Widgets
angeboten.
Beispiel Button
Der Vorteil von jQuery UI Buttons gegenüber HTML Buttons ist, dass jedes Element (z.B. ein Link <a>)
in einen Button verwandelt werden kann.
<html>
<head>
<link rel="stylesheet"
href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<script>
$(function() {
$( "#button1" ).button();
</script>
</head>
<body>
<a id="button1" href="index.html">Ein Link</a>
</body>
</html>
jQuery Plugins
Mit Plugins kann jQuery einfach um spezielle Funktionen erweitert werden. Um ein Plugin
einzubinden, muss nur die entsprechende JavaScript Datei eingebunden werden.
Zum Beispiel ist es mit Navigations Plugins möglich, eine Liste (<ul>, <li>, …) mit nur einem
Funktionsaufruf automatisch in eine Navigationsleiste zu verwandeln.
Ein weiteres Beispiel für praktische jQuery Plugins ist die Darstellung von großen Datenmengen in
Tabellenform. Es gibt Plugins die die Daten automatisch in kleinen Teilen vom Server holen und dann
138/143
aufbereitet in einer Tabelle darstellen. Diese Tabellen bieten meistens erweiterte Funktionen wie
Sortiermöglichkeiten oder einer Suche.
JSON
Das JSON (= JavaScript Object Notation) Format ist ein Datenformat zum Austausch von Daten
zwischen Anwendungen und ist für Menschen und Maschinen leicht lesbar, da es reiner Text ist.
JSON wird unter anderem in Verbindung mit AJAX zur Übertragung von Daten zwischen Client und
Server eingesetzt.
JSON­ Strukturen
Datentypen
JSON unterstützt folgende Datentypen:
● boolescher Wert
Ein boolescher Wert ist entweder true oder false. Diese Werte sind keine Strings und
daher ohne Anführungszeichen.
● Zahl
Eine Zahl besteht aus den Ziffern 0–9, und kann ein negatives Vorzeichen (-) und einen
Dezimalpunkt (.) enthalten. Außerdem kann die Zahl kann durch die Angabe eines
Exponenten e oder E ergänzt werden (z.B. 2e-6. 1.5E+4).
● Zeichenkette
Eine Zeichenkette beginnt und endet mit doppelten Anführungszeichen (").
● Array
Ein Array beginnt mit [ und endet mit ] . Es enthält eine durch Kommas (,) geteilte Liste von
Werten. Die Liste ist geordnet und kann Werte mit gleichem oder verschiedenem Typ
enthalten, kann aber auch leer sein.
● Objekt
Ein Objekt beginnt mit { und endet mit }. Es enthält eine durch Kommas (,) geteilte,
ungeordnete Liste von Eigenschaften. Diese Liste ist nicht geordnet und ein Objekt kann
auch leer sein.
Eine Eigenschaft besteht aus einem Schlüssel und einem Wert, die durch einen Doppelpunkt
getrennt sind (Schlüssel:Wert). Die Schlüssel in einem Objekt müssen eindeutig sein. Der
Schlüssel ist eine Zeichenkette und der Wert ist ein JSON Datentyp (Objekt, Array,
Zeichenkette, Zahl, true, false, null).
● null-Wert
Dieser Wert (null) ist keine String und hat daher keine Anführungszeichen.
Für eine genaue Definition der Typen sie http://www.json.org/.
Beispiel: JSON Objekt
var obj = {
"Herausgeber": "Xema",
"Nummer": "1234-5678-9012-3456",
"Deckung": 2e+6,
139/143
"Währung": "EURO",
"Inhaber": {
"Name": "Mustermann",
"Vorname": "Max",
"männlich": true,
"Hobbys": [ "Reiten", "Golfen", "Lesen" ],
"Alter": 42,
"Kinder": [],
"Partner": null
}
}
Zugriff auf JSON­ Strukturen
Wenn die Daten als String und nicht als JSON Objekt vorliegen, müssen sie erst in ein JSON Objekt
konvertiert werden. Dazu stellt jQuery die Funktion $.parseJSON(...) zur Verfügung, in
JavaScript selbst kann die Funktion eval(...) verwendet werden, dies sollte aus
Sicherheitsgründen allerdings vermieden werden.
Wenn die Daten bereits als JSON Objekt vorliegen, muss keine weitere Verarbeitung durchgeführt
werden. Dazu muss der Conten Type (MIME-Type) auf application/json gesetzt sein. Wenn der
Content Type richtig gesetzt ist, liefern die jQuery Funktionen $.getJSON(...) und
$.ajax(...) (mit dataType : "json") ein JSON Objekt zurück. Siehe Beispiel.
Zugriff mit JavaScript
Da in JavaScript JSON Daten als Java Objekte abgespeichert werden, kann auf den Inhalt des Objekts
mit dem Punkt Operator (.) zugegriffen werden.
Beispiel: Zugriff auf das Oben genannte Objekt
alert(obj.Inhaber.Hobbys[1]);
obj.Inhaber.Name = "Musterfrau"; //Daten ändern
Serverseitige Aufbereitung
Um ein JSON Objekt zu erstellen reicht es, die Daten als JSON String zu formatieren, z. B.:
String json = "{\"Herausgeber\": \"" + herausgeber + "\",
\"Nummer\": \"" + nr + "\" }";
gson
Allerdings ist das händische Zusammenbauen des Strings umständlich und schlecht wartbar, darum
gibt es Bibliotheken die das erledigen, z.B. gson. gson hat außerdem den Vorteil, das es ganze Java
Klassen in JSON und umgekehrt konvertieren kann. Für die genaue Verwendung von gson siehe
Dokumentation: https://sites.google.com/site/gson/gson-user-guide.
140/143
Beispiel
Person p = new Person("Max", "Muster");
Gson gson = new Gson();
String json = gson.toJson(p);
Clientseitige Verwendung
Für die einfache Verwendung von JSON in Verbindung mit asynchronen Aufrufen (AJAX) empfiehlt es
sich ein Framework wie jQuery zu verwenden.
Beispiel $.getJSON()
In diesem Beispiel wird ein mit der Funktion getJSON() eine Anfrage an test.php gesendet und das
empfangene JSON Objekt in einer Schleife verarbeitet.
$.getJSON("url/test.php", function(data){
var items = [];
$.each(data, function(key, val){
items.push("<li id='" + key + "'>" + val + "</li>");
});
});
Beispiel
Ein Beispiel für die Verwendung von JSON mit einem Java Servlet und jQuery. Achtung: kein
vollständig funktionierendes Beispiel!
Servlet
Die doGet() Funktion des Servlets wird überschrieben, darin wird der Content Type auf
application/json gesetzt, der JSON String erzeugt und gesendet.
doGet(HttpServletRequest request, HttpServletResponse response){
PrintWriter out = response.getWriter();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
Person p = new Person("Max", "Muster");
Gson gson = new Gson();
String json = gson.toJson(p);
out.println(json);
}
jQuery
$.ajax({
141/143
url : "PersonServl",
type : "GET",
dataType : "json",
success : function(data) {
$.each(data, function(key, item) {
$("#personen").append("<li>" + item.vname + "</li>");
});
},
error : function(request, status, error) {
$("#errormessage").html(request.responseText);
}
});
Same-Origin-Policy
Die Same-Origin-Policy ist ein wichtiges Sicherheitkonzept, das JavaScript verbietet auf Ressourcen
zuzugreifen die von anderen Websites stammen. Zum Beispiel kann ein JavaScript ajax Aufruf auf
Server1 keine Daten von Server2 holen. Die SOP wird von den Browsern umgesetzt. Um den Zugriff
von Server1 auf Server2 zu erlauben, muss am Server2 ein HTTP-Header gesetzt werden.
response.setHeader("Access-Control-Allow-Origin","*");
Dadurch wird der Zugriff von allen (*) Quellen auf den Server erlaubt. Anstelle des * kann auch eine
Domain angegeben werden, von der aus der Zugriff erlaubt sein soll.
Separation of Concerns
Es ist in jQuery möglich den Separation of Concerns Ansatz umzusetzen, dieser wird allerdings nicht
von jQuery erzwungen.
Beispiel
Eine Animation für ein Element soll erstellt werden.
$(".cell").click(function() {
$(this).css("opacity","1").css("width", "120%").css("height",
"120%").css("font-size", "1.2em");
});
Dieses Beispiel erfüllt nicht den SoC Ansatz, da Funktionalität und Design vermischt sind. Richtig ist
es diese Beiden “Concerns” zu trennen.
$(".cell").click(function() {
$(this).addClass("enabled");
});
142/143
.enabled {
opacity: 1,
width: 120%;
height: 120%;
font-size: 1.2em;
}
Vorteile
●
●
●
●
Der Style Code ist leichter lesbar
Der Style Code ist wiederverwendbar
Das Script ist leicher lesbar
Leichtere Wartung von Script und Design
143/143
Herunterladen