s & Servlet Integration Ralf Gitzel ralf_gitzel@hotmail.de 1
Themenübersicht Ralf Gitzel ralf_gitzel@hotmail.de 2
Übersicht Motivation Das Interface Stateful und Stateless s Programmierung einer Stateful Session Bean mit Local Interface Web Client 3
Motivation für s Ralf Gitzel ralf_gitzel@hotmail.de 4
Motivation Web Container Servlet Sichtbarer Einstiegspunkt für das Servlet EJB Container DB Persistence Provider Entity 5
Mögliche Clients für eine Session Bean Servlet GUI-basierte Java Anwendung EJB Container Bel. Anwendung Web Service Entity 6
Rolle der s Stellen Geschäftslogik nach außen zu Verfügung Der JEE Client (z.b. ein Servlet) greift über die s auf die EJB Applikation zu Die s stellen die Session der JEE Anwendung dar 7
Anmerkung: 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 viel Aufwand parallel auch als Web Service angeboten werden (d.h. Aufruf aus anderen Anwendungen, die in anderen Sprachen geschrieben sind!) Containerdienste (Persistenz, Sicherheit, Transaktionen) 8
Session im EJB Kontext Session: Eine (virtuelle) Verbindung zwischen dem Client und dem Server, die eine endliche Zeitspanne anhält Lange Session: Stateful (merkt sich Daten zwischen Aufrufen) Kurze Session: Stateless (jeder Aufruf ist eine neue Session) 9
Das Interface Ralf Gitzel ralf_gitzel@hotmail.de 10
s Entfernter vs. Lokaler Zugriff Stateful: Merkt sich den Zustand der Bean Stateless: Zustandslos, jeder Aufruf wie neu s Remote Interface Local Interface EJB Container Verschiedene Client Typen 11
Client Szenarien Servlet Servlet Lokaler Zugriff Entfernter Zugriff 12
Stateful und Stateless Session Beans Ralf Gitzel ralf_gitzel@hotmail.de 13
s Session Länge (lang vs. kurz) Stateful: Merkt sich den Zustand der Bean Stateless: Zustandslos, jeder Aufruf wie neu s Remote Interface Local Interface EJB Container Verschiedene Client Typen 14
Stateless vs. Stateful Session Beans: Stateless Client @Stateless @Stateless @Stateless Jeder Aufruf ist eine neue Session, alle Daten sind vergessen! 15
Stateless vs. Stateful Session Beans: Stateful Client @Stateful Eine Session, d.h. Daten werden zw. den Aufrufen gespeichert! 16
Stateless Implementierung (I) A.doX() A.doX() A.doX() EJB Container Klasse A A Objekt 1 A Objekt 2 A Objekt n Bean Pool Klasse B 17
Stateless Implementierung (II) EJB Container Klasse A A Objekt 1 A Objekt 2 A Objekt n Bean Pool Klasse B Client bekommt eine zufällige Instanz aus dem Pool zugewiesen! 18
Stateless Implementierung (III) Aufrufe hintereinander können bei unterschiedl. Objekten der gleichen Klasse enden! 1. Aufruf 2. Aufruf EJB Container Klasse A A Objekt 1 A Objekt 2 A Objekt n Bean Pool Klasse B 19
Gruppendiskussion Erklärt diese Implementierung, warum Stateless s keinen Zustand speichern können? Welche Vorteile bietet die Implementierung als Pool? 20
Stateful Implementierung (I) Client I A.doX() EJB Container Klasse A Client II 1-zu-1 Zuordnung bis zum Ende der Session A.doX() A Objekt für I A Objekt für II 21
Passivierung Aktiv, d.h. im Hauptspeicher Keine Client Aktivität Erneute Client Aktivität Hält die Belastung des Hauptspeichers durch inaktive Sessions gering. Timeout: Sehr lange nicht verwendete Sessions werden ganz beendet. Passiv, d.h. auf der Platte gespeichert 22
Gruppendiskussion Was ist der Nachteil, was ist der Vorteil gegenüber einer Stateless Session Bean? Warum sind nicht alle s stateful? 23
Programmierung einer Stateful mit Local Interface Ralf Gitzel ralf_gitzel@hotmail.de 24
Interfaces Jede muss mindestens ein Interface haben Methodennamen dürfen nicht mit der Buchstabenfolge ejb beginnen Ein Interface kann nur eine Annotation haben, d.h. man muss jedes Interface einzeln definieren Local Interface Annotation: @Local 25
Beispiel: Local Interface Datei: IPersonenQuelle.java Anm.: Methoden können beliebig sein 26
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 anderen Klassen) Kann auch Methoden enthalten, die nicht im Interface definiert sind Muss einen parameterlosen Konstruktor haben 27
Zusätzliche Programmier-Regeln für Stateful s Speicherung des Zustandes in den Instanzvariablen Instanzvariablen müssen serialisierbar sein (wegen möglicher Passivierung) Stateful s müssen mit @Remove explizit zerstört werden, sonst wird Speicherplatz vergeudet! 28
Beispiel: Stateful Klasse Datei: PersonenQuelle.java 29
Web Client Ralf Gitzel ralf_gitzel@hotmail.de 30
Zugriff auf eine Trivial für Stateless s (sog. Dependency Injection, s. letzte Vorlesung Hello World) Für Stateful s benötigen wir einen JNDI-Lookup 31
Wie verwende ich die Stateful im Servlet? StartServlet (erster Aufruf der Applikation!) Andere Servlets 1. JNDI Lookup Referenz auf EJB Session Attribut auslesen Referenz auf EJB 2. Speicherung in Session 32
Wie verwende ich die Stateful im Servlet? StartServlet (erster Aufruf der Applikation!) Andere Servlets 1. JNDI Lookup Referenz auf EJB Session Attribut auslesen Referenz auf EJB 2. Speicherung in Session 33
EJB aus Session verwenden Datei: PersonAnlegenServlt Aufruf über: StartServlet 34
EJB aus Session verwenden Verwendung des Objekts aus der Session wie bisher 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 die Session? 35
Wie verwende ich die Stateful im Servlet? StartServlet (erster Aufruf der Applikation!) Andere Servlets 1. JNDI Lookup Referenz auf EJB Session Attribut auslesen Referenz auf EJB 2. Speicherung in Session 36
EJB Objekt in die Session speichern Bis auf die Objekterzeugung wie gehabt! Datei: StartServlet.java 37
Wie verwende ich die Stateful im Servlet? StartServlet (erster Aufruf der Applikation!) Andere Servlets 1. JNDI Lookup Referenz auf EJB Session Attribut auslesen Referenz auf EJB 2. Speicherung in Session 38
Konzept des JNDI Aufrufs aus einem Servlet (Automatisch) im Context anmelden Bean Informationen konfigurieren Context vom Container holen Eine Referenz auf die Bean aus dem Context holen Für weitere Verwendung in der HttpSession ablegen 39
Konzept des JNDI Aufrufs aus einem Servlet (Automatisch) im Context anmelden Bean Informationen konfigurieren Context vom Container holen Eine Referenz auf die Bean aus dem Context holen Für weitere Verwendung in der HttpSession ablegen 40
EJB Objekt in die Session speichern 1 2 2 1 Datei: StartServlet.java 41
Konzept des JNDI Aufrufs aus einem Servlet (Automatisch) im Context anmelden Bean Informationen konfigurieren Context vom Container holen Eine Referenz auf die Bean aus dem Context holen Für weitere Verwendung in der HttpSession ablegen 42
Context Zugriff Datei: StartServlet.java Anm: Die Befehle könnten auch direkt in doget/post stehen 43
Erläuterung zur vorherigen Folie Context-Objekt wird immer auf diese Weise erzeugt Zugriff auf JNDI ist immer gleich, bis auf: Name des Interfaces (z.b. IPersonenQuelle) Name der (z.b. PersonenQuelle) Wichtig: Exceptions abfangen! 44
Lernziele Ralf Gitzel ralf_gitzel@hotmail.de 45
Lernziele Stateful vs. Stateless verstehen Stateful programmieren können Client mit JNDI Lookup erstellen können 46
Übungsaufgabe Ralf Gitzel ralf_gitzel@hotmail.de 47
Aufgabenstellung Nehmen Sie das Beispiel aus dieser Vorlesung und betrachten Sie es im Detail, indem Sie die möglichen Aufrufe im Code verfolgen Anschließend erweitern Sie es: Schreiben Sie ein Servlet, dass die Liste mit Personen komplett löscht Schreiben Sie ein Servlet, dass automatisch eine Reihe von Beispielpersonen erzeugt 48