10. Anwendungsprogrammierung Client-Server-Architektur ■ typische Architektur von DB-Anwendungen, da zentrale Verwaltung durch DBMS notwendig Call-Level-Schnittstellen: SQL/CLI, JDBC ■ Prinzip: Client nimmt Dienste eines Servers in Anspruch ■ Einbettung: Embedded SQL, SQLJ ■ ■ Gespeicherte Prozeduren ■ Prozedurale Erweiterungen: SQL/PSM, PL/SQL erfordert ◆ Kenntnis über angebotene Dienste ◆ Protokoll zur Regelung der Interaktion ■ Web-Anbindung von Datenbanken ■ Client-Server-Architektur ■ Anbindung von Programmiersprachen ■ VL Datenbanken I – 10–1 Funktionsgruppen in DB-Anwendungen Client-Server-Modell Client (Dienstnehmer) VL Datenbanken I – 10–2 Server (Diensterbringer) ■ Präsentation und Benutzerinteraktion ■ Anwendungslogik ■ Datenmanagementfunktionalität 1.Anforderung 2.Bearbeitung 3.Antwort VL Datenbanken I – 10–3 VL Datenbanken I – 10–4 2-Schichten-Architektur 3-Schichten-Architektur Benutzerschnittstelle Benutzerschnittstelle Anwendungslogik Client CORBA, RMI, ... Client Anwendungslogik DB-Schnittstelle DB-Schnittstelle DBMS-Protokoll Applikationsserver DBMS-Protokoll DB-Server DB-Server VL Datenbanken I – 10–5 Programmiersprachenanbindung VL Datenbanken I – 10–6 Cursor-Konzept Kopplungsarten: Anwendungsprogramm ■ prozedurale oder CALL-Schnittstellen (call level interface) ■ Einbettung einer DB-Sprache in Programmiersprachen ◆ statische Einbettung: Vorübersetzer-Prinzip ; SQL-Anweisungen zur Übersetzungszeit festgelegt ◆ dynamische Einbettung: ; Konstruktion von SQL-Anweisungen zur Laufzeit ■ Spracherweiterungen und neue Sprachentwicklungen PASCAL VL Datenbanken I – 10–7 Cursor Datenbank SQL Relation VL Datenbanken I – 10–8 Cursor in SQL Cursor in SQL2 Cursor-Deklaration: declare CursorName [insensitive] [scroll] cursor for ... declare AktBuch cursor for select ISBN, Titel, Verlagsname from Bücher where Verlagsname = ’Thomson’; Cursor-Deklaration mit Änderungsmöglichkeit: declare AktBuch cursor for select ISBN, Titel, Verlagsname from Bücher for update of ISBN, Titel; ■ next: Gehe weiter zum nächsten Tupel ■ prior: Gehe zum vorherigen Tupel ■ first bzw. last: Gehe zum ersten bzw. letzten Tupel ■ absolute n from: Gehe zum n-ten Tupel des Cursors (negative Werte werden relativ zum letzten Tupel rückwärts gewertet — absolute -1 ist also äquivalent zu last) ■ relative n from: Gehe zum n-ten Tupel relativ zur aktuellen Cursor-Position VL Datenbanken I – 10–9 SQL/CLI: Der Standard ■ VL Datenbanken I – 10–10 CLI: Handles Call-Level-Interface: Bibliothek von Prozeduren/Funktionen zur ◆ Kommunikation mit dem DBMS ◆ Definition und Ausführung von Anfragen ◆ Verarbeitung von Ergebnissen ■ SQL/CLI: ISO-Standard für API ■ Programmiersprachen: C/C++, Ada, Fortran, Pascal, . . . VL Datenbanken I – 10–11 ■ Handle: Verweis auf globale Datenstruktur zur Kommunikation mit DBMS ■ C-Datentyp: SQLHANDLE ■ erforden explizite Allokation (SQLAllocHandle) ■ Arten: ◆ Environment Handles: Verwaltung des globalen Zustandes der Applikation ◆ Connection Handles: Verwaltung von Verbindungsdaten ◆ Statement Handles: Informationen zu einer SQL-Anweisung ◆ Description Handles: Daten zu Ergebnisspalten bzw. Paramtern VL Datenbanken I – 10–12 CLI: Aufbau einer DB-Verbindung CLI: Anfrageausführung 1. Handles allokieren SQLHANDLE henv; /* Environment Handle */ SQLHANDLE hdbc; /* Connection Handle */ SQLHANDLE hstmt; SQLCHAR *select = "select KNr, Name, Ort from Kunde"; SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt); SQLExecDirect (hstmt, select, SQL_NTS); SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc) != SQL_SUCCESS) /* Fehlerbehandlung */ 2. Verbindung herstellen SQLCHAR *server = "shop_db", *uid = "scott", *pwd = "tiger"; SQLConnect (hdbc, server, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS); VL Datenbanken I – 10–13 CLI: Ergebnisverarbeitung CLI: Transaktionssteuerung 1. Bindung an Variablen herstellen SQLINTEGER knr; SQLCHAR kname[31], kort[51]; SQLBindCol (hstmt, 1, (SQLPOINTER) &knr, SQLBindCol (hstmt, 2, kname, 31, NULL); SQLBindCol (hstmt, 3, kort, 51, NULL); VL Datenbanken I – 10–14 SQL_C_LONG, 0, NULL); SQL_C_CHAR, ■ Transaktion erfolgreich beenden SQLEndTrans (SQL_HANDLE_DBC, hdbc, SQL_COMMIT); ■ Transaktion abbrechen SQLEndTrans (SQL_HANDLE_DBC, hdbc, SQL_ROLLBACK); SQL_C_CHAR, 2. Ergebnisse auslesen while (SQLFetch (hstmt) == SQL_SUCCESS) printf ("Kunde = %ld, %s, %s\n", knr, kname, kort); VL Datenbanken I – 10–15 VL Datenbanken I – 10–16 ODBC JDBC: Überblick ■ SQL/CLI-konforme Implementierung für Microsoft Windows ■ Zugriff auf verschiedene Datenbanksysteme über systemspezifische Treiber möglich ■ dynamisches Laden von Treibern (implementiert als DLL) ■ Registrierung von Datenquellen mit Name, System, Treiber, Verbindungsinformation ■ Datenbankzugriffsschnittstelle für Java ■ abstrakte, datenbankneutrale Schnittstelle ■ vergleichbar mit ODBC ■ Low-Level-API: direkte Nutzung von SQL ■ Java-Package java.sql ◆ DriverManager: Einstiegspunkt, Laden von Treibern ◆ Connection: Datenbankverbindung ◆ Statement: Ausführung von Anweisungen über eine Verbindung ◆ ResultSet: verwaltet Ergebnisse einer Anfrage, Zugriff auf einzelne Spalten VL Datenbanken I – 10–17 VL Datenbanken I – 10–18 JDBC: Verbindungsaufbau JDBC: Ablauf 1. Treiber laden Class.forName ("com.company.DBDriver"); 1. Aufbau einer Verbindung zur Datenbank ■ Angabe der Verbindungsinformationen ■ Auswahl und Laden des Treibers 2. Verbindung herstellen Connection con; String url = "jdbc:subprotocol:datasource"; con = DriverManager.getConnection (url, "scott", "tiger"); 2. Senden einer SQL-Anweisung ■ Definition der Anweisung ■ Belegung von Parametern 3. Verarbeiten der Anfrageergebnisse ■ Navigation über Ergebnisrelation ■ Zugriff auf Spalten JDBC-URL spezifiziert VL Datenbanken I – 10–19 ■ Datenquelle/Datenbank ■ Verbindungsmechanismus (Protokoll, Server-Host und Port) VL Datenbanken I – 10–20 JDBC: Anfrageausführung JDBC: Ergebnisverarbeitung 1. Anweisungsobjekt (Statement) erzeugen Statement stmt = con.createStatement (); 2. Anweisung ausführen String query = "SELECT titel, preis FROM buch"; ResultSet rset = stmt.executeQuery (query); Klasse java.sql.Statement ■ Ausführung von Anfragen (SELECT) mit executeQuery ■ Ausführung von Änderungsanweisungen (DELETE, INSERT, UPDATE) mit executeUpdate 1. Navigation über Ergebnismenge (Cursor-Prinzip) while (rset.next ()) { // Verarbeitung der einzelnen Tupel ... } 2. Zugriff auf Spaltenwerte über getType-Methoden ■ über Spaltenindex String titel = rset.getString (1); ■ über Spaltenname String titel = rset.getString ("titel"); VL Datenbanken I – 10–21 JDBC: Fehlerbehandlung VL Datenbanken I – 10–22 JDBC: Änderungsoperationen ■ Fehlerbehandlung mittels Exception-Mechanismus ■ DDL- und DML-Operationen mittels executeUpdate ■ SQLException für alle SQL- und DBMS-Fehler try { // Aufruf von JDBC-Methoden ... } catch (SQLException exc) { System.out.println (SSQLException: "+ exc.getMessage ()); } ■ liefert Anzahl der betroffenen Zeilen (für DML-Operationen) Statement stmt = con.createStatement (); int rows = stmt.executeUpdate ( " UPDATE buch SET bestand = bestand-1"+ " WHERE isbn = ’12345’ "); VL Datenbanken I – 10–23 VL Datenbanken I – 10–24 JDBC: Transaktionssteuerung ■ Statische Einbettung: Embedded SQL Methoden von Connection ◆ commit () ◆ rollback () Auto-Commit-Modus ◆ implizites Commit nach jeder Anweisung ◆ Transaktion besteht nur aus einer Anweisung ◆ Umschalten mittels setAutoCommit (boolean) exec sql declare AktBuch cursor for select ISBN, Titel, Verlagsname from Bücher for update of ISBN, Titel; Öffnen und Schließen einer Datenbank exec sql connect UniBeispiel; VL Datenbanken I – 10–25 Deklarationen ■ Datentransfer Deklaration benutzter Datenbankrelationen exec sql declare Buch table ( ISBN char(10) not null, Titel char(120) not null, Verlagsname char(30) not null); ■ VL Datenbanken I – 10–26 Deklaration gemeinsamer Variablen exec sql begin declare section; BuchISBN char(10); NeuerPreis real; exec sql end declare section; exec sql update Buch_Versionen set Preis = :NeuerPreis where ISBN = :BuchISDN ; exec sql insert into Buch_Versionen values (:NeuISBN, :NeuAuflage, 1995, :Seiten, :Preis); exec sql select ISBN, Auflage, Jahr, Preis into :ISBN, :Auflage, :Jahr, :Preis from Buch_Versionen where ISBN = :SuchISBN and Auflage = 1; VL Datenbanken I – 10–27 VL Datenbanken I – 10–28 Datentransfer (II) Einsatz der Cursor-Technik Indikator-Variablen zum Test auf null-Werte: exec sql open AktBuch; exec sql select :ISBN, Auflage, Jahr, Preis into :ISBN, :Auflage, :Jahr, :Preis:PreisInd from Buch_Versionen where ISBN = :SuchISBN and Auflage = :SuchAuflage; exec sql fetch AktBuch into :ISBN, :Titel, :Verlagsname; exec sql close AktBuch; exec sql delete from Bücher where current of AktBuch; VL Datenbanken I – 10–29 Fehler- und Ausnahmebehandlung VL Datenbanken I – 10–30 Transaktionssteuerung SQL Communication Area exec sql commit work; exec sql include sqlca; exec sql rollback work; ‘whenever’-Anweisung exec sql whenever <Bedingung> <Aktion>; ■ not found: Kein Tupel wurde gefunden, definiert etwa als sqlcode = 100. ■ sqlwarning: Warnung, entspricht etwa sqlcode > 0 ∧ sqlcode 6= 100. ■ sqlerror: Fehler, also sqlcode < 0. VL Datenbanken I – 10–31 VL Datenbanken I – 10–32 Dynamische Einbettung: Dynamic SQL Dynamische Einbettung: Dynamic SQL exec sql begin declare section; AnfrageString char(256) varying; exec sql end declare section; exec sql declare AnfrageObjekt statement; AnfrageString := ’DELETE FROM Vorlesungen WHERE SWS < 2’; ... exec sql prepare AnfrageObjekt from :AnfrageString; exec sql execute AnfrageObjekt; ... AnfrageString := ’DELETE FROM Buch_Versionen ’ + ’WHERE ISBN = ? AND Auflage = ?’ ; exec sql prepare AnfrageObjekt from :AnfrageString; exec sql execute AnfrageObjekt using :LöschISBN, :LöschAuflage; Wertübergabe an Anfragen „Anfragen als Zeichenketten“ VL Datenbanken I – 10–33 VL Datenbanken I – 10–34 SQLJ-Anweisungen SQLJ: Embedded SQL für Java ■ Einbettung von SQL-Anweisungen in Java-Quelltext ■ Kennzeichnung durch #sql Deklarationen ■ Vorübersetzung des erweiterten Quelltextes in echten Java-Code durch Translator sqlj ■ Klassendefinitionen für Iteratoren ■ ■ Überprüfung der SQL-Anweisungen ◆ korrekte Syntax SQL-Anweisungen: Anfragen, DML- und DDL-Anweisungen #sql { SQL-Operation }; ■ Beispiel: #sql { INSERT INTO buch VALUES ("Datenbanken", 59.00, "123456", "MITP") }; Übereinstimmung der Anweisungen mit DB-Schema ◆ Typkompatibilität der für Datenaustausch genutzten Variablen ◆ ■ Nutzung von JDBC-Treibern VL Datenbanken I – 10–35 VL Datenbanken I – 10–36 Host-Variablen ■ Variablen einer Host-Sprache (hier Java), die in SQL-Anweisungen auftreten können ■ Verwendung: Austausch von Daten zwischen Host-Sprache und SQL ■ Kennzeichnung durch ":variable" ■ Beispiel: String titel, isbn = "123456"; #sql { SELECT titel INTO :titel FROM buch WHERE isbn = :isbn }; Iteratoren Implementierung des Cursor-Konzeptes 1. Deklaration des Iterators #sql public iterator BookIter (String titel, double preis); 2. Definition des Iteratorobjektes BookIter iter; 3. Ausführung der Anweisung #sql iter = { SELECT titel, preis FROM buch }; 4. Navigation while (iter.next ()) { System.out.println (iter.titel () + " "+ iter.preis ()); } VL Datenbanken I – 10–37 Gespeicherte Prozeduren ■ ■ VL Datenbanken I – 10–38 Vorteile Gespeicherter Prozeduren Probleme von CLI und Embedded SQL: ◆ ständiger Wechsel der Ausführungskontrolle zwischen Anwendung und DBS ◆ keine anweisungsübergreifende Optimierung notwendig Ausweg: gespeicherte Prozeduren ◆ im Datenbank-Server verwaltete und auch dort ausgeführte Software-Module in Form von Prozeduren bzw. Funktionen ◆ Aufruf aus Anwendungen und Anfragen heraus VL Datenbanken I – 10–39 ■ Strukturierungsmittel für größere Anwendungen ■ Prozeduren nur vom DBMS abhängig und nicht von externen Programmiersprachen oder Betriebssystemumgebungen ■ Optimierung der Prozeduren ■ Ausführung der Prozeduren unter Kontrolle des DBMS ■ zentrale Kontrolle der Prozeduren: redundanzfreie Darstellung relevanter Aspekte der Anwendungsfunktionalität ■ Rechtevergabe für Prozeduren ■ in der Integritätssicherung: Aktionsteil von Triggern VL Datenbanken I – 10–40 SQL/PSM: Der Standard SQL/PSM: Funktionen ■ SQL-Standard für prozedurale Erweiterungen ■ PSM: Persistent Stored Modules ◆ gespeicherte Module aus Prozeduren und Funktionen ◆ Einzelroutinen ◆ Einbindung externer Routinen (implementiert in C, Java, . . . ) ◆ syntaktische Konstrukte für Schleifen, Bedingungen etc. ■ Funktionsdefinition create function dm_in_euro (float v) returns float begin return (v / 1.95583); end; ■ Aufruf innerhalb einer Anfrage select Bezeichnung, dm_in_euro (Preis) from Produkt where dm_in_euro (Preis) < 100 ■ Nutzung außerhalb von Anfragen set euro_preis = dm_in_euro (79.00); VL Datenbanken I – 10–41 VL Datenbanken I – 10–42 SQL/PSM: Zugriffscharakteristik SQL/PSM: Prozeduren ■ Prozedurdefinition create procedure rechnungsbetrag ( in int nr, out float summe) begin select sum(p.Preis ∗ bp.Anzahl) into summe from Bestellposten bp, Produkt p where bp.BestNr = nr and bp.ProdId = p.ProdId; end; ■ Nutzung über call-Anweisung declare preis float; call rechnungsbetrag (42, preis); VL Datenbanken I – 10–43 ■ Eigenschaften von Prozeduren, die Anfrageausführung und -optimierung beeinflussen ◆ deterministic: Routine liefert für gleiche Parameter gleiche Ergebnisse ◆ no sql: Routine enthält keine SQL-Anweisungen ◆ contains sql:Routine enthält SQL-Anweisungen (Standard für SQL-Routinen) ◆ reads sql data: Routine führt SQL-Anfragen (select-Anweisungen) aus ◆ modifies sql data: Routine, die DML-Anweisungen (insert, update, delete) enthält VL Datenbanken I – 10–44 SQL/PSM: Ausnahmebehandlung SQL/PSM: Ablaufkontrolle ■ Variablendeklaration declare name varchar(50); ■ Auslösen einer Ausnahme (Condition) signal <ConditionName>; ■ Zuweisung set var = 42; ■ Deklarieren von Ausnahmen declare yyy condition; ■ Bedingte Verzweigungen if <Bedingung> then <Anweisungen> [ else <Anweisungen> ] end if; ■ ■ Schleifen loop <Anweisungen> end loop while <Bedingung> do <Anweisungen> end while repeat <Anweisungen> until <Bedingung> end repeat Ausnahmebehandlung begin declare exit handler for <ConditionName> begin <Ausnahmebehandlung>; end <Anweisungen>; end VL Datenbanken I – 10–45 PL/SQL von Oracle ■ prozedurale SQL-Erweiterung für Oracle ■ Merkmale ◆ erweitertes Typsystem ◆ Package-Konzept VL Datenbanken I – 10–46 PL/SQL: Cursor cursor AktBuch is select ISBN, Titel, Verlagsname from Bücher; Zugriff auf Typinformation Deklarationen AktPersName Mitarbeiter.PersonName%type; BuchTupel AktBuch%rowtype; declare Heute date; type PersonRecordType is record ( PersonName varchar (50), GebDatum date); Mitarbeiter PersonRecordType; VL Datenbanken I – 10–47 VL Datenbanken I – 10–48 Operationale Konstrukte Iteration über Tabellen if <Bedingung> then <PL/SQL-Anweisungen> [ else <PL/SQL-Anweisungen> ] end if; for BuchRec in AktBuch loop ... end loop; entspricht for <IndexVariable> in <EndlicherBereich> loop <PL/SQL-Anweisungen>; end loop; while <Bedingung> loop <PL/SQL-Anweisungen>; end loop; declare BuchRec AktBuch%rowtype; begin loop fetch AktBuch into BuchRec; exit when AktBuch%notfound; ... end loop; VL Datenbanken I – 10–49 Fehlerbehandlung VL Datenbanken I – 10–50 PL/SQL: Gespeicherte Prozeduren when Ausnahme then ProgrammStück; create function FunktionsName ( Param1 ParamTyp1, ..., ParamN ParamTypN ) return ErgebnisTyp is /* PL/SQL - Block mit return-Anweisung */ create procedure ProzedurName ( Param1 in ParamTyp1, ( Param2 out ParamTyp2, ( Param3 in out ParamTyp3, ... ) is /* PL/SQL - Block mit Zuweisungen an out-Parameter */ VL Datenbanken I – 10–51 VL Datenbanken I – 10–52 Weitere Prozedurale SQL-Erweiterungen Web-Anbindung von Datenbanken ■ IBM DB2: SQL/PSM ■ Begriffe und Techniken ■ Informix: SPL ■ Anwendungsszenarien ■ Sybase, Microsoft SQL Server: Transact-SQL ■ Kopplungstechniken ■ externe Routinen: implementiert in C, Java, . . . ■ Zustandsrealisierung VL Datenbanken I – 10–53 Begriffe VL Datenbanken I – 10–54 Uniform Resource Locator ■ Hypertext-Dokumente (HTML) mit Verweisen (Links) auf andere Objekte (Dokumente, Multimedia-Objekte) ■ Adresse einer Ressource im Web ■ Format: <schema>:<schema spezifikation> ■ Von Web-Servern bereitgestellt ■ <schema> ■ Links: durch URL spezifiziert ■ ■ Web-Datei: einzelne Datei (mit einem HTTP-Request) ■ Web-Seite: Menge von Web-Dateien (eine Nutzeraktion) ■ Protokoll (http, news, mailto, telnet) Für HTTP ◆ Vollständig: http://<host>.<domain>:<port>/<path>/<filename> Relativ: <path>/<filename> ◆ Verweis in Dokument: ◆ Web-Site: Menge von Web-Seiten (ein Server) . . . <path>/<filename>#<anchor > ◆ Funktionsaufruf: . . . <path>/<procname>?<params> VL Datenbanken I – 10–55 VL Datenbanken I – 10–56 HTTP: Beispiel HTTP ■ Einfaches Protokoll zum Datenaustausch auf Basis von TCP/IP Anforderung an ■ Zustandsloses Protokoll: jede Anforderung ist unabhängig von allen anderen Antwort: ■ Methoden/Kommandos: ◆ GET: Holen einer Web-Seite ◆ HEAD: Holen der Header-Informationen ◆ POST: Senden von Daten (Bytestrom) zum Server www.mitp.de: GET /index.html HTTP/1.0 HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Date: Fri, 02 Feb 2001 07:51:09 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Thu, 01 Feb 2001 15:33:35 GMT ETag: "4034757648cc01:441e" Content-Length: 31516 <html> <head> ... VL Datenbanken I – 10–57 MIME VL Datenbanken I – 10–58 HTML ■ Multipurpose Internet Mail Extensions ■ ■ Spezifikation von Inhaltstypen von Emails, Web-Dokumenten Hypertext Markup Language (Tim Berners-Lee, CERN 1990) ■ Auszeichnungssprache des Web ■ Form <typ>/<subtyp> ■ ■ Wird als Antwort auf ein HTTP-GET vor dem Dokument geliefert (Content-Type) ■ Typen: text, image, audio, video, application ■ Bsp.: erfordert Browser zur Präsentation Schwerpunkte ◆ strukturelle Bestandteile eines Dokumentes (Absätze, Überschriften, Listen usw.) ◆ Hypertext-Sprache: Verweise auf andere Dokumente, die vom Benutzer verfolgt werden können ■ text/html, image/gif, application/postscript ■ Weitere Elemente ◆ Interaktive Elemente (Formulare) ◆ Multimedia-Inhalte VL Datenbanken I – 10–59 VL Datenbanken I – 10–60 Interaktion mit HTML HTML: Formulare ■ Formular: ◆ Gruppe von Eingabemöglichkeiten ◆ Zurücksenden von Informationen an Web-Server ■ erfordert ◆ interaktive Elemente (Textfelder, Schalter, ...) ◆ serverseitigen Mechanismus zur Verarbeitung ◆ Kommunikation zwischen Browser und Server (HTTP) ◆ Schnittstelle zwischen Server und Verarbeitungsmechanismus (CGI) <form method=POST action="http://www.air-fun.de/cgi-bin/lookup"> Produkt: <input type="text" name="prodname"><br> Preis: <input type="text" name="prodpreis"><br> <input type="submit"> <input type="reset"> </form> VL Datenbanken I – 10–61 Anwendungsszenarien VL Datenbanken I – 10–62 Web-Dienst mit Schnittstelle zum DBS ■ Web-Dienst als Informationssystem: Sammlung von statischen Web-Seiten ■ Web-Dienst als Verteilungsmechanismus für Anwendungsfunktionen: Java-Applets ■ Web-Dienst mit Schnittstelle zum Datenbanksystem: Generierung von Web-Seiten aus DB-Inhalten WWW-Browser Internet / HTTP WWW-Server HTML CGI HTML select-from-where ■ Web-Seiten im Datenbanksystem: LOBs bzw. eigene Datentypen für Speicherung von Seiten im DBS ■ Komplette Web-Strukturen im Datenbanksystemen: Speicherung von Web-Strukturen (inkl. Links) VL Datenbanken I – 10–63 HTML CGI select-from-where DBMS VL Datenbanken I – 10–64 Komplette Web-Strukturen im DBS Web-Seiten im DBS WWW-Browser WWW-Browser Internet / HTTP Internet / HTTP WWW-Server WWW-Server DBMS ODBMS + HTML HTML VL Datenbanken I – 10–65 Aufgaben und Anforderungen VL Datenbanken I – 10–66 Common Gateway Interface (CGI) ■ Aufruf „externer“ Programme mit Datenbankoperationen ■ Parameterübergabe Client → Server → DB-Programm ■ dynamische Generierung von Web-Dokumenten mit Ergebnissen von DB-Operationen ■ Realisierung von Zuständen (Sitzungen, Transaktionen) VL Datenbanken I – 10–67 ■ CGI: ursprüngliche Schnittstelle zwischen Web-Server und Programm zur Anbindung externer Quellen ■ Gateway: ◆ Umformung einer Informationsquelle in ein Web-Dokument ◆ Programm/Skript zur Bearbeitung einer Dokumentenanforderung, das – HTML-Text, eine URL oder andere Daten liefert – in beliebiger Sprache implementiert ist VL Datenbanken I – 10–68 CGI: Prinzip Parameterübergabe (1) Anfrage Web-Browser ■ Übergabe von Parametern an CGI-Programme durch Browser ■ z.B. Inhalte von Formularelementen ■ Methoden ◆ GET: durch Anhängen an URL – für wenige Parameter geeignet (Längenbegrenzung) – kann direkt mit URL angegeben werden – Parameter für Nutzer sichtbar ◆ POST: über Standardeingabe des CGI-Programms – für Nutzer nicht sichtbar – Parameter nicht Teil der URL Web-Server (5) HTML (4) HTML (2) CGI (3) CGI-Programm VL Datenbanken I – 10–69 GET-Methode ■ ■ VL Datenbanken I – 10–70 POST-Methode Parameteraufbau ◆ Trennung von URL durch ? ◆ Trennzeichen & ◆ Ersetzung von Leerzeichen durch + Umlaute durch Escape-Notation %hexwert Beispiel: ◆ Parameter: feld1: "Eins" feld2: "Zwei Drei" ◆ URL: ■ Parameteraufbau wie bei GET-Methode ■ Übergabe als Standardeingabe ■ unbegrenzte Länge ■ geeignet für große Datenmengen ■ Beispiel (Eingabedatei): feld1=Eins&feld2=Zwei+Drei http://host/cgi-prog?feld1=Eins&feld2=Zwei+Drei VL Datenbanken I – 10–71 VL Datenbanken I – 10–72 Kommunikation Kommunikation ■ CGI-Programm → Web-Server ■ Erzeugung eines HTML-Dokumentes und Senden zur Standardausgabe Web-Server → CGI-Programm ■ Umgebungsvariablen, die vor Ausführung des Programms vom Server initialisiert werden ■ HTML-Dokument muß Content Type enthalten Variable Bedeutung + Beispiel ■ Aufbau: REQUEST_METHOD REQUEST_HOST REMOTE_USER QUERY_STRING CONTENT_LENGTH CONTENT_TYPE Request-Methode: GET Host des Browsers: 141.44.45.32 Benutzername (nur bei Authentisierung) Anfrageparameter: p1=12&p2=abc Länge der Anfrageparameter: 20 Format der Anfrageparameter: application/x-www-form-urlencoded ■ Content-Type: text/html Leerzeile !!!! <html>... </html> ■ Umlenkung durch Senden einer neuen URL Location: URL Leerzeile !!!! VL Datenbanken I – 10–73 CGI: Beispiel VL Datenbanken I – 10–74 Weiterentwicklungen Bourne-Shell-Programm #!/bin/sh echo "Content-Type: text/html" echo "" echo "<html><body>Zugriff um = " date echo " von: " echo $REMOTE_HOST echo " mit Parametern: " echo $QUERY_STRING echo "</body></html>" VL Datenbanken I – 10–75 ■ Probleme des CGI ◆ Performance: jeder Aufruf = Start eines neuen Prozesses ◆ Aufbau einer neuen DB-Verbindung ◆ Programm läuft unter UID des Web-Servers ■ FastCGI ◆ „persistente“ Prozesse ◆ Interprozeßkommunikation zwischen Server und FastCGI-Prozeß ■ Server-Erweiterungen ◆ Erweiterung als Programmbibliothek, die zum Server dynamisch gebunden wird (NSAPI, ISAPI) VL Datenbanken I – 10–76 Java Servlets Java Servlets: Schnittstelle interface javax.servlet.Servlet ■ Servlet = Java-Objekt, das im Kontext eines Web-Servers abläuft ■ ■ Alternative zu CGI ◆ verarbeitet Dokumentanforderungen ◆ liefert Dokumente als Ergebnis void init (ServletConfig config) Initialisierung des Servlets (z.B. Öffnen benötigter Dateien, Öffnen einer Datenbank-Verbindung, . . . ) ■ ■ Unterstützung von ◆ Cookies ◆ Session-Management void destroy () Aufräumarbeiten (z.B. DB-Verbindung schließen, Daten speichern) ■ void service (ServletRequest req, ServletResponse res) Bearbeitung der Anfrage (Parameterabfrage, Ergebnisgenerierung) ■ Ablauf ◆ direkt im Server (Java-WebServer) ◆ in separatem Prozeß (Servlet-Engines) VL Datenbanken I – 10–77 Beispiel-Servlet VL Datenbanken I – 10–78 Einbettung public class HelloServlet extends javax.servlet.GenericServlet { // Bearbeitung der Anforderung public void service (ServletRequest req, ServletResponse res) throws ServletException, IOException { // MIME-Typ des Antwortdokuments res.setContentType ("text/html"); // Ausgabestrom ServletOutputStream out = res.getOutputStream (); out.println ("Hello World !"); } } VL Datenbanken I – 10–79 ■ Einbettung von Kommandos (z.B. Datenbankoperationen) in HTML-Dokument ■ Skriptsprachen wie Perl, Visual Basic, PHP, ... ■ Kennzeichnung durch spezielle Tags (z.B. <% . . . %>) ■ Verarbeitung ◆ Parsen des Dokumentes vor Auslieferung ◆ Intepretieren der Kommandos in Tags ◆ Ersetzen durch Ergebnis der Ausführung VL Datenbanken I – 10–80 Einbettung: Prinzip <html> <body> <? query_db () ?> </body> </html> SkriptInterpreter Einbettung mit PHP <html> <body> <table> <tr> ... </tr> </table> </body> </html> ■ PHP: Skriptsprache für server-seitige Einbettung in HTML ■ Features ◆ C-ähnliche Syntax, objektorientierte Konzepte ◆ einfache Verarbeitung von Dokumentanforderung ◆ dynamische Generierung von HTML-Dokumenten ◆ Schnittstellen zu vielen Systemfunktionen und DBMS ◆ Prinzip <html><body> <?php echo "Hello World !" ?> </body></html> VL Datenbanken I – 10–81 Einbettung mit PHP VL Datenbanken I – 10–82 PHP-Beispiel: Formular ■ Einbindung externer Dateien (z.B. HTML-Vorlagen) ■ require ’dateiname’ Einfügen des Inhaltes ■ include ’dateiname’ Einfügen und Auswerten ■ Verarbeitung von Formularen ◆ Auswertung der Umgebungsvariablen durch PHP-Interpreter ◆ Zugriff auf Werte der Felder: Variablen mit Elementnamen ■ Beispiel: ◆ HTML: <input type="text" name="var" > ◆ PHP: $var VL Datenbanken I – 10–83 <form method=POST action="/path/query.php3"> <input type="text" name="autor"> <input type="submit"> </form> VL Datenbanken I – 10–84 PHP-Beispiel: PHP-Skript Java Server Pages <html><body> <table border=1> <tr><th>Autor</th><th>Titel</th><th>Preis</th></tr> <?php if (isset($author)) { $query = "SELECT autor, titel, preis FROM " . "buch WHERE autor like=’%$author%’"; mysql_connect ($host, $user, $passwd); mysql_select_db ("my_db"); $result = mysql_query ($query); while ($row = mysql_fetch_row ($result)) { echo "<tr><td>$row[0]</td><td>$row[1]</td>"; echo "<td>$row[2]</td></tr>"; } }?> </table></body></html> ■ Java-Quelltext in HTML ■ Integration von Java-Komponenten (Beans) Prinzip ◆ basierend auf Servlets ◆ Compilieren des eingebetteten Codes: → Generierung eines Servlet ◆ bei wiederholter Anforderung: → Nutzung des compilierten Servlets ■ Vorteil: Performance VL Datenbanken I – 10–85 Java Server Pages ■ ■ JSP: Syntax Zugriff auf ◆ vollständigen Java-Sprachumfang ◆ implizite Objekte (Requests, Sessions) ■ Include-Direktiven <%@ include file="relativeURL" %> ■ Server-Page ◆ ■ VL Datenbanken I – 10–86 Übersetzungseinheit: HTML + Scriptlets (eingebetteter Java-Code) + eingebundene Dateien (über include-Direktive) Markierung in HTML-Seite <% ...%> Deklarationen (Variablen, Methoden) <%! String printMessage (String s) { return "ERROR: " + s; } %> <%! int var = 0; %> ■ Expressions (Ausdrücke): Einfügen von Werten <%= output %> <%= Math.sqrt (2) %> VL Datenbanken I – 10–87 VL Datenbanken I – 10–88 Makroprogrammierung Internet Database Connector (IDC) HTML-Schablone <html> <body> <table> <tr> ... </tr> </table> </body> </html> <html> <body> <% Makro %> </body> </html> Makro SELECT * FROM tabelle MakroProzessor ■ Einfache Erweiterung für MS Internet Information Server auf Basis von ODBC ■ stark eingeschränkte Skriptsprache ■ kaum Anwendungslogik implementierbar ■ wenig Kontrolle über Ausgabe ■ einfach anwendbar ■ Prinzip ◆ idc-Datei mit DB-Operationen ◆ htx-Datei mit HTML-Templates VL Datenbanken I – 10–89 IDC: Aufbau der idc-Datei ■ VL Datenbanken I – 10–90 IDC: Aufbau der htx-Datei beinhaltet ◆ ODBC-Datenquelle (Datasource) ◆ Verweis auf HTML-Template (Template) ◆ Anfragen (SQLStatement) ◆ SQLStatement mit Anfrageparametern (Wert eines Formularelementes) SQLStatement: + SELECT autor, titel, preis + FROM buch + WHERE autor=<%autor%>; VL Datenbanken I – 10–91 ■ Vorlage für HTML-Seiten mit Anfrageergebnissen ■ bestehend aus ◆ Kopf-, Fußbereich (unabhängig vom Ergebnis) ◆ Detailbereich (in Abhängigkeit vom Ergebnis: Wiederholung für jedes Ergebnistupel) – Kennzeichnung des Detailbereiches <%begindetail%> <%enddetail%> – Kennzeichnung der Ergebnisdaten <%attribut%> VL Datenbanken I – 10–92 IDC: Aufbau der htx-Datei ■ IDC: Kontrollstrukturen Beispiel: <table border=1> <tr><th>Autor</th><th>Titel</th> <th>Preis</th></tr> <%begindetail%> <tr><td><%autor%></td> <td><%titel%></td> <td><%preis%></td> </tr> <%enddetail%> </table> ■ Unterstützung bedingter Ausführung durch if...else...endif ■ spezielle Tags: <%if bedingung %> HTML [ <%else%> HTML ] <%endif%> ■ Bedingungen mit ◆ Operatoren EQ, LT, GT, CONTAINS ◆ Variablen: Ergebnisdaten, Servervariablen, spezielle Variablen (CurrentRecord, MaxRecords) VL Datenbanken I – 10–93 Vergleich und Bewertung IDC: Aufruf ■ VL Datenbanken I – 10–94 Aufruf der IDC-Skripte wie CGI-Programme als URL im ACTION-Attribut eines Formulars <form method=post action="/shop/query.idc"> ... <input type="text" name="autor"> <input type="submit> </form> VL Datenbanken I – 10–95 Programmierschnittstellen ■ Vorteile ◆ Performance ◆ Codegröße ◆ Optimierbarkeit für konkrete Anforderungen ■ Nachteile ◆ unflexibel (u.U. Neuübersetzung bei Änderungen) ◆ Aufwand: – neues Programm für jedes Problem – Generierung von HTML ◆ Performance bei CGI VL Datenbanken I – 10–96 Vergleich und Bewertung Vergleich und Bewertung Einbettung Makroprogrammierung ■ Vorteile ◆ Lesbarkeit durch Plazierung von SQL-Anweisungen an die spätere Position der Daten ◆ Erstellung und Wartung mit HTML-Wekzeugen möglich ◆ eine gemeinsame Datei ■ Nachteile ◆ bei größeren Projekten unübersichtlich durch Mischung von HTML und SQL ◆ Performanceprobleme durch Parsen und Interpretieren von eingebetteten Anweisungen ■ Vorteile ◆ Bearbeitung von HTML-Dateien mit HTML-Werkzeugen möglich ◆ übersichtliche Spezifikation aller SQL-Anfragen ◆ Wiederverwendbarkeit von Anfragen und HTML-Templates ◆ schnelleres Parsen durch kleinere Dateien ■ Nachteile ◆ schlechte Überschaubarkeit durch Verteilung auf mehrere Dateien ◆ mehrere Dateizugriffe notwendig VL Datenbanken I – 10–97 Realisierung von Zuständen ■ Problem: Zustandslosigkeit von HTTP ■ im Normalfall: Anforderung = 1. Aufbau der DB-Verbindung 2. Ausführung der Anfrage 3. Abbruch der Verbindung VL Datenbanken I – 10–98 Realisierung von Zuständen ■ keine Sitzung mit mehreren Verarbeitungsschritten möglich (Transaktionskonzept) ■ potentiell paralleler Zugriff vieler Nutzer VL Datenbanken I – 10–99 ■ Aufgabe: server-seitige „Speicherung“ des Kontextes (Zustandes) des Clients → Session-ID ■ Verfahren: ◆ URL-Kodierung ◆ Formularvariable ◆ Cookies ◆ HTTP-Authentisierung ■ notwendig: Timeout-Mechanismen für Sitzungsende und Freigabe belegter Ressourcen VL Datenbanken I – 10–100 URL-Kodierung Formularvariable ■ ■ Übergabe der Session-ID als Teil der URL ■ explizite Kodierung als Parameter (GET-Request) ■ Beispiel: http://bookshop.com/buy?session=42 ■ server-seitige Behandlung wie Formularvariable ■ Kodierung in Pfad ■ Beispiel: http://bookshop.com/42/daten.html ■ bei relativer Adressierung kein weiterer Aufwand zur Generierung ■ ■ Speichern der Session-ID in einem (versteckten) Formularelement <input type="hidden" name="session" value="42"> ■ Übergabe des Wertes mit HTTP-Request (GET, POST) ■ Sitzungsmanagement ◆ Auslesen des Feldwertes ◆ Erzeugen eines neuen Feldes mit aktuellem Wert für Folgeseiten Vorteil: Browser-unabhängig ■ Vorteil: Browser-unabhängig Problem: Initialisierung ■ Probleme: Im HTML-Quelltext sichtbar, dynamische Generierung der Folgeseiten notwendig VL Datenbanken I – 10–101 Cookies ■ Metainformation zu Web-Dokumenten ■ Einbettung in HTTP-Header bei Übertragung des Dokumentes zum Browser ■ Aufbau: VL Datenbanken I – 10–102 Cookies ■ Beispiel Set-Cookie: CustId="42"; Path="/bookshop" ■ Cookies werden vom Browser ◆ persistent gehalten (bis zum Verfallszeitpunkt) ◆ bei Anforderung eines Dokumentes aus dem jeweiligen Bereich zum Server übertragen Cookie: CustId=42 ■ Vorteil: automatische Unterstützung durch Browser ■ Problem: abschaltbar durch Nutzer Set-Cookie: Name=Wert; expires=Datum; path=Pfad; domain=Domäne Name, Wert des Cookies ◆ Gültigkeit ◆ Zeit: Datum ◆ Web-Server/Bereich: Pfad, Domäne ◆ VL Datenbanken I – 10–103 VL Datenbanken I – 10–104 HTTP-Authentisierung Cookies mit PHP ■ ■ ■ Setzen eines Cookies ■ Nutzung der Authentisierungsmechanismen von HTTP int setcookie (string name, string value, int expire, string path, string domain, int secure); ■ Nutzer/Paßwort-Abfrage durch Browser ■ Speichern der Nutzerinformation in der Umgebungsvariablen REMOTE_USER Beispiel: ■ setcookie ("CustId", "42", time () + 3600, "/bookshop"); automatische Übermittlung durch Browser nach erfolgreicher Anmeldung ■ Problem: erfordert vorherige Registrierung Lesen eines gesendeten Cookies: Cookie wird als Variable übergeben $CustId VL Datenbanken I – 10–105 VL Datenbanken I – 10–106