Praxis der Internet-Programmierung Servlet I Statische Webseiten 1:1-Ausgabe der angeforderten Datei Dynamische Komponenten auf der Client-Seite: Scripts (ECMAScript, JavaScript,…) Plug-Ins (Java Applets, Macromedia Flash, …) Dynamische Webseiten Erzeugung der Ausgabe zur Laufzeit "Web-Anwendung", Server-seitige Technologien Common Gateway Interface (CGI) Ausführung in einem Webserver-externen Prozess kein Zugriff auf Ressourcen des Webservers je ein eigener Prozess pro Anfrage beliebige Sprachen möglich (C/C++, Perl, Java, …) Interpretiert / kompiliert Server-seitige Technologien Server-seitige Skripte Serverside JavaScript SSJS (Netscape) Active ServerPages ASP (Microsoft) Hypertext Preprocessor PHP (Apache) JavaServer Pages JSP (Sun) Bsp: ASP <HTML> <!-- This example displays the content of several ServerVariables. --> ALL_HTTP server variable = <%= Request.ServerVariables("ALL_HTTP") %> <BR> CONTENT_LENGTH server variable = <%= Request.ServerVariables("CONTENT_LENGTH") %> <BR> CONTENT_TYPE server variable = <%= Request.ServerVariables("CONTENT_TYPE") %> <BR> QUERY_STRING server variable = <%= Request.ServerVariables("QUERY_STRING") %> <BR> SERVER_SOFTWARE server variable = <%= Request.ServerVariables("SERVER_SOFTWARE") %> <BR> </HTML> Java Servlet Framework JSEE Versionen Java Servlet 2.2 (17.12.1999) "write once, serve anywhere“ stabil: Servletcontainer: Tomcat 3.3 Servlet API: 2.2 JSP: 1.1 für Entwickler: Servletcontainer: Servlet API: JSP: stabil Tomcat 4.0 2.3 1.2 Servlets die Antwort auf CGI Programmierung Servlets laufen auf einem Webserver in einem Servletcontainer. Aufgaben: Zugriff auf REQUEST Erzeugen einer Antwort Formatierung der Antwort in einem Dokument Senden des RESPONSE kein eigenständiges Programm! keine main()-Methode! Vorteile Alle Servlets können in einer JVM laufen Erleichtert die Kommunikation Portabilität / Stabilität / Platformunabhängikeit Sicherheit nur eine Sprache Funktionalität durch Methodenaufrufe auf das Servlet Objekt Servlet bleibt im Speicher erhalten Schnellem Starten bei einem neuen Request wenig Memory overhead javax.servlet C:\Programme\jbuilder5\extras\jakarta-tomcat-src\src\webpages\docs\api Lebenszyklus eines Servlet Laden der Servlet-Klasse Erzeugen einer Instanz Ausführen der init()-Methode prüfen auf neuere Version des *.class-Files: allenfalls neu laden Ausführen der Methode service() z.B. Herunterfahren des Servers Ausführen der destroy()-Methode garbage collection Programmierung eines Servlets • erweitern die abstract class javax.servlet.http.HttpServlet (Subklasse von GenericServlet) • service() wird nicht überschrieben • überschreiben der Methoden doGet(), doPost(), doPut(), doDelete() HELLO WORLD package hello_world; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>Hello World</TITLE></HEAD>"); out.println("<BODY>"); out.println("<BIG>Hello World</BIG>"); out.println("</BODY></HTML>"); } } Zugriff auf REQUEST public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Interface HttpServletRequest getParameter()/getParametetValues(): Zugriff auf die Name/Wert-Paare des REQUESTS getRemoteAddr(): IP-Adresse des Clients getProtocol(): benutztes Protokol HttpServletRequest API Zugriff auf RESPONSE public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Interface HttpServletResponse Ausgabe mittels java.io.PrintWriter PrintWriter out = res.getWriter(); MIME-Format: res.setContentType(CONTENT_TYPE); ASCII-Formate: text/html, text/xml, text/plain,… Hello II package hello_world; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); String name = req.getParameter("name"); out.println("<HTML>"); out.println("<HEAD><TITLE>Hello, " + name + "</TITLE></HEAD>"); out.println("<BODY>"); out.println("Hello, " + name); out.println("</BODY></HTML>"); } } Hello World Form <HTML> <HEAD> <TITLE>Introductions</TITLE> </HEAD> <BODY> <FORM METHOD=GET ACTION="/servlet/hello_world.Hello"> If you don't mind me asking, what is your name? <INPUT TYPE=TEXT NAME="name"><P> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> Request Headers IE 5.5 Request Headers Netscape 6.0 HTTP Request Header import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class Request_all2 extends HttpServlet { private static final String CONTENT_TYPE = "text/html"; /**Initialize global variables*/ public void init(ServletConfig config) throws ServletException { super.init(config); } HTTP Request Header /**Process the HTTP Get request*/ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); String title = "Servlet Example: Showing Request Headers"; out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<B>Request Method: </B>" + request.getMethod() + "<BR>\n" + "<B>Request URI: </B>" + request.getRequestURI() + "<BR>\n" + "<B>Request Protocol: </B>" + HTTP Request Header request.getProtocol() + "<BR><BR>\n" + "<TABLE BORDER=1 ALIGN=CENTER>\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Header Name<TH>Header Value"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); out.println("<TR><TD>" + headerName); out.println(" <TD>" + request.getHeader(headerName)); } out.println("</TABLE>\n</BODY></HTML>"); } HTTP Request Header /**Process the HTTP Post request*/ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /**Clean up resources*/ public void destroy() { } } Praktikum SERVLET Programmierung I 1. Hello World Servlet 2. Eigenes Servlet: • • • • • Gibt aktuelle Zeit aus Begrüsst Sie mit Morgen oder Abend Gibt erkennt ihren Browser Sagt Ihne ihre IP Adresse Zeigt Ihnen den Query-String an. Links http://java.sun.com/products/servlet/ http://developer.java.sun.com/developer/technicalArticles/Servlets/ http://java.sun.com/docs/books/tutorial/servlets/ http://www.servlets.com/index.tea http://archive.coreservlets.com/ http://www.oreilly.com/catalog/jservlet2/ http://java.sun.com/j2ee/j2sdkee/ http://java.sun.com/products/servlet/2.2/javadoc/ http://www.ifi.unibas.ch/Courses/JavaTech/course/1306Schaub/index.htm CGI-Variable Environement Variablen CGI Variable AUTH_TYPE CGI-Variable Art der Autentisation (basic oder digest) CONTENT_LENGTH # Bytes mit post gesendet CONTENT_TYPE MIME Typ von anghängten Daten DOCUMENT_ROOT Wurzelverzeichnis des Webservers PATH_INFO Pfad ohne QueryString PATH_TRANSLATED wirklicher Pfad auf dem Server QUERY_STRING REMOTE_ADDR IP Adresse des Client CGI Variable REMOTE_HOST CGI-Variable Domainname vom Host REMOTE_USER Username (nur bei Authentification) REQUEST_METHOD Get,Post,Put,... SCRIPT_NAME Pfad des Servlet SERVER_SOFTWARE Neues Servlet im JBuilder New Servlet Rechte Maustaste Web Run