Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Java 2 Enterprise Edition (J2EE)

Ähnliche Präsentationen


Präsentation zum Thema: "Java 2 Enterprise Edition (J2EE)"—  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("<HTML><HEAD><TITLE>Hello World</TITLE></HEAD>"); response.getWriter().println("<BODY>Diese Ausgabe wurde durch ein Java Servlet generiert!</BODY></HTML>"); } „Mutter“ aller Service-Methoden, es gibt noch andere. Es gibt kein „main()“ in J2EE! Superklasse aller HTTP Servlets MimeType setzen (optional) Nutzdaten generieren Request URL:

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
init() service(...) doGet(...) doPost(...) ... javax.servlet.http.HttpServlet Servlet1 Servlet2 Servlet3 Servlet4

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 Bearbeitet nur HTTP Get-Requests URL-Parameter abfragen
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("<HTML><HEAD><TITLE>Echo</TITLE></HEAD>"); response.getWriter().print("<BODY>"); response.getWriter().print(text == null ? "foo!" : text); response.getWriter().println("</BODY></HTML>"); } Bearbeitet nur HTTP Get-Requests URL-Parameter abfragen URL-Parameter können den Wert null haben! Request URL:

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 Keine gute Idee! 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 + "<p>"); response.setContentType("text/html"); response.getWriter().print(buffer.toString()); } Keine gute Idee! Request URL:

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! Servlet1 Servlet2 Servlet3 Container

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

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

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 Nicht gerade praktisch!
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); } Nicht gerade praktisch! Was passiert wenn das File nicht existiert? Wo ist der Packagename? Request URL:

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: <web-app id="WebApp"> <display-name>samples</display-name> <servlet> <servlet-name>MP3Servlet</servlet-name> <display-name>MP3Servlet</display-name> <servlet-class>com.ibm.ba.MP3Servlet</servlet-class> <init-param> <param-name>mount</param-name> <param-value>E:/Audio/MP3/</param-value> </init-param> </servlet> </web-app>

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(„<HTML><HEAD><SCRIPT>“); response.getWriter().print(„function load() {this.location =´“ + request.getParameter(„url") + „´;}“); response.getWriter().println(„</SCRIPT></HEAD><BODY ONLOAD= ´javascript:load()´></BODY></HTML>“); } Request URL: ); } Request URL: http://:8080/samples/servlet/ForceReloadServlet url=", "width": "800" }

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.lang.Object java.naming.Context
verwaltet Information Sub-Context verwaltet lookup() bind() rebind() unbind() java.naming.InitialContext Root-Context

26 JNDI Servlet Root-Context instantiieren JNDI erzeugt NamingExceptions
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("<HTML><HEAD><TITLE>JNDI</TITLE></HEAD><BODY>"); response.getWriter().println(„Name: „ + name + „<P>“ + „Value: „ + value + "</BODY></HTML>"); } catch (NamingException exception) { exception.printStackTrace(response.getWriter()); } Root-Context instantiieren JNDI erzeugt NamingExceptions Request URL:

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.DataSource java.sql.Connection
erzeugt Factory für Datenbank-Verbindungen Datenbank-Verbindung erzeugt java.sql.Statement SQL-Statement erzeugt java.sql.ResultSet java.sql.PreparedStatement Virtuelle Tabelle java.sql.CallableStatement

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 DataSource über JNDI abfragen
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(„<P>“); } } catch (Throwable exception) exception.printStackTrace(response.getWriter()); DataSource über JNDI abfragen Connection & Statement erzeugen SQL query absetzen Daten und Meta-Daten abfragen Request URL:

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: Direktive %> 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
<HTML> <HEAD> <TITLE>JSP Direktiven</TITLE> page buffer=”none” isThreadSafe=”no” errorPage=”/fehler.jsp” %> </HEAD> <BODY> taglib uri=”http://www.myserver.com/customtags” prefix=”custom” /> include file=”Seiteninhalt.html” %> </BODY> </HTML>

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: <%! Deklaration %> Scriptlets sind Java-Codefragmente, die der JSP Compiler in die Service-Methode des zu generierenden Servlets einbauen soll  Syntax: <% Scriptlet %> Expressions sind Java-Ausdrücke, deren Evaluierungs-Ergebnis der JSP Compiler in das zu generierenden Servlet einbauen soll  Syntax: <%= Expression %>

