Beispiel: Stateless Session Bean (IBM WebSphere)


Beispiel für eine Stateless Session Bean, auf die per Webclient und mittels Application Client zugegriffen wird.
TODO: Screenshots aus der Englischen Version !
Die Deployanleitung bezieht sich auf IBM WebSphere.
Hier gibt es das WebSphere-Projekt zum Download (dies ist ein Projektaustausch-Export, die Importanleitung findet man am Ende dieses Dokuments): StatelessExport.zip

Aufbau des Beispieles


a) Bean-Klasse mit Local und Remote-Interfaces.
b) Webclient: JSP-Seite
c) WebClient: Servlet
d) App-Client.


Anlegen der Application

Schritt 1: In der Karteikarte "Projekt-Explorer" einen Rechtsklick auf "Unternehmensanwendungen" ausführen und im Menü "Neu" -> "Unternehmensanwendungsprojekt" wählen.
Erzeugen einer Application (Schritt 1)
Schritt 2: Dem Projekt den Namen "Stateless" geben und als JEE-Version (unter "Erweiterte anzeigen...") "1.4" wählen.
Erzeugen einer Application (Schritt 2)
Schritt 4: Modulprojekte zufügen. Dazu auf den Button "Neues Modul" klicken.
Erzeugen einer Application (Schritt 3)
Schritt 5: Zu erzeugende Module definieren. Dieses Beispiel benötigt ein EJB-Projekt, einen Anwendungsclient und ein Webprojekt. Connectorprojekte werden wir in dieser Veranstaltung nie benötigen.
Erzeugen einer Application (Module erstellen)
Nach dem Klick auf "Fertigstellen kommt man wieder zum Assistenten zurück:
Erzeugen einer Application (Schritt 3a)
Man klickt auf "Fertigstellen" und hat folgende J2EE-Hierarchie angelegt:
Erzeugte J2EE-Hierarchie


Anlegen der StatelessBean

Schritt 1: Im Projekt-Explorer den Knoten "EJB-Projekte" \ "StatelessEJB" \ "Implementierungsdeskriptor: StatelessEJB" \ "Session-Beans" wählen. Rechtsklick, im Contextmenü den Punkt "Neu -> Session-Bean" wählen.
Stateless Session Bean, Schritt 1
Schritt 2: Die Bean wird dem eben erzeugten EJB-Projekt "StatelessEJB" zugefügt.
Typ der Bean (Session Bean), Bean-Name (ohne Zusatz "Bean") und Package angeben.
Stateless Session Bean, Schritt 2
Schritt 3: In diesem Dialog kann man fast alle Einstellungen auf dem Default belassen. Nur der Haken bei "Sicht lokaler Client" wird gesetzt, da unser Webclient auch die Local Interfaces verwenden soll.
Stateless Session Bean, Schritt 3
Schritt 4: In den nächsten Fenstern beläßt man alle Werte auf den Defaults (fügt die Bean damit dem Klassendiagramm zu) und klickt auf "Fertig stellen".
Die J2EE-Hierarchie sieht jetzt so aus:
Erzeugte J2EE-Hierarchie mit Bean
Schritt 5: Vorbereiten der Business-Methoden:
Die beiden Business-Methoden werfen eine eigene Exception. Diese wird dem Projekt so zugefügt: Im Projekt-Explorer den Knoten "EJB-Projekte" \ "StatelessEJB" auswählen. Rechtsklick, "Neu" -> "Klasse". Eine Klasse namens "InvalidParameterException" zufügen, die von "java.lang.Exception abgeleitet ist.
InvalidParameterException zufügen
Das Ergebnis sieht so aus:
InvalidParameterException zufügen
Schritt 6: Hinzufügen der Business-Methoden:
Die Bean-Klasse "StatelessBean" wird bearbeitet und zwei Methoden "computeCuboidVolume" und "computeCuboidSurface" zugefügt.
Schritt 7: Business-Methoden in die Remote-Interfaces zufügen.
Dazu wählt man in der Gliederung (Fenster/TabPage links unten) die Methode "computeCuboidVolume" aus und klickt mit rechts darauf. Im Contextmenü wählt man den Punkt "Enterprise Bean" -> "Auf lokale Schnittstelle hochstufen" und "Auf Remote-Schnittstelle hochstufen". Das gleiche führt man für "computeCuboidSurface" durch.
Geschäftsmethoden in Interfaces überführen


Anlegen des Webclients

Schritt 1: Im Projekt-Explorer einen Rechtsklick auf "Dynamische Webprojekte" -> "StatelessWeb" ausführen und im Contextmenü "Neu" -> "JSP-Datei" wählen.
JSP-Seite, Schritt 1
Schritt 2: Definition der JSP-Seite. Als Dateiname wird "GeometricModelTest" angegeben.
JSP-Seite, Schritt 2
Nach dem Klick auf "Fertig stellen" hat man die JSP-Seite erstellt und kann den Quellcode der JSP-Datei aus dem SunAppserver-Beispiel einfügen.


