Praktikum Datenbanksysteme Ho Ngoc Duc IFIS - Universität zu Lübeck 01.06.2005 Tomcat-Installation • • • • $JAVA_HOME (z.B. /home/dbp00/j2sdk1.4.2) $CATALINA_HOME (/home/dbp00/jakarta-tomcat-4) Skripte zum Start/Stop: $CATALINA_HOME/bin Bibliotheken: $CATALINA_HOME/common/lib (zum Kompilieren von Servlets benötigt) • Web-Anwendungen: $CATALINA_HOME/webapps/ Web-Applikation • $CATALINA_HOME/webapps/dbpNN • Struktur des Verz. dbpNN: – WEB-INF • web.xml • classes (eigene Klassen, Package-Struktur beachten!) • lib (Hilfsbibliotheken, z.B. mysqldb.jar, upload.jar) – index.html (index.jsp) & mgl. andere Dateien/Verz. • http://host:port/dbpNN/servlet/mypackage.MyServlet • Servlet-Mapping: in Datei web.xml. Zugriff dann über http://host:port/dbpNN/myservlet package ifis.ss05.dbp00.web; import javax.servlet.*; import javax.servlet.http.*; public class UhrzeitServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>\n<head>"); out.println("<h1>"+new java.util.Date()+"</h1>"); out.println("</body>\n</html>"); } } <servlet> <servlet-name>time</servlet-name> <servlet-class>ifis.ss05.dbp00.web.UhrzeitServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>time</servlet-name> <url-pattern>/uhrzeit</url-pattern> </servlet-mapping> Servlet: Vor- u. Nachteile • Vorteil: sehr flexibel • Nachteil: HTML ist in Java-Quellcode eingebettet – Unübersichtlich – HTML-Editoren können nicht benutzt werden – Kein Syntax-Highlighting von HTMLQuellcode • Alternative: Java Server Pages (JSP) Java Server Pages • JSP-Seiten als normale HTML-Seite geschrieben ("Template", statischer Teil), vermischt mit ein wenig Java (dynamischer Teil) • Java in speziellen "tags", z.B. <%...%> • JSP-Dateien müssen die Endung .jsp haben • JSP wird in ein Java-Servlet übersetzt, welches dann kompiliert wird. • Das Servlet arbeitet in der gewohnten Art und Weise. Browser sieht nur HTML Beispiel <HTML> <BODY> Hello! The time is now <%= new java.util.Date() %> </BODY> </HTML> • Äquivalent: Hello! The time is now <% out.print(new java.util.Date()) %> JSP-Syntax • Verschiedene JSP “tags” für versch. Zwecke • <%= expression %> – expression ist evaluiert. Das Ergebnis in die HTML Seite eingefügt • <% code %> – code wird in service-Methode des Servlets eingefügt – Diese Konstruction: scriptlet • <%! declarations %> – Die declarations werden in die Servlet-Klasse, nicht in eine Methode eingefügt • <%-- JSP Kommentar --%> (<!-- HTML -->) JSP: Vordefinierte Variablen • request: das HttpServletRequest-Objekt • response: das HttpServletResponse-Objekt • session: die HttpSession assoziiert mit dem Request oder null wenn es keine Session gibt • out: JspWriter (ähnlich PrintWriter) zum Senden von Daten an den Client • Beispiel: Your hostname: <%= request.getRemoteHost() %> • Äquivalent: Your hostname: <% out.print(request.getRemoteHost()) %> Deklarationen und Direktive • Global, beeinflußen das ganze Servlet • <%@ Direktive %> • Am wichtigsten: page-Direktive • <%@ page import="java.util.*" %> • Deklarationen: Definitionen von Variablen und Methoden <%! static final int PI = 3.1415926536; double u(double radius) { return 2*PI*r; } %> • Benutzung in der Seite: Umfang des Einheitskreises: <%= u(1.0) %> Zusammenspiel Servlet/JSP • Trennung von Logik / Layout – Servlets: HTML eingebettet in Java – JSPs: Java eingebettet in HTML • Folgerung: – Servlets (und JavaBeans) für Logik – JSPs für Anzeige Model View Controller (MVC) Model View Controller (MVC) Model View Controller (MVC) • Model (Java Beans) – Enthält die eigentliche Programmlogik – Unabhängig von der Webschnittstelle è Kein Import von javax.servlet.* • View (JSPs) – Anzeige des Ergebnisses – Ziel: Möglichst wenig Java Code • Controller (Servlet) – Einlesen und Überprüfen der übergebenen Parameter – Aufrufen der eigentlichen Programmlogik im Model – Weitergabe des Ergebnisses an das passende View public class ControllerServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int action = Integer.parseInt(request.getParameter("action")); String start = request.getParameter("start")); // … if (action == 1) { Verbindung verb = berechneVerbindung(start, ziel, zeit); request.setAttribute("verbindung", verb); RequestDispatcher disp = request.getRequestDispatcher("/jsp/Verbindung.jsp"); disp.forward(request, response); } else if (action == 2) { …; } } } JSP-Datei Verbindung.jsp <%! Verbindung verb = (Verbindung) request.getAttribute("verbindung"); %> <html> <head> <title> Verbindung </title> </head> <body> Verbindung: <%=verb.toString();%> </body> </html>