41 JSP Scripting - Beispiel
<HTML> <HEAD> <TITLE>JSP Scripting</TITLE> </HEAD> <BODY> Millisekunden seit 1970: <%= System.currentTimeMillis() %> <P><P> <%! private int timesThree(int multiplier) { return multiplier * 3; } %> Vielfache von 3: <P> <% for (int index =0; index < 10; index++) { %> <%= index %>.Vielfaches: <%= this.timesThree(index) %> <P> <% } %> </BODY> </HTML> 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 <jsp:useBean> Aktion assoziiert ein neues oder übergebenes Java-Objekt mit einem Namen Die <jsp:getProperty> 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 <jsp:setProperty> 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
<HTML> <HEAD> <TITLE>JSP Aktionen</TITLE> </HEAD> <BODY> <jsp:useBean id=„datum“ class=„java.util.Date“ /> Stunde: <jsp:getProperty name=„datum“ property=„hours“ /> <P> Minute: <jsp:getProperty name=„datum“ property=„minutes“ /> <P> Sekunde: <jsp:getProperty name=„datum“ property=„seconds“ /> <P> </BODY> </HTML>

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
Datenbank-Modellierer J2EE-Entwickler JNDI rufe Model Servlet JDBC erzeuge ViewBeans rufe View, übergebe ViewBeans JSP Web-Designer Model - View - Controller

47 Beispiel - JSP <HTML> <HEAD>
<TITLE>Artikel-Details</TITLE> </HEAD> <BODY> <jsp:useBean id="artikel" class="com.ibm.ba.ArtikelViewBean" scope="session" /> Name: <jsp:getProperty name="artikel" property="name" /> <P> Bestand: <jsp:getProperty name="artikel" property="quantity" /> <P> </BODY> </HTML> unter diesem Namen muß ein Servlet das ViewBean übergeben wichtig bei Übergabe von ViewBeans an JSPs File: jsp/ArtikelView.jsp

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 im JSP definierter Name
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()); } im JSP definierter Name das Servlet übergibt das ViewBean im Session-Context, daher scope=session im JSP! Request URL:

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

51 Refresh Teil III JNDI JDBC JSP

52 Entwicklungs-Umgebungen
Kommandozeile Überall verfügbar Not-Behelf Eclipse 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  http://www.eclipse.org/
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 http://www.bea.com/
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 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 id name straße ort vereinfacht modelliert jedes Entity Bean eine Tabelle einer relationalen Datenbank, und jede Entity Bean Instanz eine Zeile darin. Kunden-Tabelle

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

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. Home Interface local remote Entity Bean Instance Interface local remote

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! Home Interface local remote Entity Bean Instance Interface local remote

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 1 Servlet 2 Servlet 3 sessionId=42 sessionId=42 Session Bean

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. Home Interface local remote Session Bean Instance Interface local remote

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. Servlet JSP HTML Servlet

73 HTML Forms – Vorgänger-JSP
<html> <head> <title>Servlet Form Test</title> </head> <body> <h1><font color="magenta">This form invokes a servlet as its action.</font></h1> <form METHOD=GET ACTION=„http://myserver:8080/samples/FormServlet"> <h4>Please enter your company's name:</h4> <input TYPE="text" NAME="companyname" SIZE="30"> <h4>What web services does your company need?</h4> <p> <br><input TYPE="checkbox" NAME="hosting" CHECKED> Web Server Hosting <br><input TYPE="checkbox" NAME="design" CHECKED> Web Page Design <br><input TYPE="checkbox" NAME="javadev" CHECKED> Java Servlets and JSP Development <h4>How many people are in your company?</h4> <p> <input TYPE="radio" NAME="numberofpeople" VALUE="oneplus"> 1 to 99 <br> <input TYPE="radio" NAME="numberofpeople" VALUE=" hundredplus"> 100+<br> <p><input TYPE="submit" VALUE="Submit Form"> </form> </body> </html>

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
Session Bean sessionId=42 sessionId=42 Servlet 1 Servlet 2 Servlet 3 Form-Daten Form-Daten JSP 1 JSP 2 JSP 3 Entity Bean 1 Entity Bean 2 Entity Bean 3 JDBC

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
NoSuchObjectException nicht existent und nicht referenziert nicht existent und referenziert Referenz freigeben Container Crash Bean Timeout System Exception ejbObject.remove() home.remove(handle) home.create(...) container crash bean timeout existent und nicht referenziert Referenz freigeben existent und referenziert handle.getEJBObject() Business Logik

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

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 Session Bean Servlet 1 Servlet 2 Servlet 3 JSP 1
serialized SB handle serialized SB handle Servlet 1 Servlet 2 Servlet 3 Form-Daten Form-Daten JSP 1 JSP 2 JSP 3 Entity Bean 1 Entity Bean 2 Entity Bean 3 JDBC

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
NoSuchObjectException nicht existent und nicht referenziert nicht existent und referenziert Referenz freigeben ejbObject.remove() home.remove(Handle) home.remove(EJBObject) SQL DELETE home.create(...) home.remove(Handle) SQL DELETE SQL INSERT Referenz freigeben existent und nicht referenziert existent und referenziert home.find(...) oder handle.getEJBObject() Business Logik

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

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 Einkaufswagen Artikel Servlet Bestell Servlet
serialized SB handle & Form Daten Bestell Servlet Bestell JSP Artikel JSP Artikel EJB (CMP) JDBC


Herunterladen ppt "Java 2 Enterprise Edition (J2EE)"

Ähnliche Präsentationen


Google-Anzeigen