Jetzt fügen wir das Servlet zu:
Schritt 1: Im Projekt-Explorer einen Rechtsklick auf "Dynamische Webprojekte" -> "StatelessWeb" ausführen und im Contextmenü "Neu" -> "Andere..." wählen. In der Kategorie "Web" wählen wir "Servlet" aus.
Servlet, Schritt 1
Wir geben ihm einen Namen und entfernen unter "URL-Zuordnungen" die vorhandene und legen stattdessen "/servlet/GeometricModelServlet" an.
Servlet, Schritt 2
Im nächsten Schritt wird das Servlet in das richtige Package gesetzt:
Servlet, Schritt 3
Jetzt noch die zu implementierenden Methoden der Basisklasse wählen (wir belassen hier die Defaults "doGet" und "doPost").
Servlet, Schritt 4


EJB-Referenzen:
Damit die JSP-Seite die EJB referenzieren kann, muss eine Referenz auf die JAR-Datei zugefügt werden.
Dazu einen Rechtsklick auf den Projekt-Explorer-Knoten "Dynamische Webprojekte" -> "StatelessWeb" ausführen und "Eigenschaften" wählen.
Webclient, EJB-Referenz
Unter dem Punkt "Java-JAR-Abhängigkeiten" wählt man die Option "EJB-Client-JARs verwenden" und setzt den Haken beim JAR der EJB-Datei.
Webclient, EJB-Referenz, Schritt 2
Achtung: Die Local-Interfaces haben hier andere Namen als im SunAppServer-Beispiel, d.h. hier die JSP-Seite anpassen.
Deklaration der EJB-Referenzen:
Per Doppelklick auf "Dynamische Webprojekte" \ "StatelessWeb" im Projekt-Explorer gelangt man zum Bearbeiten des Webimplementierungsdeskriptors. Über die Karteikarten am unteren Rand wechselt man zu "Verweise" und klickt auf "Hinzufügen".
Webclient, EJB-Referenz, Schritt 3
Im ersten Schritt wählt man als Referenztyp "EJB-Verweis".
Webclient, EJB-Referenz, Schritt 4
Wir wählen als Verweistyp "Remote" aus und selektieren die GeometricModelBean. Das ergibt einen Namensvorschlag für den Verweis, der uns sehr gut gefällt.
Webclient, EJB-Referenz, Schritt 5
Im nächsten Schritt müssen wir nichts ändern, und damit ist die Zeit reif für "Fertig stellen".
Das Ergebnis sieht so aus:
Webclient, EJB-Referenz, Schritt 6
Jetzt machen wir das gleiche noch für das Local Interface, wobei wir hier den Namen des Verweises manuell auf "ejb/GeometricModelLocal" ändern müssen.
Webclient, EJB-Referenz, Schritt 7
BUGALARM: In der deutschen Version (in 6.0.0.1 aufgetreten) wird hier eine Local Referenz generiert ! Hier muss die web.xml per Hand nachbearbeitet werden !
Falls also jemand nicht auf die hören wollte die ihn vor übersetzten Versionen gewarnt haben, muss er/sie jetzt tapfer sein und sich in die XML-Source stürzen. Im "Webimplementierungsdeskriptor" wählen wir die Karteikarte "Quelle" und ändern das XML per Hand. Wir ersetzen das Element "ejb-ref" mit dem Namen "ejb/GeometricModelLocal" durch folgendes Fragment:
	<ejb-local-ref id="EjbRef_XXXXXXXXXXXX" > 
		<description></description>
    		<ejb-ref-name>ejb/GeometricModelLocal</ejb-ref-name>
		<ejb-ref-type>Session</ejb-ref-type>
		<local-home>com.knauf.ejb.stateless.GeometricModelLocalHome</local-home> 
		<local>com.knauf.ejb.stateless.GeometricModelLocal</local> 
	        <ejb-link>StatelessEJB.jar#GeometricModel</ejb-link>
	</ejb-local-ref> 
Wichtig: die ID müssen wir aus dem von WebSphere generierten (falschen) <ejb-ref>-Tag kopieren, sonst funktioniert nix !

Die so definierten Referenzen tauchen jetzt in der J2EE-Hierarchie auf:
Webclient, EJB-Referenz, Schritt 8


Server einrichten

Beim Ausführen der Anwendung (Rechtsklick auf das auszuführende Modul, "Ausführen" -> "Auf Server ausführen..." wählen) erscheint ein Dialog zum Einstellen des Servers. Beim ersten Mal müssen wir hier einen Server erstellen. Da wir nicht wirklich viele Optionen haben belassen wir es beim Default.
Server erstellen, Schritt 1
Wir wollen unser aktuelles Projekt ausführen.
Server erstellen, Schritt 2
Jetzt haben wir mal wieder Zeit ein Getränk unserer Wahl zu uns zu nehmen während der Speicherverbrauch das halbe Gigabyte überschreitet.
Es startet ein Browserfenster, in dem wir nur eine Fehlerseite sehen.
Geben wir als URL aber http://localhost:9080/StatelessWeb/GeometricModelTest.jsp oder http://localhost:9080/StatelessWeb/servlet/GeometricModelServlet ein, dann können wir unser Werk bewundern.


