J2EE-Technologien

 Diese Seite drucken


JDBC

Ähnlich wie ODBC ist JDBC eine Schnittstelle um von Java auf eine Datenbank zuzugreifen: Java Database Connectivity. Die JDBC-API stellt eine Abstraktionsschicht für den Connect zu praktisch jeder relationalen oder tabellarischen Datenquelle zur Verfügung. Dabei kümmert sich JDBC u.a. um die Authentifizierung, die Connection, SQL-Umsetzung und die Transaktions-APIs. So können Programmierer den selben einen Code für den Zugang zu praktisch jeder Standard-konformen Datenbank benutzen, indem sie den entsprechenden JDBC-Treiber für ihre Datenbankimplementierung benutzen. Oder anders ausgedrückt: Man kann der J2EE-Applikation so - zumindest theoretisch - die Datenbank 'unterm Hintern' austauschen.

JNDI

Die APIs des Java Naming and Directory Interface stellen Schnittstellen für verschiedene Verzeichnisdienste zur Verfügung, beispielsweise über LDAP zu LDAP-Servern, JDBC Datenquellen, EJB Homes, JMS (Java Messaging Service) Connections, Network Information Service (NIS) und Domain Name System (DNS). Diese Namensdienste sind ein essentieller Bestandteil einer J2EE-Umgebung, weil sie der Weg sind, wie J2EE-Komponenten Services, andere Komponenten oder Legacy-Systeme finden. Man kann als Entwickler deklarativ (also einfach durch Angabe eines dafür vergebenen Namens) auf diese Komponentendaten zugreifen. Mit der Einrichtung und Anbindung der Komponenten hat der Entwickler dann gar nichts mehr zu tun. Änderungen werden vom System völlig transparent durchgereicht und erfordern keine Änderungen im Code.

JTA und JTS

Transaktionsmanagement ist ein J2EE-Standardservice, der die Entwicklung von verteilten Softwaresystemen erleichtert. Datenintegrität ist halt am besten gesichert, wenn man darauf hinwirken kann, dass die Richtlinien für den Zugang zu und die Manipulation an Daten strikt eingehalten werden, indem man ein stringentes Transaktionskonzept durchführt. Die Java Transaction API (JTA) erlaubt es einem verteilten transaktionalen System oder einer verteilten transaktionalen Anwendung, auf den Transaktionsmanager zuzugreifen, der von den Java Transaction Services (JTS) zur Verfügung gestellt wird. JTS sorgt dabei nicht nur für die Demarkation und Synchronisierung von Transaktionen, sondern auch für das Ressourcenmanagement und die Informationsübertragung innerhalb der Komponenten einer Transaktion.

Servlets

Die Java Servlet API ist eine vom Container verwaltete (container-managed) Alternative mit Zustand (stateful) zu Common Gateway Applikationen (CGI). Servlets werden von einem ganz speziellen Teil des J2EE-Containers deployed und gemanagt, der besonders eng in das Sicherheits-Subsystem des Containers integriert ist. Der einzige Lebenszweck eines Servlets ist es, HTTP-Requests zu empfangen, dynamisch Daten zu erzeugen (üblicherweise HTML) und das Ganze als HTTP-Antwort auszuliefern. Mit der Java Servlet API wurde außerdem das Konzept einer HTTP-Sitzung (-Session) eingeführt, wodurch erst Anfragen vom Client an den Servlet-Container mit Zwischenspeicherung des Zustands (stateful calls) möglich sind.

Im Gegensatz zu typischen CGI-Applikationen geben Servlets nach dem Abarbeiten eines Requests nicht wieder komplett alle Ressourcen frei, sondern bleiben resident im Container, um für weitere Anfragen der HTTP-Clients schneller zur Verfügung zu stehen. Über die Servlet-Event-Listener hat man Zugriff auf den Lebenszyklus eines Servlets und - seit Servlet 2.3 - können Entwickler Filter-Chains benutzen, um sukzessive Transformationen am HTTP-Request oder -Response vorzunehmen.

JSP

Java Server Pages bieten dem Entwickler eine komfortable Möglichkeit, mit Hilfe von Templates dynamisch erzeugten HTML-Inhalt darzustellen. Üblicherweise ist eine JSP-Seite eine HTML-Seite mit dazwischen liegenden "Code-Schnipseln" (sog. Scriptlets) oder selbstprogrammierten bzw. Standard-Tag-Libraries. Tag-Libraries sorgen von vornherein für eine sauberere Trennung zwischen der View-Schicht und der Controller-Schicht einer Applikation, obwohl man das auch mit bestimmten Techniken und Patterns bei Scriptlets erreichen kann. Tag-Libraries haben aber noch dazu den Vorteil, dass sie den JSP-Entwickler davon befreien, sich um den Javacode auf der Seite zu kümmern, denn man braucht nur diese vorgefertigten HTML-ähnlichen Tags in der JSP-Seite zu benutzen - zur Laufzeit werden sie dann in ein Servlet kompiliert und laufen als Servlet im Container.

