Datenbank im Internet 13 Datenbank im Internet Für das Internet haben wir die Situation, dass die Oberfläche entfernt auf einem Client als HTML-Seite läuft und mit den beiden restlichen Schichten kommuniziert werden muss. Zur Abwicklung dieser Kommunikation werden zwei Zusatzprogramme, der Web-Server (hier Apache) und der Web-Client (hier Explorer), benötigt. Als Quellen wurden benutzt: [1] Balzert für die Installation, [10] Turau für die Realisierung, und [12] für die (kostenlose) SW. Client Server Oberfläche Web-Browser Web-Server Programme Datenbank Dazu muss zunächst der Web-Server installiert werden. Der Web-Client ist wahrscheinlich bereits installiert. Für den Betrieb sind notwendig: starten des Web-Servers in: C:\Dokumente und Einstellungen\Steyer\Startmenü\Programme\Apache Tomcat 4.1 Plazierung einer jsp-Seite im ROOT-Verzeichnis In: C:\Programme\Apache Group\Tomcat 4.1\webapps\ROOT Aufruf einer Seite im Browser http://localhost:8080/eins.jsp stoppen des Web-Servers in: C:\Dokumente und Einstellungen\Steyer\Startmenü\Programme\Apache Tomcat 4.1 Datenbankzugriff: Tabelle nur anzeigen (Aufruf einer Seite ohne Parameter) Die wichtigsten (hier benötigten) HTML-Tags sind <body> Beginn der Seitenbeschreibung <table> Beginn der Tabellenbeschreibung <tr> Beginn einer Zeilenbeschreibung einer Tabelle <td> Beginn einer Wertebeschreibung einer Zeile in einer Tabelle <%> Beginn eines Programmstückes zur Interpretation durch den Web-Server Es wird eine HTML-Seite angefordert, die noch aktuell dynamisch mit Datenbankdaten gefüllt werden muss. Für den Datenbankzugriff gelten die wesentlichen fünf Schritte aus Kapitel 2. Liegen die Daten vor, muss die angeforderte Seite zusammengebaut werden. db1.jsp: <%@ page errorPage="errorpge.jsp" import="java.sql.*" session="false" %> <html> <body> <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:accessdb","",""); Statement stmt = c.createStatement(); final String query = "Select pnr, pname from person"; ResultSet rs = stmt.executeQuery(query); %> <table border="1" bgcolor="#CCFFF" cellpadding="3" cellspacing="0"> <tr> <% int i = 1; while (rs.next()) {%> <tr><td align="center"><%= i%></td> <td><%= rs.getString(1)%></td> <td><%= rs.getString(2)%></td> </tr> <% i++;} %> </table> <% rs.close(); c.close(); %> </body> </html> Datenbankzugriff: bestimmte Tabellenwerte anzeigen (Aufruf einer Seite mit Parameterübergabe) Hier werden dem Datenbankzugriff noch Parameter mitgegeben. Diese werden vor der Seitenanforderung in eine Formularseite eingebenen und an den Server übermittelt. Dieser holt sie mit request.getParameter("<Variable>") ab. Der Rest läuft ab wie oben. bsp2.jsp: <html> <body> <h1>Kontostand abfragen</h1> <form method = "GET" action="http://localhost:8080/bsp2db.jsp"> Name: <input type = "text" name = "us"> <br><br> <input type = "submit" value="Kontostand"> </form> </body> </html> bsp2db.jsp: <%@ page errorPage="errorpge.jsp" import="java.sql.*" session="false" %> <html> <body> <%String us = request.getParameter("us");%> <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:accessdb","",""); Statement stmt = c.createStatement(); final String query = "Select kundenname, pin, kontostand from kunde where kundenname = \'" + us + "\'"; ResultSet rs = stmt.executeQuery(query); %> <table border="1" bgcolor="#CCFFF" cellpadding="3" cellspacing="0"> <% while (rs.next()) {%> <tr><td><%= rs.getString(1)%></td> <td><%= rs.getString(2)%></td> <td><%= rs.getString(3)%></td> </tr> <%}%> </table> <% rs.close(); c.close(); %> </body> </html> Datenbankzugriff: gesamten SQL-Befehl ausführen lassen (Aufruf einer Seite mit Parameterübergabe) Hier ist neu, dass nicht einzelne Parameter ein- und übergeben werden, sondern ein ganzer SQL-Befehl. Dieser wird zum Server übermittelt, wo die beiden Fälle 1) Datenbankzugriff mit Datenrückgabe (select, s. Kapitel 3) oder 2) Datenbankzugriff ohne Datenrückgabe (insert, update, delete usw. s.Kapitel 4) unterschieden werden. Der Fall 1 läuft wie oben, im Fall 2 wird der SQL-Befehl nur ausgeführt. bsp3.jsp: <html> <body> <h1>SQL-Befehl ausführen</h1> <form method = "GET" action="http://localhost:8080/bsp3db.jsp"> <input type = "text" name = "bef" size=50> <br><br> <input type = "submit" value="ausführen"> </form> </body> </html> bsp3db.jsp: <%@ page errorPage="errorpge.jsp" import="java.sql.*" session="false" %> <html> <body> <%String bef = request.getParameter("bef");%> <% if (bef.indexOf("select") <= 0) { %> <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:accessdb","",""); Statement stmt = c.createStatement(); ResultSet rs = stmt.executeQuery(bef); ResultSetMetaData rsmd = rs.getMetaData(); int n = rsmd.getColumnCount(); %> <h3>n=</h3> <%=n%> <table border="1" bgcolor="#CCFFF" cellpadding="3" cellspacing="0"> <% while (rs.next()) {%> <tr> <%int i=1;%> <% while (i <= n) { %> <td><%=rs.getString(i) %></td> <%i++; }%> </tr> <%}%> </table> <% rs.close(); c.close(); } else { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:accessdb","",""); Statement stmt = c.createStatement(); stmt.execute(bef); } %> </body> </html> Diese Kommandounterscheidung ist ziemlich grob. Selbstverständlich müsste der Server individueller kommandoweise reagieren. Das aber würde den Rahmen des Buches sprengen. Es sollte hier nur das Prinzip gezeigt werden. Auf diese Weise können SQL-Oberflächen im Internet für beliebige Datenbanksysteme realisiert werden. TFH Berlin/Steyer