10. Anwendungsprogrammierung Client-Server-Architektur

Werbung
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
Herunterladen