Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Java 2 Enterprise Edition (J2EE) Sascha Baumeister Software Architect Specification Lead JSR086 IBM Deutschland Entwicklung GmbH

Ähnliche Präsentationen


Präsentation zum Thema: "Java 2 Enterprise Edition (J2EE) Sascha Baumeister Software Architect Specification Lead JSR086 IBM Deutschland Entwicklung GmbH"—  Präsentation transkript:

1 Java 2 Enterprise Edition (J2EE) Sascha Baumeister Software Architect Specification Lead JSR086 IBM Deutschland Entwicklung GmbH

2 Teil II – Java Servlet API Refresh Teil I Servlets Container Deployment

3 Projekt baBay Entwicklung einer Web-Site zum Versteigern von Artikeln. Funktion und Grob-Design wird vorgegeben. Einstellen von Auktions-Artikeln, Bieten für Artikel, Darstellung des Ausgangs einer Auktion. Bestanden haben alle, die am Ende eine funktionsfähige Site vorweisen können.

4 Refresh Teil I Model-View-Controller Programmiermodelle Java Community Process J2EE Positionierung

5 Hello World Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().println(" Hello World "); response.getWriter().println(" Diese Ausgabe wurde durch ein Java Servlet generiert! "); } Request URL: :8080/samples/servlet/com.ibm.ba.HelloWorldServlet Superklasse aller HTTP Servlets Mutter aller Service-Methoden, es gibt noch andere. Es gibt kein main() in J2EE! MimeType setzen (optional) Nutzdaten generieren

6 Basics Servlets erben direkt oder indirekt von javax.servlet.GenericServlet bzw javax.servlet.http.HttpServlet Ein Servlet muß eine oder mehrere Service-Methoden implementieren und einen public Default-Konstruktor bereitstellen. Der Service-Parameter request beinhaltet alle Objekte, die mit einem HTTP Request übertragen werden. Der Service-Parameter response beinhaltet alle Objekte, die für die Generierung eines HTTP Response benötigt werden.

7 Servlet Übersicht java.lang.Object javax.servlet.GenericServlet javax.servlet.http.HttpServlet Servlet1Servlet2 Servlet3 Servlet4 init() service(...) doGet(...) doPost(...)...

8 J2EE Container Servlets laufen in spezielle Java Virtual Machines (JVM), sogenannten Servlet- oder J2EE Containern. Servlet bzw. J2EE Container sind austauschbar und entsprechen dem J2EE Standard. Sie unterschieden sich durch Leistungsmerkmale wie Performance, Stabilität, Preis. Ihre Programmierschnittstelle ist identisch! Beispiele für Servlet- bzw J2EE Container sind TomCat (Open Source), IBM WebSphere Application Server, BEA Server. Das Installieren eines Servlets in einen Container nennt man Deployment.

9 Echo Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class EchoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String text = request.getParameter("text"); response.setContentType("text/html"); response.getWriter().println(" Echo "); response.getWriter().print(" "); response.getWriter().print(text == null ? "foo!" : text); response.getWriter().println(" "); } Request URL: :8080/samples/servlet/com.ibm.ba.EchoServlet?text= URL-Parameter abfragen URL-Parameter können den Wert null haben! Bearbeitet nur HTTP Get-Requests

10 URL Parameter Syntax: url?name1=wert1&...&nameN=wertN Werden in realen Anwendungen oft für Basis-Parameter verwendet, wie zum Beispiel Sprache oder Identität. Vorteil: Sehr einfache Art Parameter an ein Servlet zu übergeben. Nachteile: Die maximale Länge einer URL ist begrenzt, und nicht jedes Zeichen ist in einer URL verwendbar!

11 Chat Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class ChatServlet extends HttpServlet { private static StringBuffer buffer = new StringBuffer(); public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String text = request.getParameter("text"); buffer.append(name + ": " + text + " "); response.setContentType("text/html"); response.getWriter().print(buffer.toString()); } Request URL: :8080/samples/servlet/com.ibm.ba.ChatServlet?name= &text= Keine gute Idee!

12 J2EE Container Servlet-Instanzen werden HTTP-Requests vom J2EE- Container zugeteilt, daher kann State-Information nicht wie üblich in eigenen Instanzvariablen abgelegt werden! Aus dem gleichen Grund werden vom J2EE Container bei der Instantiierung von Servlets nur Default-Konstruktoren verwendet! Container Servlet3Servlet2 Servlet1

13 Virtuelle J2EE Container Servlets können über mehrere Prozesse skaliert sein, daher ist die Verwendung von statischer Zustands-Information ebenfalls eingeschränkt! Container 1 Container 2Container 3 Lastbasierter URL Redirector Virtueller Container Servlet3 Servlet2 Servlet1 Servlet4 Servlet2 Servlet1Servlet2 Servlet3 Servlet4

