57
Ralf Gitzel [email protected] 1 Fortgeschrittene Servlet- Techniken

Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm Tag des Deployment Descriptors definiert Gilt für

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

1

Fortgeschrittene Servlet-Techniken

Page 2: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

2

Themenübersicht

Page 3: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

3

Übersicht

• Servlet Initialisierung• Attribute und Gültigkeitsbereiche• Sessions• Lebenszyklusereignisse

Page 4: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

4

Servlet Initialisierung

Page 5: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

5

Initialisierung

• Konfiguration des Servlets und der Web Applikation

• Es können Änderungen vorgenommen werden, ohne den Code zu kennen

• Initialisierungsparameter im DeploymentDescriptor

Page 6: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

6

Servlet Initialisierung

Container(Application Server)

Servlet A

Servlet B

Servlet C

ServletConfig A

ServletConfig B

ServletConfig CSer

vlet

Con

text

Web Application

Page 7: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

7

ServletConfig vs. ServletContext

„Globale Variable“„Lokale Variable“

Im <web-app> Tag des Deployment Descriptors

definiert

Im <servlet> Tag des Deployment Descriptors

definiert

Gilt für alle Servlets in der Webapplikation

Gilt nur für ein spezifisches Servlet

ServletContextServletConfig

Page 8: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

8

Der Deployment Descriptor im Projekt

Page 9: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

9

Grobaufbau DeploymentDescriptor

Page 10: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

10

Angabe der Servlet-SpezifischenParameter im Deployment

Descriptor

Mehrere init-params sind einfach mehrereBlöcke dieser Art hintereinander!

Page 11: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

11

Verwendung der Parameter im Servlet

Hinweis: Schlechter Programmierstil. (Warum?) Aber auch hier gilt die Regel – tut was ich sage und nicht, was ich mache!Klasse: init.BasicInit

Page 12: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

12

Angabe/Verwendung der webapplikationsspezifischen Parameter

Klasse: init.ContextUser

Page 13: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

13

Gruppendiskussion

Wie könnte es zu dieser Ausgabe

kommen?

Page 14: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

14

Attribute

Page 15: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

15

Motivation

Informations-austauschzwischen

verschiedenen Elementen

Page 16: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

16

Attribute Konzept

• Servlets können miteinander kommunizieren, indem sie Objekte als Attribute definieren

• Diese können einen beliebigen Typ haben (d.h. Rückgabewert ist Object!)

• Attribute werden in verschiedenen Bereichen abgelegt, je nach Gültigkeit

Page 17: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

17

Attributsbereiche

?Bis die Session beendet ist

Für einen Anwender, bis er

die Web-App„verlässt“

Session

?

Bis die Requestnicht mehr

weitergegeben wird

Alle Elemente in der Kette dieser

RequestRequest

?Wie die Anwendung

Ganze WebanwendungContext

VerwendungLebensdauerGültigkeitsbereich

Page 18: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

18

Attributsbereiche

EinkaufswagenBis die Session beendet ist

Für einen Anwender, bis er

die Web-App„verlässt“

Session

Zwischen-ergebnisse

Bis die Requestnicht mehr

weitergegeben wird

Alle Elemente in der Kette dieser

RequestRequest

Datenbank-verbindung

Wie die Anwendung

Ganze WebanwendungContext

VerwendungLebensdauerGültigkeitsbereich

Page 19: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

19

Attribut-API: Context

• Im Interface ServletContext• Im Servlet über getServletContext()

verfügbar• Methoden:

– getAttribute(String)– setAttribute(String,Object)– removeAttribute(String)– getAttributeNames()

Page 20: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

20

Attribut-API: Request

• Im Interface ServletRequest (und damit auch in HttpServletRequest)

• Methoden:– getAttribute(String)– setAttribute(String,Object)– removeAttribute(String)– getAttributeNames()

Page 21: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

21

Attribut-API: Session

• Im Interface HttpSession (mehr dazu später)

• Methoden:– getAttribute(String)– setAttribute(String,Object)– removeAttribute(String)– getAttributeNames()

Page 22: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

22

Wichtige Anmerkungen zu Attributen

• Rückgabetyp ist Object, also ist ein Castnotwendig

