Praktikum Datenbanksysteme Ho Ngoc Duc IFIS – Universität zu Lübeck 28.05.2003 Nullwerte und Primitive Typen • Wenn parent==null, was wird in der Datenbank gespeichert? • Wenn man aus der DB liest, wie kann man feststellen, dass das Node gar kein Parent hat? • Falsch: rs.readInt("parent_id") == -1, rs.readObject("perent_id") == null ? log/effendi.txt:java.lang.ClassCastException: ifis.dbp03.effendi.model.User log/gehrmann.txt:java.lang.ClassCastException: ifis.dbp03.gehrmann.model.User log/hennings.txt:java.lang.NullPointerException log/hennings.txt:java.lang.NullPointerException log/reher.txt:java.lang.ClassCastException: java.util.Vector log/reher.txt:java.lang.NumberFormatException: admin log/reher.txt: at java.lang.Exception.<init>(Exception.java:42) log/reher.txt: at java.lang.RuntimeException.<init>(RuntimeException.java:47) log/reher.txt: at java.lang.IllegalArgumentException.<init>(IllegalArgumentException.java:43) log/reher.txt: at java.lang.NumberFormatException.<init>(NumberFormatException.java:43) log/schlicht.txt:java.lang.NumberFormatException: root log/schlicht.txt: at java.lang.Exception.<init>(Exception.java:42) log/schlicht.txt: at java.lang.RuntimeException.<init>(RuntimeException.java:47) log/schlicht.txt: at java.lang.IllegalArgumentException.<init>(IllegalArgumentException.java:43) log/schlicht.txt: at java.lang.NumberFormatException.<init>(NumberFormatException.java:43) log/schlicht.txt:java.lang.NumberFormatException: admin log/schlicht.txt: at java.lang.Exception.<init>(Exception.java:42) log/schlicht.txt: at java.lang.RuntimeException.<init>(RuntimeException.java:47) log/schlicht.txt: at java.lang.IllegalArgumentException.<init>(IllegalArgumentException.java:43) log/schlicht.txt: at java.lang.NumberFormatException.<init>(NumberFormatException.java:43) log/schlicht.txt:java.lang.NullPointerException log/schlicht.txt:java.lang.NullPointerException log/wilken.txt:java.lang.ClassCastException: java.util.Vector log/wilken.txt:java.lang.NullPointerException log/wilken.txt:java.lang.ClassCastException: java.util.Vector findNodesByParent() • Möglich: "select id from node where parent_id = ?"; List ls = new Vector(); while (…) {ls.add(findNodeByID(id));} ls.toArray(); • Sehr aufwändig. Soll vermieden werden. Besser: List ls = new Vector(); "select * from node n, hierarchy h where n.parent_id = ?"; while (…) {ls.add(getHierarchyFromRow(rs);} "select * from node n, mediaobject where n.parent_id = ?"; while (…) {ls.add(getMediaObjectFromRow(rs);} Blatt 5 • • • • • • Meist richtig Pahl [findNodeByID(id, parent)] Effendi Pfützenreuter Reher Strauch Nächste Schritte • Ziel: Web-Anbindung von Datenbanken • Werkzeuge: – HTML-Programmierung – Servlet/JSP • Nächstes Aufgabenblatt: Jakarta Tomcat einrichten, einfache Servlets schreiben http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ HTML • HyperText Markup Language. Sprache, in der Webseiten geschrieben sind <html> <head> <title>Eine Beispielseite</title> </head> <body> <h1>&Uuml;berschrift</h1> <p>Ein ziemlich sinnfreier Text, der nur demonstrieren soll, was HTML ist</p> </body> </html> HTML Request und Response • HTTP Request (Client: Browser, Programme) – URL • http://server:port/pfad/seite?param1=wert1&param2=wert2 • http://localhost:8080/demo/add?x=12&y=13 – Methode (GET/POST/… ) – Body (z. B: Parameter bei POST, Datei-Uploads… ) – Diverse andere Informationen (Header) • HTTP Response (Web-Server) – Angeforderte Datei (HTML, GIF, … ) – Diverse andere Informationen (Header) Servlet API • Anwendungsprogrammierschnittstelle für server-seitige Java-Programme • Servlet: gewöhnliche Java-Klasse, mit der sich der Webserver beliebig erweitern läßt • Servlets stellen Dienste für den Client bereit, die dieser anfragen kann • Anfrage und Antwort über Datenströme • Servlet API bietet Unterstützung für Cookies und ein Session-Management Servlet implementierung • Typisch: Unterklasse von HttpServlet oder GenericServlet • doGet() oder/und doPost() überschreiben • Alternativ: service() überschreiben HelloWorld-Servlet 1:import java.io.*; 2:import java.util.Date; 3:import javax.servlet.*; 4: 5:public class HelloWorld extends javax.servlet.GenericServlet { 6: public void service(ServletRequest req, ServletResponse res){ 7: res.setContentType("text/html"); 8: PrintWriter out = res.getWriter(); 9: Date d = new Date(); 10: out.println("<html><head></head><body>" + 11: "Hello World am " + d.toString() + 12: "</body></html>"); 13: } 14:} Browser ,QWHUQHW :HEVHUYHU VorlesungsVerzeichnis.html 6HUYOHW(QJLQH Servlet S e r v lV er tl V r z S e r v lVertl V r z VrlVrz -'%& (Java Database Conn.) 'DWHQEDQN Aufruf eines Servlets • Anfrage: HTTP Request – URL in Browser eingeben (GET) – HTML Link klicken (GET) – HTML Formular abschicken (GET/POST) • Verarbeitung: Parameter holen, Datenbank abfragen, Berechnungen durchführen etc. • Ergebnis: HTTP Response – Wird vom Browser angezeigt – Evtl. automatisch weitere Requests, etwa Bilder Input/Output • Request-Objekt enthält Anfrageparameter request.getParameter(String paraName) • Response-Objekt stellt Ausgabekanal zur Verfügung response.getWriter() für Textausgabe response.getOutputStream() für Binärdaten GET-Methode mit Hyperlink <html> <head> <title>Calculator</title> </head> <body> <a href="servlet/sep.CalculatorServlet?x=12&y=13"> Berechnung starten </a> </body> </html> GET Methode mit Formular <html> <head> <title>Calculator</title> </head> <body> <form action="servlet/sep.CalculatorServlet"> X: <input type="text" name="x"> Y: <input type="text" name="y"> <input type="submit"> </form> </body> </html> POST Methode (nur Formular) <html> <head> <title>Calculator</title> </head> <body> <form action="servlet/sep.CalculatorServlet" method="post"> X: <input type="text" name="x"> Y: <input type="text" name="y"> <input type="submit"> </form> </body> </html> Vergleich GET / POST • GET Methode – Parameter sind Bestandteil des URLs Î Bei Bookmarks werden Parameter mitgespeichert Î Ungeeignet für Passwörter – Links benutzen automatisch GET Methode • POST Methode – Parameter werden im Body des Requests übertragen – Notwendig z.B. bei Datei-Upload import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class CalculatorServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int x = Integer.parseInt(request.getParameter("x")); int y = Integer.parseInt(request.getParameter("y")); PrintWriter out = response.getWriter(); out.println("<html><head><title>MyCalc</title></head>"); out.println("<body>"); out.println("Berechnung: "+x+" + "+y+" = " + (x+y)); out.println("</body>"); out.println("</html>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }