Webprogrammierung Servlets / JSP 20.07.10 Thomas Perschke Rückblick HTML / CSS JavaScript / DHTML PHP AJAX 20.07.10 Heute Servlets 20.07.10 Common Gateway Interface (CGI) Definiert Methoden, wie ein Web-Server mit externen Programmen kommunizieren kann Eine der ersten praktisch eingesetzten Techniken zur Erzeugung dynamischer Webseiten Web-Server leitet Request an externes Programm weiter Ausgabe des externen Programms wird an Client gesendet CGI-Programme können nicht mit dem Web-Server interagieren CGI-Programme können in fast allen Sprachen erstellt werden (Perl, C / C++, ...), da Kommunikation über Standardkanäle 20.07.10 Java Servlets Werden normalerweise in Verbindung mit einem WebServer bzw. einer Servlet-Engine benutzt Java-Servlets laufen einer JVM auf dem Server ab Servlets werden in separaten Threads innerhalb des Server-Prozesses ausgeführt gute Performance Servlets sind Java-Klassen, deren Aufgabe es ist, eine Antwort zu erzeugen – – – HTML-Seite XML-Daten ... 20.07.10 Vorteile portabel / mächtig / sicher – effizient – – – einmal geladen, verweilt das Servlet im Speicher Threads anstelle von Prozessen parallele Requests werden auf verschiedene Threads verteilt (skalierbar) elegant – – durch Java (->API) objektorientiert, modular bereitgestellte Servlet-spezifische Methoden Integration – – komplett in den Server integriert Austausch von Daten der Servlets untereinander 20.07.10 Technische Voraussetzungen JDK – J2SDK Servlet-Engine – – – Tomcat (Catalina) Resin JRun 20.07.10 Die Servlet-API Servlets benutzen Klassen und Interfaces aus zwei Packages: – – javax.servlet javax.servlet.http Servlets haben i.A. keine main-Methode Bestimmte Methoden des Servlets werden durch den Web-Serveraufgerufen – – Jeder Request wird an die service()-Methode des Servlets übergeben Bei den HTTP-Servlets erfolgt eine Vorverarbeitung und der Request wird direkt an die doGet()- oder an die doPost()Methode übergeben (doXXX()-Methode) 20.07.10 Servlet-Hierarchie 20.07.10 Implementierung Test-Servlet (1. Schritt) Neue Datei „TestServlet.java“ im Verzeichnis ‚resin-2.1.11/doc/test/WEBINF/classes‘ anlegen Datei TestServlet.java: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MyTestServlet extends HttpServlet { ... } 20.07.10 Test-Servlet 20.07.10 Implementierung Test-Servlet (2. Schritt) ... public class MyTestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); ... } } 20.07.10 Implementierung Test-Servlet (3. Schritt) ... public class MyTestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head><title>Test</title></head>"); out.println("<body>"); out.println("Dies ist ein Test"); out.println("</body>"); out.println("</html>"); } } 20.07.10 Deploying des TestServlets (4. Schritt) Konfigurationsdatei webapps/test/web-inf/web.xml – Innerhalb des Bereichs <host>..</host>: <web-app ...> <servlet> <servlet-name>MeinTestServlet</servlet-name> <servlet-class>test.MyTestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MeinTestServlet</servlet-name> <url-pattern>/ts</url-pattern> </servlet-mapping> </web-app> Aufruf im IE: http://localhost:8080/test/ts 20.07.10 Form-Daten auswerten <html> <head><title>Test-Form</title></head> <body> <form method=„get“ action=„/test/ts“> Wie ist ihr Name? <input type=„text“ name=„name“><p> Wie ist ihr Vorname? <input type=„text“ name=„vorname“><p> <input type=„submit“> </form> </body> </html> 20.07.10 Form-Daten auswerten public void doGet(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); String name = request.getParameter("name"); String vorname = request.getParameter("vorname"); out.println("<html>"); out.println("<head><title>Test</title></head>"); out.println("<body>"); out.println("Ihr Name lautet " + vorname + " " + name + "!"); out.println("</body>"); out.println("</html>"); 20.07.10 Form-Daten auswerten mit POST <form method="get" action="/test/ts"> <form method=„post" action="/test/ts"> TestServlet.java: ... public void doPost(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException { doGet(request, res); } ... 20.07.10 Einfacher Seitenzähler Datei MyTestServlet.java: public class MyTestServlet extends HttpServlet { public static int counter = 0; ... public void doPost(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException { ... out.println("Ihr Name lautet " + vorname + " " + name + "!"); out.println("<p>Die Seite wurde " + ++counter + " mal aufgerufen"); out.println("</body>"); ... } ... 20.07.10 Server-/Client-Informationen auswerten – – – – – – – – – request.getServerName() request.getServerPort() request.getMethod() request.getRequestURI() request.getProtocol() request.getServletPath() request.getRemoteAddr() request.getRemoteHost() request.getRemoteUser() 20.07.10