Das Client-Programm Klasse BankierClient • • • bietet Funktionalität für den Bankangestellten verwendet die Entity Bean Konto verwendet die stateless Session Bean Kontenverwaltung Klasse KundenClient • • • bietet Funktionalität für den Kunden verwendet die Entity Bean Konto verwendet die stateful Session Bean Kundenterminal weitere Klassen für die Benutzeroberfläche Welche Dateien werden benötigt? IAS: Client Jar Generation Wizard KontoHome.class KontoPK.class Konto.class KreditrahmenUeberzogenException.class KundenterminalHome.class Kundenterminal.class InhaberNoetigException.class PinNoetigException.class KeinKontoException.class FalscheAngabeException.class KontenverwaltungHome.class Kontenverwaltung.class KontenverwaltungHelper.class KontenverwaltungHolder.class KontenverwaltungHomeHelper.class KontenverwaltungHomeHolder.class KontenverwaltungHomeOperations.class KontenverwaltungHomePOAInvokeHandler.class KontenverwaltungOperations.class KontenverwaltungPOAInvokeHandler.class KontoHelper.class KontoHolder.class KontoHomeHelper.class KontoHomeHolder.class KontoHomeOperations.class KontoHomePOAInvokeHandler.class KontoOperations.class KontoPOAInvokeHandler.class KundenterminalHelper.class KundenterminalHolder.class KundenterminalHomeHelper.class KundenterminalHomeHolder.class KundenterminalHomeOperations.class KundenterminalHomePOAInvokeHandler.class KundenterminalOperations.class KundenterminalPOAInvokeHandler.class _KontenverwaltungHome_Stub.class _Kontenverwaltung_Stub.class _KontoHome_Stub.class _Konto_Stub.class _KundenterminalHome_Stub.class _Kundenterminal_Stub.class 1 Wie kommt der Client an die Beans? // InitalContext ist Container/Serverabhängig (existiert nur durch Starten mit “vbj”) // “vbj” statt “java” und “vbjc” stat “javac” verwenden // Ergebnis ist ein JNDI Kontext des VisiBroker Naming Service javax.naming.Context context = new javax.naming.InitialContext(); // holt ein Objekt mit JNDI Namen “konto” (Home Interface der Bean Konto) Object ref = java.naming.context.lookup("konto"); // überprüft, ob der Cast vom Typ Object nach KontoHome möglich ist KontoHome kHome = (KontoHome) javax.rmi.PortableRemoteObject.narrow(ref, KontoHome.class); // Ergebnis ist ein Stub-Klasse, die das RemoteInterface der Konto Bean implementiert Konto aktKonto = kHome.findByPrimaryKey(new KontoPK(kontoNr)); // mögliche Exceptions: java.rmi.RemoteException, javax.naming.NamingException // müssen abgefangen oder geworfen werden setKonto(kNr) im BankierClient public void setKonto(int kontoNr) throws RemoteException, KeinKontoException, NamingException { javax.naming.Context context = new InitialContext(); Object ref = context.lookup("konto"); KontoHome kHome = (KontoHome) PortableRemoteObject.narrow(ref,KontoHome.class); try { aktKonto = kHome.findByPrimaryKey(new KontoPK(kontoNr)); } catch( Exception ex ) { throw new KeinKontoException(); } aktKontoNr=kontoNr; } 2 Der Konstruktor des BankierClient public class BankierClient { [...] private Kontenverwaltung kontoVerw; [...] // private Variable public BankierClient() { try{ javax.naming.Context context = new javax.naming.InitialContext(); Object ref = context.lookup("kontenverwaltung"); KontenverwaltungHome kverwHome = (KontenverwaltungHome) javax.rmi.PortableRemoteObject.narrow (ref, KontenverwaltungHome.class); kontoVerw = kverwHome.create(); } catch (Exception e) { e.printStackTrace(); } } [...] Aufrufen der Bean-Methoden public double getZinssatz() throws RemoteException, KeinKontoException { if(aktKonto == null){ throw new KeinKontoException();} return aktKonto.getZinssatz(); } public String getInhaber() throws RemoteException, KeinKontoException { if(aktKonto == null) { throw new KeinKontoException(); } return aktKonto.getInhaber(); } public void neuesKonto(int kontoNr, String inhaber, int pin) throws RemoteException, NamingException, CreateException, KeinKontoException { kontoVerw.neuesKonto(kontoNr, inhaber); setKonto(kontoNr); aktKonto.setPIN(pin); } 3 setKonto(kNr) im KundenClient public void setKonto (int kontoNr) throws KeinKontoException, RemoteException, javax.naming.NamingException { javax.naming.Context context = new javax.naming.InitialContext(); try { Object ref = context.lookup("kundenterminal"); KundenterminalHome kHome = (KundenterminalHome) javax.rmi.PortableRemoteObject.narrow(ref, KundenterminalHome.class); kterminal = kHome.create(kontoNr); // stateful Session Bean erzeugen } catch(Exception ex) { throw new KeinKontoException(); } } Aufrufen der Bean-Methoden public void setInhaber(String inhaber) throws RemoteException, FalscheAngabeException{ kterminal.setInhaber(inhaber); } public void setPin(int pin) throws RemoteException, FalscheAngabeException { kterminal.setPin(pin); } public void einzahlen(double betrag) throws RemoteException, InhaberNoetigException, KeinKontoException { kterminal.einzahlen(betrag); } 4