4. Servlets Ein kleiner Einstieg Erinnerung: HTTP und HTML Idee von Web Servern und Containern Erstellung einfacher Servlets (zunächst software technisch übelst unstrukturiert) Literatur: B. Basham, K. Sierra, B. Bates, Head First Servlets and JSP, Second Edition, O Reilly, Sebastopol (USA), 2008 Sun, Java Servlet Specification Version 2.5 MR6 Sun: http://java.sun.com/developer/onlinetraining/servlets/ Fundamentals/servlets.html#usingJavaWebServer 147
Kurze Java Historie Erfolgsfaktoren von Java Portabilität Wesentlich einfachere Syntax/Semantik als C++ Frei verfügbar Oberflächenentwicklung als Teil der Kernsprache (erst AWT, dann Swing) Mit Applets erste einfach anzuwendende Technik, Programme im Browser laufen zu lassen Heute Applets spielen relativ geringe Rolle Java die Allgemeinsprache Java auch in Servern genutzt 148
Erinnerung: Internet Anwendungen URL (Uniform Resource Locator) Adressierung von Maschinen, Dateien und Programmen URI (Uniform Resource Identifier) Indirekte Adressierung, Server kennt evtl. physikalischen Pfad und Dateinamen Auch alleine als eindeutiger Identifikator (ohne konkrete Information dahinter nutzbar) HTTP (Hypertext Transfer Protocol) Kommunikation zwischen Client und Server (Request und Response) GET: Parameter bei Anfrage an URL gehängt (sichtbar) POST: Parameter im separaten Block (Body) unsichtbar 149
Konzept eines Seitenaufrufs HTTP-Request Web-Server Client HTTP-Response mit HTML-Datei im Body Server HTML (Hypertext Markup Language) Auszeichnungssprache mit festgelegten tags zum Aufbau der Ausgabe Ebene 3/4 typisch TCP/IP, Session Ebene 5: HHTP, Darstellungsebene 6: HTML, Programmebene 7: JVM 150
HTTP Ablauf Client: Request get, post, head, put,... URL HTTP1.x HeaderInfo: Accept, Cookie,... Body: Post Parameter Server: Response Statusmeldung: HTTP1.x 200 OK, oder 404 Error HeaderInfo: Content type, set cookie,... Body: Dokument Verbindungsabbau Protokoll ist zustandslos/gedächtnislos; Client wird bei erneutem Request ohne Trick nicht als Bekannter erkannt 151
HTTP Server selber schreiben public class Main { public static void main(string[] args) throws UnknownHostException, IOException { ServerSocket socket = new ServerSocket(80); Socket conn = socket.accept(); BufferedReader in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readline())!= null) System.out.println(line); conn.close(); } } GET /meinwww:80 HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; 152
Web Server mit Container nutzen Servlet: Wortkreation aus den Begriffen Server und Applet, (serverseitiges Applet) Web Server leitet HTTP Request an Servlet weiter Servletkann Antwort (HTML Code) berechnen Servletkann Anfrage Informationen und Serverumgebung nutzen Servletkann mit anderen Servlets kommunizieren Container 153
Erstes Servlet (1/2) import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class ErstesMal extends HttpServlet { @Override protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response); } @Override protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response); } 154
Erstes Servlet (2/2) protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); PrintWriter out = response.getwriter(); try { out.println("<html> <head>"); out.println("<title>servlet ErstesMal</title>"); out.println("</head><body>"); out.println("<h1>pfad:<br>" + request.getcontextpath() + "</h1>"); out.println("</body></html>"); } finally { out.close(); } } } 155
Typische Projektstruktur () Zentrale Konfigurationsdatei web.xml (Deployment Descriptor) Ergänzt um Serverspezifika sun web.xml <servlet> <servlet-name>erstesmal</servlet-name> <servlet-class>servlets.erstesmal </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>erstesmal</servlet-name> <url-pattern>/erstesmal</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> 156
Erstes komplettes Beispiel (1/4) <html> <head> <title>bewertung</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body> <form name="auswertungsform" action="auswertung" method="post"> Verteilte ID eingeben: <input type="text" name="idfeld" value="" size="20" /><br> <input type="checkbox" name="urteil" value="ausgezeichnet" checked="checked" /> ausgezeichnet <br> <input type="checkbox" name="urteil" value="faszinierend" checked="checked" /> faszinierend <br> <input type="checkbox" name="urteil" value="solala" /> solala <br> <input type="submit" value="abschicken" name="abschicken"/> </form> </body> </html> 157
Erstes komplettes Beispiel (2/4) Web Seite und Projektaufbau 158
Erstes komplettes Beispiel (3/4) public class Auswertung extends HttpServlet { protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); PrintWriter out = response.getwriter(); String id = request.getparameter("idfeld"); String [] werte = request.getparametervalues("urteil"); try { out.println("<html> <head>"); out.println("<title>bewertungsergebnisse</title>"); out.println("</head> <body>"); out.println("<h3>auswertung mit ID: "+id+ "</h3><ul>"); if(werte!=null) for(int i=0;i<werte.length;i++) out.println("<li>"+werte[i]+"</li>"); out.println("</ul></body></html>"); } finally { out.close(); } }... 159
Erstes komplettes Beispiel (4/4) In web.xml <welcome-file-list> <welcome-file>bewertung.html</welcome-file> </welcome-file-list> Ausgabe 160
Deployment (Ausblick) Standard definiert u. a. : web.xml in WEB INF Programmierte Klassen in Ordner classes war = Web Archive (installierbar durch Drag und Drop) In Netbeans empfiehlt sich Blick in Ordner build oder dist 161
Ablauf bei Servlet Nutzung (1/2) Web-Server GET GET Web Server Steuerung Servlet Steuerung (Container) Client erzeugt erzeugt :Request :Response liest Servlet Thread erzeugt Servlet (in Java) 162
Ablauf bei Servlet Nutzung (2/2) HTTP <HTML> Web Server Steuerung <HTML> Servlet Steuerung (Container) Web-Server Client liest :Response <HTML> schreibt Servlet Thread <HTML> 163
Aufgaben des Containers Kommunikation zwischen Servlet und Web Server Container steuert Erzeugung und Löschung von Servlets Container ermöglicht Mehrfachnutzung; neue Threads für benötigte Servlets Hinweis: Container garantiert keine Threadsicherheit; gemeinsam genutzte Objekte muss Entwickler synchronisieren Container Verhalten über XML Deployment Descriptor konfigurierbar Container erlaubt Zusammenarbeit von Techniken ( > JSP) 164
Zwischenfazit Servletserlauben mit Hilfe eines Web Servers und zugehöriger Container die Erzeugung dynamischer HTML Seiten Servlet Konfiguration über einen Deployment Descriptor Servletskönnen klassische und selbst erstellte Java Klassen nutzen Container stellt Objekte zur Aufgabenlösung zur Verfügung (einige mehr, als bis jetzt gezeigt) Alles in Servlets zu packen, ist schlechte Idee Keine Trennung der Oberfläche und der Geschäftslogik println ist fehlerträchtig in Web Designer können kein Java 165