Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Fachhochschule München, Fachbereich Informatik Software-Engineering II WS 2002 / 2003 bei Prof. Dr. Streng Seminararbeit Gruppe SEII03 Komponentenmodelle: Enterprise Java Beans 19.11.2002 Alexander Kubicki (Verfasser) 09 42 62 98 0111 07 IF 8W Mischa Gwinner 09 74 49 98 0111 07 IF 8W Ranko Krvavac 09 53 43 97 0133 07 IF 6WP Gruppe SEII03 1 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Inhaltsverzeichnis 1. Einleitung 4 2. Überblick Komponentenmodelle 4 2.1 DCE 4 2.2 COM / DCOM 4 2.3 CORBA 5 2.4 RMI 5 2.5 JavaBeans 6 2.6 Enterprise Java Beans 6 2.7 Web-Services 7 3. J2EE-Applikationen und Enterprise Java Beans 7 3.1 3.1.1 3.1.2 3.1.3 J2EE-Architektur und EJB-Server Schichten-Architektur J2EE-Server EJB-Container 7 8 10 12 3.2 Aufgabenverteilung und Entwicklerrollen 13 3.3 J2EE-Spezifikationen und API 14 3.4 Bestandteile eines EJB 20 3.5 3.5.1 EJB-Arten Session Beans 23 24 3.5.1.1 Stateless Session Beans 25 3.5.1.2 Stateful Session Beans 3.5.2 Entity Beans 3.5.3 Message-Driven Beans 26 28 31 3.6 Deployment 32 3.7 Benutzung von EJB 33 3.8 Dateiformate 34 4 Beispiel 35 4.1 Entwicklungsschritte 35 4.2 4.2.1 4.2.2 4.2.3 EJB-Klassen erstellen und kompilieren Die EJB-Klasse Das Remote-Interface Das Home-Interface 36 37 38 38 Gruppe SEII03 2 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Web-Client erstellen 39 4.4 Konfigurationsdateien erstellen 41 4.5 Verzeichnisstruktur erstellen 44 4.6 Archiv-Dateien erstellen 45 4.7 Anwendung auf Applikations-Server installieren und starten 46 5 Ausblick 47 6 Fragen und Antworten 49 7 Quellenverzeichnis 51 Gruppe SEII03 3 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 1. Einleitung Auf dem Weg zu unternehmensweiten Anwendungen wurden bei der Entwicklung von Softwarekomponenten-Modellen und deren AustauschMethoden verschiedene Techniken entwickelt. Zunächst eine kurze Übersicht über einige Komponentenmodelle und deren Entwicklung. Sie reicht von einheitlichen Schnittstellendefinitionen bis zu modularen, web-basierten Software-Komponenten. Dabei leistet die Java 2 Enterprise Edition (J2EE) einen wichtigen Beitrag, um auf Java-Basis die eigentliche Geschäftslogik sowohl von Systemdiensten als auch von der Benutzerschnittstelle abzukoppeln. Es wird ihre Architektur und Spezifikation beschrieben. Das hierbei verwendete Komponentenmodell der Enterprise Java Beans wird in seinen Bestandteilen, den Bean-Arten, seine Entwicklung und Benutzung erläutert. In einem Beispiel wird eine Applikation mit Enterprise Java Beans vorgestellt. 2. Überblick Komponentenmodelle In der Entwicklung von Komponentenmodellen wurden und werden Konzepte teilweise übernommen. 2.1 DCE Eine wichtige Entwicklung war Distributed Computing Environment (DCE). Diese einheitliche Schnittstellendefinition sollte auf allen Plattformen, vom Desktop PC bis hin zum Großrechner, verwendbar sein. DCE hatte keinen großen Erfolg, nicht zuletzt wegen des umfangreichen API mit 600 Funktionen. 2.2 COM / DCOM DCE wurde von Microsoft zum Component Object Model (COM) weiterentwickelt. Es ist für lokale Funktionsaufrufe, Interprozess- und Netzwerkkommunikation zuständig. Seit Windows NT 4.0 kann mittels DCOM (Distributed-COM) Datenaustausch zwischen verteilten Objekten Gruppe SEII03 4 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans erfolgen. Zunächst nur für Microsoft-Betriebssysteme entwickelt, existiert COM heute auch auf Apple und einigen UNIX-Derivaten. Ein Beispiel für COM-Objekte ist Active-X. Die (theoretische) Plattformunabhängigkeit ist nur gegeben, solange kein spezielles API verwendet wird. Auch werden bei API-Nutzung (z.B. WIN32-API) fast keine Sicherheitsmechanismen verwendet. 2.3 CORBA Die Object Management Architecture (OMA) wurde von der Object Management Group (OMG) entwickelt. Das Kernstück stellt der sog. Object Request Broker (ORB) dar. Es handelt sich dabei um eine Art Vermittlungszentrale zwischen den Objekten. Der ORB nimmt Anfragen entgegen, lokalisiert das entsprechende Objekt, übermittelt anschliessend die Anfrage und dann das Ergebnis der Operation. Der ORB wurde als Common Object Request Broker Architecture (CORBA) standardisiert und ermöglicht folglich die Kommunikation zwischen Systemen verschiedener Hersteller auf heterogenen Plattformen mit unterschiedlichen Programmiersprachen. Unterschiedlichste Applikationen können so als CORBA-Services verpackt werden und mit neuen Systemen zusammenarbeiten. Der entscheidende Nachteil des CORBA-Standards ist die Beschränkung auf die gemeinsamen Eigenschaften dieser Sprachen. Für Java bedeutet dies, dass viele Features wie die verteilte Garbage Collection, oder die Sicherheit der Java Virtual Machine keine Entsprechung finden. Auch die Portierbarkeit von verteilten Anwendungen kann z.B. durch maschinennahe Sprachen wesentlich erschwert werden. Ferner ist CORBA sehr komplex, kann nicht über Firewalls hinweg arbeiten, ORBs unterschiedlicher Hersteller sind zueinander inkompatibel und CORBA wird nicht von Microsoft unterstützt. 2.4 RMI Mittels Remote Method Invocation (RMI) und einer Java Entwicklungsumgebung können objektorientierte Programme erstellt werden, deren Objekte auf unterschiedlichen Rechnern in einem verteilten Netzwerk miteinander interagieren können. RMI ist einfacher zu implementieren als CORBA und leichter verfügbar (SDK von SUN). Es ist allerdings auf Java beschränkt und nicht so leistungsfähig wie CORBA oder DCOM. Gruppe SEII03 5 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 2.5 JavaBeans Ab Java Version 1.1 ist mit dem Bean-API ein Komponentenmodell von SUN verfügbar. Es lassen sich kleine bis mittlere Komponenten unterschiedlichen Größe und Komplexität (Granularität) entwickeln. Die wichtige Plattformunabhängigkeit ist aber nicht mehr gegeben, wenn Beans in plattformspezifische Komponentenmodelle integriert werden. Die Integration geschieht mit Hilfe einer „Bridge“, so dass z.B. Aufrufe zwischen JavaBeans und ActiveX/COM möglich sind Zugriffe erfolgen über öffentliche Methoden (Get-/Set-Methoden) und können somit genau festgelegt werden. Eine BeanInfo-Klasse beinhaltet alle Informationen über Properties, Methoden und Events einer Bean. Eine Instanz der Klasse java.beans.Introspector sucht zu einer Bean die korrespondierende BeanInfo-Klasse. Ist diese nicht vorhanden, so nutzt der Introspector das Java-Reflection-API und die Designpatterns der Namensgebung von Methoden und Events der JavaBeans-Spezifikation, um die benötigte Information zu generieren. Kann eine BeanInfo-Klasse gefunden werden, so werden nur die fehlenden Deskriptoren ergänzt. Das Ergebnis der Introspection ist eine BeanInfo-Klasse, die nun teilweise benutzerdefinierte und durch den Introspector generierte Informationen enthält. Kann keine BeanInfo-Klasse gefunden werden, generiert der Introspector alle Informationen und liefert sie in einem BeanInfo-Objekt zurück. 2.6 Enterprise Java Beans Enterprise Java Beans (EJB) haben zwar einen Teil ihres Namens mit JavaBeans gemein, es handelt sich hierbei jedoch um zwei eigenständige Komponentenmodelle der Firma Sun Microsystems. Es kann aber z.B. auch hier das mächtige Java-Reflection-API verwendet werden. EJB sind innerhelb einer eigenen Spezifikation, der Java 2 Enterprise Edition (J2EE), definiert. Zusätzlich sind weitere APIs enthalten, die den Datenaustausch vereinfachen. Die EJB Komponenten-Technologie ist gegenüber JavaBeans komplexer, da sie eine mehrschichtige Server-Struktur erfordert, wobei EJB auf beliebig vielen sog. Applikations-Servern laufen können. Auch ist sie kompatibel zu CORBA und kann mit verschiedenen Plattformen und Programmiersprachen zusammenarbeiten. Im Folgenden werden Enterprise Java Beans, deren Laufzeit-Umgebung und die nötigen Entwicklungswerkzeuge vorgestellt. Gruppe SEII03 6 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 2.7 Web-Services Web-Services sind modulare, internet-basierte Software-Komponenten. Sie werden durch den Anbieter im WWW zur Verfügung gestellt und durch die Applikation des Nutzers online verwendet. Sun-One und Microsoft .Net sind zwei unterschiediche Ansätze hierzu. Nach der aktuellen J2EE-Spezifikation können Enterprise Java Beans zu Web-Services erweitert werden. 3. J2EE-Applikationen und Enterprise Java Beans Für Enterprise Java Beans muss die Java Erweiterung J2EE verwendet werden: Zusätzlich zum normalen Java-SDK wird von SUN das JavaSDKEE in der gleichen Version benötigt (beides kostenfrei). Es umfasst die nötigen APIs, ein grafisches Tool zu EJB-Erstellung, sowie einen Applicationserver (Referenzserver von SUN Microsystems). Von den APIs sind entsprechend den EJB-Funktionalitäten nur einige essentiell wichtig. Als Alternative zum beigefügten grafischen Tool (Java deploytool) können auch bekannte Java-Entwicklungswerkzeuge in den jeweiligen Enterprise-Versionen (Forte for Java EE, Jbuilder EE, Together J) genutzt werden. Der Referenzserver kann ebenfalls durch modernere und performantere Application-Server ersetzt werden (z.B. Jboss, Silverstream, Bea WebLogic, IBM Websphere, iPlanet), wobei die mitgelieferte Datenbank ebenfalls ausgetauscht werden kann (z.B. Oracle, SQL Server, PostgreSQL, MySQL, Instant-DB) 3.1 J2EE-Architektur und EJB-Server Man kann die Funktionsweise von EJB gut mit Applets und Servlets vergleichen, die beide kein unabhängiges, eigenständiges Programm sind, sondern eine geeignete Laufzeitumgebung zum Ablaufen benötigen. Beim Applet ist diese Laufzeitumgebung der Webbrowser und beim Servlet die sog. Servlet Engine des Webservers (z.B. Tomcat für Apache-Webserver). Bei EJB übernimmt diese Funktionalität der Container des ApplikationsServers. Ein Container kann mehrere EJBs enthalten. Der Unterschied zwischen Applets / Servlets und EJB liegt auf der Anwendungsseite. Applets liefern ihre Ergebnisse direkt an ein GUI auf dem Client. Demgegenüber bearbeiten EJB komplexe Berechnungen oder Transaktionen auf einem Server und stellen diese Ergebnisse anderen Komponenten oder Applikationen zur Verfügung. Gruppe SEII03 7 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Das Ziel von EJB ist es, die Entwicklung von verteilten, komponentenbasierten, serverseitigen Java-Applikationen zu vereinfachen und Aufgaben wie Sicherheits-und Transaktions- oder Verteilungsverwaltung von den Komponentenentwicklern fernzuhalten. Enterprise Java Beans sind für eine moderne Mehr-Schichten-Architektur ausgelegt. 3.1.1 Schichten-Architektur Die ersten Client/Server Systeme bestanden aus zwei Schichten (TwoTiers-Architecture), dem User Interface auf dem Client und der Datenbank auf dem Server. Solche Systeme sind derzeit noch üblich. Zwei-SchichtenArchitekturen führen den größten Teil der Business Logic auf dem Client aus, der anschließend mittels SQL-Statements den Server aktualisiert. Client Server Frontend und Datenbank Businesslogik Abb.1: Zwei-Schichten-Architektur Die Three-Tiers-Architektur wird durch eine schlanke Klientensicht in der Präsentationsschicht charakterisiert. Die Anwendungslogik (Business Logic) mit den eigentlichen Applikationen wird in der zweiten Schicht auf dem Application-Server (Middleware) ausgeführt und nutzt die Datenbanken der Datenschicht. Hierbei benutzen Client und Server typischerweise ein Protokoll, daß die Konversation auf der Ebene von Geschäftsvorfallstransaktionen anstatt von Tabellen und Reihen repräsentiert. Gruppe SEII03 8 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Dieses Konstrukt bietet in vielerlei Hinsicht Vorteile. Die Entwicklungs-, Wartungs- und Erweiterungskosten sind niedriger, da die komplette Geschäftslogik zentral platziert ist und so nicht auf jedem Clientrechner Änderungen durchgeführt werden müssen. Die Kommunikation zwischen Client und Datenbank geschieht nicht mehr direkt. Dies bringt Vorteile bezüglich Lizenzen, Netzwerkauslastung und einer eventuellen Umstellung der Datenbank. Des weiteren ist z.B. die Möglichkeit einer Absicherung der Präsentationsschicht durch eine Firewall positiv zu beurteilen, da somit eine leichte Webintegration realisierbar ist. Die dahinterstehenden Geschäftsprozesse sind davon nicht betroffen. Zusammenfassend kann man sagen, dass durch diese Architektur Vorteile bezüglich Skalierbarkeit, Performanz, Lastverteilung, Verfügbarkeit, Flexibilität und nicht zuletzt Softwarewiederverwendung gegeben sind. Client Application-Server Frontend Businesslogik Datenbank-Server Datenbank Abb.2: Three-Tiers-Architecture n-Tiers-Architectures sind Verallgemeinerungen von Three TierArchitectures. Jede Ebene der Software sorgt für einen anderen Level an Services zu den Ebenen darunter und daneben. In n-Tier-Architectures wird das Netzwerk vielmehr als ein Pool von verteilten Services betrachtet, als einfach der Zugriff eines Client auf einen einzelnen Server. Client Service 1 Frontend Service n Datenbank-Server Datenbank Abb.3 n-Tiers-Architecture Gruppe SEII03 9 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Im Folgenden wird von einer Three-Tiers-Architecture ausgegangen. Abb.4 Drei-Schichtenmodell 3.1.2 J2EE-Server Als Clients können Web-Browser oder Standalone-Applikationen verwendet werden. Standalone-Applikationen benutzen einen eigenen Client oder sind ein Applet in einer Spezialanwendung (z.B. Mobiltelefone). Sie bieten den Vorteil direkt auf die Datenbank-Ebene zugreifen zu können. Web-Browser sind auf allen heute gängigen Betriebssystemen bereits vorhanden und bedürfen im Gegensatz zu Standalone-Applikationen keiner speziellen Administration. Auch betreffen Änderungen des Frontend nur den (hierbei benötigten) Webserver alleine, was gerade bei einer großen Client-Anzahl eine sehr effiziente System-Wartung ermöglicht. Im Folgenden wird von einem web-basierten Frontend ausgegangen: Dazu ist neben dem EJB-Server mit seinen EJB-Containern auch ein Webserver erforderlich. Dieser muß dabei auch dynamische WebseitenInhalte erzeugen können. Nach Definition im J2EE-Standard ist dies mittels der server-seitigen Techniken „Java Servlet“ oder „Java Server Pages“ (JSP) möglich. Hierzu ist wiederum einer Erweiterung des Web-Servers um eine Servlet-Engine nötig. Beispielsweise ist Jacarta-Tomcat eine Servlet-Engine zum ApacheWebserver. Gruppe SEII03 10 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans J2EE-Server WEB-Container WEB-Browser JSP Servlet Standalone Client EJB-Container Enterprise Data EJB Client Tier (Client) Middle Tier (Application-Server) Enterprise information System Tier (Datenbank-Server) Abb.5 Beziehungen im Drei-Schichtenmodell Der Vorteil von Java Server Pages ist, das sie automatisch nach Ihrer Erstellung von der Servlet-Engine des Webservers in (aktualisierte) Servlets umgewandelt werden. Diese können bei Anfrage durch den Client sofort auf dem Webserver ausgeführt werden. Der Nachteil von Java Server Pages ist die Vermischung von HTML- und Java-Code, JSP-Tags und anderen Informationen wie z.B. Java Script. Dies wird bei der Verwendung von Servlets verhindert, da sie reine JavaKlassen sind. Web-Ausgaben werden dynamisch mittels system.out.println erzeugt. Dann kann es aber auch nötig sein, zum Servlet geeignete statische Webseiten bereitzustellen. Gruppe SEII03 11 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 3.1.3 EJB-Container Der EJB-Container übernimmt die Steuerung der Datenkommunikation und entlastet somit den EJB-Entwckler erheblich. Der entfernte Client greift über die Java-eigene Remote-MethodInvocation (RMI) und das Java Remote-MethodProtokoll (JRMP) auf den Server zu. Einige Applikationsserver unterstützen optional das Internet Inter-ORB Protokoll aus CORBA. Der EJB-Server stellt für jede EJB-Komponente einen EJB-Container zur Verfügung. Der Client kommuniziert nicht mit der Komponente selbst sondern mit dem Container. Dies hat den großen Vorteil, dass sich der Komponententwickler nur mit seinem Anwendungsfall, also der Geschäftslogik auseinandersetzten muss, und die konkrete Implementierung der Schnittstelle dem Container überlassen kann. Diese Schnittstelle ist in der EJB-Spezifiktaion klar definiert (Component Contract). Die Bereitstellung einer Laufzeitumgebung („Container“) für EJB ist die wichtigste Aufgabe des Application-Servers. Darüberhinaus werden Dienste, wie z.B. die Life-Cycle-Management, Netzwerkverbindungen, Sicherheit, Datenbankzugriff, Prozess- und Threadverwaltung, und Persistenz zur Verfügung gestellt. Durch diese Architektur kann sich der Entwickler vollständig auf die eigentlich Logik der Applikation konzentrieren. EJB-Server EJB-Container Client EJB-Komponente Component Contract Abb.5 Architektur einer EJB-Anwendung Gruppe SEII03 12 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 3.2 Aufgabenverteilung und Entwicklerrollen Aufgrund der J2EE-Architektur (siehe 3.3) ist es möglich, dass die verschiedenen Komponenten (Enterprise Bean, Container, ...) unabhängig voneinander entwickelt werden können: • Der Enterprise Bean-Provider erstellt sowohl die Enterprise Java Beans als nötige Web-Komponenten (JSPs, Servlets). EJBs beinhelten die Geschäftslogik und benutzen dazu die Container-Dienste des Application-Servers (Verteilung, Transaktionssteuerung, Persistenz, Sicherheit). EJBs können in Eigenentwicklung entstehen oder zugekauft werden. • Der Application Assembler setzt aus den einzelnen SoftwareKomponenten, den EJBs, die gewünschte Applikation zusammen. Dabei sind nur Problemstellung und EJBSchnittstellen relevant (nicht die EJB-Implementierung). Neben Anpassungen kann aber auch die Erstellung von speziellen EJBs nötig werden. Außerdem erstellt oder modifiziert er den Deployment-Descriptor der Applikation (in XML). • Der EJB Container / Server Provider stellt den Applikationsserver, also die Laufzeitumgebung mit Low-LevelSystemdiensten für die Enterprise Java Beans, zur Verfügung (z.B. JBoss). Im Moment wird der passende Container für den Server gleich mitgeliefert. • Der Deployer richtet die Applikation auf dem Zielsystem ein. Er gibt dem Applikationsserver die erstellten SoftwareKomponenten bekannt, d.h. er legt sie in einem bestimmten Verzeichnis des Servers ab. Zusätzlich werden gegenüber der Testumgebung veränderte Hardware, Transaktionen und Sicherheit (Firewall,...) angepasst. • Der System Administrator ist für die Anwendung nach der Implementierung verantwortlich. Er muss sich also um die täglichen durch mitgelieferte Management Tools kümmern. Gruppe SEII03 13 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans . Abb.6 Entwicklerrollen Für alle Aufgaben stellt der Tool Provider die J2EE-Entwicklungsumgebung und deren Tools bereit (z.B. Sun Forte for Java EE als IDE, Jakarta ANT für Deployment-Descriptoren). 3.3 J2EE-Spezifikationen und API Die „Java 2 Platform Standard Edition“ (J2SE) wird durch die „Java 2 Platform Enterprise Edition“ (J2EE) erweitert. Sie besteht aus mehreren APIs, zu denen auch die Enterprise Java Beans gehören. Die momentan aktuellste J2EE-Spezifikation (v1.4) ist der „Proposed Final Draft 2 / Public Draft“ vom 08.11.2002. Eine J2EE-Patform besteht aus folgenden API: Enterprise Java Beans 2.1(EJB): EJBs ist ein server-seitiges Komponentenmodell, das Portabilität über verschiedene Applikationsserver hinweg bietet. Dieses Framework stellt verschiedene Dienste für Appliakationskomponenten zur Verfügung. Es gibt drei EJB-Arten: Session-, Entity- und Message-Driven Beans. Bei Datenbankoperationen mittels eines Entity-Beans ist kein SQL-Code oder die Benutzung des JDBC-API notwendig (aber möglich), da der Container des Application-Server dies übernimmt . Als Neuerung gegenüber der Version 2.0 wurde Unterstützung für Webservices eingefügt: Stateless Session Beans (siehe 3.5.1.1) und Message-Driven Beans (siehe 3.5.3) können als SOAP 1.1-basierte Webservices veröffentlicht werden. Mittels SOAP 1.1 können Methoden Gruppe SEII03 14 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans eines Stateless Session Bean durch fremde Web-Service Plattformen wie Microsoft .net, Apache Axis, Perl verwendet werden. Java Naming and Directory Interface (JNDI): JNDI bietet Zugang zu Namens- und Verzeichnisdiensten (z.B. NDS oder LDAP), um entfernte Objekte zu lokalisieren und zu verwenden. Remote Method Invocation (RMI-IIOP): Mit RMI können Java-Funktionsaufrufe über Rechnergrenzen hinweg erfolgen. Virtuelle Kommunikation Client Remote-Objekt Interface Interface Rumpf (stub) Gerüst (skeleton) Remote Reference Layer Netzwerkverbindung Abb.7 Remote Method Invocation Java Interface Definition Language (JIDL): Mit JIDL können entfernte Funktionsaufrufe über CORBA und IIOP (Internet-Inter-ORB-Protocol) erfolgen. Java Database Connectivity 3.0(JDBC): JDBC ermöglicht den Zugang zu relationale Datenbanken mittels SQL: In einem Entity-Bean können die vom Container vorgegebenen Datenbanfunktionen überladen werden. Oder ein Session-Bean muss auf die Datenbank zugreifen. Auf Seite des Clients kann ein JSP oder Servlet die Datenbank auch ohne Umweg über das EJB benutzen. Das JDBC-API besteht aus zwei Teilen: Ab Version 2.0 ist JDBC in die Pakete java.sql (für JDBC-konforme Treiber) und javax.sql (JDBC für J2EE) aufgeteilt. Es gibt 4 Typen von JDBC-Treibern: Gruppe SEII03 15 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Typ1: Der Treiber verwendet eine native Bibliothek mit einem allgemeinen Interface (nicht datenbankspezifisch). Beispiel ist die JDBC-ODBCBrücke im Java-SDK. Typ2: Der Treiber greift über eine native Bibliothek auf einen datenbankspezifischen Treiber zu (schneller als Typ1). Typ3: Der Treiber selbst ist reines Java und kommuniziert über ein datenbankunabhängiges Protokoll mit einem Datenbankportal. Beispiel sind Java-Applets, wegen deren Sicherheitsrestriktionen. Typ4: Der Treiber selbst ist reines Java, kommuniziert direkt mit der Datenbank und ist datenbankabhängig (Leistungsstärker Typ 2 und fast genauso schnell). Java Servlet 2.4: Hierdurch können http-spezifische Klassen erstellt werden, wobei die Logik nach Anfrage durch den Client auf dem (Web-)Server abläuft. Java Server Pages 2.0 (JSP): Eine Java Server Page ist ein textbasiertes Dokument mit statischen (HTML,WML,XML) und dynamischen(JAVA-Code, JSP-Tags) Elementen. Java Message Service 1.1 (JMS): J2EE-Komponenten können besonders bei verteilten Systemen Nachrichten senden, empfangen und lesen (z.B. Asynchrone Kommunikation mit Queuing). Java Transaction API 1.0 (JTA) : JTA stellt Transaktionssicherheit für Datenbankzugriffe her (z.B. commit, rollback). Verteilte Transaktionen auf der Basis des OTS (Object Transaction Service) von CORBA können durchgeührte werden. Java Mail 1.3 : Durch Java Mail können J2EE-Komponenten Email aus ihrer Applikation heraus senden. Das JavaMail-API besteht aus zwei Teilen: Die Anwendung benutzt das Application-Level-Interface, um Email zu versenden. Daneben existiert das Service-Provider-Interface. Für Java und Java-Enterprise Applikationen existieren wie verschiedene API: J2EE verwendet javax.mail.* . Gruppe SEII03 16 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans J2EE Connector API 1.5 : Dies ist ein API zur Erzeugung von Komponenten (resource adapter), die den J2EE-Komponenten die Kommunikation mit Enterprise-InformationSystems (z.B. Datenbank) ermöglicht. Es wird von J2EESystemintegratoren benötigt. Java Authentication and Authorisation Service 1.0 (JAAS): Es dient der benutzerbasierten Autentifizierung und Autorisierung in J2EE Applikationen. JAAS ist eine Version des Pluggable Authentication Module (PAM) Framework, das in Java 2 enthalten ist. Die Neuerungen in der Version 1.4 des J2EE betreffen vor allem WebServices: Java Web Services 1.1 und Java Web Services Developer Pack 1.0_01 (Java WSDP): Das Java WSDP ist z.B eine Werkzeugsammlung, die Java-Entwicklern ermöglicht XML-Applikationen, Web-services und Web-Applikatonen zu erstellen, testen und veröffentlichen. Enthalten sind folgende APIs: Das Java XML Pack umfasst: Java API for XML Messaging (JAXM) v1.1_01 Java API for XML Processing (JAXP) v1.2_01 Java API for XML Registries (JAXR) v1.0_02 Java API for XML-based RPC (JAX-RPC) v1.0_01 Java WSDP Registry Server v1.0_02 SOAP API with Attachments for Java (SAAJ) v1.1_02 Web Application Deployment Tool JavaServer Pages Standard Tag Library (JSTL) v1.0.1 Ant Build Tool 1.4.1 Apache Tomcat 4.1.2 container Gruppe SEII03 17 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans JAXM ist analog zu JMS für den Nachrichtenaustausch mittels SOAP zuständig. Auch ist damit eine neue Bean-Art, JAXM-basierte MessageDriven Beans (JAXM-MDB), möglich. Gruppe SEII03 18 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans JAX-RPC ist ähnlich zu Java-RMI, aber benutzt SOAP als Protokoll. Mittels JAX-RPC können Session-, Entity-, und Message-Driven-BeanMethoden u.a. Microsoft .net Web-Services verwenden. Abb.8 EJB verwendet Web-Service Gruppe SEII03 19 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans JAX-RPC kann auch als Grundlage für das neues Endpoint-Interface dienen. Ein stateless Session Bean kann als Web Service fungieren. Abb.9 Web-Service verwendet EJB 3.4 Bestandteile eines EJB Ein Enterprise Java Bean besteht im wesentlichen aus folgenden Bestandteilen: • Home-Interface • Remote-Interface • EJB-Klasse • Primary-Key (-Klasse) , (nur Entity Beans, siehe 3.5.2) • Deployment-Deskriptor Das Home-Interface definiert die Verwaltungmethoden des EJB, d.h. alle Methoden, die seinen Lebenszyklus betreffen. Es beinhaltet das Interface javax.ejb.EJBHome, das eine Grundfunktionalität eines Home Interfaces definiert. Gruppe SEII03 20 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Alle Methoden in diesem Interface müssen Java-RMI kompatibel sein, d.h. jede Methode muß von dem java.rmi-Package genutzt werden können. Der Client benutzt diese Schnittstelle um EJB-Instanzen zu erzeugen, um sie zu finden und um sie zu löschen. Der Rückgabewert der create()Methode ist das Remote Interface für die EJB. Das Remote-Interface definiert die „Business-Methoden“ des EJB. Damit sind alle Funktionalitäten gemeint, die vom EJB nach außen hin angeboten werden. Ein EJB Remote Interface enthält das javax.ejb.EJBObject-Interface und kann jede gewünschte Methode beinhalten, wobei die Rückgabewerte für jede Methode RMI-kompatibel sein müssen und jede Methode eine java.rmi.RemoteException beinhalten muß. Ferner muß jede Methode des Remote-Interface exakt mit der entsprechenden Methode der jeweiligen EJB-Klasse übereinstimmen. Die EJB-Klasse implementiert alle Methoden, die im Home- und RemoteInterface deklariert wurden. Beispielsweise muss ejbCreate() zum erzeugen eines EJB enthalten sein. Darüber hinaus finden sich in dieser Klasse noch einige „Callback-Methoden“, die im entsprechenden Interface des zugehörigen EJB-Typs definiert sind. Sie werden vom Container aufgerufen um den Zustand des EJB zu steuern. Der Primary-Key ist nur bei Entity-Beans relevant. Er gibt einer EJBInstanz eine eindeutige Identität gegenüber dem Client. Mit Hilfe des Primärschlüssels kann der Client nach einer bestimmten EJB-Instanz auf dem Server suchen. Bei zusamengesetzten Schlüsseln ist eine PrimaryKey-Klasse möglich. Der Deploymentdiskriptor ist im wesentlichen eine XML-Datei, die Verzeichnisinformationen und Benennungen über das EJB enthält. Hier wird z.B. der Name, der Typ oder das Transaktionsverhalten angegeben. Gruppe SEII03 21 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.10 Vererbungsbeziehungen von Home- und Remote-Interface Das Remote-Interface (Book) ist immer abgeleitet vom Interface EJBObject im package javax.ejb. Das Remote-Interface (BookHome) wird abgeleitet vom Interface EJBHome, im package javax.ejb. Beide Interfaces, EJBObject und EJBHome, sind wiederum abgeleitet von Interface java.rmi.Remote. Nur Klassen, die dieses Interface Implementieren, können im Sinne von RMI als verteilte Objekte angesprochen werden. Zusätzlich wird noch ein EJB-Client benötigt. Dies ist ein Stück Software (JSP oder Servlet), das eine Funktion eines EJB in Anspruch nehmen will: Es findet über das „Java Naming and Directory Interface“ (JNDI) die gewünschte Komponente dank deren EJB-Home-Schnittstelle. Die angeforderte Funktion der Komponente wird dann über deren EJBRemote-Schnittstelle aufgerufen. Der Client kann das EJB nie direkt ansprechen. Enterprise-Java-Beans können mit anderen EJB-Komponenten oder mit einer Datenbank kommunizieren. Zur Migration der EJB-Technologie in vorhandene Firmenumgebungen ist es hilfreich, daß alte Software sich bei Bedarf mit Java-Code umhüllen und integrieren läßt (Wrapper). Gruppe SEII03 22 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 3.5 EJB-Arten Es gibt es drei verschiedene EJB-Typen: Session Beans, Entity Beans, Message-driven Beans sowie deren Untertypen. Abb.11 EJB-Typen Alle drei Interfaces der Bean-Typen sind abgeleitet vom Interface EnterpriseBean, im package javax.ejb. Es ist, genau wie das ElternInterface java.io.Serializable, lediglich ein „Marker-Interface“, enthält also keine Methodendeklarationen. Innerhalb der Bean-Interfaces sind Methoden deklariert, die der Container benutzt um den Zustand der Bean zu verwalten (z.B. ejbActivate(), ejbRemove() usw.). Diese Methoden werden allgemein auch als „Callback-Methoden“ bezeichnet. Gruppe SEII03 23 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Eine Sonderrolle spielt das Interface MessageDrivenBean. Es ist abgeleitet von Interface javax.jms.MessageListener. Dieses Interface deklariert nur eine Methode, nämlich „onMessage(java.jms.Message)“. Abb.12 Vererbungsbeziehungen der EJB-Interfaces 3.5.1 Session Beans Session Beans können einem Client für die Dauer einer Sitzung („Session“) exklusiv zu Verfügung gestellt werden. Sie enthalten BusinessLogik und sind üblicherweise mit einem EJB-Client assoziiert, der für ihre Erzeugung und Zerstörung verantwortlich ist. Session Beans sind transiente Objekte, die einen Shutdown des Servers nicht überleben. Sie werden in „Stateless Session Beans“ und „Stateful Session Beans“ unterteilt. Sie können zudem über Persistenz verfügen, d.h. mittels spezieller Methoden über Client Sessions hinweg gespeichert werden, um den Zustand (Daten) zu erhalten. Allgemeine Verwendungszwecke für Session Beans: - Jederzeit hat nur ein Client Zugriff auf das EJB - Der EJB-Zustand ist nicht persistent (z.B. nur einige Stunden) Gruppe SEII03 24 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Beispielsweise würde der virtuelle Einkaufwagen eines Online-Shops und sein Inhalt durch ein Session-Bean repräsentiert werden. 3.5.1.1 Stateless Session Beans Diese EJBs besitzen keinen definierten Zustand, durch den sich eine Instanz von einer anderen unterscheiden würde. Im allgemeinen hat Sie auch keine Attribute weil bei Ihrer Erzeugung kein bestimmter Zustand initialisiert werden muß (create() – Methode ohne Parameter). Ein Stateless Session Bean kann von jedem beliebigen Client (auch von mehreren) für einen Aufruf verwendet werden. Das bedeutet, daß ein Client bei zwei aufeinander folgenden Methodenaufrufen durchaus zwei verschiedenen Bean-Instanzen zugeordnet bekommen kann. Um Ressourcen zu schonen werden Stateless Session Beans vom EJBContainer in Pools verwaltet. Stateless Session Beans sollten bei einem oder mehreren zutreffenden Krierien verwendet werden: - Der EJB-Status enthält keine Daten für einen speziellen Client - Ein einzelner Methodenaufruf der EJB führt eine allgemeine Operation durch, die für alle Clients gültig ist (z.B. E-Mail senden) - Das EJB benutzt die Datenbank nur lesend, um den Clients häufig benötigte Daten zur Verfügung zu stellen Gruppe SEII03 25 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.13 Zustandsdiagramm eines Stateless Session Bean 3.5.1.2 Stateful Session Beans Im Gegensatz zu den Stateless Session Beans besitzen Stateful Session Beans einen definierten Zustand, durch den sich eine Instanz von einer anderen unterscheidet. Dieser ergibt sich aus den Werten der Attribute, sowie allen verwendeten Ressourcen (z.B. Datenbankverbindungen). Sie können daher nur von jeweils einem Client verwendet werden. Es können verschiedene Zustände initialisiert werden (mehrere create() – Methoden mit verschiedenen Parametern. Ein Stateful Session Bean wird für die Dauer einer Session exklusiv einem Client zugeordnet. Der Lebenszyklus der Instanz ist eng an den Client gebunden,d.h. sie wird explizit vom Client erzeugt und auch wieder gelöscht. Durch die unterschiedlichen Zustände der einzelnen Bean-Instanzen ist keine Pool-Verwaltung möglich um Ressourcen zu sparen. Statt dessen werden Stateful Session Beans von Container passiviert, falls die Anzahl sich im Arbeitsspeicher befindlicher Instanzen verringern werden muß. Dafür wird die Instanz serialisiert und auf ein sekundäres Speichermedium (z.B. Festplatte) geschrieben. Wird eine passivierte Instanz wieder gebraucht, wird sie deserialisiert und wieder in den Arbeitsspeicher geladen. Gruppe SEII03 26 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Eine Stateful Session Bean kann sich in drei verschiedenen Zuständen befinden: Wenn eine Neue Instanz vom Client angefordert wird, geht das EJB nach dem Aufruf von ejbCreate(...) des Home-Interfaces in den Zustand Ready über (Der Container wird veranlasst, eine neue Instanz anzulegen). Das EJB ist nun bereit, verschiedene vom Client aufgerufene Methoden auszuführen. Tritt innerhalb einer Methode eine RuntimeException auf, wird die Instanz von Container verworfen und der Client durch eine RemoteException benachrichtigt. Muß der Container das EJB passivieren um Ressourcen zu sparen, ruft er ejbPassivate() auf. In dieser Methode können vom EJB-Provider noch bestehende Ressourcen, die nicht serialisiert werden konnten, geschlossen werden. Das EJB geht in den Zustand Passiviert über. Um die Instanz wieder zu aktivieren, ruft der Container ejbActivate() auf. Das EJB geht in den Zustand Ready über. Falls ein Client vergessen hat die ihm zugeordnete Instanz explizit durch ejbRemove() des Home-Interfaces zu löschen, wird das EJB irgendwann einmal vom Container passiviert werden. Nach einer gewissen Zeitspanne, in der die Instanz von keinem Client angefordert wurde, wird die Bean automatisch vom Container gelöscht. Abb.14 Zustandsdiagramm eines Stateful Session Bean Stateful Session Beans sollten bei einem oder mehreren zutreffenden Kriterien verwendet werden: Gruppe SEII03 27 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans - Der EJB-Status repräsentiert die Interaktion zwischen dem EJB und einem speziellen Client - Das EJB muß Informationen bezüglich des Client auch zwischen Methodenaufrufen speichern - Das EJB vermittelt zwischen dem Client und anderen Komponenten der Applikation (bestimmte Sicht für den Client) - Das EJB koordiniert den Arbeitsablauf mehrerer EJB’s 3.5.2 Entity Beans Entity Beans repräsentieren typischerweise Daten aus einer Datenbank. Sie sind jedoch nicht nur als Datenspeicher zu betrachten, sondern als vollständige Geschäftsobjekte mit eigener Funktionalität. Das bedeutet, daß Entity Beans Methoden besitzen, die auf den Daten der Bean (Attribute) arbeiten. Entity Beans besitzen eine eindeutige Identität in Form ihres Primärschlüssels. Normalerweise wird als Primärschlüssel der Primärschlüssel der Datenbanktabelle verwendet. Handelt es sich um einen zusammengesetzten Schlüssel aus mehren Attributen, wird eine Primärschlüssel-Klasse definiert, die als Attribute die Spalten der Datenbanktabelle enthält, die den Primärschlüssel der Datenbank ergeben. Der Client kann mit Hilfe der „findByPrimaryKey(key) – Methode“ nach einer bestimmten Instanz auf dem Server suchen. Entity Beans können von mehreren Clients parallel genutzt werden, so daß sie transaktionsbewußt sein müssen. Entity Beans sind persistent, da die dazugehörigen Daten in der Datenbank abgespeichert sind. Sie überleben also einen Shutdown des Servers. Ein Systemausfall oder Crash der virtuellen Maschine kann ein Rollback laufender Datenbank-Transaktionen zur Folge haben, wird jedoch nie das EJB oder die Referenzen der Clients auf diese Komponente zerstören. Die Clients können sich später über den eindeutigen Primärschlüssel wieder mit genau der vorher benutzten Komponente verbinden. Es gibt zwei verschieden Arten ein Entity Bean persistent in der Datenbank zu speichern: Bei Container-Managed Persistence (CMP) sorgt der Container für die Synchronisation der Bean mit der Datenbank. Dafür werden vom Container-Provider Tools zu Verfügung gestellt. Mit deren Hilfe werden die Gruppe SEII03 28 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans entsprechenden SQL-Statements für das Mapping der Bean-Attribute auf die Datenbank generiert. Bei Bean-Managed Persistence (BMP) ist der Bean-Provider selbst dafür verantwortlich das EJB mit der Datenbank synchron zu halten. Die nötigen Datenbankzugriffe werden vom Entwickler mit Hilfe von JDBC in den entsprechenden Methoden selbst codiert. Abb.15 Zustandsdiagramm eines Entity Bean Um Ressourcen zu sparen werden Entity Beans vom Container in Pools verwaltet. Dabei unterhält der Container für jede Bean-Klasse einen eigenen Pool. Um die Anzahl im Pool befindlicher Instanzen zu vergrößern, erzeugt der Container eine neue Instanz und ruft die Methode setEntityContext() auf. Die Bean-Instanz kann nun Anfragen des Clients bearbeiten. Sie hat jedoch noch keine eindeutige Identität in Form eines Primärschlüssels. Sucht der Client eine bestimmte Instanz anhand des Primärschlüssels, leitet der Container die Anfrage an eine beliebige Bean im Pool weiter. Von der jeweiligen Bean wird die Methode ejbFindByPrimaryKey(key) aufgerufen. Liefert die Suche in der Datenbank ein Ergebnis in Form eines Primärschlüssels, wird eine Instanz aus dem Pool vorbereitet und durch den Aufruf von ejbActivate() in den Zustand ReadyAsync gebracht. In diesem Zustand hat die Bean bereits eine eindeutige Identität und kann ihren Primärschlüssel über den EntityContext abfragen. Die Instanz ist jedoch noch nicht mit der Datenbank synchronisiert. Gruppe SEII03 29 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Die Synchronisation erfolgt in der Methode ejbLoad(), die anschließend von Container aufgerufen wird. In dieser Methode werden die nötigen SQL-Abfragen ausgeführt um die Attribute der Bean zu initialisieren. Möchte der Client einen neuen Datenbankeintrag erzeugen erfolgt dies mit dem Aufruf ejbCreate(...) unter Angabe des Primärschlüssels und allen sonstigen Attributen als Parameter. Eine Bean-Instanz wird aus dem Pool genommen und führt die nötigen SQL-Befehle aus. Die Instanz wechselt anschließend in den Zustand ReadySyn in dem sie mit der Datenbank synchronisiert ist. Zum löschen eines Eintrags dient die Methode ejbRemove(). Der entsprechende Datensatz wird gelöscht und die Bean-Instanz geht in den Zustand Pooled über. Befindet sich die Bean im Zustand ReadySync kann sie verschiedene vom Client gewünschte Methoden ausführen. Ändern sich dabei die Attributwerte nicht, bleibt die Instanz im Zustand ReadySync. Wenn sich die Attributwerte ändern geht sie in den Zustand ReadyUpdate über. In diesem Zustand kann sie noch weitere Methoden ausführen. Der EJBContainer wird jedoch bald die Methode ejbStore() aufrufen um die Bean wieder mit der Datenbank zu synchronisieren. In dieser Methode werden die SQL-Updates ausgeführt. Entity Beans sollten bei folgenden Bedingungen verwendet werden: - Das EJB repräsentiert Business-Daten und keine Methode - Der EJB-Status muss persistent sein (Speicherung in Datenbank) Beispielsweise soll für einen einzelnen Mitarbeiter in einer Mitarbeiterdatenbank ein employee-Objekt erstellt werden. Der EJB-Client erzeugt ein EJB-Objekt auf dem Server und arbeitet mit ihm, als wenn es ein lokales Objekt wäre. Hierbei würde ein Entity-Bean verwendet werden. Gruppe SEII03 30 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 3.5.3 Message-Driven Beans Message-driven Beans (MDB) wurden mit der EJB-Spezifikation 2.0 eingeführt. Ein MDB ist ein asynchroner Nachrichtenkonsument für das Java Message Service API (javax.jms.Message). Durch den asynchronen Aufruf erhält man eine zeitliche Entkopplung von Sender und Empfänger. Eine MDB besitzt kein Konversationsgedächtnis und hat keine sichtbare Identität für den Client. Eine Besonderheit besteht darin, dass eine MDB kein Home- oder Remote-Interface besitzt (nur die EJB-Klasse). Die. Kommunikation des Clients mit der Bean erfolgt in diesem Fall über eine javax.jms.Queue oder einen javax jms.Topic . Die Nachrichten können von jeder J2EE-Komponente (Application-Client, EJB, Web-Komponente) gesendet werden. Teilweise gilt das auch für J2EE-fremde Komponenten. In einigen Aspekten ist das Message-Driven Bean mit einem StatelessSession Bean zu vergleichen: - Eine Instanz des Message-Driven Bean enthält keine weder Daten noch Status für einen speziellen Client - Alle Instanzen eines Message-Driven Bean sind gleich: gleiche Nachricht an alle MDB’s, kontinuierliche Nachrichtenverarbeitung durch mehrere MDB’s - Ein einzelnes MDB kann Nachrichten vieler Clients verarbeiten Message-Driven Beans sollten bei folgender Bedingung verwendet werden: Bei synchronem Empfangen vom Nachrichten durch Session- und EntityBeans wird der Empfänger blockiert und dadurch die Server-Kapazität belastet. Um dies zu vermeiden, sollten MDB’s mit asynchronem Nachrichtenempfang verwendet werden. Gruppe SEII03 31 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.16 Zustandsdiagramm eines Message Driven Bean 3.6 Deployment Beim Deployment des EJB, also bei der endgültigen Installation im EJBContainer, generiert der Container automatisch die zugehörigen Implementierungen des Home- und Remote-Interfaces. Zusätzlich wird für jede der beiden Implementierungen noch eine Stubund eine Skeleton-Klasse erzeugt, damit die Implementierungsklassen mit Hilfe von RMI ansprechbar sind. Bei der Kommunikation per RMI muß auf Seite des Clients eine Stub-Klasse vorhanden sein. Eine dazugehörige Skeleton-Klasse liegt auf dem Server. Der Client arbeitet nun mit dem Remote-Objekt, als ob er ein lokales JavaObjekt ansprechen würde. Die Methodenaufrufe werden jedoch vom Stub serialisiert und über das Netzwerk an das entsprechende Skeleton-Objekt gesendet. Dort wird der Methodenaufruf deserialisiert und am RemoteObjekt ausgeführt. Das Ergebnis des Aufrufes wird wiederum von Skeleton serialisiert und an den Stub übermittelt. Dort wird das Ergebnis der Anfrage deserialisiert und an das aufrufende Objekt übergeben. Gruppe SEII03 32 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 3.7 Benutzung von EJB Will ein Client ein Bean auf dem Server erzeugen, benutzt er das Java Naming and Directory Interface (JNDI) zur Lokalisierung des Home Interfaces für die Klasse des EJBs. JNDI ist eine Standard-Erweiterung zu Java und bietet einen globalen Service zu jeglicher Java-Umgebung. Es ermöglicht Java-Programmen die Lokalisierung und Benutzung von Resourcen per Namen sowie die Ermittlung und Analyse von Informationen und Strukuren über diese Resourcen. Das Client-seitige Home-Interface-Object führt einen Remote Method Call (RMI) an den EJB Container aus, der dann eine EJB Component erzeugt. Der Rückgabewert der create()-Methode ist das Remote Interface für die EJB. Der Client kann dann die Methoden des EJBs aufrufen, die an den Container weitergereicht werden. Der Container verzögert typischerweise die Weitergabe der Methode an die EJB Component, da er gleichzeitig noch Fehlerprüfungen vornehmen (z.B. ob EJB Component existent ist) und ggf. Exceptions werfen muß. Das Home Interface enthält auch eine Methode, in der dem Container mitgeteilt wird, wenn ein EJB Component entfernt werden soll. Diese Methode zerstört die Server-seitige Instanz. Beim Versuch, ein zerstörtes EJB anzusprechen, wird eine Exception geworfen. Entitiy Beans haben zusätzliche Finder-Methoden im Home-Interface, um basierend auf dem Primary Key des EJBs einzelne persistente EJBs zu lokalisieren. Gruppe SEII03 33 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.17 Zugriff auf EJB-Komponenten 3.8 Dateiformate J2EE-Applikationen müssen folgende Dateifomate unterstützen: HTML 3.2 / gif / jpg / jar / class (Java Klassen) / XML J2EE-Applikationen sind durch *.ear (Enterprise Archiv) gekennzeichnet. Sie enthalten nach Bedarf Web-Clients (*.war , Web Archiv), Enterprise Beans (*.jar , Java Archiv) und Standalone-Clients (*.jar). DeploymentDeskriptoren sind über mehreren Hierachieebenen hinweg in „META-INF“Verzeichnissen enthalten. *.ear, *.war und *.jar können durch das Java jar-Pack-Tool erzeugt werden. Es ist ein zip-Format mit Beachtung von Gross- und Kleinschreibung. Daher kann z.B. unter Windows ein zip-Packer (nur) zum Entpacken der Archive verwendet werden. Gruppe SEII03 34 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Enterprise Archiv (EAR) File WAR-File JAR-File WAR-File JAR-File WAR-File META-INF Abb.18 EJB-Dateiarchive 4 Beispiel Das folgende Beispiel dient dem praktischen Programmierung von J2EE-Anwendungen: Einstieg in die Es stellt eine einfache Bankanwendung dar, mit deren Hilfe ein EuroGeldbetrag in US-Dollar, japanische Yen und britisches Pfund umgerechnet wird. Mittels eines Web-Client (JSP) wird auf ein Session EJB zur Berechnung zugegriffen. Um das Beispiel einfach zu halten, sind die drei Wechselkurse in diesem EJB gespeichert (keine Verwendung einer Datenbank). 4.1 Entwicklungsschritte Bei der Erstellung von J2EE-Anwendungen können Entwicklungswerkzeuge mit verschiedenem Unterstützungsgrad verwendet werden: Gruppe SEII03 35 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Hierzu gehören Deploytools für Konfigurationsdateien und ServerInstallation (z.B. SUN Deploytool, JAKARTA Ant), Entwicklungsumgebungen mit integriertem EJB-Wizard (z.B. SUN Forte for Java Enterprise Edition) oder Case-Tools für vollständige J2EEApplikationen aus UML ( TOGETHERSOFT Together ControlCenter). Bei diesem Beispiel wurden aus Gründen der Übersichtlichkeit extrem wenig Unterstützungswerkzeuge benutzt. Dies brachte bei der Entwicklung teilweise auch einen Zeitgewinn mit sich. Die einzelnen Entwicklungsschritte im Überblick: • EJB-Klassen erstellen und kompilieren • Web-Client erstellen • Konfigurationsdateien (XML) erstellen • Verzeichnisstruktur erstellen • Archiv-Dateien (jar, war, ear) erstellen • Anwendung auf Applikations-Server installieren und starten Im Folgenden wird nun näher darauf eingegangen. 4.2 EJB-Klassen erstellen und kompilieren Das Beispiel benutzt ein Session-EJB, da dies zunächst einfacher als ein Entity-EJB zu erstellen ist. Es besteht aus der EJB-Klasse, deren Homeund Remoteinterface Es wird die Java-Version 1.3.1 in der Standard- und der Enterpriseversion verwendet (sdk 1.3.1 / sdk 1.3.1ee). Für die Kompilierung müssen die Umgebungsvariablen JAVA_HOME und J2EE_HOME auf die entsprechenden Verzeichnisse verweisen und das Paket sdk1.3.1ee/lib/j2ee.jar im Java-classpath angeben werden. Als Entwicklungsumgebung unter Windows XP wird die frei erhältliche IDE JCreator LE von Xinox Software benutzt (www.jcreator.com). Sie kann aber auch durch jedes andere Verfahren zur Kompilierung ersetzt werden. Gruppe SEII03 36 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 4.2.1 Die EJB-Klasse package converter.ejb; import java.rmi.RemoteException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import java.math.*; public class ConverterBean implements SessionBean { //Exchange Rate: 28.09.2002 , 12:56 BigDecimal yenRate = new BigDecimal("120.1500"); BigDecimal dollarRate = new BigDecimal("1.0233"); BigDecimal poundRate = new BigDecimal("0.628"); public BigDecimal euroToDollar(BigDecimal euros) { return euros.multiply(dollarRate); } public BigDecimal euroToYen(BigDecimal euros) { return euros.multiply(yenRate); } public BigDecimal euroToPound(BigDecimal euros) { return euros.multiply(poundRate); } public ConverterBean() {} public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} } Abb.19 Datei ConverterBean.java Die package-Angabe ist für die spätere Verzeichnisstruktur der jar- und war-packages (siehe 4.5) nötig. Die Importanweisungen für EJB-Exceptions und Session-Bean Eigenschaften sind ebenso wie die hier nicht definierten VerwaltungsMethoden (Im Container definiert, überladen möglich) durch den J2EEStandard vorgeschrieben. Auch wird eine Klassenbenennung empfohlen: EJB-Klassen als „KlasseBean“, Homeinterface als „KlasseHome“ und Remoteinterface als „Klasse“. Gruppe SEII03 37 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Die Business-Methoden im Beispiel erfordern java.math.* wegen des Datentyps BigDecimal (siehe auch JSP-Client x.x.x). Die Konvertierungsraten und –Methoden stellen die Businesslogik in diesem EJB dar. 4.2.2 Das Remote-Interface package converter.ejb; import javax.ejb.EJBObject; import java.rmi.RemoteException; import java.math.*; public interface Converter extends EJBObject { public BigDecimal euroToDollar(BigDecimal dollars) throws RemoteException; public BigDecimal euroToYen(BigDecimal yen) throws RemoteException; public BigDecimal euroToPound(BigDecimal yen) throws RemoteException; } Abb.20 Datei Converter.java Hier werden nur die Deklarationen der Business-Methoden des EJB mitsamt RemoteExceptions angegeben (als Interface). Die Package-Angabe dient der EJB-Verwaltung und die ImportAnweisungen sind bis auf java.math.* durch J2EE vorgegeben. 4.2.3 Das Home-Interface package converter.ejb; import java.io.Serializable; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface ConverterHome extends EJBHome { Converter create() throws RemoteException, CreateException; } Abb.21 Datei ConverterHome.java Gruppe SEII03 38 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Hier werden nur die Deklarationen der Verwaltungs-Methoden des EJB mitsamt Exceptions angegeben (als Interface). Die Package-Angabe dient der EJB-Verwaltung und die Import-Anweisungen sind bis auf java.math.* durch J2EE vorgegeben. 4.3 Web-Client erstellen <%@page <%@page <%@page <%@page <%@page <%@page import="converter.ejb.*"%> import="javax.naming.*"%> import="javax.rmi.PortableRemoteObject"%> import="java.rmi.RemoteException"%> import="javax.ejb.*"%> import="java.math.*"%> <%! private Converter converter = null; public void jspInit() { try { Context ic = new InitialContext(); Object objRef = ic.lookup("converter/MyConverter"); ConverterHome home = (ConverterHome) PortableRemoteObject.narrow (objRef, ConverterHome.class); converter = home.create(); } catch (RemoteException ex) { System.out.println("Couldn't create converter bean."+ ex.getMessage()); } catch (CreateException ex) { System.out.println("Couldn't create converter bean."+ ex.getMessage()); } catch (NamingException ex) { System.out.println("Unable to lookup home: "+ "TheConverter "+ ex.getMessage()); } } public void jspDestroy() { converter = null; } %> Abb.22 Datei Index.jsp (Teil1) Gruppe SEII03 39 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans In der JSP wird zunächst eine Verbindung zum EJB aufgebaut ( jspInit() ): • Holen eines neuen Context: Context ic = new InitialContext() • Suchen des EJB über JNDI: Object objRef = ic.lookup ("converter/ MyConverter") ; Der Name „converter/ MyConverter“ wird später im Deployment-Descriptor festgelegt. • Holen des Home-Interfaces über das PortableRemoteObject: ConverterHome home = (ConverterHome) PortableRemote Object.narrow (objRef, ConverterHome.class) • Erstellen des EJB mittels Home-Interfaces: converter = home.create() ; Rückgabeobjekt ist das Remote-Interface <html> <head> <title>Converter</title> </head> <body> <bgcolor="white"> <h1><b><center></center></b></h1> <hr> <p>Enter Euro-amount to convert:</p> <form method="get"> <input type="text" name="amount" size="25"> <br> <p> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </form> <% String amount = request.getParameter("amount"); if ( amount != null && amount.length() > 0 ) { BigDecimal d = new BigDecimal(amount) ; %> <p> <%= amount %> Euro are <p> <p> US-Dollar : <%= converter.euroToDollar(d) %> <p> Japanese Yen : <%= converter.euroToYen(d) %> <p> British Pound: <%= converter.euroToPound(d) %> </body> </html> Abb.23 Datei Index.jsp (Teil2) Gruppe SEII03 40 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Nun kann die Logik der JSP auch die Methoden des EJB ansprechen: 4.4 • Übernahme des URL-Parameter: String amount = request.getParameter("amount") • Konvertierung des Parameters: BigDecimal d = new BigDecimal(amount) • Aufruf der Methoden des Remote-Interfaces: converter.euroToDollar(d) Konfigurationsdateien erstellen Konfigurationsdateien (DTD in XML) werden auch BereitstellungsDeskriptoren oder Deployment-Deskriptoren genannt. Sie enthalten in dieser Beispielanwendung nur die nötigsten XML-Tags. Auch hier wird aus Gründen der Übersichtlichkeit nur wenig Hilfswerkzeuge verwendet. Wichtig ist hierbei u.a. die korrekte Gross-/Kleinschreibung. Die nötigen Konfigurationsdateien sind nur zum Teil nach j2EE standardisiert und werden durch spezielle Dateien des verwendeten Applikationsservers ergänzt. Zu den allgemeingültigen Dateien gehören: • web.xml zur Beschreibung des Web-Bestandteiles der Applikation und der Startseite in Web • ejb-jar.xml zur Beschreibung der EJB’s inklusive deren Interfaces • application.xml zu Beschreibung der Web-, EJB- und JavaBestandteile der vollständigen Anwendung Gruppe SEII03 41 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans <?xml version="1.0"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <display-name>Converter Application</display-name> <description> This is a Currency Exchange Example to demonstrate EJB programming It was written Alexander Kubicki </description> <context-param> <param-name>appname</param-name> <param-value>Converter</param-value> <description> The name of this application. </description> </context-param> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> Abb.24 Datei web.xml Die Angabe des DOCTYPE ist hier wegen Java zwingend erforderlich. Die welcome-file-list stellt die Startseiten des Web-Client dar. <?xml version="1.0"?> <ejb-jar> <enterprise-beans> <session> <ejb-name>TheConverter</ejb-name> <home>converter.ejb.ConverterHome</home> <remote>converter.ejb.Converter</remote> <ejb-class>converter.ejb.ConverterBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> Abb.25 Datei ejb-jar.xml Gruppe SEII03 42 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Hier werden die Bestandteile und Eigenschaften aller EJB’s angegeben. Die Pfadnamen müssen mit den Klassennamen (im Package converter.ejb) und der Verzeichnisstruktur (siehe 4.5 ) übereinstimmen. Eine Entity-EJB würde hier eine eigene Sektion und zusätzliche XML-Tags besitzen. <?xml version="1.0"?> <application> <display-name>ConverterApp</display-name> <description>Simple Bank Application</description> <module> <web> <web-uri>converter.war</web-uri> <context-root>converter</context-root> </web> </module> <module> <ejb>converter.jar</ejb> </module> </application> Abb.26 Datei application.xml Auf höchster Ebene werden hier die Namen der einzenen Archiv-Dateien angegeben, deren Endungen durch J2EE vorgegeben sind. Der in diesem Beispiel verwendete und frei erhältliche Applikations-Server JBoss 2.4.6 verwendet folgende Server-spezifische Konfigurationsdateien: • jboss.xml zur Angabe von Namen für JNDI- und VerzeichnisReferenzierung • jaws.xml zum Mapping von EJB-Datentypen auf Datentypen der Datenbank (nur bei Entity-EJB, hier nicht benötigt) • jboss-web.xml für ergänzende und serverspezifische Angaben zur web.xml (hier nicht verwendet) Gruppe SEII03 43 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans <?xml version="1.0"?> <jboss> <enterprise-beans> <session> <ejb-name>TheConverter</ejb-name> <jndi-name>converter/MyConverter</jndi-name> </session> </enterprise-beans> </jboss> Abb.27 Datei jboss.xml Hier werden die Bezeichnungen angegeben, unter denen ein Client das EJB via JNDI ansprechen kann (siehe 4.3) 4.5 Verzeichnisstruktur erstellen Im nachfolgenden Schritt müssen die Archiv-Dateien (*.war,*.jar,*.ear) gemäss der J2EE-Spezifikation erstellt werden. Auch dabei sollen keine Hilfswerkzeuge wie deploytool oder Ant zu Einsatz kommen. Deswegen wird nun eine Verzeichnishierachie erstellt, die später gepackt werden kann. Die bereits erstellten Dateien werden in die entsprechenden Verzeichnisse eingefügt (wie in den XML-Dateien angegeben). Gruppe SEII03 44 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.28 Verzeichnisbaum 4.6 Archiv-Dateien erstellen Nach J2EE-Spezifikation müssen mit dem Java-Archiv-Tool JAR drei Archiv-Dateien erstellt werden: • converter.war für den Web-Client (web archiv) • converter.jar für das EJB (java archiv) • converter.ear für die vollständige J2EE Applikation (enterprise archiv) Die Verzeichnisse und Dateien werden auf der Kommandozeile wie folgt komprimiert: 1) Im WAR-Verzeichnis: jar cvf converter.war *.* 2) Datei converter.war ins EAR-Verzeichnis kopieren 3) Im JAR-Verzeichnis: jar cvf converter.jar *.* 4) Datei converter.jar ins EAR-Verzeichnis kopieren 5) Im EAR-Verzeichnis: jar cvf converter.ear *.* Gruppe SEII03 45 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 4.7 Anwendung auf Applikations-Server installieren und starten Die zuletzt erstellte Datei converter.ear stellt die komplette J2EEApplikation dar und muss auf dem verwendeten Applikationsserver installiert werden. Bei einigen Servern muss hierzu ein eigenes Werkzeug verwendet werden (z.B. Bea Web Logic). Der in diesem Beispiel verwendete freie Applikationsserver JBOSS bietet einen praktischen Automatismus (AutoDeploy): Die fehlerfreie J2EE-Anwendung, also die Datei converter.ear, muss nur in ein spezielles deploy-Verzeichnis eingefügt werden. Der Server entpackt und installiert die Datei selbstständig. Ab der Version 3.0 erstellt JBoss automatisch auch praktische Web-Clients für die Administration der EJB’s Zum Starten der Anwendung in diesem Beispiel mit lokaler JBoss 2.4.6-Installation wird folgende WEB-URL aufgerufen: http://localhost:8081/converter Hierbei gilt zu beachten: • Fast jeder Applikationsserver verwendet standardmässig andere Portnummern, die aber individuell angepasst werden können (hier 8081 statt 8080) • Jeder Applikationsserver verwendet für Applikationen sowie Server-Verwaltung zwei verschiedene Portnummern Gruppe SEII03 46 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.29 Screenshot EJB-Beispiel 5 Ausblick Wie in 3.3 dargestellt, wird das J2EE-Framework von SUN zur WebServices-Technologie erweitert (SUN ONE). Zusätzlich wird auch der Zugriff von und zu Microsoft .net ermöglicht. Im Vergleich zu verteilten Web-Anwendungen wie EJB mittels J2EE werden mit Web Services die bisher nur intern verwendeten Dienste von EJB-, CORBA- oder DCOM- Komponenten nach außen bekannt und nutzbar gemacht. Web Services werden über XML-Dokumente (Extensible Markup Language) in WSDL (Web Services Definition Language) beschrieben. Damit wird in zentralen Datenbanken ein UDDI-Verzeichnis (Universal Description, Discovery and Integration) der verfügbaren Dienste aufgebaut. Durch WSDL werden die Mechanismen früherer Standards zum Datenaustausch, wie etwa bei COM und RPC ersetzt. Das Protokoll SOAP (Simple Object Access Protocol) basiert auf XML und ersetzt die proprietären Spezifikationen und Protokolle aus der CORBA-, DCOModer RMI-Welt. Gruppe SEII03 47 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.30 Web-Services Ein stateless Session Bean, BookCatalog EJB, benutzt JAX-RPC um den Preis eines Buches in einem .net Web-Service zu ermitteln. Dieser verarbeitet die SOAP-Nachricht und sendet eine Antwort an eine Hilfsklasse. Sie extrahiert das Ergebnis aus der SOAP-Nachricht und gibt es an den Client zurück. Gruppe SEII03 48 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 6 Fragen und Antworten 1. Nennen Sie 3 wichtige J2EE-APIs o Enterprise Java Beans (EJB) o Remote Method Invocation (RMI) o Java Naming and Directory Interface (JNDI) 2. Nennen Sie die EJB-Typen ggf. Ihre Unterteilung o Session-Bean (stateful und stateless) o Entity-Bean (Container Managed und Bean Managed) o Message-Driven-Bean 3. Nennen Sie die Bestandteile eines EJB und deren Aufgaben o Home-Interface (Verwaltungmethoden) o RemoteInterface (Businessmethoden) o EJB-Klasse (Implementierung) o Deployment-Deskriptoren (Konfiguration) 4. Wie ist eine Three-Tier-Architecture aufgebaut? Es gibt o Frontend o Business-Logik o Datenbank 5. Welche Schritte zur Benutzung von Enterprise Java Beans sind nötig? 1. Home-Interface des EJB mit JNDI suchen Gruppe SEII03 49 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 2. Server-Objekt mittels Home-Interface erzeugen und Remote-Interface bekommen 3. Business-Methoden des Remote-Interface anwenden 6. Was ist die Hauptaufgabe eines EJB-Containers? o Bereitstellung einer Laufzeitumgebung für EJB Gruppe SEII03 50 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans 7 Quellenverzeichnis Besel, Ulrich, Menzel, Martin, Multerer, Klaus, Studienarbeit zur Vorlesung Software-Engineering II: Software-Komponenten-Modelle ActiveX, JavaBeans,Enterprise JavaBeans, Fachhochschule München Fachbereich Informatik, 2001 Haefel, Monson, Monson-Haefel's Guide to Enterprise JavaBeans EJB 2.1 Web Services: Part1, URL: http://theserverside.com/resources/ (26.08.2002, 17:35 MEZ) Haefel, Monson, Monson-Haefel's Guide to Enterprise JavaBeans What’s new in EJB 2.1, URL: http://theserverside.com/resources/ (26.08.2002, 17:35 MEZ) Humbold, Stefan, Lamprechter, Christian, Kalter, Guido, Studienarbeit zur Vorlesung Software-Engineering II: Komponentenmodelle: Enterprise JavaBeans (EJB), Fachhochschule München Fachbereich Informatik, 2000 Krechowezki, Oleg, Studienarbeit zur Vorlesung SoftwareEngineering II: J2EE Application Server, Fachhochschule München Fachbereich Informatik, 2001 Kubicki, Alexander, Bericht des 2. Praktischen Studiensemesters Informatik, Fraunhofer-Institut für Experimentelles Software Engineering, Kaiserslautern, 2002 Miciecki, Christian, Sempruch, Rafael, Sperl, Roland, Studienarbeit zur Vorlesung Software-Engineering II: Komponentenmodelle: JavaBeans und Enterprise JavaBeans, Fachhochschule München Fachbereich Informatik, 2000 Sun Microsystems, Enterprise Java Beans Specification, Version 2.1, , URL: http://java.sun.com/products/ejb [pdf Format] (26.08.2002, 17:40 MEZ) Sun Microsystems, The J2EE Tutorial, A beginner's guide to developing enterprise applications on the Java 2 Platform, Enterprise Edition SDK version 1.3, Date 9/17/01 , URL: http://java.sun.com/j2eetutorial/index.html (26.08.2002, 17:40 MEZ) Sun Microsystems, Java 2 Platform, Enterprise Edition Specification Version 1.4, , URL: http://java.sun.com/j2ee/docs.html [pdf Format] (26.08.2002, 17:40 MEZ) Gruppe SEII03 51 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Turau, Volker, Java Server Pages und J2EE: unternehmensweite Web-basierte Anwendungen, dpunkt Verlag, Heidelberg, 2001 Willax, Theodor, Wulf, Marten, Zielinski, Stefan, Studienarbeit zur Vorlesung Software-Engineering II: Enterprise Java Beans, Fachhochschule München Fachbereich Informatik, 2002 Wutka, Mark, J2EE Developer’s Guide (dt.): JSP,Servlets, EJB 2.0, JNDI, JMS, JDBC, Corba, XML, RMI, Markt+Technik Verlag,München 2002 8 Abbildungsverzeichnis Abb.1: Zwei-Schichten-Architektur 8 Abb.2: Three-Tiers-Architecture 9 Abb.3 n-Tiers-Architecture 9 Abb.4 Drei-Schichtenmodell 10 Abb.5 Beziehungen im Drei-Schichtenmodell 11 Abb.5 Architektur einer EJB-Anwendung 12 Abb.6 Entwicklerrollen 14 Abb.7 Remote Method Invocation 15 Abb.8 EJB verwendet Web-Service 19 Abb.9 Web-Service verwendet EJB 20 Abb.10 Vererbungsbeziehungen von Home- und Remote-Interface 22 Abb.11 EJB-Typen 23 Abb.12 Vererbungsbeziehungen der EJB-Interfaces 24 Abb.13 Zustandsdiagramm eines Stateless Session Bean 26 Abb.14 Zustandsdiagramm eines Stateful Session Bean 27 Abb.15 Zustandsdiagramm eines Entity Bean 29 Abb.16 Zustandsdiagramm eines Message Driven Bean 32 Abb.17 Zugriff auf EJB-Komponenten 34 Abb.18 EJB-Dateiarchive 35 Abb.19 Datei ConverterBean.java 37 Gruppe SEII03 52 Fachhochschule München – Software Engineering II Komponentenmodelle : Enterprise Java Beans Abb.20 Datei Converter.java 38 Abb.21 Datei ConverterHome.java 38 Abb.22 Datei Index.jsp (Teil1) 39 Abb.23 Datei Index.jsp (Teil2) 40 Abb.24 Datei web.xml 42 Abb.25 Datei ejb-jar.xml 42 Abb.26 Datei application.xml 43 Abb.27 Datei jboss.xml 44 Abb.28 Verzeichnisbaum 45 Abb.29 Screenshot EJB-Beispiel 47 Abb.30 Web-Services 48 Gruppe SEII03 53