Enterprise JavaBeans fejlesztési példa Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem Enterprise JavaBeans példa A J2EE SDK installálása Jelenlegi verzió: 1.4 béta (2002. november) Szükséges hozzá a J2SDK legalább 1.4 verziója Letöltés, telepítés Beállítások: J2EE_HOME a telepítés helyére mutasson J2EE_HOME/bin legyen a PATH-ban ANT_HOME legyen az ant helye (alapban megegyezik a J2EE_HOME -al JAVA_HOME a J2SDK helyére mutasson JAVA_HOME/bin legyen a PATH-ban Enterprise JavaBeans példa EJBpelda / 2 A J2EE SDK installálása (folyt.) A j2ee parancs elindítja a szükséges program komponenseket. (A -verbose kapcsoló mutatja történéseket.) A j2ee -stop parancs leállítja a szervert. Enterprise JavaBeans példa EJBpelda / 3
ant Fontosabb segédprogramok Mint a make (Apache) cloudscape Java-ban írt relációs adatbáziskezelő deploytool Alkalmazás telepítő j2eeadmin A J2EE környezet konfigurálására Enterprise JavaBeans példa EJBpelda / 4 Stateless session bean A feladat: (J2EE Turorial-ból) Készítsünk egy bean-t, amely dollárt yen-re, illetve yen-t euróra tud váltani. Ez egy állapot nélküli session bean lesz, mert Nem kell perzisztens adatokat kezelnie Eseti feladatot old meg, a kliens egyszer meghivja, és visszakapja tőle az eredményt. A kipróbáláshoz kell majd egy kliens és egy JSP, mint Web komponens. Enterprise JavaBeans példa EJBpelda / 5 deploytool Új alkalmazás készítése File -> New -> Application Browse File név: ConverterApp.aer Az aer kiterjesztés egy összecsomagolt, telepítésre előkészített alkalmazás szabványos kiterjesztése. Válasszuk a New Application funkciót Enterprise JavaBeans példa EJBpelda / 6
A Converter remote interface import javax.ejb.ejbobject; import java.rmi.remoteexception; import java.math.*; public interface Converter extends EJBObject { public BigDecimal dollartoyen (BigDecimal dollars) throws RemoteException; public BigDecimal yentoeuro (BigDecimal yen) throws RemoteException; Enterprise JavaBeans példa EJBpelda / 7 A Converter home interface import java.io.serializable; import java.rmi.remoteexception; import javax.ejb.createexception; import javax.ejb.ejbhome; public interface ConverterHome extends EJBHome { Converter create() throws RemoteException, CreateException; Enterprise JavaBeans példa EJBpelda / 8 A Converter bean osztály import java.rmi.remoteexception; import javax.ejb.sessionbean; Import javax.ejb.sessioncontext; import java.math.*; public class ConverterBean implements SessionBean { Enterprise JavaBeans példa EJBpelda / 9
A Converter bean osztály (folyt.) // adattagok BigDecimal yenrate = new BigDecimal("121.6000"); BigDecimal eurorate = new BigDecimal("0.0077"); Enterprise JavaBeans példa EJBpelda / 10 A Converter bean osztály (folyt.) // Business metódusok // Ezért van az egész felhajtás! public BigDecimal dollartoyen(bigdecimal dollar) { BigDecimal result = dollar.multiply(yenrate); return result.setscale(2,bigdecimal.round_up); public BigDecimal yentoeuro(bigdecimal yen) { BigDecimal result = yen.multiply(eurorate); return result.setscale(2,bigdecimal.round_up); Enterprise JavaBeans példa EJBpelda / 11 A Converter bean osztály (folyt.) // A SessionBean interface deklarálja az // alábbi metódusokat, tehát kötelező // implementálni, de most nincs funkciójuk. public ConverterBean() { public void ejbcreate() { public void ejbremove() { public void ejbactivate() { public void ejbpassivate() { public void setsessioncontext(sessioncontext sc) { // ConverterBean Enterprise JavaBeans példa EJBpelda / 12
JAR file előállítása A fejlesztőeszköz segítségével A ConverterJAR.jar file tartalma ConverterBean.class ConverterHome.class Converter.class Egy deployment descriptor, amit a fejlesztőeszköz állít elő Hozzáadás a ConverterApp.ear file-hoz Enterprise JavaBeans példa EJBpelda / 13 J2EE alkalmazás kliens Java program, amely nem feltétlenül ugyanazon a JVM-en fut, mint az alkalmazás szerver Két jar file, amiből az egyik alkalmazás szerver specifikus, így a fejlesztőeszköz generálja A másikat a fejlesztőnek kell megírnia, abban van a kliens funkcionalitása A kliens a bean-t a JNDI segítségével találja meg Enterprise JavaBeans példa EJBpelda / 14 J2EE alkalmazás kliens (folyt.) import javax.naming.context; import javax.naming.initialcontext; import javax.rmi.portableremoteobject; import java.math.bigdecimal; public class ConverterClient { public static void main(string[] args) { try { // Egy JNDI kontextus létrehozása Context initial = new InitialContext(); Enterprise JavaBeans példa EJBpelda / 15
J2EE alkalmazás kliens (folyt.) // A kliens JNDI név kontextusának megszerzése Context myenv = (Context)initial.lookup("java:comp/env"); // A bean referenciájának megszerzése Object objref = myenv.lookup("ejb/simpleconverter"); // Megfelelő típusra konvertálás ConverterHome home = (ConverterHome)PortableRemoteObject. narrow(objref,converterhome.class); // Zöld: JNDI azonosítók Enterprise JavaBeans példa EJBpelda / 16 J2EE alkalmazás kliens (folyt.) // Kérés az EJB konténerhez, hogy hozzon létre // egy bean példányt. // A kérés ereménye egy objektum referencia Converter currencyconverter =home.create(); BigDecimal param = new BigDecimal("100.00"); // Innen már minden egyszerű: a kapott objektum // referencia segítségével meghívható a business // metódus BigDecimal amount = currencyconverter.dollartoyen(param); System.out.println(amount); Enterprise JavaBeans példa EJBpelda / 17 J2EE alkalmazás kliens (folyt.) amount = currencyconverter.yentoeuro(param); System.out.println(amount); System.exit(0); catch (Exception ex) { System.err.println("Unexpected exception!"); ex.printstacktrace(); // catch // main // ConverterClient Enterprise JavaBeans példa EJBpelda / 18
J2EE alkalmazás kliens (folyt.) Ezután a kliens is csomagolandó egy jar file-ba A file-t hozzá kell adni az alkalmazás ear filejához Be kell állítani a megfelelő JNDI azonosítókat Az alkalmazást telepíteni kell valamilyen eszközzel (deploytool vagy fejlesztőeszköz) A kliens a runclient segédprogammal futtatható Enterprise JavaBeans példa EJBpelda / 19 Web kliens A bean kliense lehet például egy JSP is. Ez egy tipikus megoldás Enterprise JavaBeans példa EJBpelda / 20 Web kliens (folyt.) <%@ page import="converter,converterhome,javax.ejb.*, java.math.*, javax.naming.*, javax.rmi.portableremoteobject, java.rmi.remoteexception" %> <%! private Converter converter = null; public void jspinit() { try { InitialContext ic = new InitialContext(); Object objref = ic.lookup("java:comp/env/ejb/theconverter"); ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objRef, ConverterHome.class); converter = home.create(); Enterprise JavaBeans példa EJBpelda / 21
Web kliens (folyt.) catch (RemoteException ex) { System.out.println("Couldn't create converter bean."+ ex.getmessage()); catch (CreateException ex) { System.out.println("Couldn't create converter bean."+ ex.getmessage()); catch (NamingException ex) { System.out.println("Unable to lookup home: "+ "TheConverter "+ ex.getmessage()); Enterprise JavaBeans példa EJBpelda / 22 public void jspdestroy() { converter = null; %> <html> <head> <title>converter</title> </head> Web kliens (folyt.) <body bgcolor="white"> <h1><b><center>converter</center></b></h1> <hr> Enterprise JavaBeans példa EJBpelda / 23 Web kliens (folyt.) <p>enter an amount to convert:</p> <form method="get"> <input type="text" name="amount" size="25"> <br> <p> <input type="submit" value="submit"> <input type="reset" value="reset"> </form> <% %> String amount = request.getparameter("amount"); if ( amount!= null && amount.length() > 0 ) { BigDecimal d = new BigDecimal (amount); Enterprise JavaBeans példa EJBpelda / 24
Web kliens (folyt.) <p> <%= amount %> dollars are <%= converter.dollartoyen(d) %> Yen. <p> <%= amount %> Yen are <%= converter.yentoeuro(d) %> Euro. <% %> </body> </html> Enterprise JavaBeans példa EJBpelda / 25 Web kliens (folyt.) Ezután ugyanúgy csomagolás (war file-ba), majd hozzáadás az alkalmazás ear file-jához Telepítés, majd a JSP a szokásos módon indítható Enterprise JavaBeans példa EJBpelda / 26 Állapottal rendelkező session bean Készítése lényegében ugyanaz, mint az állapot mentes esetben Mivel állapota lehet, általában nem csak egy paraméter nélküli create metódus van a home interface-ben, hanem több create. Példa: egy online könyvesbolt kosara. Enterprise JavaBeans példa EJBpelda / 27
Remote interface import java.util.*; import javax.ejb.ejbobject; import java.rmi.remoteexception; public interface Cart extends EJBObject { public void addbook(string title) throws RemoteException; public void removebook(string title) throws BookException, RemoteException; public Vector getcontents() throws RemoteException; Enterprise JavaBeans példa EJBpelda / 28 Remote interface (megjegyzések) A pirossal jelzett részek kötelezőek extends EJBObject RemoteException A zölddel jelzett BookException jelzi, hogy segédosztály(ok)ra is szükség lesz. Enterprise JavaBeans példa EJBpelda / 29 Home interface import java.io.serializable; import java.rmi.remoteexception; import javax.ejb.createexception; import javax.ejb.ejbhome; public interface CartHome extends EJBHome { Cart create(string person) throws RemoteException, CreateException; Cart create(string person, String id) throws RemoteException, CreateException; Enterprise JavaBeans példa EJBpelda / 30
Home interface (megjegyzések) Több create metódus, paraméterekkel A kivételek kötelezőek Enterprise JavaBeans példa EJBpelda / 31 A bean osztály import java.util.*; import javax.ejb.*; public class CartBean implements SessionBean { String customername; String customerid; Vector contents; public void ejbcreate(string person) throws CreateException {... Enterprise JavaBeans példa EJBpelda / 32 A bean osztály (folyt.) public void ejbcreate(string person, String id) throws CreateException {... public void addbook(string title) { contents.addelement(title); Enterprise JavaBeans példa EJBpelda / 33
A bean osztály (folyt.) public void removebook(string title) throws BookException { boolean result = contents.removeelement(title); if (result == false) { throw new BookException(title + " not in cart."); Enterprise JavaBeans példa EJBpelda / 34 A bean osztály (folyt.) public Vector getcontents() { return contents; public CartBean() { public void ejbremove() { public void ejbactivate() { public void ejbpassivate() { public void setsessioncontext(sessioncontext sc) { Enterprise JavaBeans példa EJBpelda / 35 A bean osztály (megjegyzések) A create metódusoknak nem üres implementációjuk van Több meglepetés nincs Csomagolás, alkalmazáshoz adás, telepítés ugyanúgy A bean jar file-jához kell csomagolni a segéd osztályokat (pl. BookException) is. Enterprise JavaBeans példa EJBpelda / 36
BMP entitás bean Adatbázisban tárolt adatok reprezentálása A bean állapotának és az adatbázis tartalmának a szinkronizálása a bean feladata Enterprise JavaBeans példa EJBpelda / 37 BMP példa Példa: egy bankszámla adatait kezelő bean. A SavingAccountEJB állapota a savingaccount táblában tárolódik, amely az alábbi SQL utasítással képezhető: CREATE TABLE savingsaccount (id VARCHAR(3) CONSTRAINT pk_savingsaccount PRIMARY KEY, firstname VARCHAR(24), lastname VARCHAR(24), balance NUMERIC(10,2)); Enterprise JavaBeans példa EJBpelda / 38 A bean osztály A SavingsAccountBean osztály implementálja Az EntityBean interface-t Egy vagy több ejbcreate és ejbpostcreate metódust "finder" (kereső) metódusokat A business metódusokat "home" metódusokat Enterprise JavaBeans példa EJBpelda / 39
A bean osztály (folyt.) Korlátozások Az osztály public kell legyen Az osztály nem lehet abstract vagy final Egy üres kontruktort kell tartalmaznia Nem implementálhatja a finalize metódust Az EntityBean interface deklarál számos olyan metódust, amit a bean osztálynak (nem üresen) implementálnia kell (pl. ejbactivate, ejbload stb.) Enterprise JavaBeans példa EJBpelda / 40 A bean osztály (folyt.) Az ejbcreate metódus A konténer hívja meg a kliens create metódus hívásának hatására Új elemet illeszt az adatbázisba Inicializálja a bean adattagjait Visszaadja a primary key-t Több is definiálható A példában az insertrow private metódus egy INSERT SQL utasítást ad ki. Enterprise JavaBeans példa EJBpelda / 41 A bean osztály (folyt.) Az ejbcreate metódus forrása: public String ejbcreate(string id, String firstname, String lastname, BigDecimal balance) throws CreateException { if (balance.signum() == -1) { throw new CreateException ("A negative initial balance is not allowed."); Enterprise JavaBeans példa EJBpelda / 42
A bean osztály (folyt.) try { insertrow(id, firstname, lastname, balance); catch (Exception ex) { throw new EJBException("ejbCreate: " + ex.getmessage()); this.id = id; this.firstname = firstname; this.lastname = lastname; this.balance = balance; return id; Enterprise JavaBeans példa EJBpelda / 43 A bean osztály (folyt.) Az ejbpostcreate metódus Implementálni kell A konténer közvetlenül az ejbcreate után hívja meg Az argumentumok számának és típusának a két metódusra egyeznie kell A visszatérési értéke kötelezően void. Gyakran üres. (A példában is az.) Enterprise JavaBeans példa EJBpelda / 44 A bean osztály (folyt.) Az ejbremove metódus A konténer ezt hívja meg a kliens remove metódushívásának hatására Feladat a bean eltávolítása az adatbázisból. Megfelel egy DELETE SQL utasításnak Enterprise JavaBeans példa EJBpelda / 45
A bean osztály (folyt.) Az ejbremove metódus implementációja: public void ejbremove() { try { deleterow(id); catch (Exception ex) { throw new EJBException("ejbRemove: " + ex.getmessage()); Enterprise JavaBeans példa EJBpelda / 46 A bean osztály (folyt.) Az ejbload és ejbstore metódusok Ha a konténer szükségesnek tarja, meghívja Értelemszerűen implementálandó Ha egy business metódus tranzakcionális, végrahajtása előtt meghívódik az ejbload, utána az ejbstore Enterprise JavaBeans példa EJBpelda / 47 A bean osztály (folyt.) Kereső (finder) metódusok A kliens ezek segítségével kereshet meg egy adott entitás beant. A példában három kereső metódust hívhat a kliens SavingsAccount jones = home.findbyprimarykey("836"); Collection c = home.findbylastname("smith"); Collection c = home.findinrange(20.00, 99.00); A bean osztálynak kell implementálnia ezeket ejbfind prefix-el. (pl. ejbfindbylastname) Enterprise JavaBeans példa EJBpelda / 48
A bean osztály (folyt.) Kereső (finder) metódusok (folytatás) Az ejbfindbyprimarykey implementálása kötelező, a többi opcionális A kliens nem ezeket hívja közvetlenül, hanem a home interface megfelelő (ejb prefix nélküli) függvényeit A visszatérési értékek a primary key vagy annak kollekciója. Enterprise JavaBeans példa EJBpelda / 49 A bean osztály (folyt.) A business metódusok Általában nem tartalmaznak adatbázis kezelést. Az adatfüggetlen logikát valósítják meg. A példa üzleti metódusai: Enterprise JavaBeans példa EJBpelda / 50 A bean osztály (folyt.) public void debit(bigdecimal amount) throws InsufficientBalanceException { if (balance.compareto(amount) == -1) { throw new InsufficientBalanceException(); balance = balance.subtract(amount); Enterprise JavaBeans példa EJBpelda / 51
A bean osztály (folyt.) public void credit(bigdecimal amount) { balance = balance.add(amount); public String getfirstname() { return firstname; public String getlastname() { return lastname; public BigDecimal getbalance() { return balance; Enterprise JavaBeans példa EJBpelda / 52 A bean osztály (folyt.) A "home" metódusok A valamennyi bean-re jellemző üzleti logikát tartalmazzák Nem hivatkozhatnak a bean perzisztens állapotára Általában bean példányok kollekcióján manipulálnak Példa: ejbhomechargeforlowbalance Kezelési költséget von le minden olyan számláról, aminek egyenlege túl kicsi Enterprise JavaBeans példa EJBpelda / 53 A bean osztály (folyt.) A home interface tartalmazza az ejbhome prefix nélküli definíciókat, az implemetációs párjuk a bean osztályban van. A kliens a fentit az alábbi módon hívja: SavingAccountHome home;... home.chargeforlowbalance(...) Enterprise JavaBeans példa EJBpelda / 54
A home interface A kilens által hívható metódusokat definiálja create metódusok "finder" metódusok Egyéb, általános metódusok (mint most a példában a ChargeForLowBalance) Implementációs párjaik valamilyen prefix-el a bean osztályban találhatók. Enterprise JavaBeans példa EJBpelda / 55 A home interface (folyt.) create metódusok Paraméterszignatúrájuk meg kell egyezzen a a megfelelő ejbcreate metódusével. Visszatérési érték típusa a remote interface. A throw ugyanazt a kivétel listát kell tartalmazza, mint a megfelelő ejbcreate metódusé. A throw kell, hogy tartalmazza a javax.ejb.createexception kivételt, a remote home interface ezen felül még a java.rmi.remoteexeption kivételt is. Enterprise JavaBeans példa EJBpelda / 56 A home interface (folyt.) "finder " metódusok Ezeknek is megvan a párjuk a bean osztályban A megfelelők paraméterszignatúrája és kivétel listája meg kell egyezzen A visszatérési értékük típusa a remote interface, vagy abból alkotott kollekció Meg kell jelölni a javax.ejb.finderexception kivételt. A remote home interface metódusainál meg kell jelölni a java.rmi.remoteexception kivételt. Enterprise JavaBeans példa EJBpelda / 57
A home interface (folyt.) home metódusok Mindegyiknek van egy párja a bean osztályban, amelyek neve az ejbhome prefix-el az itt megadott névből képzendő A nevek nem kezdődhetnek create-el vagy find-al A paraméterszignatúráknak és a kivétel listának páronként egyeznie kell. Nem dobhatják a FinderException kivételt Enterprise JavaBeans példa EJBpelda / 58 A home interface (folyt.) import java.util.collection; import java.math.bigdecimal; import java.rmi.remoteexception; import javax.ejb.*; public interface SavingsAccountHome extends EJBHome { public SavingsAccount create(string id, String firstname, String lastname, BigDecimal balance)throws RemoteException, CreateException; Enterprise JavaBeans példa EJBpelda / 59 A home interface (folyt.) public SavingsAccount findbyprimarykey (String id) throws FinderException, RemoteException; public Collection findbylastname(string lastname)throws FinderException, RemoteException; public Collection findinrange(bigdecimal low, BigDecimal high) throws FinderException, RemoteException; Enterprise JavaBeans példa EJBpelda / 60
A home interface (folyt.) public void chargeforlowbalance (BigDecimal minimumbalance, BigDecimal charge)throws InsufficientBalanceException, RemoteException; Enterprise JavaBeans példa EJBpelda / 61 Remote interface A kliens által hívható üzleti metódusokat definiálja Minden definícióhoz tartozik egy implementáció a bean osztályban, azonos paraméterszignatúrával Az argumentumoknak és a visszatérési értéknek érvényes RMI típusoknak kell lenniük. A metódusoknak dobniuk kell a java.rmi.remoteexception kivételt. A local remote interface-re a fenti két megkötés nem érvényes Enterprise JavaBeans példa EJBpelda / 62 Remote interface (folyt.) import javax.ejb.ejbobject; import java.rmi.remoteexception; import java.math.bigdecimal; public interface SavingsAccount extends EJBObject { public void debit(bigdecimal amount) throws InsufficientBalanceException, RemoteException; Enterprise JavaBeans példa EJBpelda / 63
Remote interface (folyt.) public void credit(bigdecimal amount) throws RemoteException; public String getfirstname()throws RemoteException; public String getlastname()throws RemoteException; public BigDecimal getbalance()throws RemoteException; Enterprise JavaBeans példa EJBpelda / 64 Kivételkezelés Két kategória: rendszer (system) kivételek hiba a szolgáltatásokban (pl. adatbázis vagy a kívánt objektum nem található) a konténer megszüntetheti a bean-t. a kliens nem tudja lekezelni ha tranzakció közben keltkezik, a konténer visszavonja a tranzakciót Enterprise JavaBeans példa EJBpelda / 65 Kivételkezelés (folyt.) alkalmazás (application) kivételek. hiba az üzleti logika végrehajtása közben lehet programozó által definiált vagy előre deiniált a kliens megkapja a kivételt, és annak feladata lekezelni ha a kivétel tranzakció közben keletkezik, a konténer nem vonja vissza azt Enterprise JavaBeans példa EJBpelda / 66
Kivételkezelés (folyt.) Előredefiniált system kivételek: Módszer ejbcreate ejbfindprimarykey (és minden finder metódus, ami egy objektumot ad vissza) ejbremove Kivétel CreateException ObjectNotFoundException (a FinderException leszármazottja) RemoveException Ok Érvénytelen input paraméter Az adatbázisban nem található a szükséges sor Az adatbázisból nem törölhető a szükséges sor Enterprise JavaBeans példa EJBpelda / 67 Kivételkezelés (folyt.) Előredefiniált application kivételek: Módszer ejbload Kivétel NoSuchEntityException Ok A betöltendő adatbázis sor nem taláható ejbstore NoSuchEntityException A módosítandó adatbázis sor nem taláható Bármelyik módszer EJBException Rendszerhiba történt Enterprise JavaBeans példa EJBpelda / 68 CMP entitás bean Adatbázisban tárolt adatok reprezentálása. A bean állapotának és az adatbázis tartalmának a szinkronizálása a konténer feladata. A konténer kezeli a bean-ek közötti kapcsolatokat is. A szükséges beállításokat a deployment descriptorban kell leírni. Nem kell adatbázis kezelést kódolni, ami egyben hordozhatóbbá is teszi a bean-t. Enterprise JavaBeans példa EJBpelda / 69
CMP entitás bean példa A példa egy sportszövetség csapatnévsorainak kezelését végző alkalmazás (RosterApp). A kliens a RosterEJB session bean-t éri el. A RosterEJB session bean három entity bean-t kezel: PlayerEJB, TeamEJB, LeagueEJB. Ezeket a lokális interface-ükön keresztül éri el. Egy Player több Team tagja is lehet, de minden Team csak egy League-hez tartozhat. Ennek megfelelően az alkalmazás architektúrája: Enterprise JavaBeans példa EJBpelda / 70 CMP entitás bean példa (folyt.) Enterprise JavaBeans példa EJBpelda / 71 A PlayerEJB kódja Egy sportolót reprezentál A következő részekből áll: Entity bean osztály (PlayerBean) Lokális home interface (LocalPlayerHome) Lokális interface (LocalPlayer) Enterprise JavaBeans példa EJBpelda / 72
A PlayerBean osztály Az osztálynak public-nak és abstract-nak kell lennie. Implementálnia kell az alábbiakat: Az EntityBean interface-t Egy vagy több ejbcreate és ejbpostcreate metódust Minden perzisztens (adatbázisra leképzendő) és kapcsolati (relationship, kapcsolókulcsot képező) mezőre implementálni kell egy-egy get és set metódust. Ezek abstract metódusok. Enterprise JavaBeans példa EJBpelda / 73 A PlayerBean osztály (folyt.) Implementálnia kell (folytatás): Tetszőleges számú select metódust (abstract metódusként) A home metódusokat Az üzleti metódusokat Tilos implementálni A finder metódusokat A finalize metódust Enterprise JavaBeans példa EJBpelda / 74 Kódolási különbségek Osztálydefiníció Adatbázis elérés Perzisztens állapot Elérési metódusok a perzisztens és kapcsoló mezőkhoz CMP abstract Generált Virtuális perzisztens mezők reprezentálják Szükséges BMP Nem abstract Fejlesztő által kódolt Adattagok reprezentálják Nem szükséges Enterprise JavaBeans példa EJBpelda / 75
Kódolási különbségek (folyt.) findbyprimaykey metódus Speciális finder metódusok Select metódusok Az ejbcreate metódus visszatérési értéke CMP A konténer kezeli A konténer kezeli, de a fejlesztőnek kell definiálni EJB QL lekérdezésekkel A konténer kezeli Nincs BMP A fejlesztő írja meg A fejlesztőnek kell megírnia Nincs Primary key-nek kell lennie Enterprise JavaBeans példa EJBpelda / 76 Kódolási különbségek (folyt.) Azonos szabályok szerin kell kódolni az üzleti metódusokat a home metódusokat. Enterprise JavaBeans példa EJBpelda / 77 A perzisztens mezők A konténer automtikusan gondoskodik a perzisztens mezők adatbázisba mentéséről illetve visszatöltéséről A példa mezői: playerid (elsődleges kulcs) name position salary A PlayerBean osztály által definiált elérési metódusok: Enterprise JavaBeans példa EJBpelda / 78
A perzisztens mezők (folyt.) public abstract String getplayerid(); public abstract void setplayerid(string id); public abstract String getname(); public abstract void setname(string name); public abstract String getposition(); public abstract void setposition(string position); public abstract double getsalary(); public abstract void setsalary(double salary); Enterprise JavaBeans példa EJBpelda / 79 A perzisztens mezők (folyt.) A névképzés szabályai: A get vagy set szóval kezdődik. A mgefelelő perzisztens mező nagy kezdőbetűvel írt nevével folytatódik. Enterprise JavaBeans példa EJBpelda / 80 A kapcsoló mezők Egy PlayerEJB példány több TeamEJB példányhoz kapcsolódhat. A deployment descriptor egy kapcsolómezőt (team) definiál. A kapcsolómező elérési függvényei: public abstract Collection getteams(); public abstract void setteams(collection teams); Enterprise JavaBeans példa EJBpelda / 81
A select metódusok Hasonlóak a finder metódusokhoz az alábbiakban: Az adatbázist kérdezik le és objektumokat adnak vissz A deployment descriptor a select metódushoz egy EJB QL lekérdezést specifikál Az entity bean osztálynak nem kell implementálnia a metódusokat Enterprise JavaBeans példa EJBpelda / 82 A select metódusok (folyt.) Különböznek a finder metódusoktól az alábbiakban: Visszaadhat perzistens mezőt vagy mezőket, vagy a kapcsolódó bean-ek home interface-ét. (A finder metódus csak home interface-t adhat vissza.) Nem szerepel sem remote, sem a local interfaceben, így nem hiívhatja a kliens. (Általában az üzleti metódusok hívják.) A select meódusok a bean osztályban definiáltak. Finder metódust ez az osztály nem definiálhat. Enterprise JavaBeans példa EJBpelda / 83 A select metódusok (folyt.) A PlayerBean osztályban definiált select metódusok: public abstract Collection ejbselectleagues (LocalPlayer player throws FinderException; public abstract Collection ejbselectsports (LocalPlayer player throws FinderException; Enterprise JavaBeans példa EJBpelda / 84
A select metódusok (folyt.) Mivel ezeket a metódusokat csak az üzleti logika metódusai érhetik el, a kliens által is szükséges funkciókat a PlayerBean osztály becsomagolhatja, például: public Collection getleagues() throws FinderException { LocalPlayer player = (team.localplayer)context.getejblocalobject (); return ejbselectleagues(player); Enterprise JavaBeans példa EJBpelda / 85 Életciklus metódusok A perzisztenciát a konténer kezeli, így csak az ejbcreate metódusra van szüksége a PlayerBean osztályban. A példában: public String ejbcreate (String id, String name, String position, double salary) throws CreateException { setplayerid(id); setname(name); setposition(position); setsalary(salary); return null; Enterprise JavaBeans példa EJBpelda / 86 A local home interface Definiálja a create, finder és home metódusokat a lokális kliensek számára A create metódus szabályai: paraméterek és kivételek mint az ejbcreate esetén visszatérési érték típusa a bean local interface-e dobnia kell a javax.ejb.createexception kivételt Enterprise JavaBeans példa EJBpelda / 87
A local home interface (folyt.) A finder metódusok szabályai: a név a find-al kezdődik a visszatérési érték típusa a bean local interface-e vagy azok kollekciója dobnia kell a javax.ejb.finderexception kivételt a findbyprimarykey metódus definiálása kötelező A példa local home interface-e: Enterprise JavaBeans példa EJBpelda / 88 A local home interface (folyt.) package team; import java.util.*; import javax.ejb.*; public interface LocalPlayerHome extends EJBLocalHome { public LocalPlayer create (String id, String name, String position, double salary)throws CreateException; Enterprise JavaBeans példa EJBpelda / 89 A local home interface (folyt.) public LocalPlayer findbyprimarykey (String id) throws FinderException; public Collection findbyposition (String position) throws FinderException;... public Collection findbyleague (LocalLeague league) throws FinderException;... Enterprise JavaBeans példa EJBpelda / 90
A local interface Azokat az üzleti és elérési metódusokat definiálja, amelyeket a lokális kliensek használhatnak. A példában: két üzleti metódus: getleagues és getsports get metódusok a kliensek számára a set metódusok rejtettek a kliensek elől, mert nem szerepelnek az interface-ben. A példa LocalPlayer interface-e: Enterprise JavaBeans példa EJBpelda / 91 A local interface (folyt.) package team; import java.util.*; import javax.ejb.*; public interface LocalPlayer extends EJBLocalObject { public String getplayerid(); public String getname(); public String getposition(); public double getsalary(); public Collection getteams(); Enterprise JavaBeans példa EJBpelda / 92 A local interface (folyt.) public Collection getleagues() throws FinderException; public Collection getsports() throws FinderException; Enterprise JavaBeans példa EJBpelda / 93
Irodalom The J2EE Tutorial Enterprise JavaBeans Technology Fundamentals Short Course Braun Tamás: Internet banki alkalmazás fejlesztése J2EE technológiával és az IBM Websphere alkalmazás szerverrel Diplomaterv, Általános Informatikai Tanszék, Miskolc, 2002. Enterprise JavaBeans példa EJBpelda / 94