Java EE

kurz & gut

Arun Gupta

Thomas Demmig

Für Menka, meine geliebte Frau und beste Freundin. Deine Unterstützung und deine Ermutigung sorgen dafür, dass unser Leben Spaß macht und Sinn hat.

Für Aditya und Mihir, meine zwei fröhlichen Jungs, die mit mir spielen und mich aktiv halten.

Vorwort

Die Java EE 6-Plattform hat die einfache Entwicklung mit Java im Enterprise-Umfeld auf eine neue Ebene gehoben. Dieses Buch richtet sich an Leute, die einen schnellen Überblick über die Plattform erhalten wollen, um danach die Grundlagen zu erlernen.

Das Buch bietet einen Überblick über die Schlüsselspezifikationen der Java EE 6-Plattform (eine Spezifikation pro Kapitel). Die wichtigsten Konzepte der verschiedenen Spezifikationen werden erklärt und Beispiele dazu vorgestellt. Sie müssen nichts über frühere Versionen der Plattform wissen. Allerdings ist ein grundlegendes Verständnis von Java notwendig, um den Code zu verstehen.

In diesem Buch genutzte Konventionen

Die folgenden typographischen Konventionen werden in diesem Buch verwendet:

Kursiv

Steht für neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen.

Nichtproportionalschrift

Wird für Programmcode genutzt – auch innerhalb von Fließtext –, um auf Programmelemente wie Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter hinzuweisen.

Kursive Nichtproportionalschrift

Zeigt Text an, der durch eigene Werte oder kontextabhängige Werte ersetzt werden sollte.

Danksagungen

Dieses Buch wäre nicht möglich geworden ohne die Unterstützung von sehr vielen Leuten.

Zu allererst bedanke ich mich bei O'Reilly für das Vertrauen in mich und für die Möglichkeit, dieses Buch zu schreiben. Ihr Team hat mich beim Schreiben, Überarbeiten, Korrekturlesen und Veröffentlichen exzellent unterstützt.

Bei O'Reilly hat mir Michael Loukides geholfen, die Grundlagen für das Buch zu legen. Meghan Blanchette war in allen Phasen der Entstehung eine außerordentlich große Hilfe, indem sie den Text schon zwischendurch begutachtete, Feedback zur Darstellung gab, Fachlektoren organisierte und mich bei Bedarf mit den richtigen Ansprechpartnern im Team zusammenbrachte. Jessica Hosman hat mir beim Einstieg in das Autorenleben geholfen und mich weiter begleitet.

Emily Quill und Kristen Borg haben beim Lektorieren geholfen und sichergestellt, dass auch die Kleinigkeiten stimmen. Vielen Dank auch an die anderen Mitglieder des O'Reilly-Teams, mit denen ich nicht direkt zu tun hatte, die aber auch zum Gelingen des Buchs beigetragen haben.

