Systemy Rozproszone TECHNOLOGIA JAVA 2 ENTERPRISE EDITION PRZEMYSŁAW SOŁTAN email: kerk@moskit.ie.tu.koszalin.pl 07.11.2002
Co powinieneś znać? Podstawy HTML i XML Programowanie obiektowe w Javie Serwery aplikacji (JSP i Servlety) Obsługa baz danych (SQL) 2
Cel! Tworzenie aplikacji rozproszonych w oparciu o technologię J2EE Instalowanie i obsługa aplikacji enterprise na wzorcowym serwerze J2EE server Tworzenie rozproszonych systemów wykorzystujących: komponenty rozproszone, systemy katalogowe, przetwarzanie komunikatów, wywoływanie metod usług webowych. 3
4 Zagadnienia poruszane na zajęciach Serwery WWW i serwery aplikacji Technologia Java 2 Enterprise Edition Enterprise Java Bean Transakcje i bezpieczeństwo Wzorce Projektowe Serwery nazewnicze JNDI i systemy katalogów LDAP Java Message Services (komunikaty) JavaMail (poczta) Web Services (usługi webowe)
Literatura The J2EE Tutorial Sun Microsystems Enterprise JavaBean Specification ver2.1 Sun Microsystems Mastering Enterprise JavaBeans second edition Ed Roman The Java Web Services Tutorial Sun Microsystems Thinking in Java - edycja polska Bruce Eckel, Helion 2001 Design Enterprise Application with the J2EE Nicholas Kassen and Enterprise Team EJB Designe Patterns Floyd Marinescu, Wiley Computer Publishing J2EE and XML development Kurt A. Gabrick, David B. Weiss, Mmanning Bitter Java Bruce A. Tade, Mmanning Sun Microsystems - www.java.sun.com 5
Ewolucja J2EE J2EE Serwery komunikatów Serwery pocztowe Transakcje Bazy danych Serwery nazw Systemy Katalogowe EJB Architektura komponentowa Autoryzacja użytkowników Programowanie obiektowe Kontenery JAVA Serwery aplikacji Programowanie strukturalne Page Engine CGI Web Serwices SSL HTTPS HTTP XML HTML 6
7 N-Tier Przeglądarka internetowa Serwer webowy Serwer aplikacji Dane Warstwa prezentacji Warstwa logiki biznesowej Warstwa danych
N-Tier Technologia obiektów rozproszonych: rozbicie aplikacji na samozarządzalne komponenty współdziałanie komponentów pomiędzy różnymi sieciami i systemami operacyjnymi Integracja ze starszymi technologiami - technologia konektorów 8
Enterprise API Enterprise Java Beans (EJB) komponenty działające w warstwie logiki biznesowej, zarządzane i wykonywane na serwerze w kontenerze EJB Java Naming and Directory Interface (JNDI) usługa katalogowania pełniąca rolę zapamiętywania informacji o położeniu zasobów, scalania i zarządzania aplikacji J2EE 9
10 Platforma J2EE HTML Serwer Aplikacji Kontener WEB JDBC DBMS XHTML XML APPLET Servlets JSP TAG Lib JAF JAVAMAIL JMS JDBC JTA JNDI RMI/IIOP JavaMail RMI Mail Server Aplikacja JAVA Kontener EJB IIOP CORBA Server Aplikacja klienta RMI/IIOP JNDI Session Beans JTA JDBC JMS Message Beans JAVAMAIL JAF Entity Beans JNDI JMS Directory Service Message queue
Serwlety DBMS Przeglądarka internetowa Klient HTTP HTML Kontener WEB Servlety i strony JSP EJB Baza Danych Kontener EJB Serwer aplikacji - ograniczenia przy rozbudowie systemu 11
Serwlety JavaBean DBMS Przeglądarka internetowa Klient HTTP HTML Kontener WEB Servlety i strony JSP Java Bean EJB Baza Danych Kontener EJB Serwer aplikacji + oddzielenie widoku od logiki biznesowej 12
Serwlety EJB DBMS Przeglądarka internetowa Klient HTTP HTML Kontener WEB Servlety i strony JSP Java Bean EJB Baza Danych Kontener EJB Serwer aplikacji + transakcyjność, trwałość i bezpieczeństwo 13
Heterogeniczny dostęp do danych LDAP JMS BEAN EJB KLIENT JSP Custom Tag XML JDBC DBMS Korzystanie z danych z różnorodnych źródeł (transformacje po stronie serwera, abstrakcyjność danych) 14
EJB 15
Warstwa logiki biznesowej Logika biznesowa jest odpowiedzialna za wykonywanie głównych zadań aplikacji: dostępu do źródeł danych integracji systemu z nowymi funkcjami Odwzorowanie metod za pomocą komponentów biznesowych: session bean i wielu entity beans. Warstwa obsługiwana jest przez serwer aplikacji zgodny z architekturą J2EE 16
17 Enterprise Java Bean Architektura EJB jest przeznaczona do tworzenia aplikacji bazujących na rozproszonych komponentach wsparcie transakcji bezpieczeństwo Kontakt z innymi komponentami biznesowymi Kontakt z klientem Komponenty biznesowe Administracja Bezpieczeństwo Kontakt z danymi Transakcje
Enterprise Java Bean Specyfikacja EJB określa strukturę usług działajcych po stronie serwera producenci serwerów aplikacji webowch tworzą kontenery EJB Serwer Kontener WEB Servlet Java Server Pages Kontener EJB EJB EJB EJB EJB EJB EJB Komponenty rozproszone Komponenty lokalne 18
Zalety komponentów EJB otwartość standardu wieloplatformowość javy izolacja od problemów połączeń oraz transakcji dystrybucja EJB w sieci serwerów wielokrotne użycie komponentów 19
20 EJB EJB architektura do dystrybucji komponentów transakcyjnych po stronie serwera Zdefiniowanie standardowych interfejsów i ich implementacja w serwerach aplikacji (kontenerach EJB)
21 EJB <<Interface>> java.rmi.remote <<Interface>> java.io.serializable jdk API <<Interface>> EJBHome <<Interface>> EJBObject <<Interface>> EnterpriseBean javax.ejb API <<Interface>> SessionBean Projektant Komponentu EJB
Architektura EJB Kontener EJB EJBHome (interfejs) EJBHome (implementacja) KLIENT EJB EJBObject (interfejs) EJBObject (implementacja) Dostęp do komponentów EJB za pomocą zdefiniowanych interfejsów (HOME i REMOTE) 22
Architektura EJB Kontener EJB EJBHome KLIENT EJBObject EJB Dostęp do komponentów EJB za pomocą zdefiniowanych interfejsów (HOME i REMOTE) 23
24 Przykład: Witaj public class Witaj { public String witaj() { return "Witaj!!!"; } } Przykładowa klasa przeznaczona do implementacji jako komponent EJB Należy stworzyć: klasę dziedziczącą z EnterpriseBean Interfejs EJBHome Interfejs EJBObject
Klasa SessionBean WitajBean.java import javax.ejb.*; public class WitajBean implements SessionBean { <<Interface>> java.io.serializable public String witaj() { return "Witaj!!!"; } public WitajBean(){} public void ejbcreate(){} public void ejbremove(){} <<Interface>> EnterpriseBean <<Interface>> SessionBean public void ejbactivate(){} public void ejbpassivate(){} public void setsessioncontext(sessioncontext ctx) { } WitajBean } 25
Interfejs EJBHome WitajHome.java import javax.ejb.*; import java.rmi.remoteexception; <<Interface>> java.rmi.remote public interface WitajHome extends EJBHome { } Witaj create() throws RemoteException,CreateException; <<Interface>> EJBHome <<Interface>> WitajHome 26
Interfejs EJBObject Witaj.java import javax.ejb.*; import java.rmi.remoteexception; <<Interface>> java.rmi.remote public interface Witaj extends EJBObject { } public String witaj() throws RemoteException; <<Interface>> EJBObject <<Interface>> Witaj 27
28 Witaj EJB <<Interface>> java.rmi.remote <<Interface>> java.io.serializable jdk API <<Interface>> EJBHome <<Interface>> EJBObject <<Interface>> EnterpriseBean javax.ejb API <<Interface>> SessionBean <<Interface>> WitajHome <<Interface>> Witaj WitajEJB Projektant Komponentu EJB
29 Witaj EJB Diagram klas komponentu WitajBean (Power Desinger - Sybase) interfejs klasa
Witaj EJB <<Interface>> java.rmi.remote <<Interface>> java.io.serializable jdk API <<Interface>> EJBHome <<Interface>> EJBObject <<Interface>> EnterpriseBean javax.ejb API <<Interface>> SessionBean <<Interface>> WitajHome <<Interface>> Witaj WitajEJB Projektant Komponentu EJB xxxwitaj EJBHome xxxwitaj EJBObject xxx WitajBean Kontener EJB 30
Klienci komponentów EJB Klient Biznesowy (web service) SOAP Kontener WEB Przeglądarka HTML Aplikacja Javy HTTP RMI-IIOP JSP i servlety RMI-IIOP Kontener EJB EJB Applet Klient C++ Klient JMS RMI-IIOP CORBA-IIOP JMS EJB RMI-IIOP EJB 31
32 Klient (strona JSP) Kontener WEB Kontener EJB Przeglądarka HTML HTTP JSP EJB
Klient EJB KLIENT try { Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/witaj"); WitajHome home = (WitajHome)PortableRemoteObject. narrow(objref,witajhome.class); 1 1 Serwer Nazw JNDI Witaj witaj = home.create(); out.println(witaj.witaj()); } catch (Exception ex) { } Klient przesyła do Serwera JNDI nazwę obiektu java:comp/env/ejb/witaj 33
Klient EJB KLIENT try { Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/witaj"); WitajHome home = (WitajHome)PortableRemoteObject. narrow(objref,witajhome.class); Witaj witaj = home.create(); out.println(witaj.witaj()); 1 2 } catch (Exception ex) { } 2 Serwer Nazw JNDI Serwer JNDI odsyła do Klienta referencję do obiektu o określonej nazwie 34
Klient EJB Interfejs domowy HOME 3 4 EJBHome Kontener EJB KLIENT EJB EJB EJB 1 2 Serwer Nazw JNDI Referencja zostaje wykorzystana przez Klienta do pobrania nowej referencji wskazującej na obiekt domowy Home kontenera EJB 35
Klient EJB try { Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/witaj"); WitajHome home = 3 (WitajHome)PortableRemoteObject. narrow(objref,witajhome.class); Witaj witaj = home.create(); out.println(witaj.witaj()); } catch (Exception ex) { } Klient otrzymuje dostęp do obiektu home stworzonego przez Kontener na podstawie klasy wygenerowanej z interfejsu domowego Home 4 EJBHome 36
WitajHome & WitajBean_RemoteHomeImpl Klasa WitajBean_RemoteHomeImpl.java <<Interface>> WitajHome Metoda create() Interfejs Witaj.java xxxwitaj EJBHome 37
Klient EJB Interfejs domowy HOME 3 4 EJBHome Kontener EJB KLIENT Interfejs zdalny REMOTE 5 create() EJB EJB EJBObject EJB 1 2 Serwer Nazw JNDI Klient posiadając referencję na obiekt domowy HOME wywołuje jego metodę create() tworzącą obiekt zdalny EJBObject 38
Klient EJB 5 try { Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/witaj"); WitajHome home = (WitajHome)PortableRemoteObject. narrow(objref,witajhome.class); Witaj witaj = home.create(); out.println(witaj.witaj()); } catch (Exception ex) { } Klient otrzymuje dostęp do obiektu zdalnego witaj stworzonego przez Kontener na podstawie klasy wygenerowanej z interfejsu zdalnego Remote EJBObject 39
Witaj & WitajBean_EJBObjectImpl Metoda witaj() Interfejs Witaj.java <<Interface>> Witaj Klasa WitajBean_EJBObjectImpl.java xxxwitaj EJBObject 40
41 Instancje EJB & Kontener Kontener (nie klient) decyduje o tworzeniu i usuwaniu instancji komponentów EJB Kontener EJB EJB możliwość wykorzystania wolnych instancji przez innych klientów (tworzenie puli komponentów już przy starcie serwera wzrost wydajności) EJB EJB
Klient EJB Interfejs domowy HOME 3 4 EJBHome Kontener EJB KLIENT Interfejs zdalny REMOTE 5 Create() EJB EJB 6 witaj() EJBObject EJB 1 2 Serwer Nazw JNDI Klient ma teraz pełny dostęp do komponentu EJB i może wykonywać jego metody biznesowe np. metodę witaj() 42
43 Klient EJB try { Context initial = new InitialContext(); Object objref = initial.lookup("java:comp/env/ejb/witaj"); WitajHome home = (WitajHome)PortableRemoteObject. narrow(objref,witajhome.class); Witaj witaj = home.create(); out.println(witaj.witaj()); } catch (Exception ex) { } 6 Klient wywołuje metodę biznesową witaj() obiektu witaj komponentu EJB w taki sam sposób jak w przypadku komponentów lokalnych
Klient EJB Interfejs domowy HOME 3 4 EJBHome Kontener EJB KLIENT Interfejs zdalny REMOTE 5 Create() EJB EJB 6 EJBObject witaj() 7 EJB 1 2 Serwer Nazw JNDI Obiekt zdalny po otrzymaniu od Klienta nakazu wykonania metody witaj() wywołuje metodę na określonej instancji komponentu EJB 44
Klient(Przeglądarka) 45 Klient Serwer Serwer(Kontener WEB) Serwer(Kontener EJB) 3 2 4 1 Przeglądarka HTML Kontener WEB JSP Kontener EJB EJB
Serwer J2EE 46
47 Instalacja i uruchomienie instalacja serwera np. do katalogu c:\java\j2ee ustawienie zmiennych środowiskowych JAVA_HOME=c:\java\jdk j2ee_home=c:\java\j2ee start serwera c:\java\j2ee\bin\j2ee -verbose test serwera http://localhost:8000 zatrzymanie serwera c:\java\j2ee\bin\j2ee -stop
Uruchomienie i zatrzymanie serwera j2ee -stop j2ee -verbose W celu uruchomienia serwera w środowisku Windows 9x należy dokonać modyfikacji plików startowych 48
http://localhost:8000 49
50 Cloudscape (baza danych pakietu J2EE) cloudview.bat cloudscape.bat -start cloudscape.bat -stop
51 Dystrybuja komponentów EJB Tworzenie Komponentów EJB Budowa aplikacji Instalacja aplikacji Projektant komponentów EJB Projektant aplikacji Instalator aplikacji Instalacja serwera Administrator Instalator kontenera EJB (serwera aplikacji)
Program zarządza archiwami aplikacji Enterprise (EAR) oraz ich instalacją na serwerze aplikacyjnym 52 Application Deployment Tool deployment
Deskryptory rozmieszczenia (Deployment Descriptions) EAR (Enterprise Application Resource) WAR (Web Application Resource) RAR (Resource Adapters) EJB Klient JAR Deskryptory DD opisują wewnętrzną strukturą archiwum aplikacji 53
DD deployment descriptor (desktyptor rozmieszczenia w formacie XML) 54 Deployment Tool Klasa i interfejsy komponentu EJB EJB home EJB object EJB DD EJB home EJB object EJB DeployTool DD jar Archiwum ejb-jar
55 Deployment Tool Archiwa komponentów EJB jar Archiwa komponentów webowych war jar DD ear Archiwa aplikacji klientów jar war jar Archiwum aplikacji (plik ear) Deskryptor rozmieszczenia DD DeployTool
56 Mapowanie klas Komponent Session Stateless Klasa WitajBean Interfejs domowy WitajHome Interfejs zdalny Witaj
57 Komponent EJB WitajBean Nowy komponent WitajBean znajdujący się w archiwum WitajEJB Zamapowane klasy komponentu
58 Mapowanie nazw JNDI Dla komponentów należy przypisać nazwy za pomocą których będą rozpoznawane przez inne komponenty, czy też przez kod klienta (jsp, servlety) Wprowadzenie nazwy ejb/witaj dla komponentu WitajBean
59 Archiwum webowe WAR Nowe archiwum WAR Plik witaj.jsp
60 Web Context Nazwa w Context Root określa lokalizator dostępu URL aplikacji do archiwum WitajWAR
Referencja do komponentu EJB 61
Deployment 62
Serwer Nazw JNDI Przeglądarka internetowa 1 Kontener WEB Strona JSP 4 Kontener EJB EJB Klient 2 3 Serwer JNDI Serwer Aplikacji 63
Test komponentu EJB Przeglądarka internetowa Klient HTTP HTML Kontener WEB Servlety i strony JSP Kontener EJB EJB W konsoli serwera można podglądać informacje o poprawności lub ewentualnych błędach publikowania aplikacji 64
Wzorcowa aplikacja J2EE http://localhost:8000/petstore 65
66 Petstore (deployment) Archiwum EAR zawierające komponenty aplikacji Enterprise (archiwa jar, war, rar)
Cykl tworzenia aplikacji Projekt logiki biznesowej oraz kontrolera UML (Rational Rose) Tworzenie i debugowanie klas javy (servlety, java beans, EJB) Java IDE Tworzenie archiwum EAR Deployment PUBLIKOWANIE Umieszczenie codu logiki biznesowej, kontrolera oraz widoku Serwer Aplikacji (J2EE Server) Edytory JSP i HTML (notepad ) Tworzenie stron HTML i JSP (widoki) 67
Platforma Eclipse 68
Session Bean 69
Ziarenka EJB J2EE Message-Driven EJB Session EJB BMP Entity EJB CMT (Container-Managed Transactions) BMT (Bean-Managed Transactions) Stateless Stateful CMT (Container-Managed Transactions) BMT (Bean-Managed Transactions) Interfejsy Remote i Local Interfejsy Remote i Local CMP Entity EJB Powiązane komponenty CMP Entity EJB Obsługa tabeli z podłączonej bazy danych Obsługa EJB-QL Interfejsy Remote i Local Obsługa tabel z podłączonej bazy danych CMR (Container-Managed Relationships) Interfejsy Remote i Local 70
Session Bean Reprezentacja przypadków użycia (Use Cases) lub procesów biznesowych realzowanych w imieniu klienta Wypłata gotówki Klient Dokonanie przelewu System Bankowy Złożenie depozytu BANKOMAT Komponenty Session reprezentują działanie na danych (nie reprezentują samych danych) 71
72 Session Bean klient klient klient Session Bean Session Bean Session Bean Komponent typu Session (reprezentacja klienta po stronie serwera) Komponenty Session Bean charakteryzują się: - reprezentacja procesów biznesowych - krótki żywot komponentu (podobie jak sesje w jsp) - osobna instancja komponentu dla klientów - komponent ma charakter pośrednika (TRANSIENT)
Przeznaczenie komponentów SessionBean Użycie komponentu do modelowania procesów i kontroli Przenoszenie logiki biznesowej z aplikacji klienckich (client-serwer) na serwery aplikacji Kontrolowanie interakcji pomiędzy komponentami EJB 73
74 Rodzaje komponentów Session Session Bean Stateless Komponent nie utrzymuje żadnych stanów wewnętrznych, które można wykorzystać przy ponownym wywołaniu komponentu przez klienta (bezstanowość) Stateful Komponent ma możliwość utrzymania stanów wewnętrznych pomiędzy wywołaniami komponentu przez klienta (mapowanie jednego komponentu na jednego klienta)
75 Session Stateless Bean
76 Cykl życia komponentu Stateless Bean Komponent nie istnieje Class.newInstance() setsessioncontext() ejbcreate() ejbremove() Wywoływanie metod biznesowych Komponent istnieje
Diagram sekwencji Stateless Session Bean Klient Kontener Bean Baza Danych newinstance() setsessioncontext() ejbcreate() Dodanie nowej instancji komponentu bean do puli komponentów 77
Diagram sekwencji Stateless Session Bean Klient Kontener Bean Baza Danych newinstance() setsessioncontext() ejbcreate() Dodanie nowej instancji komponentu bean do puli komponentów home.create() new EJB object Obsługa metody create 78
Diagram sekwencji Stateless Session Bean Klient Kontener Bean Baza Danych newinstance() setsessioncontext() ejbcreate() Dodanie nowej instancji komponentu bean do puli komponentów home.create() new EJB object ejbobject.method(arg) Obsługa metody create method(arg) read or update data register resource manager with transaction Obsługa metod biznesowych 79
Diagram sekwencji Stateless Session Bean Klient Kontener Bean Baza Danych newinstance() setsessioncontext() ejbcreate() Dodanie nowej instancji komponentu bean do puli komponentów home.create() new EJB object ejbobject.method(arg) Obsługa metody create method(arg) read or update data register resource manager with transaction Obsługa metod biznesowych ejbobject.remove() or home.remove(...) Obsługa metody remove 80
Diagram sekwencji Stateless Session Bean Klient Kontener Bean Baza Danych newinstance() setsessioncontext() ejbcreate() Dodanie nowej instancji komponentu bean do puli komponentów home.create() new EJB object ejbobject.method(arg) Obsługa metody create method(arg) read or update data register resource manager with transaction Obsługa metod biznesowych ejbobject.remove() or home.remove(...) Obsługa metody remove ejbremove() Usunięcie instancji komponentu bean z puli komponentów 81
Interfejsy i klasa bean a Interfejs CalculatorHome Klasa CalculatorBean Interfejs Calculator W klasie komponentu CalculatorBean zdefiniowano dwie metody biznesowe: add oraz substract 82
Strona JSP (metody init i destroy) 83 Kalkulator klient (jsp) Komunikacja z komponentem EJB poprzez JNDI
84 Aplikacja klienta cd.. Strona JSP (wywołanie metody biznesowej)
85 Session Stateful Bean
86 Session Stateful Zalety Łatwość użycia Obiektowość Skalowalność Określanie logiki biznesowej dla pojedynczego klienta Komponent Session Stateful pełni rolę komunikatora serwera aplikacji z klientem przechowującego stany konwersacji (typowe zastosowanie to wózek na zakupy)
Ciasteczka (cookies) HTTP Session Stateful Session Wpisy w bazie danych 87 Sesyjność N-tier Serwer aplikacji Przeglądarka internetowa Klient HTTP HTML Kontener WEB Servlety i strony JSP EJB Baza Danych Kontener EJB
88 Metody sterujące cyklem życia Stateful Session Bean 2 3 Pasywność komponentu EJB Aktywacja komponentu EJB 1 Aktywacja komponentu EJB ej bcreat e() ejbpasivate() ejbactivate() ejbremove() 4 Niszczenie komponentu EJB Kontener EJB
89 Cykl życia komponentu Stateful Bean Komponent nie istnieje Class.newInstance() setsessioncontext() ejbcreate() ejbremove() Upłynięcie czasu obsługi klienta Wywoływanie metod biznesowych Komponent istnieje ejbpasivate() ejbactivate() Uśpienie komponentu (serializacja)
90 Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych home.create(arg) new EJB object newinstance() setsessioncontext() ejbcreate(arg) Obsługa metody create
91 Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych home.create(arg) new EJB object ejbobject.method(arg) newinstance() setsessioncontext() ejbcreate(arg) Obsługa metody create method(arg) Obsługa metod biznesowych
92 Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych home.create(arg) new EJB object ejbobject.method(arg) newinstance() setsessioncontext() ejbcreate(arg) Obsługa metody create method(arg) Obsługa metod biznesowych ejbpasivate() Serializacja instancji komponentu i utrwalenie w magazynie Uśpienie instancji komponentu
Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych home.create(arg) new EJB object ejbobject.method(arg) newinstance() setsessioncontext() ejbcreate(arg) Obsługa metody create method(arg) Obsługa metod biznesowych ejbpasivate() Serializacja instancji komponentu i utrwalenie w magazynie Uśpienie instancji komponentu Odczyt serialozowanego komponentu z magazynu i deserializacja komponentu ejbobject.method(arg) ejbactivate() method(arg) Aktywacja instancji komponentu i obsługa metod biznesowych 93
Metoda ejbpasivate() Kontener 1 ejbpasivate() Instancja komponentu EJB 2 Przed uśpieniem komponentu (utrwaleniem komponentu) 2 kontener wywołuje metodę ejbpasivate() 1. Projektant komponentu EJB ma możliwość zdefiniowania własnego kodu wywoływanego podczas zasypiania 94
Metoda ejbactivate() Kontener 1 4 ejbpasivate() ejbactivate() Instancja komponentu EJB 2 3 Kontener ożywia utrwalony komponent wywołująć metodę ejbactivate() 4. 3 Projektant komponentu EJB ma możliwość zdefiniowania własnego kodu wywoływanego po uaktywnieniu komponentu 95
Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych home.create(arg) new EJB object ejbobject.method(arg) newinstance() setsessioncontext() ejbcreate(arg) Obsługa metody create method(arg) Obsługa metod biznesowych ejbpasivate() Serializacja instancji komponentu i utrwalenie w magazynie Uśpienie instancji komponentu Odczyt serialozowanego komponentu z magazynu i deserializacja komponentu ejbobject.method(arg) ejbactivate() method(arg) Aktywacja instancji komponentu i obsługa metod biznesowych 96
97 Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych ejbobject.transactional method(arg) afterbegin() read database data register resource manager with transaction Obsługa sekwencji transakcji (w przypadku implementacji javax.ejb.sessionsynchronization)
98 Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych ejbobject.transactional method(arg) afterbegin() read database data register resource manager with transaction Obsługa sekwencji transakcji (w przypadku implementacji javax.ejb.sessionsynchronization) beforecompletion() prepare commit write database data If commit = true then aftercommpletion(true) If commit = false then aftercommpletion(false) Zatwierdzenie sekwencji transakcji (w przypadku implementacji javax.ejb.sessionsynchronization)
Diagram sekwencji Stateful Session Bean Klient Kontener Bean Baza Danych ejbobject.transactional method(arg) afterbegin() read database data register resource manager with transaction Obsługa sekwencji transakcji (w przypadku implementacji javax.ejb.sessionsynchronization) beforecompletion() prepare commit write database data If commit = true then aftercommpletion(true) If commit = false then aftercommpletion(false) Zatwierdzenie sekwencji transakcji (w przypadku implementacji javax.ejb.sessionsynchronization) ejbobject.remove() or home.remove(...) ejbremove() Obsługa metody remove 99
100 Interfejsy i klasa bean a Interfejs WozekHome Interfejs Wozek Klasa WozekBean
DeployTool 101
102 Wózek na zakupy klient (jsp) Inicjalizacja komponentu za pomocą JNDI tak samo jak przy WitajBean
Interfejsy lokalne (LocalHome i LocalObject) 103
Lokalny dostęp do komponentu Klient JVM 1 JVM Komponent W przypadku dystrybucji komponentu na inną maszynę Javy korzystamy z metod wywoływane zdalnie 1 Klient 2 1 JVM Komponent W przypadku dystrybucji komponentu na tej samej maszynie Javy można stosować także metody 2 wywoływane lokalnie 104
Interfejsy zdalne Zalety Niezależność od lokacji komponentu Elastyczność w dystrybucji Izolacja komponentów Wady Większa złożoność Możliwość występowania wyjątków RemoteException 105
Interfejsy lokalne Zalety Lepsza wydajność Wady Trudności w dystrybucji obiektu Klient i komponent korzystają z tej samej maszyny wirtualnej JAVA 106
Interfejs EJBLocalHome WitajLocalHome.java import javax.ejb.*; public interface WitajLocalHome extends EJBLocalHome { <<Interface>> EJBLocalHome WitajLocal create() throws CreateException;; } <<Interface>> WitajLocalHome WitajHome.java import javax.ejb.*; import java.rmi.remoteexception; public interface WitajHome extends EJBHome { } Witaj create() throws RemoteException,CreateException; 107
Interfejs EJBLocalObject WitajLocal.java import javax.ejb.*; public interface WitajLocal extends EJBLocalObject { <<Interface>> EJBLocalObject public String witaj(); } <<Interface>> WitajLocal Witaj.java import javax.ejb.*; import java.rmi.remoteexception; public interface Witaj extends EJBObject { } public String witaj() throws RemoteException; 108
109 Witaj EJB <<Interface>> java.rmi.remote <<Interface>> java.io.serializable jdk <<Interface>> EnterpriseBean javax.ejb <<Interface>> EJBLocalHome <<Interface>> EJBLocalObject <<Interface>> EJBHome <<Interface>> EJBObject <<Interface>> SessionBean <<Interface>> WitajLocalHome <<Interface>> WitajLocal <<Interface>> WitajHome <<Interface>> Witaj WitajBean Projektant Komponentu EJB xxxwitaj EJBLocalHome xxxwitaj EJBLocalObject xxxwitaj EJBHome xxxwitaj EJBObject xxx WitajBean Kontener EJB
Deploytool 110
111 Interfejsy lokalne Local EJBHome EJBHome klient EJBObject A Bean Local EJBObject B Bean Local EJBObject B Bean Komponent B Bean posiada zdefiniowane interfejsy lokalne LocalEJBHome oraz LocalEJBObject
112 Klasa adaptacyjna
113 Klasa Adaptera - dziedziczenie StatelessSessionAdapter <<Interface>> SessionBean WitajBean Do klasy Adaptera można przenieść puste metody, których definiowanie wymusza specyfikacja EJB
114 Klasa Adaptera - dziedziczenie <<Interface>> SessionBean StatelessSessionAdapter WitajBean Klasa WitajBean definiuje wyłącznie metody biznesowe
Klasa Adaptera - dziedziczenie Z klasy Adaptera mogą teraz korzystać inne klasy komponentów biznesowych tworzonej aplikacji <<Interface>> SessionBean StatelessSessionAdapter CalculatorBean Zalety: W klasie adaptera można definiować metody, które będą widziane przez inne klasy z niej dziedziczące ConverterBean WitajBean 115
Entity Beans 116
Ziarenka EJB J2EE Message-Driven EJB Session EJB BMP Entity EJB CMT (Container-Managed Transactions) BMT (Bean-Managed Transactions) Stateless Stateful CMT (Container-Managed Transactions) BMT (Bean-Managed Transactions) Interfejsy Remote i Local Interfejsy Remote i Local CMP Entity EJB Powiązane komponenty CMP Entity EJB Obsługa tabeli z podłączonej bazy danych Obsługa EJB-QL Interfejsy Remote i Local Obsługa tabel z podłączonej bazy danych CMR (Container-Managed Relationships) Interfejsy Remote i Local 117
118 Rodzaje komponentów EJB klient klient Entity Bean Komponent typu Entity (obiekt biznesowy reprezentujący przechowywanie danych) klient Komponenty Entity Bean charakteryzują się: - reprezentacja danych biznesowych -długi okes życia komponentu (dane baz danych) - wspólna (dzielona) instancja komponentu dla klientów - komponent ma charakter trwałości (PERSISTENT)
Komponety EJB klient Komponent SessionBean reprezentuje klienta na serwerze Entity Bean Entity Bean - redukcja liczby odwołań do serwera klient - komponent session pełni rolę osłony oddzielającej klienta od wewnętrznych relacji pomiędzy komponentami entity Session Bean Entity Bean Entity Bean Wzorzec projektowy FASADY 119
120 Komponety EJB klient klient klient Session Session Bean Session Bean Bean Entity Entity Bean Entity Bean Bean Message Queue Session Session Bean Session Bean Bean Entity Entity Bean Entity Bean Bean klient Message Driven Bean Entity Entity Bean Entity Bean Bean
ANT 121
122 ANT make dla javy?! ANT narzędzie do tworzenia skryptów opartych o XML a przeznaczonych do automatyzacji kompilacji projektów Niektóre zalety: przenośność (niezależność od systemu) Automatyzacja pracy poprzez kompilacje projektów i ich automatyczne publikowanie na serwerach aplikacji, wywoływanie skryptów SQL, tworzenie dokumentacji JDK itd...
Skrtypt build.xml 123
124 ant build.xml deploy Inicjalizacja i tworzenie katalogów Kompilacja plików java Tworzenie archiwów jar, war i ear Publikowanie aplikacji ear na serwerze J2EE
125 ant build.xml undeploy Inicjalizacja Usunięcie publikowanej aplikacji z serwera J2EE Usunięcie tumczasowych plików i katalogów
JNLP 126
JNLP JNLP Java Network Launching Protocol Archiwum JAR aplikacji klienta Lokalizacja archiwum wskazywana jest przez lokalizator URI http:// lub file:/// Aplikacja klienta Komputer Klienta Java Web Start 127
JNLP - przykład <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="http://localhost:8080/jnlp/" href="baner.jnlp"> <information> <title>systemy Rozproszone - BANER</title> <vendor>technical University of Koszalin</vendor> <homepage href="http://kik.ie.tu.koszalin.pl/systemy"/> <description>przykład</description> <description kind="short">baner</description> <description kind="tooltip">baner</description> <icon href="gfx/icon.gif"/> <offline-allowed/> </information> <resources> <j2se version="1.3+"/> <jar href="baner.jar"/> </resources> <application-desc main-class="systemy.rozproszone.baner"/> </jnlp> Lokalizacja plików: http://localhost:8080/jnlp/baner.jnlp http://localhost:8080/jnlp/baner.jar 128
JNLP - przykład <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="http://localhost:8080/jnlp/" href="baner.jnlp"> <information> <title>systemy Rozproszone - BANER</title> <vendor>technical University of Koszalin</vendor> <homepage href="http://kik.ie.tu.koszalin.pl/systemy"/> <description>przykład</description> <description kind="short">baner</description> <description kind="tooltip">baner</description> <icon href="gfx/icon.gif"/> <offline-allowed/> </information> <resources> <j2se version="1.3+"/> <jar href="baner.jar"/> </resources> <application-desc main-class="systemy.rozproszone.baner"/> </jnlp> 129