Servlets und JSPs HTTP, JSP und Servlets DB2 Besprechung Datenbankpraktikum DBServer Server Client Apache Anfrage (http-request) 27. Mai 2008 Statischer Webserver Antwort (http-response) Dynamischer Webserver Java Servlets (kompiliert) statische HTML-Seiten Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 • HTTP Request: – URL: http://server:port/page?param1=value1&param2= value2 – Methode: POST/GET/... – Body: Beinhaltet Parameter bei Post, andere Daten für die Verbindung – Header • HTTP Response: Besprechung Datenbankpraktikum SoSe 2008 Java Server Pages (JSP) 27.05.2008 Datentransport bei HTTP: Zwei Methoden, um Daten zu übergeben: • GET: Die Daten werden an die Ziel-URL angehängt. – Nachteile: • Der Benutzer kann die Daten sehen • Die Länge ist begrenzt • POST: Die Daten werden an die http-Anfrage als Body angehängt – Nachteil: • Nur per Formular möglich 27.05.2008 HTTP Daten (2) Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 HTTP Daten (3) • Parameter-Übergabe durch GET • HTML-Formulare: POST – Parameter an einen Link anhängen, das Ziel des Links wird aufgerufen und kann die Parameter dann auswerten: – Syntax: <a href="filename.jsp?param1=val1&param2=val2">..</a> – in JSP dynamisch erzeugen, der User löst durch klicken auf den Link die gewünschte Aktion aus. – Bsp: <% for ( int i=0; i<10; i++ ) { %> <a href="filename.jsp?id=<%=i%>"><%=i%>tes Ziel</a><% } %> Besprechung Datenbankpraktikum SoSe 2008 JSPEngine HTTP-Daten (1) Request und Response – Header – Geforderte Datei (HTML) Besprechung Datenbankpraktikum SoSe 2008 Jakarta Tomcat 27.05.2008 – Per HTML-Tags definiert man eine logische Struktur von Eingabefeldern, die die Eingaben des Benutzers aufnehmen und bei Bestätigung an ein angegebenes Ziel senden: – Bsp: Bitte Daten eingeben:<br /> /> <form action="filename" method="post"> Name: <input type="text" name="id" /><br <input type="submit" value="OK" /> </form> Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 1 (X)HTML – Hypertext Markup Language HTTP Daten (4) • alle Daten im impliziten Objekt request (der Klasse HttpServletRequest) • Auslesen der Parameter name : liefert den Wert des Parameters name als String zurück name : liefert Array mit allen Werten des Parameters name zurück : liefert alle Parameter, die an eine Seite gesendet wurden • Weitere Informationen aus dem Anfrage-Header: – z.B. Host und Port) ): liefert die URI der Anfrage (ohne Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 <html> <head> <title>Hallo Welt!</title> <meta ... /> <style> <!-- CSS --> </style> </head> <body> <p> Dies ist ein Absatz mit Text. Dieser Bereich ist <strong>hervorgehoben</strong>. <!-- Das ist ein Komentar. Er wird nicht angezeigt --> </p> <table> <!-- Das ist eine Tabelle --> <tr> <!-- Die Tabelle hat eine Zeile --> <td>Hier ist die erste Spalte</td> <td>... und da die zweite</td> </tr> </table> </body> </html> Besprechung Datenbankpraktikum SoSe 2008 Servlets vs. JSPs Bearbeitung dynamischer Seiten • Lesen der gesendeten Daten • andere Informationen aus http-Anfrage entnehmen • Ergebnisse generieren • • Ergebnisse formatieren, in HTML einbetten HTTP-Antwortparameter setzen • Dokument an Client zurücksenden • Unterschiedliche Konzepte: aus Formularen, Links, andere http-Anwendungen – Servlets erstellen HTML-Code im Java-Code – JSPs integrieren Java-Code in HTML-Code Cookies, Browser-Typ, Hostname, ... • Servlet Datenbankanfrage, Benutzereingaben verarbeiten, ... – Grundfunktionalität für eine Reaktion auf HTTPAnfragen (Controller) Cookies an Client schicken • doGet - versus doPost - Requests Textformat für HTML und XML, Binärdaten für Bilder usw. • JSP – Geeignet für dynamische Repräsentation von Inhalte mittels (X)HTML (Views) Servlets und JSPs erleichtern diese Schritte Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 Servlets 27.05.2008 Servlets: doGet() Beispiel Web Server HTTP Servlet Unterklasse public class SimpleRead extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response)º throws ServletException, IOException { GET request response response.setContentType("text/html"); doGet() PrintWriter out = response.getWriter(); out.write("<html>\n"); out.write("<head>Hallo Welt</head>\n<body>\n<p>"); POST request response out.write("Parameter id hat den Wert: " + request.getParameter("id")); doPost() ... out.write("</p>\n</body>\n</html>"); ... Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 2 Servlets: doPost() Beispiel JSP-Seiten public class SimpleRead extends HttpServlet { grob: JSP = HTML + zusätzliche Tags protected void doPost(HttpServletRequest request, HttpServletResponse response)º throws ServletException, IOException { String op = request.getParameter("operation"); int i = request.getParameter("id"); String result = ""; if(op.equals("searchCustomerById")) { Customer c = Customer.getInstance(); result = c.searchCustomerById(i); } <html> <head> <title>Hallo Welt</title> </head> <html> <head> <title>Hallo Welt</title> </head> <body> Herzlich Willkommen <body> Herzlich Willkommen, es ist jetzt <%=new java.util.Date()%> </body> response.setContentType("text/html"); PrintWriter out = response.getWriter(); </body> out.write(...); out.write("Der Kunde mit ID: " + i + "ist: " + result); ... </html> </html> } Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Konstrukte einer JSP • Deklarationen: – Beispiel: <strong>hervorgehobener Text</strong> – Hauptteil der Ausgabe im Browser • Ausdrücke: – Beispiel: <%= %> (<%= foo %>)º – Code wird ausgewertet und ausgegeben – Beispiel: <%! Code %> <%! int foo = 21; %> º – Die Instanzen, die so erzeugt werden, werden im Rumpf der Java-Klasse deklariert. Sie sind also in allen Instanzen des JSPs gültig (im Gegensatz zur Instanziierung in einem Skriptlet-Code) • Scriptlets: – Beispiel: <% Code %> (<% foo = foo * 2; %>)º – Ausführen von Java-Code – Ausgaben mit print, println über das automatisch (in jedem JSP) instanziierte Objekt out (Instanz von JspWriter, Unterklassen von PrintWriter) 27.05.2008 Konstrukte einer JSP Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Beispiel <%@ page import ="java.util.HashSet" %> <%! int var2 = 0; %> • Direktiven zum Import von Klassen: <%@ page import="package.Class" %> z.B. <%@ page import="java.util.Vector" %> <html> <head> <title>Hallo Welt</title> </head> • Weitere Direktiven: – Fehlerseite • wird bei unbehandelten Exceptions aufgerufen • implizites Objekt <body> 1 + 4 = <% int var = 1+4; out.println( var + "<br />" ); %> var2 = <%= var2++ %> • – • zum Einbinden von Dateien </body> • </html> Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Konstrukte einer JSP • HTML-Elemente: Besprechung Datenbankpraktikum SoSe 2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 3 JSPs Beispiel – Umsetzung (1) Was erzeugt Tomcat daraus? • JSPs werden (automatisch) zu Servlets kompiliert: JSP *.java package org.apache.jsp; ... import java.util.HashSet; *.class public class test_jsp extends HttpJspBase { int var2 = 0; ... public void _jspService(HttpServletRequest request, HttpServletResponse response) { ... out.write("\n"); out.write("\n\n"); out.write("<html>\n\t"); Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 Beispiel – Umsetzung (2) 27.05.2008 jspInit und jspDestroy out.write("<head>\n\t\t"); out.write("<title>HTML-Seite"); out.write("</title>\n\t"); out.write("</head>\n\t\n\t"); out.write("<body>\n\t\t1 + 4 = "); int var = 1+4; out.println(var+"<br />"); out.write("\n\n\t\tvar2 = "); out.print( var2++ ); out.write("\n\t"); out.write("</body>\n"); out.write("</html>\n"); ... wird automatisch einmal am Anfang bzw. Ende ausgeführt <%! Connection con = null; public void jspInit() { try { Class.forName( "COM.ibm.db2.jcc.DB2Driver" ); } catch ( Exception e ) {} } public void jspDestroy() { try { con.close(); } catch ( Exception e ) {} } } } %> Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Sessions Implizite Objekte eines JSPs • JspWriter out: Schreibt Daten in den Ausgabestrom an den Browser • HttpServletRequest request: Enthält Anfrage-Parameter, Cookies und sonstige Informationen zur Anfrage • HTTP-Protokoll ist zustandslos • keine Unterstützung für Kontextinformationen • HttpServletResponse response: Repräsentiert die Antwort an den Browser. Bietet Möglichkeiten zum Ändern von Headern, Setzen von Http-Statuscodes und Cookies • HttpSession session Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 4 Sessions Sessions Server Client Client response request • wozu? – Benutzerkomfort – Statistiken – ... response request response Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Sessions Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Sessions Server Client • Protokoll nachträglich um Sessions erweitert – eindeutige ID für jeden neuen Client – als Cookie oder GET/POST-Parameter – bei jeder Anfrage an den Server gesandt request Client • Verschiedene Implementierungen – Cookies: auf dem Client wird die eindeutige Session ID abgelegt – URL Rewriting: Session ID wird in der Addresse kodiert " " request response request response Î request response Servlet Engine wählt automatisch richtige Implementierung session Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Sessions Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Sessions in Servlets/JSP • Session ist "Container" für Daten • Server hält diese Daten • Session wird automatisch gestartet – implizites Objekt: • einige Methoden: – spart Traffic – nur kontrollierte Manipulation º º • Session-Ende: º – explizit durch den Client – durch Timeouts º º • explizites Beenden einer Session – Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 º 27.05.2008 5 Weitere Kontexte Sessions in Servlets/JSP • • Speichern von Objekten: º – • Holen von Objekten – für die Dauer einer einzelnen Anfrage • º – – für die Dauer einer Session • Löschen von Objekten • º – Besprechung Datenbankpraktikum SoSe 2008 – über die gesamte Laufzeit der Anwendung 27.05.2008 Sessions Client Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Java Beans Server Client • Java-Klasse zur Abbildung der Daten • Default Konstruktor • vorgegebenes Namensschema für Zugriffsmethoden: – Attribut XYZ: void setXYZ( ... )º ... getXYZ()º page session application Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Java Beans – Ausnahme: boolesche Attribute: void setXYZ( boolean ... )º boolean isXYZ()º Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Beispiel • Daten werden in Beans gehalten • Beans werden in angemessenem Kontext abgelegt Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 6 Beispiel Java Beans und JSP • Bean deklarieren/erzeugen: • Property lesen: • Property schreiben: Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Web Applikation Ordnerstruktur Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Deployment Descriptor • /WEB-INF/web.xml – Deployment Descriptor • /WEB-INF/classes/ <servlet> – kompilierte Java Klassen <servlet-name> • /WEB-INF/lib/ <servlet-mapping> • / <servlet-name> <url-pattern> – *.jsp, *.html, *.gif, *.jpg, etc. </servlet-name> </url-pattern> </servlet-mapping> 27.05.2008 Deployment Descriptor Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Sessions • Interface Überwachen von Sessions • Methoden: • Weitere Tags: – <init-param> – <load-on-startup> – <session-timeout> – <welcome-file-list> – <error-page> – ... Besprechung Datenbankpraktikum SoSe 2008 </servlet-class> </servlet> – JAR Archiven Besprechung Datenbankpraktikum SoSe 2008 </servlet-name> <servlet-class> – – zum º º • damit auch Reaktion auf Session-Timeouts möglich 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 7 Beispiel Sessions package tum.dbpra00; • Timeout auf dem Praktikumsserver: eine Minute • konfigurierbar in WEB-INF/web.xml: import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionWatcher implements HttpSessionListener { public void sessionCreated( HttpSessionEvent e ) { System.err.println( "Neue Session: " + e ); } public void sessionDestroyed( HttpSessionEvent e ) { System.err.println( "Session " + e + " beendet." ); } } Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 Session Listener Java Standard Tag Library (JSTL) • Tag Library für oft benutzte Funktionen • Logik in JSP Seiten ohne Java Code direkt in der JSP Seite selber einzugeben • Weitere Trennung von Präsentation und Logik • Einbindung des Listeners in Î Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 Java Naming and Directory Interface (JNDI) // Obtain our environment naming context // Look up our data source DataSource ds = (DataSource)º cxt.lookup("java:/comp/env/jdbc/PraktDB"); 27.05.2008 Apache Ant • • • • Context initCtx = new InitialContext(); Selbständig einarbeiten und evtl. nutzen Build Tool für Java Projekte Vergleichbar mit make XML basiert Beispiel Ant Script (mit Kommentare) im Frontend bereitgestellt // Allocate and use a connection from the pool Connection con = ds.getConnection(); ... use this connection to access the database ... con.close(); Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 8 RequestDispatcher RequestDispatcher Beispiel • Interface javax.servlet.RequestDispatcher • Benutzt um den request zu jede Resource (HTML-Datei, Servlet oder JSP Seite) weiterzuleiten • Beinhaltet Funktionen: throws ServletException, IOException { /* Die die von Methode getGreetingBean() gibt eine JavaBean (Klasse mit get/set Methoden) zurück.*/ GreetingBean bean = getGreetingBean(); /* Die bean dem request "anhängen" */ request.setAttribute("greetingbean",bean); – forward(request, response): – Leitet ein Request vom Servlet zu eine anderere Resource include(request, response): Schreibt die Inhalte einer Resource (HTML, Servlet oder JSP) nach response (server-side includes in Servlet). protected void doGet(HttpServletRequest request, HttpServletResponse response)º Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 RequestDispatcher Beispiel hello.jsp holen */ RequestDispatcher dispatcher = request.getRequestDispatcher("hello.jsp"); ... Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 dbpra Verzeichnisstruktur etc. ... /* über den RequestDispatcher den request, * und den response auf * die JSP forwarden. */ dispatcher.forward(request,response); } •Die Weiterleitung läuft im ServletContainer intern ab. Der Client lädt nicht eine neue Adresse, sondern bekommt von dieser Weiterleitung gar nichts mit. Besprechung Datenbankpraktikum SoSe 2008 /* RequestDispatcher auf die JSP 27.05.2008 • Tomcat: dbpra, Port: 8080 • Einstiegsseite: http://dbpra.in.tum.de:8080/ • Jede Gruppe hat ihren eigenen Kontext unter /vol/praktika/dbpra/share/tum/dbpra<XX>/public_jsp • JSPs als Dateien mit der Endung *.jsp in obiges Verzeichnis • Beispiel-JSPs unter /vol/praktika/dbpra/share/tum/staff/public_jsp • Tomcat kann auch statische html-Seiten ausliefern • Nutzt JNDI zur Verbindungsaufbau (siehe Merkblatt) Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 Hinweise • Core Servlets and Java Server Pages (Hall and Brown): http://pdf.coreservlets.com • Java Server Pages: http://java.sun.com/products/jsp/ • Java Servlets API Specification: http://java.sun.com/products/servlet/reference/api/index.html • Java 1.5.0 API Specification: http://java.sun.com/j2se/1.5.0/docs/api/ • HTML Tutorials: http://www.selfhtml.org/ http://www.w3schools.com/ • Tomcat Dokumentation: http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ Besprechung Datenbankpraktikum SoSe 2008 27.05.2008 9