e-commerce Running Tomcat Servlets im Tomcat Web-Container deployen Prof. Dr. Nikolaus Wulff
Das BookStore Servlet Prof. Dr. Nikolaus Wulff ecommerce 2
HTTP und HTML Das HyperText TransferProtokoll (HTTP) beschreibt eine einfache verbindungslose Kommunikation, die auf TCP/IP basiert. Die ausgetauschten Nachrichten sind mit der HyperText Markup Language (HTML) formatiert. Ein Browser fordert mittels der HTTP GET Methode ein Dokument vom Webserver an, dieser schickt es dann an den Client zurück. Prof. Dr. Nikolaus Wulff ecommerce 3
Standard HTML 1: get X.html 2: Datei lesen Browser 3: X.html Web-Server X.html + einfache Sprache (HTML) nur statische Informationen & Verknüpfungen GET http://www.fh-muenster.de:80/docs/welcome.html Methode Protokoll Server DSN + Port symbolischer Pfad Dokument Prof. Dr. Nikolaus Wulff ecommerce 4
HTML und CGI-Bin Die HTML Seiten sind statisch hinterlegt und erlauben es nicht ein interaktive Client/Server Anwendungen zu bauen. Um mehr als nur Werbung in das WWW stellen zu können, benötigt man für e-business so etwas wie eine Bestellung aufgeben... Man behalf sich mit dem Common-Gateway- Interface (CGI) um auf dem Server externe Prozesse aufzurufen, die dynamisch HTML generierten Prof. Dr. Nikolaus Wulff ecommerce 5
Von CGI zu den Servlets Externe Prozesse sind eine teure Ressource. Es fehlt die Integration in den Webserver. Sun entwickelte daher die Servlet API als PlugIn für den Webserver. Anstatt als eigenständiger Prozeß laufen Servlets als Thread innerhalb der JVM. Servlets kapseln die GET/POST Methoden von HTTP in der Java Umgebung. Da Servlets in Java geschrieben sind stehen nun alle Möglichkeiten wie CORBA, EJB, JDBC, JMS etc. dem Webserver zur Verfügung. Prof. Dr. Nikolaus Wulff ecommerce 6
Java-Servlets 1: get/post servlet/x X.java Browser 7: Xout Web-Server 6: Xout 2: call X.class a: übersetzen + einfache Sprache (Java) + Dynamik HTML im Java-Code über out.println(... ) mit DB-Zugriffen usw. Servlet-Engine 5: Ausgabe DB X.class 4: X ausführen 3: Class Datei laden (einmal) Java-Compiler (javac) b: erzeugen X.class Prof. Dr. Nikolaus Wulff ecommerce 7
Die Servlet Klassenhierarchie <<Interface>> ServletRequest (from serv let) service GenericServlet (from servl et) service() service <<Interface>> ServletResponse (from servl et) Request kapselt die Anfrage Response kapselt die Antwort <<Interface>> HttpServletRequest service HttpServlet doget() dopost() service <<Interface>> HttpServletResponse Session kapselt den Status 0..1 <<Interface>> HttpSession ServletException (from serv let) throws throws I OException (from io) PrintWriter (from io) 1 Prof. Dr. Nikolaus Wulff ecommerce 8
Eigene Servlets einbinden <<Int erface>> HttpServletRequest (from http) service HttpServlet (from http) doget() dopost() service <<Int erface>> HttpServletResponse (from http) 0..1 HTML-Page MyServlet as <<Int erface>> Response HttpSession (from http) doget() dopost() sql (from java) Prof. Dr. Nikolaus Wulff ecommerce 9
Lebenslauf eines Servlets Ein Client ruft ein Servlet per GET/POST auf. Das Servlet wird vom Webserver geladen Das Servlet wird einmalig mit der init()-methode initialisiert, das Servlet kann nun z.b. eine Datenbankverbindungen initialisieren, einen EJB oder CORBA Server kontaktieren Ressourcen laden, etc. Das Request-Objekt wird vom Webserver initialisiert. Es wird die doget dopost-methode des Servlets aufgerufen. Prof. Dr. Nikolaus Wulff ecommerce 10
Lebenslauf eines Servlets (II) Das Servlet schreibt seine Anwort in den Ausgabestrom des Response-Objekts. Der Webserver wertet den Response aus und schreibt die Antwort per HTTP an den Client. Beim Herunterfahren der ServletEngine oder falls eine maximale Lebensdauer für das Servlet im Webserver definiert ist, wird die destroy()- Methode des Servlets ausgeführt, um eventuelle Aufräumarbeiten auszuführen. Prof. Dr. Nikolaus Wulff ecommerce 11
Servlet Sequenzdiagramm : Kunde Browser WebServer HttpRequest HttpServlet HttpResponse get servlet GET create create servi ce doget read write Prof. Dr. Nikolaus Wulff ecommerce 12
Infrastruktur Damit ein Servlet in einem WebContainer läuft muss es in seine Umgebung kopiert werden. Dieser Vorgang heisst: Deployment physisches Kopieren aller Ressourcen in ein Verzeichnis oder Packen als WebArchive *.war logisches Bekanntmachen per web.xml als Bestandteil einer WebApplikation Dies sind recht umständliche Schritte, die sich jedoch automatisieren lassen... Prof. Dr. Nikolaus Wulff ecommerce 13
Tomcat in Eclipse starten Tomcat kann in der Eclipse IDE integriert und und für Testzwecke administriert werden. Plugin: com.sysdeo.eclipse.tomcat_3.0.0 Tomcat läßt sich aus Eclipse heraus starten, stoppen. Diese vereinfacht den Deploymentprozess. Der jeweilige Projektworkspace wird in den Tomcat Pfad mit eingebunden und steht sofort zur Verfügung. Die jeweilige Webapplikation wird dann automatisch im Tomcat aktualisiert und steht für Testzwecke zur Verfügung. Prof. Dr. Nikolaus Wulff ecommerce 14
Tomcat integrieren Prof. Dr. Nikolaus Wulff ecommerce 15
Tomcat Manager Prof. Dr. Nikolaus Wulff ecommerce 16
web.xml <?xml version="1.0"?> <!DOCTYPE web-app PUBLIC "-//Sun... <web-app> <servlet> <servlet-name>helloworld</servlet-name> <servlet-class>de.workshop.helloservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloworld</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>»web.xml«im Hello Modul wie oben anpassen. Sie macht das Servlet beim Server bekannt und sorgt für das Mapping. Prof. Dr. Nikolaus Wulff ecommerce 17
build.xml <target name="deploy" depends="undeploy,init" > <jar jarfile="${war}.war" basedir="${dist}"/> <copy file="${war}.war" todir="${deploy.dir}"/> <copy todir="${deploy.dir}/${war}"> <fileset dir="${dist}"/> </copy> <delete file="${war}.war"/> <delete dir="${dist}"/> </target> <target name="undeploy" depends="undeploytool,init"> <delete file="${deploy.dir}/${war}.war"/> <delete dir="${deploy.dir}/${war}"/> </target> Ant Script»build.xml«im Hello Modul wie oben anpassen. Es regelt das Deployment. Prof. Dr. Nikolaus Wulff ecommerce 18
HelloServlet.java Nun können wir das Hello Servlet erzeugen: Paket»de.workshop«anlegen Klasse»HelloServlet«von der Basisklasse»javax.servlet.http.HttpServlet«ableiten eine»doget«methode implementieren ensprechende Includes einbinden Nach dem alles compiliert die»build.xml«ausführen und Tomcat starten. Im Browser»http://localhost:8080/HelloWorldServlet/Hello«aufrufen Prof. Dr. Nikolaus Wulff ecommerce 19
HelloWorld Servlet public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { } // 1. Zugriff auf den Ausgabestrom des HTML Dokuments java.io.printwriter writer = response.getwriter(); // 2. Erzeugung eines HTML Dokuments writer.println("<html>"); // 2.A Standard Kopf mit Title für den Browser writer.println("<head>"); writer.println("<title> HelloWorld Servlet </TITLE>"); writer.println("</head>"); // 2.B Der HalloWorld HTML Seiten Inhalt als Body writer.println("<body>"); writer.println("<h1> Hallo World </H1>"); writer.println("lokale Zeit +new java.util.date()+"<br>"); writer.println("</body>"); writer.println("</html>"); // 3. Den Ausgabestrom schliessen writer.close(); Prof. Dr. Nikolaus Wulff ecommerce 20
Übung Wir schreiben ein Hello World Servlet eine Anfrage (Get-Request) wird mit der Antwort Hallo World beantwortet. Notwendige Schritte: Erzeugen einer Klasse HelloServlet abgeleitet von HttpServlet Überladen der doget Methode Ausgabe von Hello World Deployment in die Umgebung des WebServers Testen des Servlets und Deployments Prof. Dr. Nikolaus Wulff ecommerce 21
HttpServletRequest Die Anfrage Parameter lassen sich immer aus dem HttpServletRequest Objekt ermitteln. Es bietet vordefinierte Methoden wie: Session getsession() Cookie[] getcookies ServletInputStream getinputstream() sowie allgemeine Query-Methoden um die (Key,Value)-Paare, wie sie z.b. beim Abschicken eines Formulars übertragen werden, abzufragen: String[] getparameternames() String getparamerter(string key); Prof. Dr. Nikolaus Wulff ecommerce 22
HttpServletResponse Die Rückgabe der Antwort an den Client-Browser geschieht mit dem HttpServletResponse. Er bietet vordefinierte Methoden wie: addcookie(cookie acookie) ServletOutputStream getoutputstream() PrintWriter getwriter() sowie allgemeine Methoden um den Inhalt des Response dem Webbrowser bekannt zu geben: void setcontenttype(string mimetype) void setcontentlengsth(int length) Prof. Dr. Nikolaus Wulff ecommerce 23
Übung Wir schreiben ein MirrorServlet: jede Anfrage wird mit einer formatierten Ausgabe der Request Parameter beantwortet. Notwendige Schritte: Neues Projekt wie beim HelloServlet anlegen Klasse»servlet.MirrorSerlet«erstellen Auslesen der Request Parameter Zurückschreiben als aufbereitete Tabelle Deployen und Testen des Servlets Dieses Servlet eignet sich zum Testen von Übergabeparametern aus einem Formular... Prof. Dr. Nikolaus Wulff ecommerce 24
Lösung MirrorServlet public class MirrorServlet extends HttpServlet { /** * POST verwendet die GET Mehthode. */ public void dopost(httpservletrequest req, HttpServletResponse res) throws ServletException,IOException { doget(request, response); } /** * GET baut eine HTML Datei auf und erzeugt * die Tabelle per Methode parametertable. */ public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { beginhtml(request, response); parametertable(request, response); endhtml(request, response); } Prof. Dr. Nikolaus Wulff ecommerce 25
Lösung MirrorServlet (II) /** * Schreibe einen Html Kopf. */ private void beginhtml(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getwriter(); out.println("<html>"); out.print("<head><title>mirrorservlet</title></head>"); out.println("<body>"); out.println("<h1>mirror Servlet </h1>"); } /** * Schreibe das Ende der Html Datei. */ private void endhtml(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getwriter(); out.println("</body>"); out.println("</html>"); } Prof. Dr. Nikolaus Wulff ecommerce 26
Lösung MirrorServlet (III) private void parametertable(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getwriter(); Map map = req.getparametermap(); out.println("<h2>parameter</h2>"); out.println("<center><table border='1'width='50%'>"); out.println("<tr><th>schlüssel</th><th>wert</th></tr>"); Iterator keys = map.keyset().iterator(); while (keys.hasnext()) { String key = (String) keys.next(); String val = req.getparameter(key); out.print("<tr>"); out.print("<td>" + key + "</td>"); out.print("<td>" + val + "</td>"); out.println("</tr>"); } out.println("</table></center>"); } Prof. Dr. Nikolaus Wulff ecommerce 27