session beans & servlet integration -...
Post on 12-Aug-2019
247 Views
Preview:
TRANSCRIPT
Ralf Gitzelralf_gitzel@hotmail.de
1
Session Beans & Servlet Integration
Ralf Gitzelralf_gitzel@hotmail.de
2
Themenübersicht
3
Übersicht
• Motivation• Das Interface• Stateful und Stateless Session Beans• Programmierung einer Stateful Session
Bean mit Local Interface• Web Client
Ralf Gitzelralf_gitzel@hotmail.de
4
Motivation für Session Beans
5
MotivationWeb Container
Servlet/JSF
EJB Container
EntityDB
Per
sist
ence
Pro
vide
r
Session Bean
SichtbarerEinstiegspunktfür das Servlet
6
Mögliche Clients für eine SessionBean
Servlet/JSF
EJB Container
Entity
Session Bean
GUI-basierteJava Anwendung
Web Service
Bel. Anwendung
Session Bean
7
Rolle der Session Beans
• Stellen Geschäftslogik nach außen zurVerfügung
• Der JEE Client (z.B. ein Servlet oder eineManaged Bean) greift über die SessionBeans auf die EJB Applikation zu
• Die Session Beans stellen die „Session“der JEE Anwendung dar
8
Anmerkung: Session Bean vs.Normale Java Klassen im Servlet
• Trennung von Darstellung und Code:– Deployment Logik und Darstellung of verschiedenen
Servern– Mehrere Darstellungsformen für die gleiche Logik
• Enterprise Integration: Logik kann ohne vielAufwand parallel auch als Web Serviceangeboten werden (d.h. Aufruf aus anderenAnwendungen, die in anderen Sprachengeschrieben sind!)
• Containerdienste (Persistenz, Sicherheit,Transaktionen)
9
Session im EJB Kontext
• Session: Eine (virtuelle) Verbindungzwischen dem Client und dem Server,die eine endliche Zeitspanne anhält
• Lange Session: Stateful Session Bean(merkt sich Daten zwischen Aufrufen)
• „Kurze Session“: Stateless SessionBean (jeder Aufruf ist eine neue Session)
Ralf Gitzelralf_gitzel@hotmail.de
10
Das Interface
11
Session Beans
Stateful: Merkt sich denZustand der Bean
Stateless: Zustandslos,jeder Aufruf wie neu
Remote Interface
Local Interface
Session Beans
Entfernter vs. Lokaler Zugriff
EJB Container
Verschiedene Client Typen
12
Client Szenarien
Servlet
Session Bean
Lokaler Zugriff
Servlet
Session Bean
Entfernter Zugriff
Ralf Gitzelralf_gitzel@hotmail.de
13
Stateful und Stateless SessionBeans
14
Session Beans
Stateful: Merkt sich denZustand der Bean
Stateless: Zustandslos,jeder Aufruf wie neu
Remote Interface
Local Interface
Session Beans
Session Länge (lang vs. kurz)
EJB Container
Verschiedene Client Typen
15
Stateless vs. Stateful SessionBeans: Stateless
@Stateless
Session Bean
Client
@Stateless
Session Bean
@Stateless
Session Bean
Jeder Aufruf ist eine neue Session, alle „Daten“ sind vergessen!
16
Stateless vs. Stateful SessionBeans: Stateful
@Stateful
Session Bean
Client
Eine Session, d.h. „Daten“ werden zw. den Aufrufen gespeichert!
17
Stateless Session BeanImplementierung (I)
EJB ContainerSession Bean
Klasse A
Session BeanKlasse B
Session BeanA Objekt 1
Session BeanA Objekt 2
Session BeanA Objekt n
A.doX()
A.doX()
A.doX()
Bea
nP
ool
18
Stateless Session BeanImplementierung (II)
EJB ContainerSession Bean
Klasse A
Session BeanKlasse B
Session BeanA Objekt 1
Session BeanA Objekt 2
Session BeanA Objekt n
Bea
nP
ool
Client bekommt eine zufällige Instanz aus dem Pool zugewiesen!
19
Stateless Session BeanImplementierung (III)
EJB ContainerSession Bean
Klasse A
Session BeanKlasse B
Session BeanA Objekt 1
Session BeanA Objekt 2
Session BeanA Objekt n
Bea
nP
ool
Aufrufe hintereinander könnenbei unterschiedl. Objekten dergleichen Klasse enden!
1. Aufruf
2. Aufruf
20
Gruppendiskussion
• Erklärt diese Implementierung, warumStateless Session Beans keinen Zustandspeichern können?
• Welche Vorteile bietet die Implementierung alsPool?
21
Stateful Session BeanImplementierung (I)
EJB ContainerSession Bean
Klasse A
Session BeanA Objekt für I
A.doX()
A.doX()
Client I
Client II
Session BeanA Objekt für II
1-zu-1 Zuordnung bis zum Ende der Session
22
Passivierung
Aktiv, d.h. im Hauptspeicher
Passiv, d.h. auf derPlatte gespeichert
Keine
Client
Aktivität
Ern
eute
Clie
ntA
ktiv
ität
Hält die Belastung desHauptspeichers durch inaktiveSessions gering.
Timeout: Sehr lange nichtverwendete Sessions werdenganz beendet.
23
Gruppendiskussion
• Was ist der Nachteil, was ist der Vorteilgegenüber einer Stateless SessionBean?
• Warum sind nicht alle Session Beansstateful?
Ralf Gitzelralf_gitzel@hotmail.de
24
Programmierung einer StatefulSession Bean mit Local Interface
25
Interfaces
• Jede Session Bean muss mindestensein Interface haben
• Methodennamen dürfen nicht mit derBuchstabenfolge „ejb“ beginnen
• Ein Interface kann nur eine Annotationhaben, d.h. man muss jedes Interfaceeinzeln definieren
• Local Interface Annotation: @Local
26
Beispiel: Local Interface
Datei: IPersonenQuelle.javaAnm.: Methoden können beliebig sein
27
Session Bean Klasse• Markierung mit Annotation: Stateless oder Stateful• Implementiert Interface(s)• Einschränkungen:
– nicht „abstract“ oder „final“– Methoden dürfen nicht final sein– Keine Methoden, deren Name mit „ejb“ beginnt
• Kann von anderen Klassen erben (auch von anderenSession Bean Klassen)
• Kann auch Methoden enthalten, die nicht im Interfacedefiniert sind
• Muss einen parameterlosen Konstruktor haben
28
Zusätzliche Programmier-Regelnfür Stateful Session Beans
• Speicherung des Zustandes in denInstanzvariablen
• Instanzvariablen müssen serialisierbar sein(wegen möglicher Passivierung)
• Stateful Session Beans müssen mit @Removeexplizit zerstört werden, sonst wirdSpeicherplatz vergeudet!
29
Beispiel: Stateful Session BeanKlasse
Datei: PersonenQuelle.java
Ralf Gitzelralf_gitzel@hotmail.de
30
Web Client
31
Zugriff auf eine Session Bean
• Trivial für Stateless Session Beans (sog.Dependency Injection, s. letzteVorlesung – Hello World)
• Für Stateful Session Beans benötigen wireinen JNDI-Lookup
32
Wie verwende ich die StatefulSession Bean im Servlet?
1. JNDI Lookup
„StartServlet“(erster Aufruf
der Applikation!)
Referenz auf EJB
Andere Servlets
2. Speicherungin Session
Session Attributauslesen
Referenz auf EJB
33
Wie verwende ich die StatefulSession Bean im Servlet?
1. JNDI Lookup
„StartServlet“(erster Aufruf
der Applikation!)
Referenz auf EJB
Andere Servlets
2. Speicherungin Session
Session Attributauslesen
Referenz auf EJB
34
EJB aus Session verwenden
Datei: PersonAnlegenServltAufruf über: StartServlet
35
EJB aus Session verwenden
• Verwendung des Objekts aus der Session wiebisher auch
• Interessante Details:– Wir müssen das Interface als statischen Typ
verwenden– Wir speichern nicht mehr die Daten sondern das
Datenzugriffsobjekt in der Session(PersonenQuelle statt List<Person>)
• Aber: Wie bekommen wir das Objekt in dieSession?
36
Wie verwende ich die StatefulSession Bean im Servlet?
1. JNDI Lookup
„StartServlet“(erster Aufruf
der Applikation!)
Referenz auf EJB
Andere Servlets
2. Speicherungin Session
Session Attributauslesen
Referenz auf EJB
37
EJB Objekt in die Sessionspeichern
Datei: StartServlet.java
Bis auf dieObjekterzeugung
wie gehabt!
38
Wie verwende ich die StatefulSession Bean im Servlet?
1. JNDI Lookup
„StartServlet“(erster Aufruf
der Applikation!)
Referenz auf EJB
Andere Servlets
2. Speicherungin Session
Session Attributauslesen
Referenz auf EJB
39
Konzept des JNDI Aufrufs auseinem Servlet
Bean Informationenkonfigurieren
Context vomContainer holen
Eine Referenz aufdie Bean aus dem
Context holen
Für weitereVerwendung in der
HttpSession ablegen
(Automatisch)Session Bean im
Context anmelden
40
Konzept des JNDI Aufrufs auseinem Servlet
Bean Informationenkonfigurieren
Context vomContainer holen
Eine Referenz aufdie Bean aus dem
Context holen
Für weitereVerwendung in der
HttpSession ablegen
(Automatisch)Session Bean im
Context anmelden
41
EJB Objekt in die Sessionspeichern
Datei: StartServlet.java
1
1
2
2
42
Konzept des JNDI Aufrufs auseinem Servlet
Bean Informationenkonfigurieren
Context vomContainer holen
Eine Referenz aufdie Bean aus dem
Context holen
Für weitereVerwendung in der
HttpSession ablegen
(Automatisch)Session Bean im
Context anmelden
43
Context Zugriff
Datei: StartServlet.javaAnm: Die Befehle könnten auch direkt in doGet/Post stehen…
44
Erläuterung zur vorherigen Folie
• Context-Objekt wird immer auf diese Weiseerzeugt
• Zugriff auf JNDI ist immer gleich, bis auf:– Name des Interfaces (z.B. IPersonenQuelle)– Name der Session Bean (z.B. PersonenQuelle)
• Wichtig: Exceptions abfangen!
Ralf Gitzelralf_gitzel@hotmail.de
45
Lernziele
46
Lernziele
• Stateful vs. Stateless verstehen• Stateful Session Bean programmieren
können• Session Bean im Client verwenden
können• JNDI Lookup nur passiv verwenden (der
Code muss nicht auswendig gekonntwerden)
Ralf Gitzelralf_gitzel@hotmail.de
47
Übungsaufgabe
Übungsaufgabe
• Hinweis: Verwendet keine SessionBeans nur JSF!
• Aufgabe: Programmieren Sie eineWebseite, auf der man verschiedeneKöpfe und Körper kombinieren kann!
48
Screenshot 1
49
Screenshot 2
50
Hinweise zur Bearbeitung
51
Kopfbilder
Körperbilder
Hinweis: Man kann den Bildnamen aus einer Expression und einemString zusammenbauen!Als Lösung nicht akzeptiert ist es, den Bildnamen in der ManagedBeanzusammenzusetzen.
Ralf Gitzelralf_gitzel@hotmail.de
52
Bonusmaterial
53
Remote Interface
• @Remote Annotation• Alle Parameter müssen Serializable sein• Einsatz wird hier nicht vertieft
54
Web Service Interface
• Kann nur für Stateless Session Beansdefiniert werden, da Web Services immerzustandslos sind
• @WebService Annotation, ohneParameter
• Wird hier nicht weiter vertieft
55
Vererbung der Annotationen
• @Stateless und @Stateful werden nichtvererbt
• Life Cycle Annotationen an denMethoden werden vererbt (s. später)
56
Probleme und Antworten• Warum kriege ich eine NullPointerException bei
Verwendung der Dependency Injection (z.B. mit@EJB)?– Verwende ich die richtigen Versionen von EJB (3.0) und
Servlets (2.5)?– Manchmal ist Undeploy/Server-Stop/Server-Start/Deploy keine
schlechte Idee.– Was sagt das Glassfish/JBoss Server Log?– Stateful Session Bean? Dann brauchen wir JNDI und nicht
Injection!• Warum ist alles so langsam?
– Evtl. läuft der Server im Hintergrund und führt für jedeÄnderung ein „Hot Deploy“ durch – Server stoppen!
57
Voller Lebenszyklus der StatefulSession Bean
Nicht existent
Zerstörung
Aktiviert
Passiviert(Auf FestplatteAusgelagert)
Ern
eute
Anf
rageC
lientlängerInaktiv
oder
sehr
lang
ein
aktiv
Sehr lange inaktiv
Neue Anfrage
58
LifeCycleCallBacks (I)
• Wenn man Ressourcen wie JDBC,Messaging usw. verwendet, dann mussman ggf. zu verschiedenen ZeitpunktenRessourcen initialisieren oder freigeben
• Hierzu verwendet man dieLifeCycleCallback Methoden, dieautomatisch aufgerufen werden, wennein bestimmter Zustand erreicht wird
59
LifeCycle Callbacks (II)
• @Remove ist keine Callback Methode!• Callbacks:
– @PostConstruct: Nach der Initialisierung derKlasse. (Z.B. Datenbank öffnen)
– @PreDestroy: Kurz vor der Zerstörung. (Z.B.Datenbank schließen)
– @PrePassivate: Vor der Passivierung einerStateless Session Bean. (Z.B. Datenbanköffnen)
– @PostActivate: Nach der Aktivierung…
60
Gruppendiskussion letzte Stunde:Was ist hier falsch?
61
Antwort zu letzter StundeWeb Container
Servlet
EJB Container
Session Bean(Hello User)
Das war gewollt
Web Container
Servlet
EJB Container
Session Bean(Hello User)
Das passiert tatsächlich
Java Klasse(Hello User)
Ralf Gitzelralf_gitzel@hotmail.de
62
Stateless Session Beans
63
Local Interface der Bean
Die @Local-Annotation
Interface: minimo.help.IPersonTaskMatcher im Projekt SessionBeansEJBClient-Aufruf erfolgt in minimo.servlet.SetupAssignPersonPageHandler
64
Beispiel Stateless Session Bean
Klasse: minimo.help.PersonTaskMatcher im Projekt SessionBeansEJB
Die @Stateless-Annotation(Parameter optional und im
Moment unwichtig)
Implementiert das LocalInterface
65
Client für Session Beans
• Wie besprochen über Dependency Injection(@EJB)
• In Ausnahmefällen JNDI Lookup (s. später)
66
Tipps zur Verwendung vonStateful Session Beans
• Lieber Stateless als Stateful (wenn möglich)• Wegen der Kosten der Passivierung/Aktivierung
und Clustering möglichst wenig Daten in einer StatefulSession Bean speichern (z.B. lieber Lookup-Namenals ganzes Person-Objekt)
• Remove-Methode immer verwenden um „verwaiste“Sessions zu vermeiden
• (Anmerkung: Falls beim Server Passivierungsintervalleeingestellt werden können, kann ein falscher Wertmehr Performanceschaden als –nutzen verursachen)
top related