Das Korrekturlesen und das Fachlektorat wurden von Markus Eisele (@myfear, http://blog.eisele.net), John Yeary (@jyeary, http://javaevangelist.blogspot.com) und Bert Ertman (@BertErtman, http://bertertman.wordpress.com) vorgenommen, so dass sichergestellt ist, dass die entscheidenden Dinge auch richtig dargestellt sind. Ihre umfangreiche Erfahrung und ihr Wissen haben sich an der Tiefe ihrer Kommentare gezeigt.

Ich bin Entwicklern auf der ganzen Welt für die zahlreichen Diskussionen dankbar, die mein Verständnis der Technologie verbessert haben. Vielen Dank meinen Kollegen bei Oracle und den JSR Specification Leads, die mir die Anwendungsfälle der verschiedenen Technologien erklärt haben. Und vielen Dank an jeden anderen in meinem Leben, der mir die nötigen Pausen von Schreiben verschafft hat.

Kapitel 1. Java Platform, Enterprise Edition

Einführung

Die Java Platform, Enterprise Edition (Java EE) bietet eine auf Standards aufbauende Plattform für das Entwickeln von Web- und Enterprise-Anwendungen. Diese Applikationen sind im Allgemeinen als Multitier-Anwendungen entworfen – mit einer Frontend-Schicht bestehend aus Web-Frameworks, einer Middleware-Schicht, die sich um die Sicherheit und Transaktionen kümmert, und einer Backend-Schicht, die die Verbindung zu einer Datenbank oder einem Legacy-System umsetzt. Die Java EE Platform definiert APIs für die verschiedenen Komponenten in jeder Schicht und bietet dazu weitere Dienste an, zum Beispiel Namensräume, Einbinden und Ressourcenverwaltung, die für die gesamte Plattform genutzt werden können. Jede Komponente ist in einer eigenen Spezifikation definiert, die auch die API, Javadocs und das erwartete Verhalten beschreibt.

Die Java Platform, Enterprise Edition 6 (Java EE 6) wurde im Dezember 2009 veröffentlicht. Sie bietet einen einfachen, leicht zu verwendenden Stack für das Bauen solcher Anwendungen. In der älteren Version der Plattform (Java EE 5) gab es die ersten Schritte für eine vereinfachte Entwicklung. Die Java EE 6 Platform sorgt für eine noch bessere Produktivität und bietet viel mehr Funktionalität.

Die drei wichtigsten Ziele der Plattform sind folgende:

Einfache Anwendung

Die Java EE 6 Platform vereinfacht die Entwicklung erneut drastisch, indem sie sehr oft Konvention statt Konfiguration einsetzt und auf Annotationen für ein Plain Old Java Object (POJO) zurückgreift. Indem Sie ein POJO um @Stateless, @Stateful oder @Singleton ergänzen, machen Sie es zu einem Enterprise JavaBean. Zudem lässt sich dies einfach in einer WAR-Datei verpacken, statt eine Spezialvariante von JAR oder EAR zu verwenden. Servlets sind ebenfalls POJOs, versehen mit der Annotation @WebServlet. Deployment Descriptors wie web.xml und faces-config.xml sind in den meisten Fällen optional – die Informationen, die im Allgemeinen in ihnen abgelegt sind, finden sich nun in Annotationen. Es gibt Standardregeln, wie man von einer JSF-Seite zu einer anderen navigiert. Um ein POJO als REST-Webservice zu veröffentlichen, muss man nur die Annotation @Path ergänzen.

Indem die Deployment Descriptors optional wurden, Konvention der Konfiguration vorgezogen und stark auf Annontationen aufgebaut wurde, lässt sich die Java EE 6 Platform einfacher verwenden und es muss insgesamt auch weniger geschrieben werden.

Leichtgewichtigkeit

Es gibt für die Java EE 6 Platform 31 Komponentenspezifikationen, die Sie im Anhang EE.6 der Plattformspezifikation finden. Zu diesen Komponenten gehören Enterprise JavaBeans (EJB), Servlets, JavaServer Faces (JSF), Java API for RESTful Web Services (JAX-RS) und viele weitere. Für den Bau einer typischen Enterprise-Anwendung werden Sie nicht unbedingt alle benötigen. Zudem waren manche der Technologien wie Java API for XML Registries (JAXR) oder Java API for XML-based RPC (JAX-RPC) zwar wichtig, als sie in die Plattform eingebracht wurden. Aber nun wurden sie durch bessere Komponenten ersetzt, zum Beispiel Java API for XML Web Services (JAX-WS), oder sind nicht mehr im Einsatz.

Die Java SE Expert Group hat einen zweistufigen Prozess definiert, mit dem Features von der Plattform genommen wurden. In diesem Prozess – als Pruning bezeichnet – wird ein Feature in einem Release als optional gekennzeichnet (proposed optional). In einem folgenden Release wird dann entschieden, das Feature tatsächlich zu entfernen, es als erforderliche Komponente beizubehalten oder es im Status proposed removal zu belassen. Die Java EE Expert Group hat einige Features mit diesem Prozess behandelt. Das ist wie das Beschneiden eines Rosenstrauchs im Frühjahr, damit neue Blüten wachsen können: Durch das Pruning von ungenutzten Features wird sichergestellt, dass trotz Hinzufügen neuer Features die Plattform einfach und leichtgewichtig bleibt.

Die Java EE Platform führt auch den Begriff des Profils ein. Ein Profil ist eine Konfiguration auf der Plattform, die an eine bestimmte Klasse von Anwendungen angepasst ist. Dabei kann es sich um eine Unter- oder Obermenge der Technologien auf der Plattform handeln. Das Java EE 6 Web Profile ist als eigenständige Spezifikation für die Plattform definiert, wobei es sich um eine Untermenge der Technologien der Plattform handelt. Es ist für die Entwicklung moderner Webanwendungen angepasst. Damit fällt der »One Size Fits All«-Ansatz früherer Releases weg. Und auch wenn es sich »nur« um eine Untermenge handelt, ist diese doch so umfassend, dass ein Großteil der Standard-APIs enthalten ist und ohne Anpassungen viele unterschiedliche Web-Anwendungen damit geschrieben werden können. Das Webprofil ermöglicht es dem Entwickler, Web-Anwendungen schnell bauen zu können. Zudem wird verhindert, dass immer mehr eigene Web-Stacks entstehen, welche in Bezug auf Wartungsfragen nur von Nachteil sein können. Weitere Profile können definiert werden, indem man dem Java Community Process (JCP) folgt.

Durch Pruning und Web-Profile bleibt die Java EE 6 Platform also leichtgewichtig und gut wartbar.

Erweiterbarkeit

Die Plattform bietet eine umfangreiche Sammlung an Funktionen an, um Enterprise-Anwendungen zu erstellen. Trotzdem wird häufig auf Third-Party-Frameworks zurückgegriffen, um Funktionalität zu ersetzen oder zu ergänzen. Diese Frameworks müssen über einen ServletListener, einen ServletFilter oder eine ähnliche Komponente registriert werden, damit die Laufzeitumgebung sie erkennen kann. Die Servlet-Spezifikation definiert einen Web Fragment-Mechanismus, über den diese Einstiegspunkte in das Framework in der Framework-Bibliothek definiert werden. Die Servlet-Container registrieren dann das Framework, so dass sich der Entwickler nicht darum kümmern muss. So können die Frameworks wie ein integraler Bestandteil der Plattform behandelt werden.

Zusätzlich definiert die Contexts and Dependency Injection (CDI) Specification einen portablen Erweiterungsmechanismus, mit dem Sie die Plattform in unterschiedlicher Art und Weise ausbauen können – zum Beispiel durch das Bereitstellen bestimmter, vordefinierter Scopes. Ein neuer Scope kann dadurch mit einem beliebigen Java EE 6-kompatiblen Anwendungsserver einfach definiert und eingebunden werden.

Spezifikationen wie CDI, JavaServer Faces 2, Java API for RESTful Services, Java Persistence API 2 und Servlets 3 sorgen dafür, dass die Java EE 6 Platform noch leistungsfähiger ist. Dieses Buch bietet einen Überblick über die wichtigsten Technologien, die auf der Plattform eingesetzt werden, sowie leicht verständliche Codebeispiele, mit denen die Verbesserungen von Java EE 6 erläutert werden.

Deliverables

Die Java EE 6 Platform wurde als Java Specification Request 316 bzw. JSR 316 entwickelt (http://jcp.org/en/jsr/detail?id=316), wobei dem Java Community Process (JCP) 2.7 gefolgt wurde. Der JCP definiert drei wichtige Deliverables für jeden JSR:

Spezifikation

Ein formales Dokument, das die vorgeschlagene Komponente und ihre Features beschreibt.

Reference Implementation (RI)

Die binäre Implementierung der vorgeschlagenen Spezifikation. Die RI hilft dabei, sicherzustellen, dass die vorgeschlagenen Spezifikationen in Binärform implementiert werden können. Zudem erhält der Spezifikationsprozess so konstant Rückmeldung.

Technology Compliance Kit (TCK)

Eine Sammlung von Tests, die sicherstellen, dass die RI zur Spezifikation passt. So können mehrere Hersteller konforme Implementierungen liefern.

Java EE 6 besteht aus der Plattform-Spezifikation, die die Anforderungen definiert. Zudem enthält sie folgende Komponenten-Spezifikationen:

Web-Technologien

JSR 45: Debugging Support for Other Languages

JSR 52: Standard Tag Library for JavaServer Pages (JSTL)1.2

JSR 245: JavaServer Pages (JSP) 2.2 and Expression Language (EL) 1.2

JSR 314: JavaServer Faces (JSF) 2.0

JSR 315: Servlet 3.0

Enterprise-Technologien

JSR 250: Common Annotations for the Java Platform 1.1

JSR 299: Contexts and Dependency Injection (CDI) for the Java EE Platform 1.0

JSR 303: Bean Validation 1.0

JSR 316: Managed Beans 1.0

JSR 317: Java Persistence API (JPA) 2.0

JSR 318: Enterprise JavaBeans (EJB) 3.1

JSR 318: Interceptors 1.1

JSR 322: Java EE Connector Architecture 1.6

JSR 330: Dependency Injection for Java 1.0

JSR 907: Java Transaction API ( JTA) 1.1

JSR 914: Java Message Server (JMS) 1.1

JSR 919: JavaMail 1.4

Webservice-Technologien

JSR 67: Java APIs for XML Messaging (JAXM) 1.3

JSR 93: Java API for XML Registries (JAXR) 1.0

JSR 101: Java API for XML-based RPC (JAX- RPC) 1.1

JSR 109: Implementing Enterprise Web Services 1.3

JSR 173: Streaming API for XML (StAX) 1.0

JSR 181: Web Services Metadata for the Java Platform 2.0

JSR 222: Java Architecture for XML Binding (JAXB) 2.2

JSR 224: Java API for XML Web Services (JAX- WS) 2.2

JSR 311: Java API for RESTful Web Services (JAX-RS) 1.1

Verwaltungs- und Sicherheitstechnologien

JSR 77: J2EE Management API 1.1

JSR 88: Java Platform EE Application Deployment API 1.2

JSR 115: Java Authorization Contract and Containers (JACC) 1.3

JSR 196: Java Authentication Service Provider Interface for Containers (JASPIC) 1.0

Die einzelnen Komponeten arbeiten zusammen, um einen kombinierten Stack bereitzustellen (siehe Abbildung 1.1).

Abbildung 1.1 Java EE 6-Architektur

Was ist in Abbildung 1.1 zu sehen?

JPA, JTA und JMS stellen die grundlegenden Dienste bereit, wie zum Beispiel Datenbankzugriff, Transaktionen und Messaging.

Managed Beans und EJB liefern ein vereinfachtes Programmiermodell, das POJOs nutzt, um auf die grundlegenden Dienste zugreifen zu können.

CDI, Interceptors und Common Annotations bieten Konzepte, die sich auf eine Vielzahl von Komponenten anwenden lassen, wie zum Beispiel typsichere Dependency Injection, das Ansprechen von Cross-Cutting Concerns über Interceptors und eine gemeinsame Menge von Annotationen.

CDI Extensions ermöglicht Ihnen, die Plattform standardisiert über die vorhandenen Features hinaus zu erweitern.

Webservices verwenden JAX-RS und JAX-WS. JSF, JSP und EL definieren das Programmiermodell für Webanwendungen. Web Fragments erlauben eine sehr natürlich umgesetzte automatische Registrierung von Web-Frameworks von Fremdfirmen.

Bean Validation ermöglicht ein Standardvorgehen zum Deklarieren von Constraints und zum Validieren in verschiedenen Technologien.

JAX-RPC (JSR 101) , JAXR ( JSR 93), EJB Entity Beans (Teil von JSR 153) und Java EE Application Deployment ( JSR 88) sind in dieser Version der Plattform für das Pruning markiert.

Die RI von Java EE 6 wird in der GlassFish-Community gebaut. Die GlassFish Server Open Source Edition bietet einen vollständig Java EE 6-konformen, freien Open Source-Anwendungsserver. Sie ist auch in einer Web Profile-Distribution verfügbar und kann unter http://glassfish.org heruntergeladen werden. Der Anwendungsserver lässt sich einfach einsetzen (ZIP-Installer und NetBeans/Eclipse/IntelliJ-Integration), ist leichtgewichtig (die Download-Größe beginnt bei 30 MByte und der Platzverbrauch auf der Festplatte und im Speicher ist gering) und modular (OSGi-basiert, Container starten bei Bedarf). Es gibt auch ein hochverfügbares Clustering mit zentraler Administration per CLI, einer webbasierten Administrationskonsole und REST-Management/Monitoring-APIs. Der Oracle GlassFish Server ist Oracles kommerzielle GlassFish-Serverdistribution, die unter http://oracle.com/goto/glassfish heruntergeladen werden kann. Während diese Zeilen entstehen, gibt es 17 Java EE 6-konforme Anwendungsserver. Die vollständige Liste finden Sie unter http://www.oracle.com/technetwork/java/javaee/overview/compatibility-jsp-136984.html.

Das TCK steht allen Java EE-Lizenznehmern zur Verfügung, um ihre Implementierungen zu testen.

Was ist neu in Java EE 6

Die Plattform wurde um ein paar neue Spezifikationen erweitert, um ihre Funktionalität und Reichhaltigkeit zu erhöhen. Eine Reihe bestehender Komponenten-Spezifikationen wurden überarbeitet, um sie einfacher einsetzbar zu machen.

Die wichtigsten Features der zentralen Spezifikationen sind hier beschrieben:

Managed Beans

POJO-basierte verwaltete Komponenten

Eine gemeinsame Sammlung an Diensten, zum Beispiel eine Lifecycle Resource Injection, Callbacks und Interceptors.

Enterprise JavaBeans

Ein EJB kann mit einer einzelnen Quelldatei pro Bean erzeugt und mit @Stateless, @Stateful oder @Singleton annotiert werden.

EJBs können für den lokalen Zugriff in einem .war verpackt werden, wobei @Local und ejb-jar für den lokalen und Remote Access genutzt werden.

EJBs lassen sich über einen portablen, globalen JNDI-Namen ansprechen.

Eine Methode eines Session-Bean kann so gekennzeichnet werden, dass es asynchron aufgerufen wird. Diese Methoden erlauben dem Client, den Rückgabewert später abzurufen oder das Fire-and-Forget-Muster zu nutzen.

Zeitabhängige Events können mit einer cron-ähnlichen Syntax eingeplant werden, indem @Schedule für Bean-Methoden definiert wird.

Die Embeddable EJB API ermöglicht es Client-Code und seinen zugehörigen Enterprise Beans, innerhalb der gleichen JVM und des gleichen Class Loaders zu laufen.

Servlets

Annotationsgesteuerte Servlets (@WebServlet), Filter (@WebFilter) und Listener (@WebListener). Der Descriptor web.xml wird in den meisten Fällen optional.

Servlets, Filter und Listener können per Programm über ServletContext registriert werden.

Asynchrone Servlets ermöglichen es dem Control (oder Thread), zum Container zurückzukehren, um andere Aufgaben zu erledigen, während darauf gewartet wird, dass ein lange laufender Prozess endet.

Framework-Bibliotheken können modular über web-fragment.xml integriert werden.

Die Servlet-Sicherheit lässt sich neben <security-constraint> auch über @Servlet Security, @HttpConstraint und @HttpMethodConstraint definieren.

Java API for RESTful Web Services

POJO-basierte und annotationsgesteuerte Möglichkeit, REST-Webservices zu veröffentlichen

Ein Standard-Set von HTTP-Methoden wie GET, POST, PUT und DELETE wird unterstützt.

Jede Ressource kann in mehreren Formaten ausgegeben werden; es werden auch eigene Typen unterstützt.

Clientseitige Content Negotiation wird durch den HTTP-Header Accept: unterstützt.

SOAP-basierte Webservices

SOAP-basierte Webservices können mit einem POJO und Annotationen veröffentlicht werden. Es gibt eine feingranulare Kontrolle der Nachrichten durch Source, DataSource und SOAPMessage.

Clientseitige API zum Aufruf eines SOAP-basierten Webservice

Wohldefinierte Extension Points für das Pre/Post-Processing von Request/Response-Nachrichten auf Client und Server

Standard-Java-to-WSDL- und -WSDL-to-Java-Mapping

JavaServer Faces

Facelets sind definiert als die bevorzugte Templating-Sprache für die Seiten. Damit lassen sich Composite-Komponenten einfach definieren und echte Abstraktion umsetzen.

Unterstützung für Ajax über JavaScript-APIs und deklaratives Ajax per f:ajax

Die meisten Elemente aus faces-config.xml besitzen eine alternative Annotation. Standard-Navigationsregeln sind definiert, um Konventionen statt Konfiguration zu folgen.

Unterstützung für HTTP GET und Bookmarkable URLs

Integration mit Bean Validation

Java Persistence API

Ein verbessertes Objekt/Relational-Mapping für ein intuitiveres Java-Mapping. Eine erweiterte und umfangreichere JPQL unterstützt dieses verbesserte Mapping und neue Funktionalität.

Das Metamodell enthält den Persistenz-Status und die Beziehungen der verwalteten Klassen einer Persistence Unit. Dieses abstrakte Persistenzschema wird dann genutzt, um per Criteria API die typsicheren Abfragen zu gestalten.

Neben optimistischem wird auch pessimistisches Locking unterstützt, indem neue Locking Modes angeboten werden.

Standardkonfigurationsoptionen über javax.persistence-Eigenschaften

Interceptors

Eingreifen in Invocation- und Lifecycle-Events, die für eine zugeordnete Zielklasse ausgelöst werden.

Interceptors können über Annotationen wie @Interceptors oder typsicher über einen Deployment Descriptor wie beans.xml erstellt werden.

Contexts and Dependency Injection

Standardbasierte typsichere Dependency Injection

Starke Typisierung durch Angabe aller Abhängigkeiten über das Java Type System. Lose Kopplung über Events, Interceptors und Decorators.

Integration mit Expression Language

Definition eines erweiterbaren Scopes and Context Management Mechanism

Einbinden einer Transaktions- (EJB) und Präsentationsschicht (JSF) in die Plattform

Bean Validation

Constraint-Deklaration und Validation für POJOs auf Klassenebene

Eingebautes Set an Constraint-Definitionen wie @NotNull, @Min, @Max und @Size

Eigene Constraints können über META-INF/validation.xml neben den Annotationen definiert werden.

Kapitel 2. Managed Beans

Managed Beans sind als Teil von JSR 316 definiert. Die vollständige Spezifikation können Sie unter http://jcp.org/aboutJava/communityprocess/final/jsr316/index.html herunterladen.

Ein Managed Bean ist ein POJO, das von einem Java EE Container als Managed Component behandelt wird. Es bietet eine allgemeine Grundlage für die verschiedenen Arten von Komponenten, die es in der Java EE Plattform gibt. Zudem definiert die Spezifikation noch einige wenige grundlegende Dienste, zum Beispiel Resource Injection, Lifecycle Callbacks und Interceptors für diese Beans.

Unterschiedliche Komponenten-Spezifikationen können diesem Managed Bean weitere Eigenschaften verleihen. Die Spezifikation definiert sogar Extension Points, um bestimmte Aspekte anzupassen. So fällt zum Beispiel mit Contexts and Dependency Injection (CDI) die Anforderung weg, ein POJO mit einem Konstruktor ohne Argumente nutzen zu müssen. Stattdessen lassen sich komplexere Signaturen verwenden. CDI bietet zudem eine Unterstützung für Lifecycle Scopes und Events. Bei Enterprise JavaBeans handelt es sich ebenfalls um ein Managed Bean, welches Transaktionen und andere Dienste anbietet. So kann der Entwickler mit einer übersichtlichen Struktur beginnen und muss eine leistungsfähigere Komponente wie ein EJB oder CDI erst dann erstellen, wenn der Bedarf dafür da ist.

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!