• Nicht thread-sicher, d.h. man sollte sich genau überlegen, wo man Attribute setzt oder ausliest um Überlappungen zu vermeiden, bzw. einen synchronized()-Block auf die HttpSession oder den Context anzuwenden

Page 23: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

23

Verwendung von Attributen –Setzen (z.B. im Context)

ServletContext!

Klasse: init.SampleContextListener

Page 24: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

24

Verwendung von Attributen -Auslesen

Klasse: init.ContextUser2

Page 25: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

25

Sessions

Page 26: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

26

Problem: Das http-Protokoll ist zustandslos

Request

Response

Verbindungsaufbau

Verbindung beendet

Im http-Protokoll wird nach jeder Anfrage die Verbindung beendet.Zustandslosigkeit

Page 27: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

27

Gruppendiskussion: Was wird hier passieren?

Kaufe Buch X

Zeige EinkaufwagenUser: Cowboy Bill

Kaufe Buch Y

Kaufe Buch X

Zeige Einkaufwagen

Kaufe Buch YUser: Gentleman Dave

User: Cowboy Bill

User: Cowboy Bill

Page 28: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

28

Antwort

• Im reinen Http ohne zusätzliche Sessionverwaltung sind die Anfragen anonym

• Der Server vergisst sofort wieder, ob Dave oder Bill eingekauft haben

• Somit kann er den Warenkorb nicht zuordnen!

Page 29: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

29

Lösung: Cookies

• Cookies speichern Informationen auf der Client Seite

• Diese Information wird mit jeder Anfrage an den Server übertragen

• Über einen Cookiewert („Session ID“) kann der Server erkennen, wer die Anfrage gestellt hat

Page 30: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

30

Session IDs

CB Kauft Buch X

Zeige Ek-Wagen CB

GD Kauft Buch YUser: Gentleman Dave

User: Cowboy Bill

User: Cowboy Bill

Anmelden als CBUser: Cowboy BillCB

CB

Anmelden als GDUser: Gentleman Dave

GD

GD

CB

Page 31: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

31

Vorgehen im Servlet-Umfeld

Session erzeugen

Session abfragen

Informationenin Session speichern

Page 32: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

32

Session erzeugen/abfragen

• Wird mit dem gleichen „Befehl“ erreicht• Wenn keine Session existiert, dann wird

eine neue erzeugt

• request.getSession()• HttpSession Objekt

Page 33: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

33

Beispiel für Sessionverwaltung

Neue Initial-Informationen anlegen

(z.B. leeren Warenkorb)

Werte anpassen (z.B. basierend auf den

übergebenen Parameters)

Klasse: session.BeanCounterServlet (Aufruf über: BeanCounter.html)

Page 34: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

34

Sessionlebenszyklus

• Erzeugung: getSession() – s. vorherige Seiten

• Beenden der Session:– Timeout– Explizites Beenden (invalidate())– Application endet (z.B. durch einen Absturz

oder weil sie undeployed wird)

Page 35: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

35

Steuerung des Timeout (1)

Timeout-Zeitspannefür alle Servlets in

der Web-Applikation in Minuten

Page 36: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

36

Steuerung des Timeout (2)

Timeout-Zeitspannefür diese Session in

Sekunden

Klasse: session.BeanCounterServlet (Aufruf über: BeanCounter.html)

Page 37: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

37

Explizites Beenden einer Session

Die Session endet sofort, Zugriffe auf das Session Objekt nicht mehr legitim(IllegalStateException)

Klasse: session.SessionInvalidator

Page 38: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

38

Exotische Fälle kurz erklärt

• Was passiert, wenn der Client keine Cookies annimmt?

• Was passiert bei Load Balancing mit den Sessions?

• Kann ich auch eigene Cookies explizit setzen?

Page 39: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

39

Client nimmt keine Cookies an

• Jedesmal, wenn getSession() aufgerufen wird, denkt der Container, dass eine neue Session angelegt werden muss.

• Workaround: URL-Rewriting• URL-Rewriting: Die Session-Id kommt

nicht in einen Cookie, sondern wird als String an die URL angehängt

Page 40: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

40

Verwendung des URL-Rewriting

