290 likes | 413 Views
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. Warum Servlets?. Servlets Motivation Tutorial
E N D
Übersicht • Applikationslogik auf dem Web-Server: Servlets • Motivation • Servlet-Tutorial • Architektur, Trennung von Applikation und Präsentation • Session-Management • Datenbankanbindung in Java: JDBC Web-Anbindung von Datenbanken
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: • Standard-API • Plattformunabhängig Java • Lightweight threads • Stabil } Web-Anbindung von Datenbanken
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, Referenzen usw. siehe Projektauftrag Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Beispiel 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>"); } } Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Beispiel 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>"); ( ... ) Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Beispiel 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); } } } Web-Anbindung von Datenbanken
<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> • Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Beispiel 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); } } } Web-Anbindung von Datenbanken
Instantiation Loading Initialisation init(ServletConfig config) Ready service(ServletRequest req, ServletResponse res) doGet(ServletRequest req, ServletResponse res) doPost(ServletRequest req, ServletResponse res) Garbage Collection Destruction destroy() • Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Servlet Lebenszyklus Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • 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 Web-Anbindung von Datenbanken
Business-Objekte Servlets • Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Architektur einer Web-Applikation Browser Presentation Layer Business-Objekte Business-Objekte Business Layer Web Server Datenbankzugriff Data Access Layer JDBC Datenbankserver Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Trennen von Applikationscode und BSS (HTML) Schreiben Sie Ihren eigenen Page-Parser Klassenbibliotheken (Objekte exportieren HTML, Umweg über XML) WebMacro HTML hartcodiert (in print-Anweisungen in doGet/doPost) Pro: einfach für Programmierer Con: Web-Designer/Design Tools, Wartbarkeit Server Side Includes SSI (<SERVLET> tag in HTML) Pro: Trennung von BSS und Code Con: Entweder Servlet druckt Häppchen ohne HTML oder man hat wieder hartcodiertes HTML Templates (for common parts of all pages) Pro: Arbeitsersparnis, Wartbarkeit Con: wie SSI Java Server Pages JSP Pro: Nur eine Datei für Code und BSS, kein print Con: Wieder Mix von Applikation und HTML JavaBeans 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 Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC 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 Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC 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 Web-Anbindung von Datenbanken
Servlets • Motivation • Tutorial • Architektur/Design • Sessions • JDBC Beispiel: HttpSession HttpSessionsession = 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); } } Beliebiges Object Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht Datenbankanbindung in Java JDBC • Was ist JDBC? • ODBC = Open Database Connectivity • JavaSoft-Spezifikation für herstellerunabhängigesAPI zum Zugriff auf SQL-Datenbankmanagementsystemein • Klassen-/Schnittstellensammlung Funktioniert auch in Servlets Web-Anbindung von Datenbanken
1. Treiber laden 2. Verbindung zur DB herstellen 3. SQL-Anweisung erzeugen Protokoll Unterprotokoll Oracle-spez. Rechner Port } 4. Anweisung absenden 5. Ergebnisse verarbeiten 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.*; ... Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht 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 Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht 2-Schicht-Architektur: Java-Anwendung Client-Rechner JDBC DBMS-eigenes Protokoll DBMS Datenbank-Server Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht 3-Schicht-Architektur: Java-Applet oder WWW-Browser Client-Maschine (GUI) HTTP, RMI, CORBA Anwendungsserver Anwendungsserver (Geschäftsprozesse) JDBC DBMS DBMS-eigenes Protokoll Datenbank-Server Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht Das java.sql Package • Wichtig sind zunächst folgende Klassen/Schnittstellen/Ausnahmen: • DriverManager • Connection • Statement • ResultSet • SQLException Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht java.sql.DriverManager • Verwaltet Treiber • Treiber werden durch Aufruf von Class.forName("DriverClassName") registriert • Methoden:Connection getConnection(String url,...); Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht java.sql.Connection • Repräsentiert Verbindung zur Datenbank • Senden von SQL-Anweisungen • Methoden:Statement createStatement();void close(); Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht java.sql.Statement • Ausführung von Anweisungen • Abfrage von Ergebnissen • Drei Typen • Methoden:ResultSet executeQuery(String);int executeUpdate(String);void close(); Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht java.sql.ResultSet • Tabelle mit Ergebnis einer Anweisung • Iterieren mit boolean next(); • Zugriff auf Spaltenwerte mitType getType(String columnName);oderType getType(int columnIndex);Type = {String, Boolean, Byte, Int, Float, ...} Web-Anbindung von Datenbanken
Servlets • JDBC • Einführung • Architekturen • Klassenübersicht java.sql.SQLException • Methoden:String getSQLState();int getSQLErrorCode();SQLException getNextException(); Web-Anbindung von Datenbanken
Property-Class-Generator PropTest.prp ________________________ test.prp=hello, world test.hello=its me • 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"); • } • } Web-Anbindung von Datenbanken