EJB

Enterprise JavaBeans dienen in einer J2EE-Applikation als Schicht für die Businesslogik. EJBs sind also die eigentlichen Komponenten für eine zustandsbehaftete (stateful), von außen zugängliche (remote), transaktionssichere, überhaupt sichere und skalierbare Business-Logik-Schicht. EJBs sind also nicht dazu gedacht, User-Interfaces zu erzeugen oder Client-Requests zu handeln. Diese Aufgaben werden - wie schon erwähnt - von den Komponenten der Präsentationsschicht übernommen (Servlets, JSPs, Clientanwendungen etc.).Mit den drei Typen von EJBs ( Session Beans, Entity Beans und message-driven Beans), ihrem Deployment und den verschiedenen Möglichkeiten zur Steuerung ihrer Persistenz werden wir uns ja noch ausgiebig beschäftigen.

Speziell die EJB 2.0-Spezifikation brachte Verbesserungen auf dem Feld der Entity Bean Persistence und der Beziehungen zwischen Beans. Man kann als Entwickler nun deklarativ die Beziehungen zwischen Beans in so genannten 'Deskriptoren' beschreiben, ohne sich um die drunterliegenden Strukturen kümmern zu müssen. Mit der EJB 2.0-Spezifikation wurde auch die Syntax der so genannten EJB Query Language (EJBQL), die Integration von Session Beans und JMS mittels message-driven Beans eingeführt, dazu noch die Möglichkeit, zusätzlich zu den Remote Interfaces auch Local Interfaces zu nutzen. Letzteres rationalisiert Aufrufe an eine EJB im selben Container erheblich.

RMI-IIOP

RMI-IIOP ist die Abkürzung für Java Remote Method Invocation over the Internet Inter-ORB-Protocol und ist der Mechanismus im J2EE, der - grob ausgedrückt - die Netzwerktätigkeiten erledigt.
RMI-IIOP ist - im Unterschied zu RMI (Remote Method Invocation) von Java mit der API java.rmi - zu CORBA kompatibel und benutzt sowohl die RMI-API java.rmi als auch die eigene API javax.rmi.

RMI hat ein paar Fähigkeiten, die in RMI-IIOP nicht verfügbar sind, wie z.B. verteilte Garbage Collection, Object Activation und downloadbare Klassen - das ist aber nicht unser Thema, weil das J2EE und EJB eben mit RMI-IIOP arbeiten. Jede J2EE-Server-Implementation (in unserem Falle JBoss 3.0) sollte ihre eigene Implementation von RMI-IIOP mitbringen. Sie sollten es unbedingt vermeiden, Implementationen verschiedener Hersteller (Bea oder Sun) zu mixen.
Also noch mal: RMI ist ein Satz APIs der dazu gemacht wurde, verteilte Java-Applikationen zu schreiben.

Java Serialization (das ist die Codierung und Decodierung von Objekten in bzw. aus einem Datenstrom, der eine Übertragung von Objekten in verteilten System erst ermöglicht) und das Java Remote Method Protocol (JRMP) erlauben Remote Procedure Calls auf Objekte.
Die Objekte und ihre Beziehungen zueinander müssen auf der einen Seite des Calls erfasst und aufgedröselt, und auf der 'Empfängerseite' wieder zusammengesetzt werden - diese Vorgänge nennt man Marshaling und Unmarshaling. Der J2EE-Standard unterstützt JRMP, um Objekten den Zugriff auf andere Objekte in anderen Adressräumen zu ermöglichen. Die Clients benutzen RMI-IIOP, um mit den EJBs zu kommunizieren.

JMS

In einem voll funktionalen J2EE-Produkt ist außerdem die Java Message Service API (JMS) implementiert. Sie unterstützt Enterprise Messaging durch unterschiedliche, interne, produktanhängige System wie beispielsweise Oracle Advanced Queuing (AQ), IBM MQSeries, SonicMQ, SwiftMQ und ähnliche. JMS stellt dem Entwickler ein asynchrones Messaging System zur Verfügung, das es nicht fest miteinander gekoppelten Systemen erlaubt, Information dann zu verarbeiten, wenn es für das jeweilige System am sinnvollsten ist. Verteilte Systeme mit Anwendungen für Buiness to Business (B2B) oder Enterprise Application Integration (EAI) sind meist ganz stark abhängig von einer guten JMS-Implementation: Die Systeme laufen ja rein physikalisch in verschiedenen Firmen und/oder auf verschiedenen Kontinenten und haben ihre Volllastperioden zu unterschiedlichen Zeiten. Mit einem asynchronen Messaging kann die Empfänger-Applikation die Nachricht abarbeiten, wenn es für sie günstig ist, da die Absender-Applikation nicht auf eine direkte Antwort warten muss.

