Einführung Servlets JEE Vorlesung Teil 2 Ralf Gitzel ralf_gitzel@hotmail.de 1
Übersicht Wiederholung Hello World Blick in die Details Servlet Programmierung Potentielle Fehler Lernziele Gruppenübung 2
Wiederholung der Grundlagen Ralf Gitzel ralf_gitzel@hotmail.de 3
Servlet Architektur Request Response Container (Application Server) Servlet 4
Identifikatoren für Servlets Deployment Name Servlet Tatsächlicher (Klassen-)Name Öffentlicher Name (URL) 5
Elemente eines Servlets Java Code (Funktionalität) Deployment Descriptor (z.b. Name Mapping) 6
Hello World Servlet Blick in die Details Ralf Gitzel ralf_gitzel@hotmail.de 7
Zur Erinnerung Eine HTML-Datei mit Formular um das Servlet aufzurufen Servlet, das Hallo Welt als Web-Seite zurückgibt 8
Anmerkung: Deployment on Tomcat Tomcat Home Directory webapps Context Servlet Code MyServlet WEB-INF Html und JSP classes lib web.xml Deployment Descriptor 9
HTML Seite! Öffentlicher Name aus dem Deployment Descriptor (aber ohne /) 10
Servlet ergänzen Diese Methode wird ausgeführt, wenn wir das HTML Formular abschicken 11
Deployment Descriptor Servlet Metadaten Servlet Mapping 12
Deployment Descriptor Deployment Name! Klassen-Name! Name nach außen! 13
Anmerkung: URL des Servlets Webseiten in der Web Applikation: http://localhost:8080/myservlet/index.html Servlet (verwendet URL-Pattern aus dem Deployment Descriptor): http://localhost:8080/myservlet/url-pattern 14
Servlet Programmierung Ralf Gitzel ralf_gitzel@hotmail.de 15
Servlet + HTML Erzeugen Jedes Servlet, das wir implementieren erbt von der Klasse HttpSerlvet und hat daher ganz bestimmte Methoden Eclipse erstellt uns eine Rumpfklasse, d.h. wir müssen nicht selber die Vererbung herstellen, den Deployment Descriptor Eintrag vornehmen etc. Anmerkung: HTML Seiten zum Aufruf von Servlets verwenden die ganz normalen Formular-Tags 16
Schlüsselmethoden eines Servlets init(): Initialisierung vor der ersten Benutzung service(): Empfang von Anfragen doget() und dopost(): Bearbeiten von Anfragen destroy(): Entsorgung am Ende Geerbt aus der Klasse HttpServlet! 17
Lebenszyklus eines Servlets Konstruktor + init() Servlet existiert nicht Initialisiert service() destroy() 18
init() Hier werden die Einstellungen vorgenommen, die vor der ersten Verwendung notwendig sind (Datenbankverbindungen etc.) Nicht den Konstruktor direkt verwenden! 19
destroy() Hier Ressourcen freigeben (z.b. Datenbanken) Wird beim Abschalten aufgerufen, nicht nach jeder Dienstanfrage! 20
service() Nicht überschreiben! Ruft doget() und dopost() auf In (typischerweise) einer dieser beiden Methoden steht dann der Code den wir ausführen wollen. 21
doget() vs. dopost() HTML Methode Man kann beide HTML-Methoden separat unterstützen. 22
Get vs. Post Get: Parameter erscheinen in der URL Sichtbar in der Browserzeile Post: Parameter werden auf HTTP-Ebene übertragen Unsichtbar 23
Gruppendiskussion Wann brauche ich doget()? Was ist gut daran, wenn Parameter in der URL auftauchen, was schlecht? Warum nimmt man nicht immer GET? 24
Gruppendiskussion - Antworten doget(): Wenn ich die URL auf das Servlet als Link verwende. (Bei POST sind die Parameter nicht in der URL und damit verloren.) Wenn ich ein Bookmark setzen möchte dopost() Mehr Daten Daten nicht in der URL Trick: In die doget()-methode einen Aufruf von dopost() packen und dort die Logik implementieren. 25
dopost()/doget() Parameter protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { } 26
dopost()/doget() Parameter HttpServletRequest: Die Anfragedaten vom Webbrowser des Clients HttpServletResponse: Unsere Antwort auf die Anfrage. Muss in der dopost()/doget() Methode gefüllt werden Request Object Response Object Servlet 27
HttpServletRequest Request Object Response Object Servlet getparameter(string s): Gibt den Parameter mit dem Namen s zurück getparametervalues(string s): Gibt alle Parameterwerte zurück, die unter diesem Namen geschickt wurden (z.b. bei Checkbox-Listen) 28
HTML Seite 29
im Browser 30
. im Servlet RequestTester.java 31
und Servletantwort im Browser 32
Weitere interessante Methoden im HttpServletRequest getheader(string): liest einen Wert aus dem HTTP Header aus, z.b. Browsertyp getcookies() getsession(): mehr dazu später getinputstream(): Wenn ich die Parameter von Hand aus dem HTTP Protokoll heraussuchen möchte 33
HttpServletResponse Request Object Response Object Servlet setcontenttype(string): Beschreibt den MIME-Type der Antwort, z.b. text/html getoutputstream(): Ein OutputStream zur Übertragung von Daten als Bytes getwriter(): Ein PrintWriter zur Übertragung von Daten als Text 34
Potentielle Fehler Ralf Gitzel ralf_gitzel@hotmail.de 35
Werkzeugkastenprinzip von service() Container (Application Server) Servlet Servlet Servlet Servlet Class A Servlet Class B Servlet Class C Thread 1 Thread 2 36
Werkzeugkastenprinzip von service() Container (Application Server) Servlet Servlet Servlet Servlet Class A Servlet Class B Servlet Class C Thread 1 Thread 2 37
Werkzeugkasten Die Arbeiter ( Thread ) verwenden die Werkzeuge ( Servlet Objekte ) um Anfragen zu bearbeiten Die Werkzeuge sollen im gleichen Zustand zurückgegeben werden in dem sie ausgeliehen wurden D.h.: Im Servletobjekt keine Zustandsinformationen speichern! (??) 38
Zustandlosigkeit Wenn Sie in einem Servlet einen Wert in ein Attribut speichern, dann kann dieses beim nächsten Aufruf einen anderen Wert haben Sie haben keine Garantie, bei jedem Aufruf das gleiche Servletobjekt zugewiesen zu bekommen Sie haben keine Garantie, dass zwischen zwei Aufrufen niemand anderes das gleiche Servletobjekt zugewiesen bekommen hat 39
Gruppendiskussion Wie ist dieses Konzept zu bewerten? Wo liegen wahrscheinlich die Vorteile? Welche Nachteile ergeben sich daraus? Für Neugierige: Speichern Sie Zustandsinformationen und greifen Sie von mehreren Rechnern mehrfach auf das Servlet zu. 40
Lernziele Ralf Gitzel ralf_gitzel@hotmail.de 41
Lernziele Servlet Lebenszyklus Kommunikationsschnittstelle des Servlets (Request/Response) Möglicher Fehler aufgrund des Thread- Servlet-Zusammenspiels 42
Übung Ralf Gitzel ralf_gitzel@hotmail.de 43
Aufgabenstellung Verwenden Sie den Download Uebung-13-02.zip Importieren Sie das Projekt (s. Anleitung auf dem Server) Die HTML-Seite mit dem Formular soll nach Bedarf vervollständigt/angepasst werden Ein passendes Servlet, dass die Eingabewerte als HTML-Seite darstellt, soll geschrieben werden Servletname und URL sollen sich unterscheiden! (Deployment Descriptor! Daher Servlet Version 2.5!) 44
Eingabe 45
Ausgabe Servletname soll RueckgabeServlet sein, die URL lautet actionprocessing! 46
Abschließender Hinweis Verwenden Sie die Vorlesungsunterlagen von heute Zögern Sie nicht, mich zu fragen, wenn Sie etwas nicht verstehen 47