Dirk Weil Java EE 6 Enterprise-Anwendungsentwicklung leicht gemacht Dirk Weil Java EE 6 Enterprise-Anwendungsentwicklung leicht gemacht ISBN: 978-3-86802-077-9 © 2012 entwickler.press Ein Imprint der Software & Support Media GmbH Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar. Ihr Kontakt zum Verlag und Lektorat: Software & Support Media GmbH entwickler.press Geleitsstr. 14 60599 Frankfurt am Main Tel.: +49 (0)69 630089-0 Fax: +49 (0)69 930089-89 [email protected] http://www.entwickler-press.de Lektorat: Sebastian Burkart Korrektorat: Frauke Pesch Satz: Dominique Kalbassi Alle Rechte, auch für Übersetzungen, sind vorbehalten. Reproduktion jeglicher Art (Fotokopie, Nachdruck, Mikrofilm, Erfassung auf elektronischen Datenträgern oder anderen Verfahren) nur mit schriftlicher Genehmigung des Verlags. Jegliche Haftung für die Richtigkeit des gesamten Werks kann, trotz sorgfältiger Prüfung durch Autor und Verlag, nicht übernommen werden. Die im Buch genannten Produkte, Warenzeichen und Firmennamen sind in der Regel durch deren Inhaber geschützt. I Inhaltsverzeichnis Vorwort9 1 Java EE im Überblick 11 1.1Aufgabenstellung 11 1.2Architekturmodell 11 1.3 Anwendungsbestandteile und Formate 12 1.4Profile 15 1.5Plattformen 16 2CDI 2.1 Was ist das? 17 17 2.2 Wozu braucht man das? 17 2.3 Bereitstellung und Injektion von Beans 20 2.4 Lifecycle Callbacks 25 2.5 Qualifier 26 2.6Alternatives 28 2.7 Nutzung der Java-EE-Umgebung 30 2.8 Producer und Disposer 31 2.9 Kontexte und Scopes 35 2.10Interceptors 40 2.11Decorators 43 2.12Stereotypes 45 2.13Eventverarbeitung 47 2.14 Programmgesteuerter Zugriff auf CDI Beans 49 2.15 Integration von JPA, EJB und JSF 52 2.16 Plattformen und Ergänzungen 53 3 Java Persistence 3.1 Worum geht’s? 57 57 3.1.1Lösungsansätze 58 3.1.2 Anforderungen an O/R-Mapper 59 3.1.3 Entwicklung des Standards 60 3.1.4 Architektur von Anwendungen auf Basis von JPA 61 Java EE 6 5 Inhaltsverzeichnis 3.2 Die Basics 3.2.1Entity-Klassen 62 3.2.2 Konfiguration der Persistence Unit 64 3.2.3CRUD 66 3.2.4 Detached Objects 68 3.2.5Entity-Lebenszyklus 69 3.2.6 Mapping-Annotationen für einfache Objekte 70 3.2.7 Generierte IDs 76 3.2.8Objektgleichheit 79 3.3Objektrelationen 82 3.3.1 Unidirektionale n:1-Relationen 83 3.3.2 Unidirektionale 1:n-Relationen 86 3.3.3 Bidirektionale 1:n-Relationen 87 3.3.4 Uni- und bidirektionale 1:1-Relationen 91 3.3.5 Uni- und bidirektionale n:m-Relationen 93 3.3.6 Eager und Lazy Loading 94 3.3.7Kaskadieren 96 3.3.8 Orphan Removal 98 3.3.9 Anordnung von Relationselementen 3.4Queries 99 100 3.4.1JPQL 100 3.4.2 Native Queries 112 3.4.3 Criteria Queries 114 3.5Vererbungsbeziehungen 122 3.5.1 Mapping-Strategie „SINGLE_TABLE“ 123 3.5.2 Mapping-Strategie „TABLE_PER_CLASS“ 125 3.5.3 Mapping-Strategie „JOINED“ 126 3.5.4Non-Entity-Basisklassen 127 3.6 Dies und das 128 3.6.1 Secondary Tables 128 3.6.2 Zusammengesetzte IDs 129 3.6.3 Dependent IDs 130 3.6.4Locking 133 3.6.5 Callback-Methoden und Listener 137 3.6.6 Bulk Update/Delete 139 3.7Caching 6 62 140 Inhaltsvrzeichnis 3.8 Erweiterte Entity Manager 143 3.9 Java Persistence in SE-Anwendungen 149 3.9.1 Konfiguration der Persistence Unit im SE-Umfeld 149 3.9.2 Erzeugung eines Entity Managers in SE-Anwendungen 150 3.9.3 Transaktionssteuerung in Java-SE-Anwendungen 152 4 Bean Validation 153 4.1Aufgabenstellung 153 4.2 Plattformen und benötigte Bibliotheken 154 4.3 Validation Constraints 155 4.4Objektprüfung 161 4.5 Internationalisierung der Validierungsmeldungen 162 4.6Validierungsgruppen 163 4.7 Integration in JPA und JSF 164 4.8 Bean Validation in SE-Umgebungen 166 5 JavaServer Faces 167 5.1 Einsatzzweck von JSF 167 5.2 Die Basis: Java-Webanwendungen 167 5.2.1 Grundlegender Aufbau 167 5.2.2Servlets 168 5.2.3 JavaServer Pages 170 5.3 JSF im Überblick 171 5.3.1 Model View Controller 171 5.3.2Facelets 173 5.3.3Request-Verarbeitung 173 5.4 Konfiguration der Webanwendung 175 5.5 Benötigte Bibliotheken und Plattformen 177 5.6 Programmierung der Views 177 5.6.1 JSF Tag Libraries 178 5.7 Managed Beans 184 5.8 Unified Expression Language 186 5.9Navigation 191 5.10Scopes 193 5.11 Verarbeitung tabellarischer Daten 194 5.12Internationalisierung 196 Java EE 6 7 Inhaltsverzeichnis 5.13Ressourcenverwaltung 199 5.14 GET Support 201 5.15Event-Verarbeitung 203 5.16Konvertierung 206 5.17Validierung 210 5.18Immediate-Komponenten 218 5.19Ajax 218 5.20 Templating mit Facelets 222 5.21 Eigene JSF-Komponenten 226 5.22Komponentenbibliotheken 233 5.23Security 234 6 Enterprise JavaBeans 237 6.1Aufgabenstellung 237 6.2 Aufbau von Enterprise JavaBeans 237 6.3 EJB Deployment 240 6.4 Lokaler Zugriff auf Session Beans 241 6.5Remote-Zugriff 243 6.6Transaktionssteuerung 246 6.7 Asynchrone Methoden 249 6.8Timer 250 6.9Security 252 7 Ein „Real World“-Projekt 255 7.1Aufgabenstellung 255 7.2Anwendungsarchitektur 257 7.3Persistenz 259 7.4Views 270 7.5 Fachliche Injektion 274 Stichwortverzeichnis277 8 V Vorwort Java steht uns als leistungsfähige Basis für die Softwareentwicklung schon seit mehr als 15 Jahren zur Verfügung, einen großen Teil davon auch inklusive der Enterprise Edition, d. h. der Plattform für Unternehmensanwendungen, die verteilte Systeme mit oder ohne Browser als Client, (Web-) Services, Clustering, integrierte Systemlandschaften etc. beherrschbar machen soll. Warum dann jetzt ein Buch über die Softwareentwicklung mit Java EE? Java EE ist zweifellos schon seit vielen Jahren eine verlässliche und tragfähige Plattform zur Entwicklung von Enterprise-Anwendungen. Die hohe Komplexität der ersten Versionen hat aber viele bewogen, sich ganz oder teilweise zugunsten anderer Frameworks abzuwenden. Die Kritik war bis zur Version 1.4 auch durchaus berechtigt – nun aber sind die Weichen neu gestellt in Richtung Einfachheit der Softwareentwicklung. Ein Wert von Java EE besteht sicher in ihrer abwärtskompatiblen Weiterentwicklung. Für ältere Versionen erstellte Anwendungen bleiben also weiter lauffähig. Als Kehrseite der Medaille sind somit auch die alten Strukturen der Plattform noch vorhanden. Um in den Genuss der leichtgewichtigen Softwareentwicklung zu kommen, muss man sich somit auf die neuen Wege konzentrieren und alten Ballast rechts und links liegen lassen. Dieses Buch soll Ihnen bei der Auswahl aus dem großen Angebot der Java EE eine Hilfe sein. Es hat nicht den Anspruch einer allumfassenden Darstellung, sondern beschränkt sich auf die Teile der Gesamtspezifikation, mit denen sich ein leistungsfähiger, aber überschaubarer Stack für Enterprise-Anwendungen zusammensetzen lässt. Es zeigt anhand vieler Beispiele, wie einfach Software für die Java-EE-Plattform erstellt werden kann. In einem durchgängigen „Real World“-Projekt werden am Ende alle behandelten Teile zu einer kompletten Anwendung zusammengesetzt und so das Zusammenspiel der Einzelteile verdeutlicht. Begleitprojekte Die im Buch gezeigten Beispiele stammen aus den Begleitprojekten zu den jeweiligen Buchkapiteln. Sie stehen unter dem URL http://www.gedoplan.de/veroeffentlichungen/ javaee6buch zum Download bereit. Dort ist auch das erwähnte übergreifende Projekt enthalten. Weiterführende Dokumentation Im Sinne der Auswahl der zur leichtgewichtigen Softwareentwicklung benötigten Teile der Java EE geht das Buch nicht auf sämtliche Details der Plattformbestandteile ein, son- Java EE 6 9 Vorwort dern verweist für weniger häufig genutzte Informationen auf die jeweiligen Spezifikationen. Sie können über http://jcp.org auf diese Texte zugreifen. Am Anfang der Buchkapitel finden Sie jeweils einen entsprechenden Link. Wir haben weitgehend darauf verzichtet, die Java-Dokumentation der Plattformklassen im Buch abzudrucken, da sie online verfügbar ist. Sie kann unter http://docs.oracle.com/ javaee/6/api/ direkt gelesen werden und ist unter http://www.oracle.com/technetwork/java/ javaee/documentation/ downloadbar. 10 1 1 1.1 Java EE im Überblick Aufgabenstellung Java EE steht für „Java Platform, Enterprise Edition“ und ist eine Dachspezifikation mit gut drei Dutzend einzelnen Spezifikationen, die als Ergänzung der Standard Edition für unterschiedliche Bereich der Anwendungsentwicklung dienen. Im Kern geht es um verteilte Anwendungen, die ggf. auf mehreren Servern laufen, von Clients unterschiedlichen Typs genutzt werden und mit anderen Anwendungen im Unternehmensverbund vernetzt sind. Einige Teilspezifikationen sind aber auch im reinen Standard-Umfeld anwendbar. Die Spezifikationen legen die Schnittstellen und Umgebungseigenschaften sehr strikt fest und definieren zudem eine Menge standardisierter Infrastrukturdienste wie bspw. Transaktionssteuerung oder Komponentenregistrierung. Entwickler erhalten dadurch einen vorgegebenen Rahmen, in dem sie Software erstellen können, ohne stets die komplexe Laufzeitumgebung vor Augen zu haben. Sie können sich idealerweise auf das konzentrieren, was ihre eigentliche Aufgabe ist: Fachlogik implementieren. 1.2 Architekturmodell Java-EE-Anwendungen lassen sich grob aufteilen in eine Clientschicht, die serverseitige Implementierung und eine Schicht, in der Daten abgelegt oder von anderen Systemen weiterverarbeitet werden. Als Clients von Java-EE-Anwendungen werden häufig Browser eingesetzt. Die Präsentationslogik wird in diesem Fall serverseitig bereitgestellt, vielfach durch JavaServer Faces in einem Web Container. Desktopclients implementieren die Präsentationslogik i. d. R. selbst. Sie greifen entweder direkt auf die Geschäftslogik zu oder bedienen sich bspw. Web Services. Die Geschäftslogik kann mittels CDI und/oder EJB programmiert werden und diverse weitere serverseitige Techniken wie Java Persistence, Connector, Messaging etc. verwenden. Die verarbeiteten Daten werden häufig in Datenbanken abgelegt, können aber auch in anderen Backend-Systemen liegen, die auf unterschiedliche Weise angebunden werden können. Java EE 6 11 1 – Java EE im Überblick Abbildung 1.1 zeigt dieses Modell schematisch. Es ist aus Gründen der Übersichtlichkeit etwas vereinfacht: •• Neben Browser und Desktop sind andere Clients denkbar wie bspw. mobile Geräte •• In der Webschicht sind andere Framework als JavaServer Faces einsetzbar •• Aus der Geschäftslogikschicht ließen sich die eher technische Aspekte wie Connector, Messaging etc. in eine Infrastrukturschicht extrahieren Abbildung 1.1: Java-EE-Architekturmodell 1.3 Anwendungsbestandteile und Formate Java-EE-Anwendungen sind aus wohldefinierten Teilen aufgebaut, die sich grob an den Architekturbestandteilen orientieren. Technisch werden die Teile in separaten Jar-Dateien bereitgestellt. Da in den weiteren Kapiteln des Buches näher auf die Bestandteile eingegangen wird, soll hier zunächst nur ein grober Überblick geschaffen werden. 12 Anwendungsbestandteile und Formate Webanwendung Dieser Anwendungsteil fasst die Webdokumente, Servlets etc. zusammen, die für die serverseitige Präsentationslogik der Anwendung benötigt werden, und zwar in ein Jar-File mit der Endung .war. Ein optionaler Deployment Descriptor WEB-INF/web.xml erlaubt die Konfiguration der Anwendung. Enterprise JavaBeans Im ursprünglichen Ansatz der Java EE waren EJBs der Platz für die serverseitige Geschäftslogik. Die Klassen und Interfaces mehrerer EJBs werden dann zu einem Jar-File zusammengepackt. Auch hier können Konfigurationswerte in einem Descriptor META-INF/ ejb-jar.xml beigefügt werden. Die Endung .jar lässt leider keine direkte Unterscheidung von einer einfachen Bibliothek zu. CDI Die Aufgaben von EJBs können weitgehend von CDI übernommen werden. Java EE definiert dafür kein spezielles Anwendungsformat. Vielmehr werden die CDI-Klassen und Interfaces direkt oder als einfache Bibliothek in die gesamte Anwendung integriert. Hier ist ein Descriptor namens beans.xml notwendig. Enterprise-Anwendung Hierin werden die zuvor genannten Bestandteile nochmals zusammengefasst, und zwar zu einem Jar-File mit der Endung .ear. Zusätzlich können auch Konnektoren und Application Clients integriert werden, worauf hier aber nicht weiter eingegangen werden soll. Konfigurationsparameter dürfen in META-INF/application.xml eingetragen werden. In einem speziellen Verzeichnis – üblicherweise lib genannt – können Bibliotheken eingetragen werden, die der gesamten Anwendung zur Verfügung stehen sollen. Abbildung 1.2 zeigt schematisch den Aufbau einer Enterprise Application, wobei die Inhalte der Applikationsteile – ihrerseits Jar-Files – exemplarisch angegeben sind. Java EE 6 13 1 – Java EE im Überblick Abbildung 1.2: Aufbau einer Enterprise-Anwendung inklusive der Inhalte der Anwendungsteile Deployment-Formate Im Sinne der Spezifikation sind Web- und Enterprise-Anwendungen deploy-fähig. Das eigentliche Deployment-Verfahren ist abhängig vom verwendeten Application Server. Vielfach wird ein Autodeploy-Ordner angeboten, in den die .war- bzw. .ear-Dateien kopiert werden können. Alternativ oder zusätzlich bieten die Hersteller Administrationswerkzeuge an, mit denen ein Deployment von Anwendungen vorgenommen werden kann. Einige Server erlauben auch das Deployment von Verzeichnissen. Sie haben die interne Struktur der genannten Archivdateien, sind aber eben nicht gepackt. Die gängigen Ent- 14 Profile wicklungsumgebungen nutzen dies häufig für ein schnelles und inkrementelles Deployment-Verfahren direkt aus der IDE heraus. Die Entscheidung für eines der beiden „offiziellen“ Deployment-Formate ist weniger technischer, sondern eher organisatorischer Natur: •• Das EAR-Format eignet sich recht gut, wenn die Anwendungsteile klar abgegrenzt sind und sich das auch in der erstellten Dateistruktur widerspiegeln soll. Die Anwendung wird im Betrieb mit mehreren Classloadern geladen, die einander in der Art referenzieren, dass die Webanwendungen die Klassen der gesamten Anwendung nutzen können, umgekehrt aber die Klassen einer Webanwendung für andere Anwendungsteile nicht sichtbar sind. Die Abhängigkeiten der Anwendungskomponenten untereinander spiegeln sich hier also im Classloading passend wider. •• In vielen Fällen benötigt man die zwar klare, aber doch komplexe Struktur des EAR- Deployments nicht. Dann kann ein WAR-Deployment gewählt werden (entsprechend dem oberen umrahmten Teil der Abbildung 1.2). Obwohl es sich nun dem Namen nach um eine Webanwendung handelt, können auch EJBs oder CDI Beans integriert werden1, sodass das WAR-Format keine Nachteile im Hinblick auf die verwendbaren Teile hat. Die Anwendung wird nun allerdings mit nur einem Classloader geladen, sodass zwischen den Anwendungsklassen keinerlei Isolation gegeben ist. Die Begleitprojekte zu den Buchkapiteln sind als WAR-Deployments aufgebaut. 1.4 Profile Beginnend mit der Version 6 der Java EE wurde eine Gruppierung der Teilspezifikationen in sog. Profile eingeführt. Damit wird der Tatsache Rechnung getragen, dass für viele Anwendungstypen nur bestimmte Teile der Java EE benötigt werden. Ein Serverhersteller ist damit nicht mehr gezwungen, für einen Java-EE-Server die gesamte Bandbreite der Spezifikation abzudecken. Er kann vielmehr einen Server anbieten, der ein bestimmtes Profil unterstützt. Derzeit ist neben dem Gesamtumfang – dem Full Profile – nur das Web Profile definiert, das die Teile der Java EE enthält, die man i. d. R. zum Aufbau von webbasierten Anwendungen benötigt (Abb. 1.3). In der Zukunft werden sicher weitere Profile definiert werden, z. B. zur Unterstützung von Web Services oder Messaging. 1 Die Descriptoren aus META-INF werden im WAR-Deployment in WEB-INF platziert. Java EE 6 15