Testen der EJB

Die Entwicklungsumgebung bietet einen Testclient, mit dem es möglich ist, Methoden der EJBs ohne eigenen Client aufzurufen. Hierzu den Server starten und per Rechtsklick die Option "Universellen Testclient ausführen" wählen.
Testclient, Schritt 1
Nach der Auswahl des Servers wird er gestartet (die Ausgabe erscheint in der Konsole unten rechts).
Es erscheint der Testclient. Man wählt als erstes die Option "JNDI-Browser". Danach klickt man sich im Zweig "ejb" bis zum Home-Interface unserer GeometricModelBean durch (Achtung: scheint nur für Remote Interfaces zu funktionieren !).
Testclient, Schritt 2
Nach einem Klick auf das Home-Interface gelangt man zur übersicht der EJB- und Objekt-Verweise, die man in diesem Testdurchlauf erzeugt hat.
Testclient, Schritt 3
Wir klicken auf die Create-Methode und rufen sie dadurch auf. Auf der rechten Seiten erscheint der Button "Aufrufen". Wenn man darauf klickt, erhält man eine Instanz der Bean. Man klickt auf "Mit Objekt arbeiten" und kann mit dieser Bean-Instanz arbeiten.
Testclient, Schritt 4
In der Übersicht links erscheint die so erzeugt Instanz als "GeometricModelLocal_1". Man klickt sie auf und wählt eine der "compute"-Methoden. Rechts kann man jetzt Parameter eingeben und die Methode mit diesen Parameter aufrufen.
Testclient, Schritt 5


Anlegen des Application Clients

Im Projekt-Explorer "Anwendungsclientprojekte" \ "StatelessClient" auswählen. Rechtsklick, und dann "Neu" -> "Klasse" wählen. Man gibt den Namen der Klasse an. Außerdem soll eine "main"-Methode erzeugt werden.
Application Client, Schritt 1
Wie im Webclient muss hier eine Abhängigkeit zum EJB-Projekt definiert werden (Rechtsklick auf "StatelessClient", "Eigenschaften" wählen). Man wählt unter "Java-JAR-Abhängigkeiten" das Bean-JAR aus.
Application Client, Schritt 2

Nachbearbeitung:
Es muss festgelegt werden, welche Klasse die Startklasse der Anwendung ist. Dazu einen Doppelklick auf "Implementierungsdeskriptor: StatelessClient" ausführen und im Clientimplementierungsdeskriptor unter "Hauptklasse" auf "Bearbeiten" klicken.
Application Client, Schritt 3
Man gelangt in das Fenster "Editor für JAR-Abhängigkeit", in dem man die Hauptklasse auswählen kann.
Application Client, Schritt 4
Als letzten Schritt muss man die EJB-Referenz auf das LocalInterface definieren. Dazu wählt man im "Clientimplementierungsdeskriptor" am unteren Rand die Karteikarte "Verweise" und im sich öffnenden Fenster "Hinzufügen..." (im Screenshot ist bereits das Ergebnis zu sehen).
Application Client, EJB-Referenzen, Schritt 1
Es öffnet sich ein Assistent für das Hinzufügen einer EJB-Referenz. Wir möchten einen "EJB-Verweis" zufügen.
Application Client, EJB-Referenzen, Schritt 2
Der Name des Verweises ist "ejb/GeometricModel", er bezieht sich auf die Bean "GeometricModel" im Projekt "StatelessEJB".
Application Client, EJB-Referenzen, Schritt 3
Damit haben wir erfolgreich die EJB-Referenz zugefügt.


Ausführen des Application Clients

Im Menü "Ausführen" den Punkt "Ausführen..." wählen.
Application Client ausführen, Schritt 1
Es muss zuerst ein neuer "WebSphere v6.0-Anwendungsclient" angelegt werden. Dazu auf "Neu" klicken und rechts den Namen ("StatelessClient") angeben sowie die Unternehmensanwendung und den Anwendungsclient auswählen. Auf "Anwenden" klicken, um die Änderungen zu speichern. Anschließend den Client mit "Ausführen" starten. Fertisch !

Austausch des Workspace

Um den kompletten Workspace so zu exportieren, dass er auf einem anderen Rechner wieder importiert werden kann, im Menü "Datei" den Punkt "Exportieren..." wählen. Als Exportziel wählen wir "Projektaustausch".
Export, Schritt 1
Im nächsten Schritt alle zu exportierenden Komponenten auswählen. Außerdem eine Zieldatei angeben.
Export, Schritt 2
Damit erhält man eine frei austauschbare Zip-Datei.

Re-Import:
Man öffnet WebSphere Studio und wählt beim Start ein leeres Verzeichnis als Arbeitsbereich.
Im Menü "Datei" ruft man "Importieren..." auf. Man wählt wiederum den Typ "Projektaustausch".
Import, Schritt 1
Im nächsten Schritt wählt man die Quelldatei (unsere eben exportierte Zip-Datei), den Zielpfad (per Default ist dies der Projekt-Workspace), und die zu importierenden Komponenten in der Zip-Datei.
Import, Schritt 2