14 Problem Wie kann Zustands- oder Session-Information in Servlets abgelegt werden? Servlet1 Servlet2 Browser Request Response Request Response

15 Lösung Session-Context Information kann als URL-Parameter in generierten HTML-Seiten encodiert werden. Diese Methode funktioniert immer! Session-Context Information kann ebenfalls im Session- Context des Request-Objekts abgelegt werden. Diese Methode ist zwar theoretisch sauberer, funktioniert jedoch nur im Applikations-Context, und auch dort nicht immer Cookie-Problematik! Alle andere Arten von Information sollten persistent gemacht werden, zum Beispiel in einer relationalen Datenbank.

16 MP3 Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MP3Servlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { byte[] buffer = new byte[0x10000]; String filename = request.getParameter(name"); InputStream inputStream = new FileInputStream("E:/Audio/MP3/" + filename + ".mp3"); response.setContentType("audio/mp3"); int bytesRead = inputStream.read(buffer); while (bytesRead != -1) { response.getOutputStream().write(buffer, 0, bytesRead); bytesRead = inputStream.read(buffer); } Request URL: :8080/samples/servlet/MP3Servlet?name= Was passiert wenn das File nicht existiert? Nicht gerade praktisch! Wo ist der Packagename?

17 Exceptions Interne IOExceptions und ServletExceptions können normalerweise nicht behandelt werden, da die Ausgabe einer HTML Fehlerseite nicht mehr möglich ist Log Normale IOExceptions und alle anderen Exceptions (inlusive RuntimeExceptions und Errors) sollten dem Anwender gemeldet werden Log + HTML Fehlerseite In der Praxis ist es üblich in jeder Service-Methode mindestens einen try/catch Block unterzubringen.

18 Konfiguration Konfigurations-Information wird aus einem Servlet über die Methode getServletConfig() abgefragt. Die Konfigurations-Information selbst wird als Name/Wert Paare in einer Datei namens web.xml abgelegt: samples MP3Servlet com.ibm.ba.MP3Servlet mount E:/Audio/MP3/

19 WAR Files Ein WAR-File ist ein JAR/ZIP-File mit einer spezifischen Verzeichnis-Struktur. Alle für Servlets relevanten Files werden in solche WAR-Files verpackt.WAR-Files stellen eine Art Install-File für Servlet-basierte Web- Anwendungen dar! Der Ordner /WEB_INF/classes ist Root für alle applikations-spezifischen Java Class-Files und zugehörige Package-Ordner Der Ordner /WEB_INF enthält das Konfigurations-File web.xml Im einfachsten Fall wird ein WAR-File in einen Container deployed indem das File in einen vorbestimmten Ordner kopiert wird TomCat.

20 Ausblick Die Generierung von HTML in Java ist selbst bei geringen Anforderungen nicht praktikabel View (JSPs) Jede reale J2EE Anwendung wird Daten persistent speichern wollen Model (JDBC, EJBs) Servlets übernehmen in realen Anwendungen nur die Steuerung Controller

21 Teil III – JNDI / JDBC / JSP Refresh Teil II Java Naming and Directory Interface (JNDI) Java Database Connectivity (JDBC) Java ServerPages (JSP)

22 Refresh Teil II Grundlagen Web Technologie Servlets Container

23 Force-Load Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class ForceLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().print( ); response.getWriter().print(function load() {this.location =´ + request.getParameter(url") + ´;}); response.getWriter().println( ); } Request URL: :8080/samples/servlet/ForceReloadServlet?url=

24 JNDI Das Java Naming and Directory API (JNDI) dient zum Zugriff auf benamte und üblicherweise hierarchische Information Model, hierarchische Datenbestände JNDI ist Teil von J2SE, da das API für alle Programmiermodelle geeignet ist. Wird hauptsächlich für Konfigurationsinformation verwendet, die über eine Installationseinheit hinaus sichtbar sein soll JNDI-Information wird heute üblicherweise in relationalen Datenbanken persistent gemacht

25 JNDI Übersicht java.naming.InitialContext java.naming.Context verwaltet Root-Context Sub-Context java.lang.Object Information verwaltet - lookup() - bind() - rebind() - unbind()

26 JNDI Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import javax.naming.*; public class JNDIServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String name = request.getParameter(name"), value = request.getParameter(value"); Context context = new InitialContext(); if (value == null) { value = (String) context.lookup(name); } else { context.rebind(name, value); } response.getWriter().println(" JNDI "); response.getWriter().println(Name: + name + + Value: + value + " "); } catch (NamingException exception) { exception.printStackTrace(response.getWriter()); } Request URL: :8080/samples/servlet/JNDIServlet?name= [&value= ] JNDI erzeugt NamingExceptions Root-Context instantiieren

27 JDBC Java Database Connectivity (JDBC) ist das Basis- API zum Zugriff auf SQL basierte Datenbanken Model, relationale Datenbestände JDBC ist Teil von J2SE, da das API für alle Programmiermodelle geeignet ist. JDBC besteht hauptsächlich aus Interfaces. Hersteller von Datenbanken liefern eine JDBC Implementierung mit aus, die über ein Plug-In Verfahren eingeklinkt wird.

28 JDBC Übersicht javax.sql.DataSourcejava.sql.Connection java.sql.Statement java.sql.PreparedStatement java.sql.CallableStatement java.sql.ResultSet erzeugt Factory für Datenbank-VerbindungenDatenbank-Verbindung SQL-Statement Virtuelle Tabelle

29 javax.sql.DataSource Repräsentiert eine Factory für Datenbank-Verbindungen Instanzen werden über JNDI konfiguriert und abgefragt Pooled DataSources erlauben das transparente Vorhalten von Datenbank-Verbindungen Connection-Pooling XA DataSources unterstützen zusätzlich das 2-Phase- Commit Protokoll Resource-Manager Das Interface löst die Klasse java.sql.DriverManager ab, da diese für das zentrische Programmiermodell ungeeignet ist Connection-Pooling ist essentiell für J2EE!

30 java.sql.Connection Repräsentiert eine Factory für Datenbank-Verbindungen Protokoll-Verbindung Das Erzeugen einer Datenbank-Verbindung ist teuer Connection-Pooling! Ein J2EE Container kann gleichzeitig sowohl multiple Verbindungen zu verschiedenen Datenbanken vorhalten, als auch multiple Verbindungen zur gleichen Datenbank mit eventuell unterschiedlichen Eigenschaften

31 java.sql.Statement Instanzen dieses Interfaces repräsentieren SQL-Befehle Direkte Instanzen dieses Interfaces sind darauf ausgelegt bei jedem Datenbank-Zugriff unterschiedliche SQL- Befehle abzusetzen dynamisches SQL Query-Zugriffe geben virtuelle Tabellen als Ergebnis zurück, Update/Insert/Delete-Zugriffe geben die Anzahl der modifizierten Tabellenzeilen zurück. Jede Instanz dieses Interfaces kann zu einer Zeit nur für einen Datenbank-Zugriff verwendet werden! Zur Laufzeit-Optimierung ist asynchrone Stapelverarbeitung von SQL-Befehlen möglich

32 java.sql.PreparedStatement Direkte Instanzen dieses Interfaces sind darauf ausgelegt den gleichen SQL-Befehl mehrfach hintereinander mit verschiedenen Parametern abzusetzen statisches SQL Als Laufzeit-Optimierung in J2EE nur in Verbindung mit applikations-spezifischem Statement-Pooling sinnvoll besser: SQL Stored Procedures verwenden!

33 java.sql.CallableStatement Instanzen dieses Interfaces sind für den Aufruf von SQL Stored Procedures ausgelegt Vorteil: SQL Stored Procedures erlauben massive Laufzeitgewinne, sowohl durch datenbankseitige Vorcompilierung von SQL-Befehlen als auch durch automatisch erzeugte und gewartete Redundanzen in der Datenbank-Struktur! Nachteil: SQL Stored Procedures sind wesentlich wartungsintensiver als dynamisches oder statisches SQL!

34 java.sql.ResultSet Repräsentieren virtuelle Tabellen, in denen mittels Cursor navigiert werden kann Erlauben neben der Abfrage von Werten auch Update/Insert/Delete Operationen! ResultSets halten eine aktive Verbindung zu betroffenen Tabellenzeilen in der Datenbank Locking!

35 Query Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import javax.naming.*; import javax.sql.DataSource; import java.sql.*; public class QueryServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { String queryString = request.getParameter(queryString"); Context context = new InitialContext(); DataSource dataSource = (DataSource) context.lookup(this.getServletConfig().getInitParameter(DataSourceName)); Statement statement = dataSource.getConnection().createStatement(); ResultSet resultSet = statement.executeQuery(queryString); ResultSetMetaData metaData = resultSet.getMetaData(); while (resultSet.next()) { response.getWriter().print(Row-Index = + resultSet.getRow()); for (int index = 0; index < metaData.getColumnCount(); index++) response.getWriter().print(, + metaData.getColumnLabel(index) + = + resultSet.getString(index)); response.getWriter().println( ); } } catch (Throwable exception) exception.printStackTrace(response.getWriter()); } Request URL: :8080/samples/servlet/QueryServlet?queryString= DataSource über JNDI abfragen SQL query absetzen Connection & Statement erzeugen Daten und Meta-Daten abfragen

36 JDBC Grundregeln Das Vorhalten von Datenbank-Verbindungen sollte immer der DataSource überlassen werden Skalieren über Konfiguration, nicht über Code! Erst Verwendung von dynamischem SQL, dann Optimierung von kritischen SQL-Befehlen mittels SQL Stored Procedures! Stapelverarbeitung von SQL-Befehlen ist im zentrischen Programmiermodell immer aufwendig! Update/Insert/Delete Operationen sollten wegen des impliziten Lockings immer über ResultSets abgesetzt werden, nie über SQL-Befehle!

37 JSP Java ServerPages (JSP) ist eine Erweiterung von HTML für das Design von dynamischen Web- Seiten View JSP-Seiten bestehen aus standard HTML, JSP Direktiven, JSP Scripting, und JSP Aktionen JSPs werden mittels eines JSP-Compilers in Java Servlets übersetzt verkehrte Servlets

38 Wichtigste JSP Direktiven JSP Direktiven teilen dem JSP-Compiler für die Übersetzungsphase relevante Information mit. Syntax: Die Page-Direktive teilt dem JSP-Compiler Meta- Information über die JSP-Seite mit: Threadsicherheit, Servlet-Superklasse, etc. Die TagLib-Direktive erlaubt die Verwendung von benutzerdefinierten Tags in einer JSP-Seite Die Include-Direktive weist den JSP-Compiler an den Inhalt eines Files in das zu generierende Servlet aufzunehmen.

39 JSP Direktiven - Beispiel JSP Direktiven

40 JSP Scripting JSP Scripting erlaubt die direkte Verbindung von Java Code mit HTML Deklarationen deklarieren Methoden und Variablen für das zu generierende Servlet Syntax: Scriptlets sind Java-Codefragmente, die der JSP Compiler in die Service-Methode des zu generierenden Servlets einbauen soll Syntax: Expressions sind Java-Ausdrücke, deren Evaluierungs- Ergebnis der JSP Compiler in das zu generierenden Servlet einbauen soll Syntax:

41 JSP Scripting - Beispiel JSP Scripting Millisekunden seit 1970: Vielfache von 3:.Vielfaches: zur Laufzeit Evaluierungs- Ergebnis in HTML einfügen Definition einer Servlet-Methode Iteration Aufruf der neuen Servlet-Methode

42 JSP Aktionen JSP Aktionen sind Tags, die in Java-Code übersetzt werden und ähnlich wie Scriptlets/Expressions in die Service-Methode des zu generierenden Servlets einfließen Standard Aktionen werden von jedem JSP Compiler ünterstützt, benutzerdefinierte Aktionen sind über die Include-Direktive einbindbar Sobald Standard Aktionen ausgereift sind sollten JSP- Entwickler nur noch JSP Direktiven und JSP Aktionen benötigen, jedoch kein JSP Scripting! JSR 052 definiert eine neue Standard Tag Library für JSPs, die Spezifikation ist zur Zeit als Proposed Final Draft verfügbar.

43 Wichtigste Standard Aktionen Die Aktion assoziiert ein neues oder übergebenes Java-Objekt mit einem Namen Die Aktion liest ein Property aus einem Java-Objekt aus, konvertiert es in einen String und fügt das Ergebnis in die HTML-Ausgabe ein Die Aktion modifiziert ein Property aus einem Java-Objekt aus, indem es den gegebenen String in den passenden Java-Typ konvertiert Es gibt bis heute keine (verabschiedeten) Standard-Tags zum Zugriff auf Arrays oder Collections, dafür aber Standard-Tags zum Einbinden von Servlets oder JSPs. Häufig fundamentales Mißvertändnis der J2EE Architektur mit kritischen Folgen für die Wartbarkeit!

44 JSP Aktionen - Beispiel JSP Aktionen Stunde: Minute: Sekunde:

45 ViewBeans ViewBeans sind benutzerdefinierte Java-Klassen, die dem JavaBean Layout entsprechen ViewBeans sollten nur Properties besitzen, die Java Basis- Typen oder Strings sind leichte Konvertierbarkeit für JSP Aktionen! ViewBeans werden aus Modell-Daten erzeugt, Exceptions beim Konvertieren werden in Servlets bearbeitet ViewBeans werden JSPs zur Darstellung/Modifikation übergeben Komponenten-Vertrag zwischen Servlets und JSPs

46 Applikations-Architektur Servlet rufe Model Model - View - Controller JNDI JDBC JSP rufe View, übergebe ViewBeans Datenbank-Modellierer Web-Designer J2EE-Entwickler erzeuge ViewBeans

47 Beispiel - JSP Artikel-Details Name: Bestand: File: jsp/ArtikelView.jsp wichtig bei Übergabe von ViewBeans an JSPs unter diesem Namen muß ein Servlet das ViewBean übergeben

48 Beispiel - ViewBean package com.ibm.ba; public class ArtikelViewBean { private final String name; private final int quantity; public ArtikelViewBean(String name, int quantity) { this.name = name; this.quantity = quantity; } public String getName() { return this.name; } public int getQuantity() { return this.quantity; }

49 Beispiel - Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import javax.naming.*; import javax.sql.DataSource;import java.sql.*; public class ArtikelAbfrageServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { String artikelName = request.getParameter("name"); Context context = new InitialContext(); DataSource dataSource = (DataSource) context.lookup(this.getServletConfig().getInitParameter("DataSourceName")); Statement statement = dataSource.getConnection().createStatement(); ResultSet resultSet = statement.executeQuery ("SELECT * FROM SBAUMEI.ARTICLE WHERE NAME = '" + artikelName + "'"); resultSet.next(); ArtikelViewBean artikel = new ArtikelViewBean(resultSet.getString("NAME"), resultSet.getInt("QUANTITY")); request.getSession(true).setAttribute("artikel", artikel); this.getServletConfig().getServletContext().getRequestDispatcher("jsp/ArtikelView.jsp").forward(request, response); } catch (Throwable exception) { exception.printStackTrace(response.getWriter()); } Request URL: :8080/samples/servlet/ArtikelAbfrageServlet?name= im JSP definierter Name das Servlet übergibt das ViewBean im Session-Context, daher scope=session im JSP!

50 Teil IV – Entwicklung Refresh Teil III Entwicklungs-Umgebungen –Kommandozeile –Eclipse –IBM WebSphere Studio Application Developer Container –Tomcat –IBM WebSphere Studio Application Developer –BEA WebLogic –IBM WebSphere Application Server

51 Refresh Teil III JNDI JDBC JSP

52 Entwicklungs-Umgebungen Kommandozeile –Überall verfügbar –Not-Behelf Eclipse –www.eclipse.org –open source –verfügbar für Windows und Linux IBM WebSphere Application Developer –professionelle Entwicklungsumgebung auf Basis von Eclipse –Integrierte J2EE Unterstützung weitere Java Entwicklungs-Umgebungen verfügbar

53 Kommandozeile - Installation Standard Java Development Kit (JDK) –java.sun.com J2EE Standard-Bibliotheken –servlet.jar Servlet API Bibliothek –jndi.jar JNDI API Bibliothek –jdbc.jar JDBC API Bibliothek –xerces.jar Standard XML Bibliothek CLASSPATH –Die Umgebungsvariable CLASSPATH muß um einige dieser JAR-Files erweitert werden

54 Kommandozeile - Prozess Aufbau der J2EE Verzeichnisstruktur –Verzeichnis WEB-INF –Verzeichnis WEB-INF/classes Übersetzung der Klassen in WEB-INF/classes –javac [options] source-file Erstellen der Datei WEB-INF/web.xml –Texteditor Erstellen eines WAR-Files –jar cvf samples.war *.*

55 Eclipse Open Source Projekt IBM-initiiertes Geschenk an die Java-Community Offenes Plug-In Design Perspektiven-Philosophie Quellcode wird beim speichern übersetzt Integrierter Debugger Zum Testen von Servlet/JSP Applikationen geeignet

56 IBM WSAD WebSphere Studio Application Developer Professionelle J2EE-Entwicklungsumgebung Basiert auf Eclipse Integrierte J2EE Unterstützung Integrierter J2EE Container für Test und Debug

57 Tomcat Teil des Apache Jakarta Projekts Referenz-Implementierung für Servlet Container Open Source Projekt Unterstützt Servlets und JSPs

58 BEA WebLogic Professioneller J2EE Container Vor allem bei kleinen und mittelgroßen Firmen beliebt War bis 2001 Marktführer

59 IBM WebSphere Application Server Professioneller J2EE Container Vor allem bei mittleren und großen Firmen beliebt Seit 2002 Marktführer

60 Teil V –EJBs & Servlet Conversations Einführung in Enterprise JavaBeans –Entity Beans –Session Beans –Message Driven Beans Servlet Conversations

61 Enterprise JavaBeans - Definition Die Enterprise JavaBeans Architektur ist eine Komponenten-Architektur für die Entwicklung und das Deployment von komponenten-basierten und verteilten Geschäftsanwendungen. Applikationen die der Enterprise JavaBeans Architektur entsprechen sind skalierbar, transaktional und multi-user secure.

62 Enterprise JavaBeans Enterprise JavaBeans integrieren viele J2EE Aspekte in einer einheitlichen und konsistenten Architektur JDBC, JTA, JMS, IIOP, etc Enterprise JavaBeans sind immer noch in der Entwicklung begriffen. Mit der Verfügbarkeit von EJB 2.0 Containern wird dieses Jahr die erste erwachsene Entwicklungsstufe erreicht.

63 Enterprise JavaBeans Es gibt drei Arten von Enterprise JavaBeans: –Entity Beans modellieren persistente Entitäten im Sinne der relationalen Algebra Model, Business-Objekte –Session Beans modellieren Vorgangsdaten Model, Conversational State –Message Driven Beans modellieren Observer, die auf asynchrone Nachrichten reagieren Model, asynchrone Datenverarbeitung Enterprise JavaBeans existieren in speziellen EJB Containern nicht verwechslen mit Servlet Containern!

64 Entity Beans Kunden-Tabelle Entity Beans lösen den klassischen Konflikt zwischen Datenmodellierung und Objektmodellierung Entity Beans sind persistent und bilden Relationen untereinander. Entity Beans vereinigen Model-Daten mit Geschäfts-Logik Entity Beans sind seit EJB 1.1 Standard und sind seit EJB 2.0 wesentlich erweitert idname straßeort vereinfacht modelliert jedes Entity Bean eine Tabelle einer relationalen Datenbank, und jede Entity Bean Instanz eine Zeile darin.

65 Entity Beans - Beispiel winner 1.. ** * 1winner1 1 picture 1.. * participant 11 poster 1* background material 1* 1 1 video Person MediaEntity EpisodeSeries EmmyAsset EmmyAward Entity-Relationship Diagramme können 1:1 in ein Entity Bean basiertes Objekt- Modell übersetzt werden.

66 Entity Beans - Interfaces Jedes Entity Bean externalisiert sein gesamtes Verhalten über eine Reihe von Interfaces. Home Interfaces definieren die Funktion der Klasse eines Entity Beans, während Instanz-Interfaces die Funktionen der Instanzen externalisieren. Typische Aufgaben für Home Interfaces sind das Erzeugen und Auffinden von Instanzen. Home Interfaces sind Singletons, die über JNDI abgefragt werden. Entity Bean Home Interface Instance Interface localremote localremote

67 Entity Beans - Interfaces Remote Interfaces erlauben den container-übergreifenden Zugriff auf Entity Beans, Local Interfaces dagegen sind auf Zugriffe innerhalb eines Containers beschränkt! Remote Interfaces propagieren Parameter und Resultate als Kopien, lokale Interfaces dagegen als Referenzen! Lokale Interfaces gibt es erst seit EJB 2.0! Remote Home Interface Methoden geben immer die Remote-Sicht auf Instanzen zurück, Local Home Interfaces Methoden immer die lokale Sicht auf Instanzen! Entity Bean Home Interface Instance Interface localremote localremote

68 Entity Beans - Persistenz Die Persistenz von Entity Beans kann auf zwei Arten erreicht werden: –Bean Managed Persistence verlangt Code vom EJB Programmierer zur Persistierung von Entity Beans. Dafür ist diese Methode auf alle Arten von Datenspeichern anwendbar. –Container Managed Persistence verlangt nur ein symbolisches Mapping von Entity Bean Properties auf Datenbankfelder während des EJB Deployments. Dafür ist diese Methode im Normalfall auf relationale Datenbanken beschränkt. Container Managed Persistence sollte bevorzugt verwendet werden, da durch diese Vorgehensweise eine Abstraktion des Anwendungs-Codes von der unterliegenden Datenbank-Struktur erreicht wird!

69 Session Beans Session Beans modellieren nicht-persistente Sitzungen zwischen jeweils einem Client und einem Server Stateful Session Beans vereinfachen das Verwalten von Session-Context Information über viele Servlets hinweg. Der Spezialfall Stateless Session Beans wird oft für Remote-APIs verwendet. Session Beans sind seit EJB 1.0 Standard. Servlet 1Servlet 2 Session Bean Servlet 3 sessionId=42

70 Session Beans - Interfaces Analog zu Entity Beans externalisieren Session Beans Ihr Verhalten in bis zu 4 Interfaces: Remote Home Interface, Local Home Interface, Remote Interface, Local Interface. Home Interfaces definieren die Funktion der Klasse eines Session Beans, während Instanz-Interfaces die Funktionen der Instanzen externalisieren.Typische Aufgaben für Home Interfaces sind das Erzeugen und Auffinden von Instanzen. Home Interfaces sind Singletons, die über JNDI abgefragt werden. Session Bean Home Interface Instance Interface localremote localremote

71 Message Driven Beans Message Driven Beans stellen Konsumenten für asynchrone Nachrichten dar. Message Driven Beans finden überall dort Verwendung wo eine synchrone Informationsverarbeitung nicht möglich oder erwünscht ist Stapelverarbeitung, Workflow Message Driven Beans sind seit EJB 2.0 Standard Da Message Driven Beans nie von Clients direkt referenziert werden, erfüllen alle den gleichen Home und Instance-Interface Kontrakt.

72 Servlet Conversations Servlet Conversations bilden Abläufe zwischen mehreren Servlets/JSPs. HTML Forms werden verwendet um Benutzereingaben entgegenzunehmen. Die Daten stehen wie URL Parameter im Request-Objekt des Nachfolge-Servlets zur Verfügung. URL Parameter und Session Beans sollten verwendet werden um Servlet Context Informationen über mehrere Seiten hinweg zu speichern. ServletJSPHTMLServlet

73 HTML Forms – Vorgänger-JSP Servlet Form Test This form invokes a servlet as its action. Please enter your company's name: What web services does your company need? Web Server Hosting Web Page Design Java Servlets and JSP Development How many people are in your company? 1 to

74 HTML Forms – Nachfolge-Servlet public void doGet ( HttpServletRequest request, HttpServletResponse response ) { String companyname = request.getParameter("companyname"); String numberofpeople = request.getParameter("numberofpeople"); String hosting = request.getParameter("hosting"); String design = request.getParameter("design"); String javadev = request.getParameter("javadev");... }

75 Typische Anwendungs-Struktur Servlet 1Servlet 2Servlet 3 sessionId=42 JSP 1JSP 2JSP 3 Session Bean JDBC Entity Bean 1 Entity Bean 2 Entity Bean 3 Form-Daten

76 Kleine Beispiel-Anwendung Abfragen/Ändern von User-Id und Password Verwendung von Servlets, JSPs, Session Beans, und HTML Forms

77 Teil VI –EJB 1.1 Refresh Teil V Programmierung von Enterprise JavaBeans –Session Beans –Entity Beans –Ejb-JAR Files e-Business Beispiel

78 Externer Session Bean Lifecycle nicht existent und nicht referenziert existent und nicht referenziert nicht existent und referenziert existent und referenziert home.create(...) Referenz freigeben handle.getEJBObject() container crash bean timeout Container Crash Bean Timeout System Exception ejbObject.remove() home.remove(handle) Referenz freigeben NoSuchObjectException Business Logik

79 Interner Session Bean Lifecycle nicht existent bereit create(...) - newInstance() - setSessionContext(sc) - ejbCreate(...) ejbActivate() Time-Out ejbRemove() ejbPassivate()

80 Session Bean Komponenten-Vertrag (Remote) Home Interfaces erben von javax.ejb.EJBHome EJBObject create(...) throws java.rmi.RemoteException, javax.ejb.CreateException (Remote) Instance Interfaces erben von javax.ejb.EJBObject void remove() javax.ejb.Handle getHandle() javax.ejb.EJBHome getEJBHome() Business Methoden - müssen java.rmi.RemoteException deklarieren! Session Bean Implementierungen erben von java.lang.Object Default-Konstruktor void setSessionContext(javax.ejb.SessionContext) javax.ejb.SessionContext getSessionContext() void ejbCreate(...) throws javax.ejb.CreateException void ejbRemove() throws javax.ejb.RemoveException void ejbActivate(), void ejbPassivate() Business Methoden – dürfen nicht java.rmi.RemoteException deklarieren!

81 Session Bean Handles Servlet 1Servlet 2Servlet 3 serialized SB handle JSP 1JSP 2JSP 3 Session Bean JDBC Entity Bean 1 Entity Bean 2 Entity Bean 3 Form-Daten serialized SB handle

82 Session Beans - Zusammenfassung Session Beans leben bis zu einem im EJB-Container einstellbaren Time-Out, bis sie explizit per remove() gelöscht werden, oder aber bis zu einem EJB-Container-Crash Session Bean Instanzen können vom Container temporär in den nicht existent Zustand versetzt (i.e. serialisiert) werden, daher Vorsicht beim Verwenden von transienten Variablen Zustandsbehaftet Session Beans werden verwendet um auf Session Context Information über viele Web-Server hinweg zuzugreifen Handles Stateless Session Beans werden verwendet um APIs remote zugreifbar zu machen Fassade

83 Externer Entity Bean Lifecycle nicht existent und nicht referenziert existent und nicht referenziert nicht existent und referenziert existent und referenziert home.create(...) Referenz freigeben home.find(...) oder handle.getEJBObject() home.remove(Handle) SQL DELETE ejbObject.remove() home.remove(Handle) home.remove(EJBObject) SQL DELETE Referenz freigeben NoSuchObjectException Business Logik SQL INSERT

84 Interner Entity Bean Lifecycle pooledbereit - ejbCreate(...) + ejbPostCreate(...) - ejbActivate() - ejbLoad() - ejbStore() nicht existent newInstance() + setEntityContext(ec) - ejbRemove() - ejbPassivate() ejbFindX(...) unsetEntityContext(ec)

85 Entity Bean Komponenten-Vertrag (Remote) Home Interfaces erben von javax.ejb.EJBHome EJBObject create(...) throws java.rmi.RemoteException, javax.ejb.CreateException EJBObject/Collection findByX(...) throws java.rmi.RemoteException, javax.ejb.FinderException (Remote) Instance Interfaces erben von javax.ejb.EJBObject void remove() javax.ejb.Handle getHandle() javax.ejb.EJBHome getEJBHome() Business Methoden - müssen java.rmi.RemoteException deklarieren! Entity Bean Key Implementierungen erben von java.lang.Object equals(java.lang.Object) implementiert Inhalts-Vergleich, nicht Referenz-Vergleich! hashcode() basiert auf Inhalt, nicht auf Referenz!

86 Entity Bean Komponenten-Vertrag Entity Bean Implementierungen erben von java.lang.Object void setEntityContext(javax.ejb.EntityContext) void unsetEntityContext() Key ejbCreate(...) throws javax.ejb.CreateException void ejbPostCreate(...) throws javax.ejb.CreateException Key/Collection ejbFindX(...) throws javax.ejb.CreateException void ejbRemove() throws javax.ejb.RemoveException void ejbActivate(), void ejbPassivate() void ejbLoad(), void ejbStore() Business Methoden – dürfen nicht java.rmi.RemoteException deklarieren! Entity Bean Zusatzkontrakt für Container Managed Persistence ejbRemove(), ejbLoad() und ejbStore() müssen keine Aktionen enthalten ejbCreate(...) muß nur den Objektzustand initialisieren ejbFindX(...) müssen nicht implementiert werden Mappings werden in Zusatz-Dateien definiert (container-abhängiges Format)

87 Entity Beans - Zusammenfassung Entity Beans leben bis sie explizit per remove() gelöscht werden Entity Bean Instanzen können vom Container temporär in den nicht existent Zustand versetzt (i.e. serialisiert) werden, daher Vorsicht beim Verwenden von transienten Variablen Bei Bean Managed Persistence müssen die ejbCreate(), ejbRemove(), ejbLoad() und ejbStore() Methoden die Persistenz handhaben Bei Container Managed Persistence wird die Persistenz beim Deployment über ein Mapping definiert Bean Managed Persistence und Container Managed Persistence kann gleichzeitig verwand werden

88 EJB-JAR Files Ähnlich wie WAR Files sind EJB-JAR Files JAR/ZIP- Files mit einer spezifischen Verzeichnis-Struktur. Alle für EJBs relevanten Files werden in solche EJB-JAR Files verpackt. EJB-JAR Files stellen eine Art Install-File für EJBs dar! Der Ordner /bin enthält alle applikations-spezifischen Compilate Beim Deployment werden in /bin zusätzliche Klassen generiert Stubs, Skeletons & Ties Der Ordner /ejbModule/META-INF enthält das Konfigurations-File ejb-jar.xml

89 Beispiel e-Business Entity Bean Artikel mit den Attributen identitaet, name und preis Session Bean Einkaufswagen mit einer Liste von Artikel- Identitäten und Stückzahlen Servlet+JSP mit Liste aller Artikel, Möglichkeit per Klick einen Artikel in den Einkaufswagen zu bewegen, und Button zum Verzweigen auf eine zweite Bestellseite Servlet+JSP mit Inhalt des Einkaufswagens zum Bestellen Utility-Servlet zum Initialisieren des Artikel-Bestandes

90 Beispiel e-Business Artikel ServletBestell Servlet serialized SB handle & Form Daten Artikel JSP Bestell JSP Einkaufswagen JDBC Artikel EJB (CMP)


Herunterladen ppt "Java 2 Enterprise Edition (J2EE) Sascha Baumeister Software Architect Specification Lead JSR086 IBM Deutschland Entwicklung GmbH"

Ähnliche Präsentationen


Google-Anzeigen