Software Engineering Praktikum WS 2002/03 Technische Einführung Michael Forster
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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 Fragen bitte gleich stellen 19.07.2002 SEP WS 2002/03 - Technische Einführung
SEP WS 2002/03 - Technische Einführung Ü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
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>Ü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 DTD-Konformer Code Validator 19.07.2002 SEP WS 2002/03 - Technische Einführung
HyperText Transfer Protocol (HTTP) Kommunikationsprotokoll zwischen Browser und WWW-Server http://www.fmi.uni-passau.de/ WWW- Browser (Client) WWW- Server HTTP Request HTTP Response HTTP Request HTTP Response 19.07.2002 SEP WS 2002/03 - Technische Einführung
HTTP: Gesendete Informationen HTTP Request URL http://server:port/pfad/seite?param1=wert1¶m2=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, …) 19.07.2002 SEP WS 2002/03 - Technische Einführung
SEP WS 2002/03 - Technische Einführung Servlets Servlet Container WWW- Browser (Client) WWW- Server Datei-system Servlet HTTP Request HTTP Request HTTP Response HTTP Response 19.07.2002 SEP WS 2002/03 - Technische Einführung
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
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
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
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>"); 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); } }
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
JSP: Vordefinierte Variablen ServletRequest request ServletResponse response HttpSession session JspWriter out … und einige weitere 19.07.2002 SEP WS 2002/03 - Technische Einführung
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung JSPs und Servlets Servlet Container WWW- Browser (Client) WWW- Server Servlet / Java Server Page HTTP Request HTTP Response 19.07.2002 SEP WS 2002/03 - Technische Einführung
Model View Controller (MVC) Servlet Container WWW- Browser (Client) Controller Controller (Servlet) Model (Java- Beans) Model HTTP Request View (JSP) View HTTP Response 19.07.2002 SEP WS 2002/03 - Technische Einführung
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
SEP WS 2002/03 - Technische Einführung 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
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); }
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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
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
SEP WS 2002/03 - Technische Einführung Servlet Mappings <servlet> <servlet-name>controller</servlet-name> <servlet-class>sep.ControllerServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/controller</url-pattern> </servlet-mapping> 19.07.2002 SEP WS 2002/03 - Technische Einführung
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
SEP WS 2002/03 - Technische Einführung Datenbankzugriff Servlet Container WWW- Browser (Client) Controller Controller Model HTTP Request Daten- bank JDBC View View HTTP Response 19.07.2002 SEP WS 2002/03 - Technische Einführung
SEP WS 2002/03 - Technische Einführung 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
SEP WS 2002/03 - Technische Einführung 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