Internetanbindung von Datenbanken SQLJ Servlets http://galahad.informatik.fh-kl.de/frankfurter SQLJ-1 Gliederung Einführung in Servlets Entwicklungswerkzeuge Servlets HTML-Beispiel Servlet Beispiel Servlet Methoden Lebenszyklus Literatur SQLJ-2
Einführung in Servlets Frankfurter Gerd SQLJ-3 Entwicklungswerkzeuge Ab JDK 1.1.X http://java.sun.com/products/jdk JSDK 2.0 http://java.sun.com/products/servlet/ Web-Server http://www.apache.org/ (Apache 1.3.9) http://java.apache.org/ (Apache JServ 1.0) SQLJ-4
Servlets Applet vs Servlet HTTP Client/Server Kommunikation Request & Response GET - Methode um Informationen aus einer Datenbank zu erhalten. POST - Methode Informationen an den Server zu senden. SQLJ-5 HTML-Beispiel <HTML> <HEAD><TITLE>Beispiel</TITLE></HEAD> <BODY> <FORM METHODE = GET ACTION = /servlet/hello > <INPUT TYPE = TEXT NAME = name ><P> <INPUT TYPE = SUBMIT> </FORM> </BODY> </HTML> SQLJ-6
Servlet Beispiel import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet{ public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException{ res.setcontenttype( text/html ); PrintWriter out = res.getwriter(); SQLJ-7 Servlet Beispiel String name = req.getparameter( name ); out.println( <HTML> ); out.println( <HEAD><TITLE>Hello, +name+ </TITLE><HEAD> ); out.println( <BODY> ); out.println( Hello, + name ); out.println( </BODY></HEAD> ); } } SQLJ-8
Servlet Methoden service() doget() dopost() init() destroy() dohead()... SQLJ-9 Lebenszyklus Erzeugen & Initizialisieren Bearbeiten von einem oder mehreren Clients bzw. Aufrufen nach Ablauf der Lebenszeit wird das Servlet vom Server beendet und belegte Resourcen wieder frei gegeben. SQLJ-10
Literatur JAVA Servlet Programming Jason Hunter, William Crawford O Reilly Oktober 1998... SQLJ-11 Internetanbindung von Datenbanken SQLJ - Embedded SQL in Java http://galahad.informatik.fh-kl.de/sawicki SQLJ-12
Gliederung Einführung SQLJ Verwendung von SQLJ SQLJ und verwendbare Schnittstellen Net8-Connection-Manager Stored-Procedures und SQLJ Beispiel-Code SQLJ-13 Einführung SQLJ Christoph Sawicki SQLJ-14
Was ist SQLJ? SQLJ ist eine standardisierte Sprach-Spezifikation für embeded SQL-Anweisungen in Java SQLJ ist ein Resultat der Bemühungen von mehreren Industriefirmen, die Entwicklung der Datenbankapplikationen in Java erleichtern soll. SQLJ-15 Wie funktioniert SQLJ? Während der Compilierung prüft der SQLJ-Translator alle SQL-Anweisungen auf: syntax semantic typ schema Anschließend werden alle embeded SQL-Anweiungen in Java konvertiert und dann dem Java- Compiler übergeben. SQLJ-16
Wie funktioniert SQLJ? Eine SQLJ-Applikation ist also ein Standard-Java- Programm, das aus SQLJ-Anweisungen generiert wurde. SQLJ-17 Wie funktioniert SQLJ? Dabei werden alle SQLJ-Anweisungen in gültige JDBC-Anweisungen konvertiert. SQLJ-18
Verwendung von SQLJ SQLJ-19 Wann SQLJ? SQLJ erlaubt gleichzeitige Aufrufe von JDBC- und SQLJ-Anweisungen aber... Oracle empfiehlt, SQLJ nur dann zu benutzten, wenn statische SQL-Anweisungen benutzt werden sollten. Bei dynamischen SQL-Anweisungen sollte nur JDBC benutzt werden. Dafür... Ist der entwickelte SQLJ-Programm, wie alle Java- und JDBC-Applikationen, plattformunabhängig. SQLJ-20
SQLJ und verwendbare Schnittstellen SQLJ-21 SQLJ und JDBC-Treiber SQLJ-Programme können mit folgenden JDBC-Treiber benutzt werden: Oracle JDBC/OCI Oracle Thin JDBC andere JDBC Treiber SQLJ-22
SQLJ mit Thin Treiber SQLJ-Translator kann zusammen mit dem Thin-JDBC- Treiber über den Net8-Connection-Manager benutzt werden. SQLJ-23 Net8-Connection-Manager SQLJ-24
Was ist Net8-Connection-Manager? Net8-Connection-Manager ist ein mehrzweck Netzwerkdienst für Oracle-Umgebungen, der die Client- Verbindungen verwaltet: Zugriff über mehrere Protokolle (TCP/IP) mehrere Clients können zusammen gefaßt werden Clients-Zugriffe können durch eine gemeinsame Methode besser kontrolliert werden Durch Multiplexen werden die aktiven Verbindungen vom Client zur Client umgeschaltet SQLJ-25 Was ist Net8-Connection-Manager? viele Clients können durch nur eine Netzwerkverbindung verwaltet werden (reduzierter Speicherverbrauch, Performance usw.) SQLJ-26
Stored-Procedures und SQLJ SQLJ-27 Speicherprozeß von SQLJ Stored-Procedures, Trigger können mit Hilfe von SQLJ implementiert werden. Man kann von folgenden Arten der Clients auf sie zugreifen: Java Clients Net8 Clients CORBA Clients SQLJ-28
Beispiel-Code SQLJ-29 SQLJ vs. generiertes JDBC Code // ************************************************************ // #sql autorresult = { SELECT // vname, // nname // FROM Person // WHERE PNr = :arbeitresult.autor() }; // ************************************************************ { sqlj.runtime.connectioncontext sjt_connctx = sqlj.runtime.ref.defaultcontext.getdefaultcontext(); if ( sjt_connctx == null) sqlj.runtime.error.runtimereferrors.raise_null_conn_ctx(); sqlj.runtime.executioncontext sjt_execctx = sjt_connctx.getexecutioncontext(); if ( sjt_execctx == null) sqlj.runtime.error.runtimereferrors.raise_null_exec_ctx(); Integer sjt_1 = arbeitresult.autor(); synchronized ( sjt_execctx) { sqlj.runtime.profile.rtstatement sjt_stmt = sjt_execctx.registerstatement( sjt_connctx, AnzeigeServlet_SJProfileKeys.getKey(0), 9); try { sjt_stmt.setintwrapper(1, sjt_1); sqlj.runtime.profile.rtresultset sjt_result = sjt_execctx.executequery(); autorresult = new autoriter( sjt_result); } finally { sjt_execctx.releasestatement(); } } } SQLJ-30
Internetanbindung von Datenbanken SQLJ Tips & Tricks http://galahad.informatik.fh-kl.de/helfrich SQLJ-31 Gliederung Hilfsmittel Sessions Anzeigen Login Probleme SQLJ-32
Hilfsmittel Apache Webserver V 1.3.9b für NT Jserv V 1.0 SQLJ Präprozessor Java VM (JDK 1.1.8) JDK 1.1.8 JSDK 2.0 UltraEdit SQLJ-33 SQLJ Präprozessor Wird durch sqlj.properties File gesteuert: sqlj.user=w3db_user sqlj.password=w3db_user ### Oracle JDBC-Thin URL sqlj.url=jdbc:oracle:thin:@143.93.21.12:1521:w3db # Turn informational messages on sqlj.warn=verbose SQLJ-34
SQJ Command Line Options Zur Entwicklung ist es notwendig einige Command Line Options zu wissen: - passes: Veranlaßt den Translator den anschließenden Compilerlauf auszulassen - user : Gibt einen Usernamen für die Verbindung an - password: gibt das Passwort des Users an -n : Zeigt den Aufruf für die JAVA VM z.b. java sqlj.tools.sqlj <Dateiname>.sqlj -compile : Veranlaßt den Translator gleich zu Compilieren (Standard) Weiterhin kann man noch Argumente und Optionen sowohl zum Javac als auch zu VM durchreichen SQLJ-35 SQLJ Translator Tips Bei Unix ist der SQLJ Translator ein Skript, bei Win eine EXE-File. Die Funktionalität ist gleich(fast). Unter WIN bleibt der Translator oft hängen. Abhilfe mit option -passes und manuellem Compiler lauf. SQLJ und JDK1.2 funktioniert nicht. Abhilfe: In Kürze neues Release oder JDK1.1.x SQLJ-36
Sessions Vom Browser generierte ID wird dem WEB Server mitgeteilt Anhand der ID ist der Benutzer eindeutig identifizierbar Gleichzeitig wird ein Cookie gesetzt, in dem man auch Daten ablegen kann. Nachteil: Wenn die Cookies deaktiviert sind ist bei jedem Aufruf die Session ID neu. Lösung: URL Rewriting SQLJ-37 Sessions in Servlets Mit Hilfe der Klasse javax.servlet.http.httpsession läßt sich der Zugriff auf die Sessions und auch auf die Cookies realisieren. Methoden der Klasse: getcreationtime() getid() - liefert die Session ID getvalue (String Name) - liest einen Wert aus der Session putvalue(string Name, Objekt value) isnew() invalidate() - Session ungültig setzten SQLJ-38
Anzeigen der Datensätze Das Anzeigen wird dadurch realisiert, das die aktuellen Nummer der Arbeit im Cookie gespeichert wird. Vorteile: Konsistenz der Daten wenn gleichzeitig ein anderer Benutzer einen neuen Datensatz einfügt oder löscht. Nachteil: Die Nummer der Arbeit steht auf dem Client. Abhilfe: Nummer verschlüsseln Nummer auf Server speichern SQLJ-39 Login Zum Freigeben der Daten soll sich der Hauptbenutzer anmelden. Sessions zum überprüfen ob der Benutzer sich schon einmal angemeldet hat. Zentrales Servlet das die Verbindung mit der Datenbank übernimmt. Benutzerverwaltung durch das Servlet SQLJ-40
Login(2) Alternative: WEB Server Sicherheit Benutzerverwaltung durch WEB Server Problem: Einbindung des JSERV in das Sicherheitskonzept SQLJ-41 Login(3) Benutzerverwaltung durch die Datenbank Servlet generiert Abfrageseite und leitet die Antwort an die Datenbank weiter. SQLJ-42
Probleme (1) JDBC Classes version 8.0.4 unterstützt nicht alle Typen Java VM der Version 1.2 liefert NullPointerException beim Übersetzen. In Iteratorendeklarationen dürfen keine Zahlen vorhanden sein?????? Da sonst nur ein Iterator ausführbar ist. z.b. #sql iterator sqlresult2 ( String Name); #sql iterater sqlresult (String, int, NUMBER); Ergebnis: Der zweite Iterator wirft eine SQLException SQLJ-43 Probleme(2) Datenbankverbindung Oracle.connect(Demo.class, connect.properties ); DriverManager.registerDriver(new Oracle.jdbc.driver.OracleDriver()); String url = "jdbc:oracle:thin:@143.93.21.12:1521:w3db"; String user = "w3db_user"; String pwd = "w3db_user"; Phänomen: Testservlet lief Sonntags aber Montags nicht mehr...?!? SQLJ-44