Web-Anbindung von Datenbanken
2.6.99 Web-Anbindung von Datenbanken 2
Ü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 3
• HTTP: Anforderung von Dokumenten• Problem: Dynamik• Lösungen:
– Client-seitig JavaScript, Applets– Server-seitig CGI, ASP, LiveWire, PHP ...
• Servlets:– Standard-API– Plattformunabhängig Java– Lightweight threads– Stabil
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
}
Warum Servlets?
2.6.99 Web-Anbindung von Datenbanken 4
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
• Java Servlet Development Kit JSDK 2.0~ag-db/sw/packages/JSDK2.0
• Zwei Packages: javax.servletjavax.servlet.http
• CLASSPATH enthält~ag-db/sw/packages/JSDK2.0/lib/jsdk.jar
• Pfade, Referenzen usw. siehe Projektauftrag
2.6.99 Web-Anbindung von Datenbanken 5
ServletsMotivationTutorialArchitektur/DesignSessions
JDBCBeispiel 1: Einfaches Servlet 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 6
ServletsMotivationTutorialArchitektur/DesignSessions
JDBCBeispiel 2: Request Info
( ... ) 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 7
ServletsMotivationTutorialArchitektur/DesignSessions
JDBCBeispiel 3: Request Header
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 8
ServletsMotivationTutorialArchitektur/DesignSessions
JDBCBeispiel 4: Request Parameters
public class RequestParamExample extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("GET Request. No Form Data Posted"); }
public void doPost(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException { Enumeration e = request.getParamterNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = request.getParamter(name); out.println(name + " = " + value); } }}
<html><body>
<form action="RequestParamExample" method=POST>Vorname: <input type=text size=20 name=firstname><br>Nachname: <input type=text size=20 name=lastname><br><input type=submit></form>
</body></html>
2.6.99 Web-Anbindung von Datenbanken 9
ServletsMotivationTutorialArchitektur/DesignSessions
JDBCServlet Lebenszyklus
InstantiationLoading
Initialisationinit(ServletConfig config)
Readyservice(ServletRequest req, ServletResponse res)doGet(ServletRequest req, ServletResponse res)doPost(ServletRequest req, ServletResponse res)
Destructiondestroy()Garbage Collection
2.6.99 Web-Anbindung von Datenbanken 10
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
Web-Server-Konfiguration und URLs
• 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 11
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
Architektur einer Web-Applikation
Browser
Datenbankserver
Business-ObjekteBusiness-Objekte
Datenbankzugriff
Business-ObjekteServlets
JDBC
Web
Ser
ver Presentation Layer
Business Layer
Data Access Layer
2.6.99 Web-Anbindung von Datenbanken 12
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
Trennen von Applikationscode undBSS (HTML)
HTML hartcodiert (in print-Anweisungen in doGet/doPost)Pro: einfach für ProgrammiererCon: Web-Designer/Design Tools, Wartbarkeit
Server Side Includes SSI (<SERVLET> tag in HTML)Pro: Trennung von BSS und CodeCon: Entweder Servlet druckt Häppchen ohne HTML
oder man hat wieder hartcodiertes HTMLTemplates (for common parts of all pages)
Pro: Arbeitsersparnis, WartbarkeitCon: wie SSI
Java Server Pages JSPPro: Nur eine Datei für Code und BSS, kein printCon: Wieder Mix von Applikation und HTML JavaBeans
Schreiben Sie Ihren eigenen Page-ParserKlassenbibliotheken (Objekte exportieren HTML,
Umweg über XML)WebMacro
Servlet: Vector personen;contex.put("Persons",personen);
Template: $foreach Person in Persons
<TR><TD>$Person.Name</TD><TD>$Person.Vorname</TD><TD>$Person.Telefon</TD></TR>
$end
2.6.99 Web-Anbindung von Datenbanken 13
HTTP ist zustandslos!
• 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
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
2.6.99 Web-Anbindung von Datenbanken 14
Servlet API für Sessions
• 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
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
2.6.99 Web-Anbindung von Datenbanken 15
Beispiel: HttpSession HttpSession session = request.getSession(true);
out.println("ID " + session.getId()); out.println("Created: " + session.getCreationTime()); out.println("Last Accessed: " + session.getLastAccessedTime());
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); } }
ServletsMotivationTutorialArchitektur/DesignSessions
JDBC
Beliebiges Object
2.6.99 Web-Anbindung von Datenbanken 16
2.6.99 Web-Anbindung von Datenbanken 17
Datenbankanbindung in Java JDBC
• Was ist JDBC?– ODBC = Open Database Connectivity– JavaSoft-Spezifikation für herstellerunabhängiges API zum Zugriff auf SQL-Datenbankmanagementsystemein
– Klassen-/SchnittstellensammlungFunktioniert auch in Servlets
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 18
Class.forName("oracle.jdbc.driver.OracleDriver");String url = "jdbc:oracle:thin:@jefe:1521:JEFE";Connection con = DriverManager.getConnection(
url, "aws ", "********");
Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(
"SELECT name, e_mail FROM adressen");
while (rs.next()) {String n = rs.getString("name");String n = rs.getString("e_mail");System.out.println(s + ": " + n);}
#import java.io.*;#import java.sql.*;#import com.sybase.jdbc.*;#import java.util.*;...
1. Treiber laden
2. Verbindung zur DB herstellen
3. SQL-Anweisung erzeugen
4. Anweisung absenden
5. Ergebnisse verarbeiten}Protokoll Unterprotokoll Oracle-spez. Rechner Port
2.6.99 Web-Anbindung von Datenbanken 19
Treiber• Übersetzt JDBC-Aufrufe in
DB-(Hersteller-)spezifische Aufrufe• Verschiedene Typen• Beispiel:
com.sybase.jdbc.SybDriveraus jConnect
• Laden mit Class Loader:Class.forName("com. ... SybDriver");
Dynamisch konfigurierbar
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 20
DBMS
2-Schicht-Architektur:
JDBC
Java-Anwendung Client-Rechner
DBMS-eigenes Protokoll
Datenbank-Server
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 21
DBMS
3-Schicht-Architektur:
JDBC
Anwendungsserver
Client-Maschine (GUI)
DBMS-eigenes Protokoll
Datenbank-Server
ServletsJDBC
EinführungArchitekturenKlassenübersicht
Anwendungsserver (Geschäftsprozesse)
HTTP, RMI, CORBA
Java-Applet oderWWW-Browser
2.6.99 Web-Anbindung von Datenbanken 22
Das java.sql Package
• Wichtig sind zunächst folgende Klassen/Schnittstellen/Ausnahmen:
– DriverManager– Connection– Statement– ResultSet– SQLException
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 23
java.sql.DriverManager
• Verwaltet Treiber• Treiber werden durch Aufruf von Class.forName("DriverClassName") registriert
• Methoden:Connection getConnection(String url,...);
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 24
java.sql.Connection
• Repräsentiert Verbindung zur Datenbank• Senden von SQL-Anweisungen• Methoden:Statement createStatement();void close();
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 25
java.sql.Statement
• Ausführung von Anweisungen• Abfrage von Ergebnissen• Drei Typen• Methoden:ResultSet executeQuery(String);int executeUpdate(String);void close();
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 26
java.sql.ResultSet
• Tabelle mit Ergebnis einer Anweisung • Iterieren mit boolean next();
• Zugriff auf Spaltenwerte mit Type getType(String columnName);oderType getType(int columnIndex);Type = {String, Boolean, Byte, Int, Float, ...}
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 27
java.sql.SQLException
• Methoden:String getSQLState();int getSQLErrorCode();SQLException getNextException();
ServletsJDBC
EinführungArchitekturenKlassenübersicht
2.6.99 Web-Anbindung von Datenbanken 28
2.6.99 Web-Anbindung von Datenbanken 29
Property-Class-Generator• PropTest.snippet:• /* This file was generated by PropClassGen from PropTest.prp */• import java.util.*;• import java.io.*;• public class PropTest {• public static Properties properties_;• public static String TEST_PRP,• TEST_HELLO;• 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");• }• }
PropTest.prp________________________
test.prp=hello, worldtest.hello=its me