Diese Aktion muss für alle URLs in der Web-Applikation durchgeführt werden

(s. auch encodeRedirectURL())

Klasse: session.UrlEncoder

Page 41: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

41

Url-Rewriting Hinweise

• Wenn man diese Technik verwendet, dann wird nur dann trifft der Container eine Entscheidung:– Werden keine Cookies akzeptiert, dann wird

durch jede „markierte URL“ verändert– Werden Cookies akzeptiert, dann wird die

„Markierung“ ignoriert

Page 42: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

42

Was bedeutet URL Rewriting für mich?

• Wenn ich sicherstellen will, dass Sessions auch dann funktionieren, wenn keine Cookies erlaubt sind, brauche ich URL Rewriting

• D.h. jede(!) Servlet/JSP-URL muss mit dem „Rewriting-Befehl“ modifiziert werden

Page 43: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

43

Exotische Fälle kurz erklärt

• Was passiert, wenn der Client keine Cookies annimmt?

• Was passiert bei Load Balancing mit den Sessions?

• Kann ich auch eigene Cookies explizit setzen?

Page 44: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

44

Load Balancing

Container I(Application Server)

A

Request

Container II(Application Server)

A

Verteilt die Anfragen gleichmäßig auf Server I und II.

Session Info

Page 45: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

45

Load Balancing

Container I(Application Server)

A

Request

Container II(Application Server)

A

Kann bei Bedarf Session Infos verschieben!

Page 46: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

46

Verschieben von Session Infos

• Alle Attribute müssen Serializable sein!• Für den Programmierer und für den

Client bleibt der Umzug unsichtbar

Page 47: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

47

Exotische Fälle kurz erklärt

• Was passiert, wenn der Client keine Cookies annimmt?

• Was passiert bei Load Balancing mit den Sessions?

• Kann ich auch eigene Cookies explizit setzen?

Page 48: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

48

Cookies explizit setzen

• Ja, über javax.servlet.http.Cookie• Hat für reine JEE-Anwendungen nur

wenig Sinn• Gruppendiskussion: Was ist die bessere

Alternative für uns?

Page 49: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

49

Lebenszyklusereignisse

Page 50: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

50

Listener Konzept

Container(Application Server)

Servlet A

Servlet B

Servlet CSer

vlet

Con

text

Web Application

ServletContextListener

Initialisierung

Zerstörung

Wird über die Ereignisse informiert und kann passenden Code

ausführen

Page 51: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

51

Implementierung des ServletContextListeners

Beim Starten der Anwendung wird ein Attribute gesetzt und ist nun für

alle Servlets verfügbar!

Page 52: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

52

Einbindung in die Web-App

Die Art des Listeners wird automatisch erkannt.Wichtig: Nicht in ein Servlet-Tag packen!

Page 53: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

53

Einige weitere Listener

• ServletContextAttributeListener:Hinzufügen, Ersetzen und Entfernen von Attributen

• HttpSessionListener: Session beginnt/endet (Wieviele aktive User gibt es?)

• HttpSessionBindingListener: Wird ein Objekt gerade als Attribut verwendet?

• ….

Page 54: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

54

Lernziele

Page 55: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

55

Lernziele

• Context und Config verwenden können.• Attribute verwenden können und die

verschiedenen Geltungsbereiche kennen.

• Sessions einsetzen können• Bedeutung von URL-Rewriting verstehen• Load Balancing Konzept erklären können• Listener verstehen

Page 56: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

Ralf [email protected]

56

Übungsaufgabe

Page 57: Fortgeschrittene Servlet- Techniken - ralf-gitzel.inforalf-gitzel.info/JEE-03-FortgeschritteneServletTechniken.pdfIm  Tag des Deployment Descriptors definiert Gilt für

57

Szenario• Schreibe eine Anwendung, die jedem Anwender die

Namen aller anderen Anwender zeigt, die aktiv sind.• Anwender melden sich an/ab über ein Webformular• Die Email des Webmasters wird über den Deployment

Descriptor definiert.

• Fortgeschrittene: – In der Anwendung können Nachrichten für andere Anwender

hinterlassen werden.– Das Message Board ist ein eigenes Servlet