184 115 3MB
Polish Pages 183 Year 2013
Tytuł oryginału: Java EE 6 Pocket Guide TłUillaczenie: ivlikołaj Szczepaniak ISBN: 978-83-246-6643-0
© 2013 Helion S.A. Authorized Polish translation of the English edition Java EE 6 Pocket Guide, ISBN 9781449336684, © 2012 Arun Gupta. This translation is published and sold by permission of O'Reilly ivledia, Inc., which owns or controls all rights to publish and sell the same. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki le, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: WWW:
[email protected] http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/jee6lk_ebook
ivlożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland.
•
Poleć książkę na Facebook.com
•
Księgarnia internetowa
•
Kup w wersji papierowej
•
Lubię to!» Nasza społeczność
•
Oceń książkę
Dla Menki, mojej kochanej żony i najlepszego przyjaciela. Twoje wsparcie i zachęty sprawiają, że nasze życie jest pełne radości i wypełnione treścią. Dla Aditji i Mihira, moich dwóch roześmianych synów, za wspólne zabawy i za przekazywanie mi niezwyklej energii.
Spis treści
Słowo wstępne
9 12 12 15 19
1. Java Platform, Enterprise Edition Wprowadzenie Elementy składowe Co nowego w wersji Java EE 6
23
2. Komponenty zarządzane Definiowanie i stosowanie komponentów zarządzanych
23
Wywołania zwrotne cyklu życia
25
3. Serwlety
26
Serwlety
26
Filtry serwletów
32
Obiekty nasłuchujące zdarzeń
33
Obsługa operacji asynchronicznych
37
Fragmenty konfiguracji
39
Bezpieczeństwo
40
Pakowanie zasobów
43
Odwzorowywanie błędów
44
Obsługa żądań wieloczęściowych
44
4. Java Persistence API
46
Encje
46
Jednostka utrwalania, kontekst utrwalania i menedżer encji
50 52
Tworzenie, odczytywanie, aktualizowanie i usuwanie encji Sprawdzanie poprawności encji
56
Transakcje i blokowanie
58 60
Buforowanie
Spis treści
5
5. Enterprise JavaBeans
62
Bezstanowe komponenty sesyjne
65
Singletonowe komponenty sesyjne
66
Komponenty sterowane komunikatami
68
Przenośne, globalne nazwy JNDI
70
Transakcje
71
Przetwarzanie asynchroniczne
74
Liczniki czasu
75
Interfejs Embeddable API
79
EJB.Lite
80
6. Konteksty i wstrzykiwanie zależności
82
Punkty wstrzykiwania
83
Kwalifikator i alternatywa
84
Producent i dyspozytor
86
Obiekty przechwytujące i dekoratory
88
Zasięgi i konteksty
92
Stereotypy
94
Zdarzenia
95
Przenośne rozszerzenia
97
7. JavaServer Faces
100
Facelety
101
Obsługa zasobów
105
Komponenty złożone
105
Ajax
109
Żądanie HTTP GET
113
Punkty rozszerzeń serwera i klienta
115
Reguły nawigacji
118
8. Usługi sieciowe na bazie protokołu SOAP
6
62
Stanowe komponenty sesyjne
119
Punkty końcowe usług sieciowych
121
Dynamiczne punkty końcowe na bazie interfejsu Provider
124
Punkty końcowe na bazie interfejsu Endpoint
125
Klient usługi sieciowej
127
Dynamiczny klient na bazie interfejsu Dispatch
129
Obiekty obsługujące
131
Spis treści
9. Usługi sieciowe zgodne ze stylem REST
134
Proste usługi sieciowe zgodne z REST
135
Wiązanie metod protokołu HTTP
137
Wiele reprezentacji jednego zasobu
140
Wiązanie żądania z zasobem
141
Odwzorowywanie wyjątków
143
10. Java Message Service
144
Wysyłanie wiadomości
147
Jakość usługi
149
Synchroniczne odbieranie komunikatu
150
Asynchroniczne odbieranie komunikatu
152
Tymczasowe miejsca docelowe
153
154
11. Bean Validation Ograniczenia wbudowane
154
Definiowanie niestandardowych ograniczeń
158
Grupy sprawdzania poprawności
162
Integracja z technologią JPA
164
Integracja z frameworkiem JSF
166
A Programowanie i wdrażanie aplikacji platformy Java EE 6 - pierwsze kroki
168
B Dodatkowe materiały
170
Specyfikacje technologii internetowych
170
Specyfikacje technologii korporacyjnych
170
Technologie usług sieciowych
171
Technologie zarządzania i zabezpieczeń
171
Skorowidz
173
O autorze
183
Kolofon
184
Spis treści
7
8
Spis treści
Java EE 6 Leksykon kieszonkowy
Słowo wstępne Platforma Java EE 6 wyznacza nowe standardy łatwego wytwarzania aplikacji korporacyjnych Javy. Ta książka jest adresowana do wszystkich, którzy chcą szybko poznać elementy tej platformy i opanować podstawy ich stosowania. Książka zawiera przegląd najważniejszych specyfikacji składających się na platformę Java EE 6 (każda z tych specyfikacji została opisana w osobnym rozdziale) . Najważniejsze zagadnienia związane z poszcze gólnymi specyfikacjami zostały szczegółowo wyjaśnione i dodatkowo zilustrowane przykładami kodu źródłowego. Nie oczekuję od Czytelnika znajomości poprzednich wersji platformy. Rozumienie kodu wyma ga jednak podstawowej wiedzy na temat programowania w Javie .
Konwencje stosowane w książce W książce zastosowano następujące konwencje typograficzne:
Kursywa Kursywa jest stosowana dla adresów poczty elektronicznej oraz nazw i rozszerzeń plików . C z c i o n ka s tałej s z ero kośc i Czcionka stałej szerokości jest stosowana w listingach programów oraz w samym tekście, w odwołaniach do nazw zmiennych lub funkcji, baz danych, typów danych, zmiennych środowiskowych, wyrażeń i słów kluczowych. Czcionka stałej szerokości pisana kursywą
Kursywa służy do wyróżniania fragmentów, które należy zastąpić konkretnymi wartościami lub których wartość zależy od kontekstu.
9
Stosowanie przykładów kodu Ta książka ma ułatwić czytelnikowi realizację konkretnych zadań . Ogólnie kod źródłowy prezentowany w niej można swobodnie sto sować w programach i dokumentacji . Nie oczekuję wniosków o zgodę, chyba że czytelnik planuje ponowną publikację istotnych fragmentów tego kodu. Na przykład pisanie programów obejmujących wiele frag mentów kodu dołączonego do tej książki nie wymaga dodatkowych pozwoleń. Zgoda wydawcy jest natomiast wymagana w przypadku sprzedaży lub dystrybucji płyt CD-ROM z przykładami zaczerpnię tymi z tej książki . Zgoda wydawcy nie jest wymagana także w przy padku cytowania tekstu tej książki lub zawartych w niej przykładów kodu. Jest jednak niezbędna, jeśli istotna część przykładowego kodu z tej książki ma trafić do dokumentacji jakiegoś produktu . Będziemy wdzięczni za stosowne przypisy (które nie są wymagane) . Przypis zwykle obejmuje tytuł, autora, wydawcę i numer ISBN. Na przykład: „Java EE 6. Leksykon kieszonkowy, Arun Gupta, Helion 2013, ISBN: 978-83-246-6640-9" . Każdy, kto nie jest pewien, czy planowany sposób użycia przykłado wego kodu mieści się w granicach zastosowań, które nie wymagają dodatkowej zgody, może skontaktować się z wydawcą .
Podziękowania Napisanie tej książki nie byłoby możliwe bez wsparcia wielu osób . Chciałbym najpierw podziękować wydawnictwu O'Reilly za zaufanie, którym mnie obdarzyło, i za szansę napisania tej książki . Zespół pra cowników wydawnictwa zapewnił mi bezcenne wsparcie na wszystkich etapach redagowania, recenzowania, korekty i publikacji. Michael Loukides z wydawnictwa O'Reilly pomógł mi na początku prac nad tą książką. Meghan Blanchette pomogła mi w pracach redakcyjnych na wszystkich etapach - na bieżąco recenzowała tekst, sugerowała stosowanie właściwych stylów, organizowała korekty merytoryczne i koordynowała moją współpracę z pozostałymi członkami zespołu . Jessica Hosman pomogła mi na początku projektu i dawała wskazówki podczas prac nad właściwą treścią książki . Emily Quill i Kristen Borg dbały o poprawność językową tekstu i do kładały wszelkich starań, aby doprowadzić ten materiał do perfekcji.
10
Java EE 6. Leksykon kieszonkowy
Dziękuję także pozostałym członkom zespołu wydawnictwa O'Reilly, z którymi nie miałem bezpośredniego kontaktu i którzy pomagali pod czas prac nad książką na wiele różnych sposobów . Szczegółowa korekta i recenzja Markusa Eisele'a (@myfear, http://blog. eisele.net), Johna Yeary'ego (@jyeary, http://javaevangelist.blogspot.com) i Berta Ertmana (@BertErtman, http://bertertman.wordpress.com) to najlepsza gwarancja merytorycznej poprawności tego tekstu i uwzględnienia wszystkich ważnych aspektów. Ogromne doświadczenie i duża wiedza recenzentów przejawiały się chocby w liczbie uwag i komentarzy. Jestem wdzięczny także programistom z całego świata za liczne dys kusje, które bardzo pomogły mi w lepszym rozumieniu poszczegól nych technologii . Dziękuję swoim kolegom z firmy Oracle i liderom zespołów odpowiedzialnych za specyfikacje JSR, którzy cierpliwie wyja śniali mi przypadki użycia uzasadniające różne technologie. Dziękuję też wszystkim innym osobom, które miałem przyjemność spotkać na swojej drodze i które umilały mi tak potrzebne przerwy w pracach nad tą książką .
Słowo wstępne
11
Rozdział 1. Java Platform, Enterprise Edition
Wprowadzenie Java Platform, Enterprise Edition Oava EE) to platforma programowania stworzona na bazie przyjętych standardów i umożliwiająca tworzenie aplikacji internetowych i korporacyjnych. Aplikacje tego typu zwykle składają się z wielu warstw, w tym warstwy frontowej obejmującej fra meworki aplikacji internetowych, warstwy środkowej odpowiedzialnej za bezpieczeństwo i obsługę transakcji oraz warstwy wewnętrznej ob sługującej połączenia z bazą danych lub rozwiązaniami odziedziczonymi po starszych systemach. Platforma Java EE nie tylko definiuje interfejsy API dla rozmaitych komponentów każdej z tych warstw, ale też udo stępnia dodatkowe usługi umożliwiające zarządzanie nazwami, wstrzy kiwaniem kodu czy zasobami niezależnie od warstwy. Każdy komponent jest zdefiniowany w odrębnej specyfikacji opisującej odpowiedni interfejs API i oczekiwane zachowania oraz obejmującej dokumentację javadocs. Wydanie Java Platform, Enterprise Edition 6 Oava EE 6) z grudnia 2009 roku oferuje prosty, łatwy w użyciu i kompletny zbiór technologii i rozwiązań potrzebnych do budowy tego rodzaju aplikacji. Już w po przedniej wersji Oava EE 5) twórcy tej platformy podjęli pierwsze kroki na rzecz uproszczenia pracy programistów. Platforma Java EE 6 w jeszcze większym stopniu podnosi produktywność programistów i obejmuje wiele dodatkowych, niezwykle przydatnych mechanizmów . Poniżej opisano trzy najważniejsze cele przyświecające twórcom tej platformy: Łatwość stosowania
Platforma Java EE 6 to zupełnie nowa jakość w kwestii prostoty programowania. Zastosowano tutaj na niespotykaną wcześniej skalę koncepcję konwencji ponad konfiguracją oraz mechanizm adnotacji używanych do oznaczania obiektów POJO (Plain Old Java Object- dosł. zwykłych, starych obiektów Javy) . Wystarczy dodać adnotację @Statel ess, @Stateful lub @S i ng l eton, aby przekształcić obiekt POJO w komponent Enterprise JavaBean . Co więcej, tak przygotowany obiekt można łatwo umieścić w pliku WAR, zamiast stosować specjalne techniki pakowania plików JAR czy EAR. Także serwlety mają teraz postać obiektów POJO, tyle że ozna czonych adnotacją @WebServl et. Deskryptory wdrożenia, jak web.xml czy faces-config.xml, w większości przypadków są opcjonalne 12
Java EE 6. Leksykon kieszonkowy
informacje, które wcześniej definiowano w tych deskryptorach, znajdują się teraz w odpowiednich adnotacjach. Istnieją też do myślne reguły nawigacji pomiędzy stronami JSF . Publikowanie obiektu jako usługi sieciowej zgodnej z REST sprowadza się teraz do umieszczenia adnotacji @Path w zwykłym obiekcie POJO. Opcjonalne deskryptory wdrożenia, konwencja ponad konfiguracją i powszechne stosowanie adnotacji powoduje, że platforma Java EE 6 jest łatwa w użyciu i - co równie ważne - nie wymaga takich ilości kodu jak starsze wersje. Lekkość
Platforma Java EE 6 obejmuje 31 specyfikacji komponentów (patrz dodatek EE .6 specyfikacji tej platformy) . Wspomniane komponenty obejmują Enterprise JavaBeans (EJB), serwlety, JavaSe rver Faces OSF), usługi Java API for RESTful Web Services OAX-RS) i wiele innych. Budowa typowych aplikacji korporacyjnych zwy kle nie wymaga wszystkich tych komponentów. Co więcej, nie które spośród tych technologii, na przykład Java API for XML Registries (JAXR) oraz Java API for XML-based RPC (JAX-RPC) mają czasy świetności za sobą (cieszyły się dużą popularnością w czasie wprowadzania do platformy Javy) . Od tamtej pory zo stały albo zastąpione przez lepsze komponenty, jak Java API for XML Web Services (JAX-WS), albo w ogóle nie są używane. Zespół Java SE Expert zdefiniował dwuetapowy proces usuwania niepotrzebnych rozwiązań z platformy. W ramach tego procesu (określanego mianem przycinania - ang . pruning) wybrany element jest w jednym wydaniu oznaczany jako opcjonalny (a kon kretnie proponowany jako opcjonalny - ang. proposed optional), a następnie, w kolejnym wydaniu, jest ostatecznie usuwany, pozo stawiany jako niezbędny komponent lub zachowuje status kom ponentu opcjonalnego. Zespół Java EE Expert Group zastosował już opisaną procedurę do wskazania kilku mechanizmów jako kandydatów do przycięcia. Proces eliminowania zbędnych kom ponentów przypomina trochę przycinanie krzewów róży, aby umożliwić swobodny wzrost świeżych kwiatów. Przycinanie nie używanych mechanizmów daje nam pewność, że nawet wprowa dzanie do platformy nowych elementów nie będzie miało nega tywnego wpływu na prostotę i lekkość tej technologii . W platformie Java EE wprowadzono też pojęcie profilów. Profil reprezentuje konfigurację platformy przystosowaną do określonej klasy aplikacji. Profil może obejmować podzbiór lub nadzbiór Rozdział 1. Java Platform, Enterprise Edition
13
technologii składających się na tę platformę. Na przykład profil Java EE 6 Web Profile definiuje odrębną specyfikację w ramach platformy Java EE obejmującą podzbiór technologii używanych przez programistów współczesnych aplikacji internetowych. Profile naruszają zasadę jednego rozwiązania pasującego do wszystkich zastosowań (ang. one size fits all), która obowiązywala w starszych wydaniach. Mimo że wspomniany profil jest podzbiorem elemen tów oryginalnej platformy, stanowi kompletny zbiór standardo wych interfejsów API i jako taki jest gotowym pakietem umoż liwiającym budowę najróżniejszych aplikacji internetowych. Profil aplikacji internetowych umożliwia programistom szybką budowę potrzebnych rozwiązań bez konieczności samodzielnego konstru owania niezbędnych stosów technologii . Istnieje też możliwość definiowania dodatkowych profili zgodnie z zaleceniami i regu łami Java Community Process (JCP) . Właśnie procedurze przycinania i koncepcji profili platforma Java EE 6 zawdzięcza swoją lekkość i łatwość konserwacji. Rozszerzalność
Platforma oferuje bogaty zbiór funkcji przydatnych podczas two rzenia aplikacji korporacyjnych. Okazuje się jednak, że spora część programistów stosuje zewnętrzne frarneworki, które uzupełniają lub dopełniają oryginalną ofertę platformy. Wspomniane frarneworki wymagają rejestrowania dodatkowego komponentu Serv l et Li sten er, Serv l et F i l ter lub dowolnego innego, który umożliwi prawidłowe rozpoznawanie odpowiednich mechanizmów w czasie wykony wania. Specyfikacja serwletów definiuje mechanizm części (frag mentów) konfiguracji aplikacji internetowych (ang. web fragment), umożliwiający definiowanie wspomnianych punktów wejścia fra meworków w ramach biblioteki . Ponieważ framework jest reje strowany przez kontenery serwletów, programista nie musi sarn wszystkiego konfigurować. Dzięki temu dodatkowe frameworki są traktowane jako obywatele pierwszej kategorii na platformie Java EE . Co więcej, specyfikacja kontekstów i wstrzykiwania zależności (ang. Contexts and Dependenci} Injection - CDJ) definiuje przenośny mechanizm rozszerzeń, który umożliwia rozszerzanie możliwości tej platformy na wiele różnych sposobów, na przykład poprzez udostępnianie predefiniowanych zasięgów. Nowy zasięg można łatwo zdefiniować i dołączyć na dowolnym serwerze aplikacji zgodnym ze specyfikacją Java EE 6 - wystarczy użyć mecha nizmu przenośnych rozszerzeń . 14
Java EE 6. Leksykon kieszonkowy
O potencjale platformy Java EE 6 decydują też takie specyfikacje jak CDI, JavaServer Faces 2, Java API for RESTful Services, Java Persistence API 2 czy Servlets 3. W tej książce omówię najważniejsze technologie tej platformy. Zaprezentuję też czytelne, łatwe do opanowania przykłady kodu, które dobrze ilustrują udoskonalenia wprowadzone w wydaniu Java EE 6.
Elementy składowe Platformę Java EE 6 opracowano jako Java Specification Request 316 (JSR 316 patrz http://jcp.org/en/jsr/detail?id=316) zgodnie z regułami procesu Java Community Process (JCP) 2.7 . Proces JCP definiuje trzy najważniejsze elementy składowe każdej specyfikacji JSR: -
Specyfikacja
Formalny dokument opisujący zaproponowany komponent i jego możliwości . Implementacja referencyjna (RI)
Binarna implementacja zaproponowanej specyfikacji. Implementacja RI (od ang. Rejerence Implementation) dowodzi, że zaproponowana specyfikacja może zostać zaimplementowana w formie binarnej, i jednocześnie stanowi cenne źródło wskazówek dla autorów specyfikacji. Pakiet zgodności technologicznej (TCK)
Pakiet TCK (od ang. Technology Compliance Kit) jest w istocie zbio rem testów sprawdzających zgodność implementacji RI ze spe cyfikacją. Dzięki temu pakietowi niezależni producenci mogą tworzyć własne implementacje i weryfikować ich poprawność. Platforma Java EE 6 składa się ze specyfikacji definiującej wymagania, które obowiązują wszystkie komponenty. Platforma obejmuje też specy fikacje następujących komponentów: Technologie internetowe •
JSR 45 obsługa mechanizmów diagnostycznych dla pozo stałych języków programowania
•
JSR 52 biblioteka standardowych znaczników (JSTL) dla JavaServer Pages 1 .2
•
JSR 245 (EL) 1 .2
-
-
-
JavaServer Pages (JSP) 2.2 i Expression Language
Rozdział 1. Java Platform, Enterprise Edition
15
•
JSR 314 - JavaServer Faces (JSF) 2.0
•
JSR 315 - Servlet 3 .0
Technologie korporacyjne •
JSR 250- standardowe adnotacje dla platformy Javy (wersja 1.1)
•
JSR 299 - Contexts and Dependency Injection (CDI) dla platformy Java EE (wersja 1 .0)
•
JSR 303- sprawdzanie poprawności komponentów (wersja 1.0)
•
JSR 316- komponenty zarządzane (wersja 1 .0)
•
JSR 317- Java Persistence API (JPA) 2.0
•
JSR 318 - Enterprise JavaBeans (EJB) 3 .1
•
JSR 318 - obiekty przechwytujące (wersja 1 .1)
•
JSR 322 - Java EE Connector Architecture 1.6
•
JSR 330 - wstrzykiwanie zależności w Javie (wersja 1.0)
•
JSR 907 - Java Transaction API (JTA) 1.1
•
JSR 914 - Java Message Server (JMS) 1.1
•
JSR 919 - JavaMail 1.4
Technologie usług sieciowych
16
I
•
JSR 67 - Java APls for XML Messaging (JAXM) 1 .3
•
JSR 93 - Java API for XML Registries (JAXR) 1.0
•
JSR 101 - Java API for XML-based RPC (JAXRPC) 1.1
•
JSR 109 - implementacje korporacyjnych usług sieciowych (wersja 1.3)
•
JSR 173 - Streaming API for XML (StAX) 1.0
•
JSR 181 - metadane usług sieciowych dla platformy Javy (wersja 2.0)
•
JSR 222- Java Architecture for XML Binding (JAXB) 2.2
•
JSR 224 - Java API for XML Web Services (JAXWS) 2.2
•
JSR 311 - Java API for RESTful Web Services (JAXRS) 1.1
Java EE 6. Leksykon kieszonkowy
Technologie zarządzania i zabezpieczeń • JSR 77 — interfejs API do zarządzania J2EE (wersja 1.1) • JSR 88 — interfejs API do wdrażania aplikacji platformy Java EE (wersja 1.2) • JSR 115 — Java Authorization Contract and Containers (JACC) 1.3 • JSR 196 — Java Authentication Service Provider Interface for Containers (JASPIC) 1.0 Poszczególne komponenty współpracują ze sobą, tworząc zintegrowany stos technologii (patrz rysunek 1.1).
Rysunek 1.1. Architektura platformy Java EE 6
Wyjaśnienie rysunku 1.1: • Technologie JPA, JTA i JMS oferują tak podstawowe usługi jak dostęp do bazy danych, obsługa transakcji czy przesyłanie komunikatów. • Komponenty zarządzane i EJB tworzą uproszczony model programowania prostych usług przy użyciu obiektów POJO. • CDI, obiekty przechwytujące i standardowe adnotacje to rozwiązania, które można z powodzeniem stosować w wielu różnych komponentach — tak jest na przykład w przypadku wstrzykiwania zależności z zachowaniem bezpieczeństwa za pomocą obiektów przechwytujących i wspólnego zbioru adnotacji.
Rozdział 1. Java Platform, Enterprise Edition
|
17
•
Rozszerzenia CDI umożliwiają rozbudowę istniejących mechani zmów platformy przy użyciu standardowych rozwiązań.
•
Usługi sieciowe tworzone za pomocą technologii JAX-RS i JAX-WS, JSF, JSP oraz języka wyrażeń EL wyznaczają pewien model pro gramowania aplikacji internetowych. Technologia dzielenia konfi guracji (Web Fragrnents) umożliwia automatyczną rejestrację ze wnętrznych frameworków aplikacji internetowych w naturalny sposób .
•
Mechanizm sprawdzania poprawności komponentów (Bean Vali dation) oferuje standardowe rozwiązania w zakresie deklarowania i weryfikacji ograniczeń dla komponentów budowanych na bazie różnych technologii .
JAX-RPC OSR 101), JAXR OSR 93), komponenty encyjne EJB (fragment specyfikacji JSR 153) oraz wdrażanie aplikacji Java EE OSR 88) oznaczono jako technologie obcinane w tej wersji platformy Java EE. Implementację referencyjną (RI) platformy Java EE 6 zbudowano przy użyciu serwera GlassFish Community. GlassFish Server Open Source Edition to pełnoprawny, darmowy, w pełni zgodny ze specyfikacją Java EE 6 serwer aplikacji open source. Produkt jest dostępny także w formie dystrybucji Web Profile, którą można pobrać ze strony internetowej http://glassfish.org. Wspomniany serwer aplikacji jest łatwy w użyciu (ma postać instalatora w pliku zip i oferuje integrację ze środowiskami NetBeans, Eclipse oraz IntelliJ), jest lekki (najmniejsze wersje dostęp ne do pobrania zajmują zaledwie 30 MB na dysku) oraz ma modułową konstrukcję (serwer zbudowano na bazie frameworku OSGi; kontenery są uruchamiane według bieżących potrzeb) . Serwer GlassFish oferuje też mechanizmy podziału na klastry i scentralizowaną administrację na bazie interfejsu CLI, konsoli administracyjnej WWW i interfejsów REST API umożliwiających zarządzanie i monitorowanie aplikacji. Oracle GlassFish Server, czyli dystrybucję serwera GlassFish, dla której firma Oracle oferuje komercyjne usługi wsparcia, można pobrać ze strony http://oracle.com/goto/glassfish. W czasie gdy pisałem tę książkę, było dostępnych 17 serwerów aplikacji zgodnych ze specyfikacją Java EE 6. Kompletną listę serwerów można znaleźć na stronie http://w.ww oracle.com/
technetwork/java/javaee/overview/compatibility-jsp-136984 .html. Pakiety TCK dostępne dla wszystkich licencji platformy Java EE umożli wiają łatwe testowanie odpowiednich implementacji.
18
Java EE 6. Leksykon kieszonkowy
Co nowego w wersji Java EE 6 Potencjał i bogactwo platformy Java EE 6 zostały poszerzone poprzez wprowadzenie kilku zupełnie nowych specyfikacji . Także wiele istnieją cych specyfikacji komponentów zostało udoskonalonych przede wszyst kim w celu ich uproszczenia i ułatwienia pracy programistów . Poniżej wymieniono najważniejsze spośród nowych i zmodyfikowanych elementów specyfikacji. Komponenty zarządzane •
Komponenty zarządzane na bazie obiektów POJO.
•
Zbiór standardowych usług, w tym wstrzykiwanie zasobów na czas całego cyklu życia, wywołania zwrotne oraz obiekty prze chwytujące.
Enterprise JavaBeans •
Komponent EJB można teraz utworzyć za pomocą pojedynczego pliku kodu źródłowego - wystarczy użyć adnotacji @State l ess, @Stateful lub @S i ng l eto n .
•
Komponenty EJB można umieszczać w pliku .war z myślą o do stępie lokalnym (za pomocą adnotacji @Loca l ) lub w pliku ejb-jar z myślą o dostępie lokalnym i zdalnym.
•
Dostęp do komponentów EJB można uzyskiwać za pomocą przenośnych, globalnych nazw JNDI .
•
Metodę komponentu sesyjnego można oznaczyć jako wywoły waną asynchronicznie. Metody tego typu umożliwiają klientowi uzyskiwanie wartości wynikowych jakiś czas po wywołaniu lub stosowanie wzorca „odpal i zapomnij" (ang. fire-and-forget).
•
Zdarzenia czasowe można planować, stosując składnię podobną do tej znanej z narzędzia cron - wystarczy oznaczyć wybrane metody komponentu adnotacją @Sched u l e .
•
Interfejs API Embeddable EJB umożliwia uruchamianie kodu klienckiego i odpowiednich komponentów EJB w ramach tej samej wirtualnej maszyny Javy OVM) i tego samego mechanizmu ładowania klas.
Rozdział 1 . Java Platform, Enterprise Edition
19
SerwI ety •
Serwlety sterowane adnotacjami (@WebServl et), filtry sterowane adnotacjami (@WebFi 1 ter) oraz obiekty nasłuchujące sterowane adnotacjami (@Webli stener) . W większości przypadków deskryp tor web.xml ma teraz charakter opcjonalny.
•
Serwlety, filtry i obiekty nasłuchujące można programowo reje strować za pomocą obiektu Serv l etContext .
•
Serwlety asynchroniczne umożliwiają zwracanie sterowania (lub wątku) do kontenera, tak aby było możliwe wykonywanie innych zadań w czasie oczekiwania na zakończenie czasochłon nego procesu.
•
Biblioteki frameworków można integrować, stosując techniki modułowe (za pomocą pliku web-fragment.xml).
•
Zabezpieczenia serwletów można konfigurować za pomocą adnotacji @Serv 1 etSecu ri ty, @Ht t pCons tra i nt i @Ht tpMet hodCons tra i nt oraz przy użyciu tradycyjnego elementu .
Java API for RESTful Web Services (JAXRS) •
Możliwość publikacji usług sieciowych REST przy użyciu zwy kłych obiektów POJO sterowanych adnotacjami .
•
Obsługa standardowego zbioru metod protokołu HITP, jak GET, POST, PUT czy D E L E T E .
•
Każdy zasób może być reprezentowany w wielu formatach; istnieje też możliwość stosowania typów niestandardowych .
•
Obsługa negocjacji rodzaju treści ze stroną kliencką za po mocą nagłówka Accept : protokołu HTTP .
Usługi sieciowe na bazie protokołu SOAP
20
•
Możliwość publikacji usług sieciowych na bazie protokołu SOAP implementowanych w formie obiektów POJO oznaczonych ad notacjami . Lepsza kontrola nad przesyłanymi komunikatami dzięki obiektom Sou rce, DataSource i SOAPMessage.
•
Interfejs API umożliwiający klientom wywoływanie usług sieciowych na bazie protokołu SOAP .
•
Precyzyjnie zdefiniowane punkty rozszerzeń na potrzeby przetwarzania wstępnego i końcowego komunikatów żądań i odpowiedzi zarówno po stronie klienta, jak i serwera.
•
Standardowe odwzorowania Java-WSDL oraz WSDL-Java . Java EE 6. Leksykon kieszonkowy
JavaServer Faces (JSF) •
Facelety stanowią teraz zalecany język szablonów stron. Takie rozwiązanie umożliwia łatwe definiowanie komponentów kom pozytowych, co z kolei ułatwia wprowadzanie prawdziwej abstrakcji.
•
Obsługa technologii Ajax za pośrednictwem interfejsów API JavaScriptu i możliwość deklaratywnego stosowania tej technologii za pomocą elementu f : aj ax .
•
D l a większości elementów stosowanych wcześniej w pliku faces-config.xml istnieją teraz odpowiednie adnotacje. Domyślne reguły nawigacji są teraz definiowane zgodnie z zasadą kon wencji ponad konfiguracją.
•
Obsługa żądań GET protokołu HTTP i powtarzalne adresy URL (ang. bookmarkable URL).
•
Integracja z mechanizmem sprawdzania poprawności kom ponentów .
Java Persistence API •
Udoskonalone odwzorowania obiektowo-relacyjne znacznie podnoszą intuicyjność kodu odwzorowań w Javie. Rozsze rzony, bogatszy język JPQL umożliwia obsługę bardziej za awansowanych odwzorowań i wprowadza pewne nowe elementy.
•
Interfejs Metamodel reprezentuje metamodel stanu utrwalania i relacje klas zarządzanych jednostki utrwalania. Ten abstrak cyjny schemat utrwalania jest następnie używany do genero wania zapytań (gwarantujących bezpieczeństwo typów) przy użyciu interfejsu Criteria API .
•
Dodano nowe tryby blokowania, w tym obsługę pesymistycz nego modelu blokowania (obok istniejącego wcześniej optymi stycznego modelu blokowania) .
•
Standardowe opcje konfiguracyjne określane za pośrednictwem właściwości j avax . pers i stence.
Obiekty przechwytujące •
Możliwość ingerowania w wywołania i zdarzenia cyklu życia dotyczące powiązanej klasy docelowej .
Rozdział 1. Java Platform, Enterprise Edition
21
•
Obiekty przechwytujące można stosować za pomocą takich ad notacji jak @ I nterceptors lub przy użyciu deskryptora wdrożenia (na przykład beans.xml) gwarantującego bezpieczeństwo typów .
Konteksty i wstrzykiwanie zależności •
Wstrzykiwanie zależności według standardów i z zachowaniem bezpieczeństwa typów .
•
Zapewnia ścisłą kontrolę typów, ponieważ wszystkie zależności podlegają systemowi typów Javy. Nowe mechanizmy nie wy magają przy tym ścisłych związków ze zdarzeniami, obiektami przechwytującymi ani dekoratorami .
•
Zapewnia integrację z językiem wyrażeń (Expression Language) .
•
Definiuje mechanizm rozszerzalnego zasięgu i zarządzania kontekstem.
•
Stanowi most łączący warstwę transakcyjną (EJB) z warstwą prezentacji (JSF) w ramach platformy Java EE .
Sprawdzanie poprawności komponentów
22
I
•
Możliwość deklarowania i weryfikacji ograniczeń na poziomie klas dla zwykłych obiektów POJO.
•
Wbudowany zbiór definicji ograniczeń reprezentowanych przez adnotacje @NotN u l l , @Mi n, @Max i @Si z e .
•
Oprócz adnotacji programista m a do dyspozycji ograniczenia niestandardowe deklarowane w pliku META-INF/validation.xml.
Java EE 6. Leksykon kieszonkowy
Więcej
na; W\>\'W
..
ebook4all . pl
Rozdział 2. Komponenty zarządzane Komponenty zarządzane (Managed Beans) zdefiniowano w ramach do kumentu JSR 316. Kompletną specyfikację można pobrać ze strony inter netowej http://jcp.org/aboutfava/communityprocesslfinal/jsr 316/index.html. Komponent zarządzany jest w istocie obiektem POJO, tyle że traktowa nym przez kontener platformy Java EE jako byt zarządzany. Kompo nenty zarządzane stanowią naturalną podstawę dla różnych rodzajów komponentów na platformie Java EE . Wspomniana specyfikacja dodat kowo definiuje niewielki zbiór podstawowych usług Qak wstrzykiwanie zasobów, wywołania zwrotne związane z cyklem życia czy obiekty przechwytujące) dostępnych dla komponentów tego typu. Specyfikacje innych komponentów mogą uzupełniać komponenty za rządzane o dodatkowe cechy. Oryginalna specyfikacja komponentów zarządzanych definiuje nawet precyzyjnie opisane punkty rozszerzeń, które umożliwiają modyfikację niektórych aspektów . Na przykład technologia kontekstów i wstrzykiwania zależności (ang. Contexts and Dependency Injection - CDI) eliminuje konieczność definiowania bezar gumentowego konstruktora obiektu POJO i dopuszcza możliwość stosowania konstruktorów z bardziej złożonymi sygnaturami . Tech nologia CDI wprowadza też obsługę zasięgów i zdarzeń cyklu życia. Podobnie komponenty Enterprise JavaBeans (EJB) mają postać kom ponentów zarządzanych, które dodatkowo oferują obsługę transakcji i innych usług. Dzięki temu programista może zacząć od prostszych, lżejszych komponentów, aby w przyszłości (w razie takiej potrzeby) zastosować bardziej rozbudowane komponenty EJB lub CDI . Komponenty zarządzane zwykle nie są używane przez zwykłe apli kacje platformy Java EE . Okazuje się jednak, że rozwiązania opisane w tej specyfikacji wprost idealnie pasują do koncepcji platformy Java EE i jako takie mogą stanowić podstawę dla pozostałych specyfikacji komponentów .
Definiowanie i stosowanie komponentów zarządzanych Komponent zarządzany jest obiektem POJO udostępniającym bezargu mentowy konstruktor i zawierającym adnotację j avax . annotat i o n . Managed addNumbers ( i n t n l , i n t n 2 ) { I n teger res u l t ; res u l t n l + n2 ; li symulac;a czasoch/onnego zapytania =
return n ew AsyncResu l t {res u l t ) ;
Sygnatura metody wskazuje, że zwracana wartość jest instancją typu Future, zaś w ciele metody jest zwracany obiekt typu AsyncResu l t future = asyncBean . addN umbers ( l O , 20) ;
Metody interfejsu API Future umożliwiają sprawdzanie dostępności wy ników (metoda i sDone) oraz anulowanie wykonywania asynchronicznego wywołania (metoda cancel (bool ean may i n terrupt i fRu n n i ng) ) . Kontekst transakcji klienta nie jest propagowany d o asynchronicznej metody biznesowej . Oznacza to, że w przypadku metod asynchronicz nych atrybut transakcji REQU I RED ma dokładnie takie samo znaczenie jak atrybut REQU I RES_N EW. Tzw. podmiot zabezpieczeń (ang. security principal) klienta jest propa gowany do asynchronicznej metody biznesowej . Oznacza to, że kontekst zabezpieczeń jest propagowany dokładnie tak samo w przypadku metod synchronicznych i asynchronicznych .
Liczniki czasu EJB Timer Service to usługa zarządzana przez kontener, która umożli wia planowanie przyszłych wywołań zwrotnych (wykonywanych w odpowiedzi na zdarzenia czasowe) . Odpowiednie zdarzenia są pla nowane w kalendarzu (na określoną datę i godzinę), po upływie okre ślonego czasu lub w wybranych odstępach czasu. Istnieje wiele możliwych sposobów planowania zdarzeń czasowych: •
automatyczne liczniki czasu na bazie metadanych zdefiniowanych w adnotacji @Sched u l e;
•
zdarzenia zdefiniowane programowo za pomocą usługi Timer Service;
•
metody oznaczone adnotacją @Ti meout;
•
deskryptory wdrożenia.
Najbardziej popularnym sposobem wywoływania metod komponentu według zdarzeń czasowych jest oznaczanie tych metod adnotacją @Sched u l e: @State l es s publ i c c l a s s MyT i mer { @Sched ul e (hour= " * " , mi nute= " * " , second = " * / I O " ) , publ i c voi d pri n tT i me ( ) { //...
Rozdział 5. Enterprise JavaBeans
75
W powyższym kodzie metoda pri ntTi me jest wywoływana co 10 sekund w każdej minucie i w każdej godzinie. W adnotacji @Sched u l e można dodatkowo określić pola year i mon t h, które domyślnie mają wartość * (oznacza to, że metoda jest domyślnie wywoływana we wszystkich miesiącach i latach) . Kontener EJB odczytuje adnotacje @Schedul e i na ich podstawie automa tycznie tworzy potrzebne liczniki czasowe. W tabeli 5 .3 pokazano kilka przykładów adnotacji @Schedu 1 e wraz z opi sem ich znaczenia. Tabela 5.3 . Znaczenie wyrażeń w ramach adnotacji @Schedule @Sched ule
Znaczenie
hour= 11 1 , 2 , 2011
Godziny 1, 2 i 20 we wszystkie d n i roku
dayOfWee k= " Mon- Fri "
Poniedz iałe k, wtorek, środa, czwa rte k i piątek o pólnocy (z uwzględnieniem domyślnych wartości dla godzin, m i n ut i se kund)
mi n ute= 11 30 11 , hour= 11 411 , t i mezone= " Ameri c a/ Los_Angel e s " dayOfMon t h = " - 1 , Last"
Codziennie, godzina 4:30 rano czasu pacyficznego Północ dnia poprzedzającego ostatni dzień miesiąca oraz północ samego ostatn iego d n ia m iesiąca
Adnotacja @Schedul es umożliwia określanie wielu liczników czasowych. Warto pamiętać, że adnotacja @Startup nie jest wymagana, ponieważ nie we wszystkich przypadkach stosowanie metod zwrotnych cyklu życia jest konieczne. Każde ponowne wdrożenie aplikacji spowoduje auto matyczne usunięcie i odtworzenie wszystkich zastosowanych liczników czasowych. Okresowe liczniki czasu można łatwo tworzyć za pomocą metod Schedul eExpres s i on . s t art ( ) i end ( ) . Jednorazowy licznik czasu można łatwo utworzyć, definiując stałe wartości w każdym polu: @Schedu l e ( year= " A " , mon t h = " B " , dayOfMon t h = " C " , hour= " O " , mi nute= " E " , second = " F " )
Liczniki czasowe nie są mechanizmem stworzonym z myślą o przetwa rzaniu w czasie rzeczywistym, ponieważ kontener przeplata wywoła nia metod zwrotnych w związku z upływającymi limitami czasowymi, 76
Java EE 6. Leksykon kieszonkowy
wywołania właściwych metod biznesowych oraz metody zwrotne cy klu życia komponentu. Oznacza to, że metody, których wywołanie za planowano na określoną godzinę, mogą zostać wywołane z pewnym opóźnieniem. Usługa Timer Service oferuje możliwość programowego tworzenia i anu lowania liczników czasu. Programowe liczniki czasu można tworzyć za pomocą metody createXXX klasy Ti merServ i ce. W roli metody, której wy wołanie zostanie zaplanowane na określony moment, można użyć me tody ej bTi meo ut interfejsu T i medObj ect: pac kage org . s amp l e ; @S i n g l eton @Startup publ i c c l a s s MyT i mer i mp l ements T i medObj ect @Resource T i merServ i ce t i merServ i c e ; @PostConstruct publ i c voi d i n i tTi mer ( ) { i f ( t i merServ i ce . getTi mers () ! = n u l l ) { for (Ti mer t i mer : t i merServ i ce . getTi mers ( ) ) t i me r . cancel ( ) ; t i merServi ce . createCa l endarTi mer ( new Schedul eExpre s s i on ( ) . hour { " * " ) . mi nute { " * " ) . second { " */ 1 0 " ) , new T i merCon fi g ( " myT i mer " , true) ); @Overri de pub 1 i c v01d ejbT!meout(Timer timer) { li . . . }
i n i tTimer jest metodą zwrotną cyklu życia, która zeruje wszystkie utwo rzone wcześniej liczniki czasu, po czym tworzy nowy licznik wywoły wany co 10 sekund . Metoda ej bT i meout (czyli implementacja metody interfejsu T i medObj ect) jest wywoływana po każdym wyczerpaniu limitu czasowego. Parametr t i mer metody ej bTi meout można wykorzystać do anulowania licznika czasu, uzyskania informacji o następnym zdarzeniu upłynięcia czasu licznika, uzyskania informacji o samym liczniku czasu lub pobrania innych, pokrewnych danych.
Rozdział 5. Enterprise JavaBeans
77
Łatwo zauważyć, że liczniki czasu są tworzone w metodach zwrotnych cyklu życia komponentu, zatem możemy być pewni, że te liczniki będą gotowe przed wywołaniem jakiejkolwiek metody biznesowej kom ponentu . Trzecim sposobem tworzenia liczników czasu dla metody jest stoso wanie następujących sygnatur: voi d { ) { li... } voi d (Ti mer t i mer) li „.
Metodę należy oznaczyć adnotacją @T i meout: publ i c c l a s s MyT i mer li. . .
@Ti meout publ i c voi d t i meou t (Ti mer t i mer) { li„.
Czwartym sposobem tworzenia liczników czasu jest oznaczenie odpo wiedniej metody jako wywoływanej w wyniku wyczerpania limitu cza sowego w pliku ejb-jar.xml. Przyjmijmy, że definicja metody ma nastę pującą postać: publ i c c l a s s MyT i mer { publ i e voi d t i meou t (Ti mer t i mer) li„.
Limit czasowy metody można przekonwertować na metodę licznika czasu - wystarczy dodać do pliku ejb-jar.xml następujący fragment:
MyTi mer org . sampl e . My Ti mer State l ess < t i mer>
* / 1 0 * * * *
78
Java EE 6. Leksykon kieszonkowy
t i meout
j avax . ej b . T i mer
Liczniki czasu można tworzyć w bezstanowych komponentach sesyj nych, singletonowych komponentach sesyjnych oraz komponentach sterowanych komunikatami, ale nie w stanowych komponentach sesyj nych. Brakujące rozwiązanie być może zostanie dodane w przyszłych wersjach specyfikacji EJB . Liczniki czasu są domyślnie utrwalane; ich utrwalanie można wyłączyć albo programowo (za pomocą wywołania T i merConfi g . set Pers i stent '+ ( fal se) ), albo na poziomie adnotacji @Schedu l e (wystarczy dodać atry but pers i stent=fal s e) . Zdarzenia czasowe można planować tylko w bezstanowych kompo nentach sesyjnych i singletonowych komponentach sesyjnych .
Interfejs Embeddable API Interfejs API Embeddable EJB umożliwia uruchamianie kodu klienckiego i odpowiednich komponentów EJB w ramach tej samej wirtualnej ma szyny Javy (JVM) i tego samego mechanizmu ładowania klas . Klient używa startowego interfejsu API dostępnego w pakiecie j avax . ej b do uruchomienia kontenera i identyfikacji dostępnych komponentów EJB. Takie rozwiązanie ułatwia testy, próbne przetwarzanie żądań i urucha mianie komponentów EJB w środowisku Java SE . Poniższy przykład kodu dobrze pokazuje, jak napisać test uruchamiający kontener EJB z możliwością wbudowania, jak odnaleźć załadowany komponent EJB przy użyciu przenośnej, globalnej nazwy JNDI i jak wywołać metodę tego komponentu: publ i e voi d testEJ B ( ) t h rows Nami n g Except i on { EJBContai ner ej bC EJBContai n e r . createEJ BContai ner ( ) ; Context ctx ej bC . getCon text ( ) ; MyBean bean (MyBean) ctx . l oo kup ( " j ava : g l obal / c l asse s/org/ s amp l e/MyBean " ) ; assertNotNul l (bean ) ; //... =
=
=
Rozdział 5. Enterprise JavaBeans
79
ej bC . c l os e ( ) ;
Kontener EJB z możliwością wbudowania przeszukuje ścieżkę do klas maszyny JVM pod kątem modułów EJB, które będzie można załadować. Klient może zmienić to zachowanie, wskazując na etapie konfiguracji alternatywny zbiór modułów docelowych: Propert i es props new Propert i es ( ) ; props . setProperty ( EJBContai n e r . EMB EDDAB L E MODU LES PRO P E RTY , " bar " ) ; EJBContai ner ej bC EJBContai ner . createEJBContai ner (props) ; =
=
Powyższy kod załaduje w kontenerze z możliwością wbudowania tylko moduł EJB nazwany bar. Właściwości, których można używać do konfigurowania kontenera EJB, opisano w tabeli 5 .4 . Tabela 5.4. Właściwości inicjalizacji kontenera EJB z możliwością wbudowania Nazwa
Typ
Zadanie
j avax . ej b . embeddab 1 e .
< h l > Facel ety są super !
Jeśli w powyższym kodzie z wyrażeniem # { user . name ) zostanie powiązana wartość " Jacek", przytoczony fragment zostanie przetłumaczony na na stępujący znacznik HTML-a: Za 1 oguj
Podobnie, istnieje możliwość określenia wyniku za pomocą elementu h : button:
Kod w tej formie wygeneruje następujący znacznik języka HTML: