WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Enterprise Application Integration Java Servlet Programmierung und HttpUnit Christian Arndt Lehrstuhl für praktische Informatik in der Wirtschaft Prof. Dr. Herbert Kuchen Inhaltsübersicht WIRTSCHAFTS INFORMATIK Java Servlet Programmierung HttpUnit Literaturempfehlungen Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 2 Inhaltsübersicht WIRTSCHAFTS INFORMATIK Java Servlet Programmierung HttpUnit Literaturempfehlungen Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 3 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Java Servlets Basieren auf der Java Servlet Spezifikation Sind in Java implementiert und nutzen die Java Servlet-API Laufen serverseitig im Kontext eines Servlet Containers Ermöglichen über die Servlet API den Zugriff auf die http Protokollebene und deren Eigenschaften Erweitern die Funktionalität des Servers um HTML Code zu generieren, Datenbankabfragen auszuführen oder einfache Geschäftsabläufe abzubilden Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 4 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Java Servlets – Eigenschaften Werden häufig in Verbindung mit weiteren Webtechnologien, insbesondere Java Server Pages und statischen HTML-Seiten eingesetzt Müssen in einem Servlet Container veröffentlicht (deployed) werden Um Unterschied zur CGI Programmierung bietet die Java Servlet API umfassende Funktionalitäten für häufig wiederkehrende Operationen wie das Auslesen von Request Parametern, die Sitzungsverfolgung (Session Tracking) oder die Verarbeitung von Cookies Durch Verwendung von Java bieten Servlets die Möglichkeiten der Objektorientierung Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 5 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Servlet Container Servlets laufen in einer Java Umgebung, welche integraler Bestandteil des Servlet Containers ist Der Servlet Container ist wiederum in einen Web Server oder Application Server integriert Container verwaltet Lebenszyklus der Servlets und reicht Anfragen an diese weiter Jede Anfrage wird dabei in einem eigenen Thread behandeltDa die JVM des Servlet Containers permanent in Betrieb ist, muss diese zum Laden eines Servlets nicht erst gestartet werden Apache Tomcat: Referenzimplementierung für die Java Servlet und Java Server Pages Spezifikation Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 6 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Der Lebenszyklus eines Servlets Der Client sendet einen Request an den Web Server Dieser registriert, dass die Anfrage an ein Servlet gerichtet ist und reicht sie an den Servlet Container weiter Der Classloader des Servlet Containers lädt das Servlet in den Speicher Die Java Servlet Spezifikation sieht vier grundlegende Methoden über die Der Servlet Container zur Steuerung des Lebenszyklus mit dem Servlet kommuniziert Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 7 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Der Lebenszyklus eines Servlets void init() Wird bei der Initialisierung eines Servlets aufgerufen und ermöglicht diesem sich zu konfigurieren und zum Bespiel Hilfsklassen zu initialisieren oder eine Datenbankverbindung aufzubauen void doGet(HttpServletRequest, HttpServletResponse) Wird bei einer Anfrage vom Typ GET aufgerufen und implementiert die eigentliche Funktionalität des Dienstes void doPost(HttpServletRequest, HttpServletResponse) Wird bei einer Anfrage vom Typ POST aufgerufen void destroy() Wird aufgerufen, wenn eine Servlet Instanz nicht mehr benötigt wird und aus dem Speicher entfernt werden soll Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 8 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Der http Request-Response Zyklus Richtet der Web Browser eine Anfrage an einen Web Server, so übermittelt er Informationen über die Art der Anfrage (zumeist GET oder POST), die angeforderte URI und die Versionsnummer des verwendeten Protokolls Beispiel: GET /irgendeineseite.html HTTP/1.1 Antwort des Servers besteht aus einem Header und dem angeforderten Dokument oder einem Fehlercode, falls dieses nicht verfügbar ist Sollen mit einer GET Anfrage Daten aus Formularfeldern an den Server übermittelt werden, so werden diese in URL Kodierung an den URL String angehängt Beispiel: http://server/servlet?parameter1=wert1&;parameter2=wert2 Bei der Methode POST werden Daten im Unterschied zu GET nicht an die URL angehängt, sondern als Datenstrom an den Server übertragen Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 9 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Das HttpServletRequest Objekt Die Eigenschaften eines http Requests sind über das Objekt HttpServletRequest zugänglich String getHeader(String headername) Liefert den Request Header mit dem Namen „headername“ String getParameter(String paramname) Liefert den Wert des Parameters „paramname“ (Ererbt von der Klasse ServletRequest) ServletInputStream getInputStream() Liefert ein ServletInputStream Objekt, welches den Datenstrom einer POST Anfrage zur Verfügung stellt HttpSession getSession() Liefert die mit dem aktuellen Request assoziierte Session Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 10 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Das HttpServletResponse Objekt Das HttpServletResponse Objekt ermöglicht es, die Ausgabe zu konfigurieren, die durch ein Servlet erzeugt und an den Web Browser des Klienten geschickt wird void setContentType(String type) Legt den Typ des Ausgabeformats mithilfe von MIME- Typen fest – z.B. „text/html“ für HTML Seiten, „image/gif“ für gif- Bilder (Ererbt von der Klasse ServletResponse) PrintWriter getWriter() Liefert ein Objekt vom Typ PrintWriter, welches es ermöglicht, textuelle Daten über den Ausgabestrom auszugeben (Ererbt von der Klasse ServletResponse) Das schreiben einer einzelnen HTML Codezeile erfolgt durch Aufruf der Methode println(String content) des PrintWriter Objektes ServletOutputStream getOutputStream() Liefert ein ServletOutputStream Objekt, welches einen Datenstrom zur Ausgabe von Binärdaten (z.B. Grafiken) zur Verfügung stellt Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 11 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Ein einfaches „Hello World“ Servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); writer.println("<html><head><title>Servlet</title></head>"); writer.println("<body><h1>Hello World!</h1>"); writer.println("This page was last updated: " + new java.util.Date()); writer.println("</body></html>"); } } Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 12 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Deployment einer Servlet Anwendung Eine Servlet basierte Web-Anwendung kann als unkomprimierte Verzeichnisstruktur oder als Web-Archiv (.war) deployed werden Ein Web-Archiv lässt sich mithilfe des Werkzeugs „jar“ erstellen Die Verzeichnisstruktur einer Web Anwendung ist durch die Java Servlet Spezifikation standardisiert Angaben zum Deployment werden in der Datei web.xml, dem Deployment Descriptor hinterlegt Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 13 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Verzeichnisstruktur einer Servlet Anwendung meineanwendung/ Enthält ergänzende Dateien (Bspw. HTML, CSS, GIF, JSP Dateien), welche sich auch in Unterverzeichnissen befinden können. meineanwendung/WEB-INF/ Enthält den Deployment Descriptor web.xml meineanwendung/WEB-INF/classes/ Enthält die .class Dateien der Servlets und aller weiteren benötigten Klassen. Die Struktur der Unterverzeichnisse innerhalb des /classes Verzeichnisses muss mit der Paketstruktur der Servlet Implementierung korrespondieren meineanwendung/WEB-INF/lib/ Enthält ergänzende .jar Archive Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 14 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Der Deployment Descriptor Registrierung der Servlet Klassen Angaben zur Abbildung von URLs auf Servlet Klassen (URL Mapping) Angaben zu Initialisierungsparametern und Timeout Einstellungen Angaben zu Start- und Fehlerseiten Angaben zu Sicherheitseinstellungen und Client Authentifizierung … Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 15 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Beispiel für einen Deployment Descriptor <web-app> <display-name>A Simple Application</display-name> <servlet> <servlet-name>catalog</servlet-name> <servlet-class>com.mycorp.CatalogServlet </servlet-class> <init-param> <param-name>catalog</param-name> <param-value>Spring</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>catalog</servlet-name> <url-pattern>/catalog/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> </web-app Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 16 Java Servlet Programmierung WIRTSCHAFTS INFORMATIK Aufruf einer Servlet Anwendung Sobald ein Servlet deployed ist, kann es unter der URL: http://serveradresse:portnummer/anwendungskontext/servletadresse aufgerufen werden. Tomcat verwendet üblicherweise den Port 8080. Da im Praktikum zwei Tomcat Installationen (standalone Tomcat + Tomcat in JBoss) eingesetzt werden, arbeitet die standalone Installation auf Port 9080 Der Anwendungskontext kann explizit festgelegt werden, andernfalls verwendet Tomcat den Namen des .war Archivs als Anwendungskontext Die Servletadresse ergibt sich aus den Angaben für das URL-Mapping im Deployment Descriptor Beispiel für eine Aufruf URL: http://wi-vm215.uni-muenster.de:9080/gruppe00_servletphonebook/searchnumber Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 17 Inhaltsübersicht WIRTSCHAFTS INFORMATIK Java Servlet Programmierung HttpUnit Literaturempfehlungen Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 18 HttpUnit WIRTSCHAFTS INFORMATIK Grundlagen HttpUnit ermöglicht Black-Box Akzeptanztests von Webanwendungen Es simuliert Benutzerinteraktionen auf Websites und überprüft somit die Funktionalität von SSL, HTTP-Header, Frames, Tabellen, Formularen, Links, JavaScript und Cookies Dabei ist es unbedeutend, ob der Code einer Webseite statisch ist oder durch ein Servlet generiert wurde Mithilfe von HttpUnit und JUnit lassen sich automatische Testsuits für Webanwendungen erstellen Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 19 HttpUnit WIRTSCHAFTS INFORMATIK Integration von Webanwendungen mittels HttpUnit? Um auf einzelne Elemente einer Webseite zugreifen zu können, parst HttpUnit den HTML Code einer Seite und ermittelt dessen Struktur Über HTML Attribute wie „name“ oder „id“ lassen sich nun einzelne Elemente wie Formularfelder oder Tabellenzellen innerhalb des Syntaxbaumes identifizieren Um die Funktionalität von Formularen zu prüfen stellt HttpUnit spezielle Methoden zur Verfügung, die es erlauben Formularfelder mit Werten zu belegen und das Abschicken des Formulars über einen „submit“ Button zu simulieren Die Rückgabewerte des Servlets können nun durch Analyse der HTML-Ausgabe ermittelt werden Auf diese Weise lassen sich die Funktionalitäten eines Servlets automatisch ansprechen und z.B. über eine Web Service Schnittstelle für weitere Anwendungen zugänglich machen Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 20 HttpUnit WIRTSCHAFTS INFORMATIK Integration von Webanwendungen mittels HttpUnit? Wenngleich eine Integration von Webanwendungen durch Analyse der Benutzerschnittstelle mittels HttpUnit theoretisch möglich ist, so wird sie in der Praxis dennoch nur selten eingesetzt. Hauptnachteile Geschwindigkeitsnachteil durch das Parsen und die Analyse der HTML-Seiten Parsen und Analyse der Webseiten ist nur erfolgreich, wenn diese sorgfältig und weitestgehend spezifikationskonform implementiert sind Zu integrierende Daten müssen im HTML-Code eindeutig anhand ihres Namens oder einer id identifiziert werden können Die meisten Webanwendungen ließen sich aufgrund von Implementierungsmängeln oder fehlender Auszeichnung der Datenelemente mit HttpUnit nicht integrieren Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 21 HttpUnit WIRTSCHAFTS INFORMATIK Verwendung von HttpUnit Um die Funktionalität eines Servlets mittels HttpUnit anzusprechen muss zunächst eine Verbindung zur entsprechenden URL aufgebaut werden Für diesen Zweck bietet HttpUnit das Objekt WebConversation Der Codeabschnitt WebConversation = new WebConversation; WebRequest request = new GetMethodWebRequest(targetUrl); erzeugt ein WebConversation Objekt und einen GET Request, der an die im String „targetUrl“ enthaltene Adresse gerichtet ist. Der Aufruf WebResponse response = conversation.getResponse(request); sendet den Request an die angegebene Adresse und liefert ein WebResponse Objekt zurück, welches einen Zugriff auf die HTML Ausgabe des adressierten Servlets erlaubt Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 22 HttpUnit WIRTSCHAFTS INFORMATIK Verwendung von HttpUnit Der Aufruf WebForm form = response.getFormWithName(„formname"); liefert ein WebForm Objekt welches den Zugriff auf die die Eigenschaften des Formulars mit dem Namen „formname“ ermöglicht Mit der Methode setParameter(„fieldname“, „paramvalue“); trägt den Wert „paramvalue“ in das Feld mit dem Namen „fieldvalue“ ein Der Aufruf WebResponse response = form.submit(form.getSubmitButton(„buttonname")); schickt das Formular ab, indem die Betätigung des Submitbuttons mit dem Namen „buttonname“ simuliert wird und liefert den Response des Servlets zurück Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 23 HttpUnit WIRTSCHAFTS INFORMATIK Verwendung von HttpUnit Der Aufruf HTMLElement element = response.getElementWithID(„id"); liefert das mit der übergebenen id ausgezeichnete HTML-Element zurück Mit der Methode element.getText(); Wird der Inhalt des HTML-Elements ausgelesen Da die Methode den Inhalt des HTML-Elements als String zurückliefert muss dieser vor einer weiter Bearbeitung ggf. in einen passenden Typ bzw. Objekt konvertiert werden Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 24 Inhaltsübersicht WIRTSCHAFTS INFORMATIK Java Servlet Programmierung HttpUnit Literaturempfehlungen Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 25 Literaturempfehlungen WIRTSCHAFTS INFORMATIK Bücher Hunter J., Crawford W.: Java Servlet Programming, O‘Reilly 2001. WWW SUN Microsystems., Java Servlet Technology, http://java.sun.com/products/servlet/. Møller A., Schwartzbach M. L.: Interactive Web Services with Java, BRICS, University of Aarhus 2002, http://www.brics.dk/NS/02/1/ Apache Software Foundation: The Apache Jakarta Tomcat 5 Servlet/JSP Container (Documentation), http://tomcat.apache.org/tomcat-5.0-doc/index.html Sourceforge.net: HttpUnit, http://httpunit.sourceforge.net/ Horn T.: HttpUnit (Beispiel), http://www.torsten-horn.de/techdocs/java-httpunit.htm . Vorlesung: Enterprise Application Integration - Java Servlet Programmierung und HttpUnit 26