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