Fortgeschrittene Servlet- Techniken -...

Preview:

Citation preview

Ralf Gitzelralf_gitzel@hotmail.de

1

Fortgeschrittene Servlet-Techniken

Ralf Gitzelralf_gitzel@hotmail.de

2

Themenübersicht

3

Übersicht

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

Ralf Gitzelralf_gitzel@hotmail.de

4

Servlet Initialisierung

5

Initialisierung

• Konfiguration des Servlets und der Web Applikation

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

• Initialisierungsparameter im DeploymentDescriptor

6

Servlet Initialisierung

Container(Application Server)

Servlet A

Servlet B

Servlet C

ServletConfig A

ServletConfig B

ServletConfig CSer

vlet

Con

text

Web Application

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

8

Der Deployment Descriptor im Projekt

9

Grobaufbau DeploymentDescriptor

10

Angabe der Servlet-SpezifischenParameter im Deployment

Descriptor

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

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

12

Angabe/Verwendung der webapplikationsspezifischen Parameter

Klasse: init.ContextUser

13

Gruppendiskussion

Wie könnte es zu dieser Ausgabe

kommen?

Ralf Gitzelralf_gitzel@hotmail.de

14

Attribute

15

Motivation

Informations-austauschzwischen

verschiedenen Elementen

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

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

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

19

Attribut-API: Context

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

verfügbar• Methoden:

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

20

Attribut-API: Request

• Im Interface ServletRequest (und damit auch in HttpServletRequest)

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

21

Attribut-API: Session

• Im Interface HttpSession (mehr dazu später)

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

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

23

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

ServletContext!

Klasse: init.SampleContextListener

24

Verwendung von Attributen -Auslesen

Klasse: init.ContextUser2

Ralf Gitzelralf_gitzel@hotmail.de

25

Sessions

26

Problem: Das http-Protokoll ist zustandslos

Request

Response

Verbindungsaufbau

Verbindung beendet

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

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

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!

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

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

31

Vorgehen im Servlet-Umfeld

Session erzeugen

Session abfragen

Informationenin Session speichern

32

Session erzeugen/abfragen

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

eine neue erzeugt

• request.getSession()• HttpSession Objekt

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)

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)

35

Steuerung des Timeout (1)

Timeout-Zeitspannefür alle Servlets in

der Web-Applikation in Minuten

36

Steuerung des Timeout (2)

Timeout-Zeitspannefür diese Session in

Sekunden

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

37

Explizites Beenden einer Session

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

Klasse: session.SessionInvalidator

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?

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

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

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

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

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?

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

45

Load Balancing

Container I(Application Server)

A

Request

Container II(Application Server)

A

Kann bei Bedarf Session Infos verschieben!

46

Verschieben von Session Infos

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

Client bleibt der Umzug unsichtbar

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?

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?

Ralf Gitzelralf_gitzel@hotmail.de

49

Lebenszyklusereignisse

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

51

Implementierung des ServletContextListeners

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

alle Servlets verfügbar!

52

Einbindung in die Web-App

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

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?

• ….

Ralf Gitzelralf_gitzel@hotmail.de

54

Lernziele

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

Ralf Gitzelralf_gitzel@hotmail.de

56

Übungsaufgabe

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

Recommended