Lehrstuhl für Theoretische Informatik Universität Passau Software Engineering Praktikum WS 2002/03 Technische Einführung Michael Forster Einleitung ∙ Idee des Software Engineering Praktikums Selbständiges Lösen einer größeren Aufgabe im Team Selbständiges Einarbeiten in neue Tools & Technologien Tutorials und Dokumentationen lesen „Spielen“ mit den Tools Einführungsaufgabe lösen ∙ Ziel dieses Vortrags Überblick über verwendete Technologien Einstieg erleichtern Kein ausführlicher Kurs ∙ Weitere Hilfe: SEP-Webseite (demnächst) 19.07.2002 SEP WS 2002/03 - Technische Einführung 2 Aufgabenstellung ∙ Inhaltlich: Termin- & Aufgabenverwaltung Überblick: Einführungsvortrag (Letzte Woche) Weitere Details: Lastenheft (Anfang August) Genaue Ausgestaltung: Pflichtenheft ∙ Technisch: Web Application Dynamische Webseiten Bedienung mit dem Browser 19.07.2002 SEP WS 2002/03 - Technische Einführung 3 Überblick ∙ Verwendete Technologien HyperText Markup Language (HTML) HyperText Transfer Protocol (HTTP) Java Servlets Java Server Pages (JSP) Java Beans ∙ Zusammenspiel Model View Controller (MVC) Design Pattern Java Web Applications 19.07.2002 SEP WS 2002/03 - Technische Einführung 4 HyperText Markup Language (HTML) ∙ Sprache, in der Webseiten geschrieben sind: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <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> ∙ Als bekannt vorausgesetzt ∙ Diverse Tutorials und Dokumentationen auf der SEP-Webseite 19.07.2002 SEP WS 2002/03 - Technische Einführung 5 HyperText Transfer Protocol (HTTP) ∙ Kommunikationsprotokoll zwischen Browser und WWW-Server http://www.fmi.uni-passau.de/ HTTP Request WWWBrowser (Client) HTTP Response HTTP Request WWWServer HTTP Response 19.07.2002 SEP WS 2002/03 - Technische Einführung 6 HTTP: Gesendete Informationen ∙ HTTP Request 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 Angeforderte Datei (HTML, GIF, …) Diverse andere Informationen (Header) 19.07.2002 SEP WS 2002/03 - Technische Einführung 7 Servlets Servlet Container HTTP HTTPRequest Request WWWBrowser (Client) WWWServlet Server Dateisystem HTTP HTTPResponse Response 19.07.2002 SEP WS 2002/03 - Technische Einführung 8 Aufruf eines Servlets ∙ Anfrage: HTTP Request URL in Browser eingeben (GET) HTML Link klicken (GET) HTML Formular abschicken (GET/POST) ∙ Ergebnis: HTTP Response Wird vom Browser angezeigt Evtl. automatisch weitere Requests, etwa Bilder 19.07.2002 SEP WS 2002/03 - Technische Einführung 9 GET Methode (Link) <html> <head> <title>Calculator</title> </head> <body> <a href="servlet/sep.CalculatorServlet?x=12&y=13"> Berechnung starten </a> </body> </html> 19.07.2002 SEP WS 2002/03 - Technische Einführung 10 GET Methode (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> 19.07.2002 SEP WS 2002/03 - Technische Einführung 11 POST Methode <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> 19.07.2002 SEP WS 2002/03 - Technische Einführung 12 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 bei Datei-Upload (Werdet ihr wohl nicht brauchen) 19.07.2002 SEP WS 2002/03 - Technische Einführung 13 package sep; 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>"); protected void doPost(HttpServletRequest request, out.println("<body>"); HttpServletResponse out.println("Berechnung: "+x+" + "+y+"response) = " + (x+y)); throws ServletException, IOException out.println("</body>"); { out.println("</html>"); doGet(request, response); } } } Sessionverwaltung ∙ Problem: Viele Benutzer kommunizieren gleichzeitig mit dem Server Welche Requests gehören zu welchem Benutzer? ∙ Glücklicherweise: Servlet Engine macht die meiste Arbeit // Session holen bzw. erzeugen HttpSession session = request.getSession() // Objekt in der Session speichern session.setAttribute("user", aUser); // Objekt aus der Session lesen User curUser = (User) session.getAttribute("user"); 19.07.2002 SEP WS 2002/03 - Technische Einführung 15 Sessionverwaltung ∙ Verschiedene Implemtierungen Cookies: Auf dem Client wird eine eindeutige Session ID abgelegt URL Rewriting: Die Session ID wird in alle URLs kodiert ∙ Cookies können deaktiviert sein Servlet Engine wählt automatisch richtige Implementierung ∙ Zu beachten: Sessionverwaltung muss auch ohne Cookies funktionieren Alle internen URLs müssen kodiert werden: out.println("<a href=\""); out.println(response.encodeURL("/servlet/xy.Abc")); out.println("\">text</a>"); 19.07.2002 SEP WS 2002/03 - Technische Einführung 16 Servlets: Bewertung ∙ Vorteil: Extrem flexibel ∙ Nachteil: HTML ist in Java-Quellcode eingebettet Unübersichtlich HTML-Editoren können nicht benutzt werden Kein Syntax-Highlighting von HTML-Quellcode ∙ Alternative: Java Server Pages 19.07.2002 SEP WS 2002/03 - Technische Einführung 17 JSP: Beispiel <%-- Parameter lesen --%> <% int x = Integer.parseInt(request.getParameter("x")); int y = Integer.parseInt(request.getParameter("y")); %> <html> <head> <title>Calculator</title> </head> <body> Berechnung: <%= x %> + <%= y %> = <%= x+y %> </body> </html> 19.07.2002 SEP WS 2002/03 - Technische Einführung 18 JSP: Syntax <%= Java Expression %> 2 + 3 = <%= 2 + 3 %> <%-- Kommentar --%> <%-- JSP Kommentar --%> <!-- HTML Kommentar --> <%@ Direktive %> <%@ page import="java.util.*" %> … diverse andere Direktiven, auf die ich jetzt nicht eingehe. 19.07.2002 SEP WS 2002/03 - Technische Einführung 19 JSP: Syntax <%! Funktions- und Variablen-Deklarationen %> <%! static final int PI = 3.1415926536; double u(double radius) { return 2*PI*r; } %> Umfang des Einheitskreises: <%= umfang(1.0) %> beliebiger Java Code („Skriptlet“) %> <% <% int i = 10; for(int j=0; j<i; ++j) { out.println(i); } %> Unterschied zu <%= … %>: Ergebnis wird nicht ausgegeben Strichpunkt Unterschied zu <%! … %>: Variablen sind lokal 19.07.2002 SEP WS 2002/03 - Technische Einführung 20 JSP: Vordefinierte Variablen ServletRequest request ServletResponse response HttpSession session JspWriter out … und einige weitere 19.07.2002 SEP WS 2002/03 - Technische Einführung 21 JSPs und Servlets ∙ JSPs werden zu Servlets kompiliert: *.jsp (JSP Quellcode) *.java (Servlet Quellcode) *.class ∙ 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 19.07.2002 SEP WS 2002/03 - Technische Einführung 22 Java Beans ∙ Beans in diesem Kontext: Nicht: Enterprise Java Beans Nicht: Oberflächenkomponenten Sondern: Server-side Java Beans ∙ Komponenten mit Properties und Methoden ∙ Im wesentlichen: Java Klassen Default Konstruktor Für jede Property mit Typ „Type“ und Namen „niceValue“ public void setNiceValue(Type value); public Type getNiceValue(); 19.07.2002 SEP WS 2002/03 - Technische Einführung 23 JSPs und JavaBeans ∙ Bean deklarieren / erzeugen <jsp:useBean id="bean" scope="request" type="Klassenname"/> ∙ Property lesen <jsp:getProperty name="bean" property="niceValue"/> <%= bean.getNiceValue() %> ∙ Property schreiben <jsp:setProperty name="bean" property="niceValue" value="1.0"/> <% bean.setNiceValue(1.0) %> ∙ Beispiel folgt 19.07.2002 SEP WS 2002/03 - Technische Einführung 24 JSPs und Servlets Servlet Container HTTP Request WWWBrowser (Client) Servlet / WWWJava Server Page Server HTTP Response 19.07.2002 SEP WS 2002/03 - Technische Einführung 25 Model View Controller (MVC) Servlet Container HTTP Request Controller Controller (Servlet) WWWBrowser (Client) Model (JavaModel Beans) HTTP Response 19.07.2002 View View (JSP) SEP WS 2002/03 - Technische Einführung 26 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 19.07.2002 SEP WS 2002/03 - Technische Einführung 27 Model Beispiel package sep; public class Calculator { protected int x; public void setX(int x) { this.x = x; public int getX() { return x; } } protected int y; public void setY(int y) { this.y = y; public int getY() { return y; } } public void calculate() { result = x + y; } protected int result; public int getResult() { return result; } } 19.07.2002 SEP WS 2002/03 - Technische Einführung 28 public class ControllerServlet 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")); Calculator c = new Calculator(); c.setX(x); c.setY(y); c.calculate(); request.setAttribute("calculator", c); RequestDispatcher disp = request.getRequestDispatcher("/WEB-INF/jsp/view.jsp"); disp.forward(request, response); } } View Beispiel <%@ page import="sep.*" %> <jsp:useBean id="calculator" scope="request" type="Calculator"/> <html> <head> <title>Calculator</title> </head> <body> Berechnung: <jsp:getProperty name="calculator" property="x"/> + <jsp:getProperty name="calculator" property="y"/> = <jsp:getProperty name="calculator" property="result"/> </body> </html> 19.07.2002 SEP WS 2002/03 - Technische Einführung 30 Verzeichnisstruktur sep-demo/ index.html Statische HTML-Seiten xy.gif Bilder calculator.jsp JSPs WEB-INF/ classes/ Kompilierte Servlets & Beans sep/ ControllerServlet.class lib/ Hilfbibliotheken xy.jar jsp/ View JSPs view.jsp web.xml Deployment Descriptor 19.07.2002 SEP WS 2002/03 - Technische Einführung 31 Deployment Descriptor (web.xml) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> … </web-app> 19.07.2002 SEP WS 2002/03 - Technische Einführung 32 Servlet Mappings <servlet> <servlet-name>controller</servlet-name> <servlet-class>sep.ControllerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>controller</servlet-name> <url-pattern>/controller</url-pattern> </servlet-mapping> 19.07.2002 SEP WS 2002/03 - Technische Einführung 33 Weitere Möglichkeiten ∙ ∙ ∙ ∙ ∙ <init-param> (z. B. Datenbankparameter) <load-on-startup> (z. B. Hintergrund-Threads) <session-timeout> <welcome-file-list> <error-page> Selber anschauen 19.07.2002 SEP WS 2002/03 - Technische Einführung 34 Datenbankzugriff Servlet Container HTTP Request Controller WWWBrowser (Client) Model HTTP Response 19.07.2002 JDBC Datenbank View SEP WS 2002/03 - Technische Einführung 35 JDBC ∙ Als bekannt vorausgesetzt (Praktische Informatik) ∙ Tutorials, Dokumentationen auf der SEP-Webseite ∙ Zu beachten: Connection Pool Aufbau von Datenbankverbindungen ist aufwendig Vorhalten von mehreren Verbindungen Wiederverwendung Shutdown-Thread Datenbankverbindungen müssen abgebaut werden (auch bei Systemabsturz) public void Runtime.addShutdownHook(Thread hook) 19.07.2002 SEP WS 2002/03 - Technische Einführung 36 Einführungsaufgabe ∙ Ausgabe SEP-Webseite Nächste Woche Ankündigung per E-Mail ∙ Abgabe Termin: 30. September Per E-Mail beim jeweiligen Betreuer ∙ Build-System: Jakarta Ant ∙ Datenbankkennung (IBM DB2) Funktioniert nur innerhalb der Uni Jeder Teilnehmer bekommt eine Später bekommt jedes Team zwei weitere 19.07.2002 SEP WS 2002/03 - Technische Einführung 37