Web-Anbindung von Datenbanken

Werbung
Web-Anbindung von
Datenbanken
Übersicht
• Applikationslogik auf dem Web-Server:
Servlets
– Motivation
– Servlet-Tutorial
– Architektur, Trennung von Applikation und
Präsentation
– Session-Management
• Datenbankanbindung in Java: JDBC
2.6.99
Web-Anbindung von Datenbanken
2
Warum Servlets?
Servlets
Motivation
Tutorial
Architektur/Design
Sessions
JDBC
• HTTP: Anforderung von Dokumenten
• Problem: Dynamik
• Lösungen:
– Client-seitig JavaScript, Applets
– Server-seitig CGI, ASP, LiveWire, PHP ...
• Servlets:
–
–
–
–
2.6.99
}
Standard-API
Plattformunabhängig
Java
Lightweight threads
Stabil
Web-Anbindung von Datenbanken
3
Servlets
Motivation
Tutorial
Architektur/Design
Sessions
JDBC
• Java Servlet Development Kit JSDK 2.0
~ag-db/sw/packages/JSDK2.0
• Zwei Packages:
javax.servlet
javax.servlet.http
• CLASSPATH enthält
~ag-db/sw/packages/JSDK2.0/lib/jsdk.jar
• Pfade,
2.6.99
Referenzen usw. siehe Projektauftrag
Web-Anbindung von Datenbanken
4
Servlets
Motivation
Tutorial
Beispiel 1: Einfaches Servlet
Architektur/Design
Sessions
JDBC
import java.io.*;
import java.servlet.*;
import javax.servlet.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
2.6.99
Web-Anbindung von Datenbanken
5
Servlets
Motivation
Tutorial
Beispiel 2: Request Info
Architektur/Design
Sessions
JDBC
( ... )
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Request Information Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Request Information Example</h3>");
out.println("Method: " + request.getMethod());
out.println("Request URI: " + request.getRequestURI());
out.println("Protocol: " + request.getProtocol());
out.println("PathInfo: " + request.getPathInfo());
out.println("Remote Address: " + request.getRemoteAddr());
out.println("</body>");
out.println("</html>");
( ... )
2.6.99
Web-Anbindung von Datenbanken
6
Servlets
Motivation
Tutorial
Beispiel 3: Request Header
Architektur/Design
Sessions
JDBC
import java.io.*;
import java.servlet.*;
import javax.servlet.*;
public class RequestHeaderExample extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = request.getHeader(name);
out.println(name + " = " + value);
}
}
}
2.6.99
Web-Anbindung von Datenbanken
7
Servlets
Motivation
Tutorial
Beispiel 4: Request Parameters
Architektur/Design
Sessions
JDBC
public
class RequestParamExample extends HttpServlet {
<html>
<body>
public void doGet(HttpServletRequest request, HttpServletResponse response)
throwsaction="RequestParamExample"
IOException, ServletException
<form
method=POST>
{
Vorname:
response.setContentType("text/html");
<input
type=text size=20 name=firstname>
PrintWriter
out = response.getWriter();
<br>
out.println("GET Request. No Form Data Posted");
Nachname:
}
<input
type=text size=20 name=lastname>
<br>
public type=submit>
void doPost(HttpServletRequest request, HttpServletResponse res)
<input
throws IOException, ServletException
</form>
{
Enumeration e = request.getParamterNames();
</body>
while (e.hasMoreElements()) {
</html>
String name = (String)e.nextElement();
String value = request.getParamter(name);
out.println(name + " = " + value);
}
}
}
2.6.99
Web-Anbindung von Datenbanken
8
Servlets
Motivation
Tutorial
Architektur/Design
Sessions
Servlet Lebenszyklus
Instantiation
Loading
JDBC
Initialisation
init(ServletConfig config)
Ready
service(ServletRequest req, ServletResponse res)
doGet(ServletRequest req, ServletResponse res)
doPost(ServletRequest req, ServletResponse res)
Garbage Collection
2.6.99
Destruction
destroy()
Web-Anbindung von Datenbanken
9
Servlets
Motivation
Tutorial
Web-Server-Konfiguration und URLs
Architektur/Design
Sessions
JDBC
• Standard-Web-Server unterstützen Servlets
• JSDK liefert Web-Server mit
(Doku siehe Projektauftrag)
servletrunner
•Property-Dateien assoziieren URL mit Servlet
• Servlet kann unter vielen Namen angesprochen werden
2.6.99
Web-Anbindung von Datenbanken
10
Architektur einer Web-Applikation
Servlets
Motivation
Tutorial
Architektur/Design
Sessions
JDBC
Web Server
Browser
Business-Objekte
Servlets
Presentation Layer
Business-Objekte
Business-Objekte
Business Layer
Datenbankzugriff
Data Access Layer
JDBC
Datenbankserver
2.6.99
Web-Anbindung von Datenbanken
11
Trennen von Applikationscode und
BSS (HTML)
Servlets
Motivation
Tutorial
Architektur/Design
Sessions
JDBC
Schreiben
Sie Ihren(in
eigenen
Page-Parser
HTML hartcodiert
print-Anweisungen
in doGet/doPost)
Pro: einfach für (Objekte
Programmierer
Klassenbibliotheken
exportieren HTML,
Con:
Web-Designer/Design
Umweg
über XML) Tools, Wartbarkeit
Server
Side Includes SSI (<SERVLET> tag in HTML)
WebMacro
Servlet:
Pro: Trennung
von BSS und Code
Vector
personen;
Con: Entweder Servlet
druckt
Häppchen ohne HTML
oder mancontex.put("Persons",personen);
hat wieder hartcodiertes HTML
Templates (for Template:
common parts of all pages)
$foreach
Person in Persons
Pro: Arbeitsersparnis,
Wartbarkeit
<TR>
Con: wie SSI
Java
2.6.99
<TD>$Person.Name</TD>
Server Pages JSP <TD>$Person.Vorname</TD>
Pro: Nur eine Datei
für Code und BSS, kein print
<TD>$Person.Telefon</TD>
Con: Wieder Mix </TR>
von Applikation und HTML  JavaBeans
$end
Web-Anbindung von Datenbanken
12
Servlets
Motivation
Tutorial
Architektur/Design
HTTP ist zustandslos!
Sessions
JDBC
• Ursprünglich Request/Reply-Paradigma
• ECommerce, Electronic Banking …:
Speichern von Zustandsinformation über
Seitenzugriff / Browersitzung hinaus
• Techniken:
– URL Rewriting
(<A HREF="nextpage.html;$sessionid$=AWEIRGTERUT">)
– Cookies
2.6.99
Web-Anbindung von Datenbanken
13
Servlets
Motivation
Tutorial
Architektur/Design
Servlet API für Sessions
Sessions
JDBC
• javax.servlet.http.Cookie
• Viel bequemer und mächtiger:
javax.servlet.http.HttpSession
– Cookies/URL Rewriting transparent für
Entwickler
– Objekte werden gespeichert
– Auch über Servlet-Grenzen hinweg
2.6.99
Web-Anbindung von Datenbanken
14
Servlets
Motivation
Tutorial
Architektur/Design
Beispiel: HttpSession
Sessions
JDBC
HttpSession session = request.getSession(true);
out.println("ID " + session.getId());
out.println("Created: " + session.getCreationTime());
out.println("Last Accessed: " + session.getLastAccessedTime());
Beliebiges
Object
2.6.99
String dataName = request.getParameter("dataName");
if (dataName != null && dateName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.putValue(dataName, dataValue);
}
String[] valueNames = session.getValueNames();
if (valueNames != null && valueNames.length > 0) {
for (int i = 0; i < valueNames.length; i++) {
String name = valueNames[i];
String value = session.getValue(name).toString();
out.println(name + " = " + value);
}
}
Web-Anbindung von Datenbanken
15
2.6.99
Web-Anbindung von Datenbanken
16
Servlets
JDBC
Datenbankanbindung in Java
JDBC
Einführung
Architekturen
Klassenübersicht
• Was ist JDBC?
– ODBC = Open Database Connectivity
– JavaSoft-Spezifikation für
herstellerunabhängiges
API zum Zugriff auf
SQL-Datenbankmanagementsysteme
in
Funktioniert auch in Servlets 
– Klassen-/Schnittstellensammlung
2.6.99
Web-Anbindung von Datenbanken
17
1. Treiber laden
#import
#import
#import
#import
...
java.io.*;
java.sql.*;
com.sybase.jdbc.*;
java.util.*;
2. Verbindung zur DB herstellen
3. SQL-Anweisung erzeugen
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@jefe:1521:JEFE";
Connection con = DriverManager.getConnection(
url, "aws ",
"********");
Protokoll
Unterprotokoll
Oracle-spez. Rechner Port
Statement stmt
= con.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT name, e_mail FROM adressen");
4. Anweisung absenden
while (rs.next()) {
String n = rs.getString("name");
String n = rs.getString("e_mail");
5. Ergebnisse verarbeiten
System.out.println(s + ": " + n);
}
}
2.6.99
Web-Anbindung von Datenbanken
18
Servlets
JDBC
Einführung
Treiber
Architekturen
Klassenübersicht
• Übersetzt JDBC-Aufrufe in
DB-(Hersteller-)spezifische Aufrufe
• Verschiedene Typen
• Beispiel:
com.sybase.jdbc.SybDriver
aus jConnect
• Laden mit Class Loader:
Class.forName("com. ... SybDriver");
Dynamisch konfigurierbar
2.6.99
Web-Anbindung von Datenbanken
19
Servlets
JDBC
Einführung
Architekturen
2-Schicht-Architektur:
Java-Anwendung
Klassenübersicht
Client-Rechner
JDBC
DBMS-eigenes Protokoll
DBMS
2.6.99
Datenbank-Server
Web-Anbindung von Datenbanken
20
Servlets
JDBC
Einführung
3-Schicht-Architektur:
Java-Applet oder
WWW-Browser
Architekturen
Klassenübersicht
Client-Maschine (GUI)
HTTP, RMI, CORBA
Anwendungsserver
JDBC
Anwendungsserver
(Geschäftsprozesse)
DBMS-eigenes Protokoll
DBMS
2.6.99
Datenbank-Server
Web-Anbindung von Datenbanken
21
Servlets
JDBC
Einführung
Architekturen
Das java.sql Package
Klassenübersicht
• Wichtig sind zunächst folgende
Klassen/Schnittstellen/Ausnahmen:
–
–
–
–
–
2.6.99
DriverManager
Connection
Statement
ResultSet
SQLException
Web-Anbindung von Datenbanken
22
Servlets
JDBC
Einführung
Architekturen
java.sql.DriverManager
Klassenübersicht
• Verwaltet Treiber
• Treiber werden durch Aufruf von
Class.forName("DriverClassName")
registriert
• Methoden:
Connection getConnection(String url,...);
2.6.99
Web-Anbindung von Datenbanken
23
Servlets
JDBC
Einführung
Architekturen
java.sql.Connection
Klassenübersicht
• Repräsentiert Verbindung zur Datenbank
• Senden von SQL-Anweisungen
• Methoden:
Statement createStatement();
void close();
2.6.99
Web-Anbindung von Datenbanken
24
Servlets
JDBC
Einführung
Architekturen
java.sql.Statement
•
•
•
•
Klassenübersicht
Ausführung von Anweisungen
Abfrage von Ergebnissen
Drei Typen
Methoden:
ResultSet executeQuery(String);
int executeUpdate(String);
void close();
2.6.99
Web-Anbindung von Datenbanken
25
Servlets
JDBC
Einführung
Architekturen
java.sql.ResultSet
Klassenübersicht
• Tabelle mit Ergebnis einer Anweisung
• Iterieren mit
boolean next();
• Zugriff auf Spaltenwerte mit
Type getType(String columnName);
oder
Type getType(int columnIndex);
Type = {String, Boolean, Byte, Int, Float, ...}
2.6.99
Web-Anbindung von Datenbanken
26
Servlets
JDBC
Einführung
Architekturen
java.sql.SQLException
Klassenübersicht
• Methoden:
String getSQLState();
int getSQLErrorCode();
SQLException getNextException();
2.6.99
Web-Anbindung von Datenbanken
27
2.6.99
Web-Anbindung von Datenbanken
28
Property-Class-Generator
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
PropTest.snippet:
/* This file was generated by PropClassGen from PropTest.prp */
import java.util.*;
import java.io.*;
PropTest.prp
public class PropTest {
________________________
public static Properties properties_;
public static String TEST_PRP,
test.prp=hello, world
TEST_HELLO;
test.hello=its me
static {
properties_ = new Properties();
try {
properties_.load(
new BufferedInputStream(
new FileInputStream(
"/home/sahib/weber/java/mail//PropTest.prp")));
} catch (Exception e) {
System.out.println(e.getMessage());
}
TEST_PRP = properties_.getProperty("test.prp");
TEST_HELLO = properties_.getProperty("test.hello");
}
}
2.6.99
Web-Anbindung von Datenbanken
29
Herunterladen