340 likes | 450 Views
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
E N D
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>
stabil 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: Tomcat 4.0 • Servlet API: 2.3 • JSP: 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
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>
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 • Hello World Servlet • 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
Environement Variablen CGI-Variable
AUTH_TYPE 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 Query-String PATH_TRANSLATED wirklicher Pfad auf dem Server QUERY_STRING REMOTE_ADDR IP Adresse des Client CGI Variable CGI-Variable
CGI Variable • REMOTE_HOST • Domainname vom Host • REMOTE_USER • Username (nur bei Authentification) • REQUEST_METHOD • Get,Post,Put,... • SCRIPT_NAME • Pfad des Servlet • SERVER_SOFTWARE CGI-Variable
New Servlet Neues Servlet im JBuilder
Web Run Rechte Maustaste