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