JMS gibt es in zwei Modellen: publish-and-subscribe (pub/sub) und point-to-point (ptp).
Publish-and-Subscribe benutzt man, wenn mehrere Prozesse (die subscriber = 'Abonnenten') die selbe Nachricht von einem anderen Prozess (dem publisher ='Nachrichtendienst' ) bekommen.
Von Point-to-Point Messaging spricht man, wenn ein Prozess direkt eine Nachricht an einen ihm bekannten anderen Prozess schickt.

Message-driven Beans sind ein spezieller (neuer) Typ EJB, der JMS kapselt, um es J2EE-Applikationen zu ermöglichen, Prozesse asynchron abzuwickeln.

JavaMail

Die JavaMail API bietet protokoll-unabhängige Unterstützung für Email-Syteme. Sie verfügt über die üblichen Funktionen zum Lesen, Schreiben und Versenden von Emails und hat eingebaute Implementationen für die bekannten Standard-Mail-Protokolle IMAP, POP3 und SMTP. Von diesen abstrakten Klassen kann der Entwickler dann Unterklassen ableiten, um auch andere Protokolle wie MAPI, NNTP, LotusNotes ö.ä. zu bedienen.

JAF

Das JavaBeans Action Framework (JAF) integriert MIME (Multipurpose Internet Mail Extensions) in die Java-Plattform. Das Framework unterstützt das Mapping von Dateitypen auf MIME-Typen und ist eng mit der JavaMail API verbandelt, damit Email-Attachments verarbeitet werden können.

JAXP

Wie Sie vielleicht schon wissen, werden alle J2EE-Deskriptoren als XML-Dateien geschrieben. So ist es nur logisch, dass die XML-Technologie ebenfalls ein wichtiger Bestandteil der Java-Plattform ist. Die Java API for XML Processing (JAXP) unterstützt das Prozessieren von XML-Dokumenten über XSLT, und zwar implemenationsunabhängig.
Es gibt zwei wichtige APIs für die Repräsentation und das Parsen von XML-Dokumenten: Das Document Object Model (DOM) basiert auf einem Baumstruktur- Modell; beim Parsen des Dokuments wird im Parser der gesamte Baum des XML-Dokumentes aufgebaut. Dagegen ist die Simple API for XML (SAX) eine Event-basierte API; beim Parsen eines Dokuments 'merkt' sich der Parser sozusagen ein Muster aus Event-Schaltern (z.B. Start und Ende eines Elements), die ein Application-Handler zum Auslösen von bestimmten Aktionen benutzen kann.
Extensible Stylesheet Language Transformation (XSLT) erlaubt die Überstzung von XML-Dokumenten in andere strukturierte Dokumentformate (XML, HTML, PDF...) auf der Basis von Vorlagen (Templates).

JAXP hat implementationunabhängige Schnittstellen. So kann ein Entwickler immer diejenige Parser-Implementation benutze, die für diese Aufgabe die beste ist: Parser haben unterschiedliche Stärken, z.B. mag der eine schnell sein, aber viel Speicher brauchen, während ein anderer besonders sparsam mit Arbeitsspeicher umgeht.. Man kann dann je nach Anspruch den geeigneten nehmen, ohne Code umschreiben zu müssen.

JAAS

Der Java Authentication and Authorization Service (JAAS) wurde geschaffen, um dem Entwickler eine standardisiertes, gemeinsames, rein-Java-basierendes Framework und eine entsprechende API zu geben, um User-Privilegien zuweisen, authentifzieren und überprüfen zu können.
JAAS stellt Unterstützung für so genannte Pluggable Authentication Modules (PAM) zur Verfügung, die auf unterschiedliche 'Authentication Provider' zugreifen können, wenn ein User authentifiziert werden soll: LDAP, andere JNDI-Quellen, Betriebssystem-(Passwort-)Dateien oder -Systeme, XML-Dateien usw. JAAS ermöglicht darüber sogar Single Sign-On und das Management von Access Control Policies für User-basierte, Gruppen-basierte oder Rollen-basierte Authentifizierung.

JCA

Die Java Connector Architecture (JCA) stellt eine weiter standardisierte, abstrakte API dar, um EJBs und Enterprise Applications an so genannte Enterprise Information Systems (EIS) verbinden zu können, die äußersten Schichten des J2EE-3-Tier-Systems.


26 -08-2003  Petra Haberer  Version 0.0.9