Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaNándor Vörös Megváltozta több, mint 10 éve
1
1 Fejlett Programozási Technikák 2. 15/11
2
Fejlett Programozási Technológiák 2. 2 A mai előadás tartalma Probléma a Java Servlet-tel Template eszközök Java Server Pages Áttekintés Elemei Életciklusa Objektumok Java Beanek használata Java Standard Tag Library Custom Tag Library Java Server Faces Feladata Elemei Navigáció Támogató Bean
3
Fejlett Programozási Technológiák 2. 3 A mai előadás tartalma: J2EE JNDI RMI Corba
4
Fejlett Programozási Technológiák 2. 4 Irodalom The JNDI tutorial http://java.sun.com/products/jndi/tutorial/trailmap.html http://java.sun.com/products/jndi/tutorial/trailmap.html The RMI tutorial http://java.sun.com/j2se/1.4.2/docs/guide/rmi/index.html http://java.sun.com/j2se/1.4.2/docs/guide/rmi/index.html Fintan Bolton: Pure CORBA
5
Fejlett Programozási Technológiák 2. 5 Vállalati szoftver 10 ügyvéd 11 féle válasz Több mint egy weboldal 2 vagy több rétegű architektúra Komponens alapú elosztott rendszerek Együttműködés más rendszerekkel Karbantartható kód/alkalmazás
6
Fejlett Programozási Technológiák 2. 6 Java 2 Enterprise Edition J2EE tartalmazza a J2SE-t API, szabvány, tervezési minta gyűjtemény Elemei (rétegek szerint): Prezentáció Adat tárolás kinyerés Kommunikáció
7
Fejlett Programozási Technológiák 2. 7 Prezentáció JSP Servlet JavaMail
8
Fejlett Programozási Technológiák 2. 8 Adatkezelés JDBC JNDI EJB JAX SAX DOM JTA JAAS
9
Fejlett Programozási Technológiák 2. 9 Kommunikáció RMI CORBA JMS
10
Fejlett Programozási Technológiák 2. 10 Megvalósítások Tomcat JBoss WebSphere iPlanet J2EE SDK … http://www.javaskyline.com/serv.html
11
Fejlett Programozási Technológiák 2. 11 JNDI Java Naming and Directory Interface A J2EE legfontosabb összetevője (a J2SEE –nek is része) Feladata: Objektumok referenciáinak tárolása kereshető formában Együttműködés a címtár alapú rendszerekkel (amelyek tudják az információt hierarchikusan kezelni) Felépítése: JNDI API Elnevezés menedzser JDNI SPI Szolgáltatók (Service Provider) LDAP COS RMI DNS NIS Fájl Rendszer Windows Reg. Novell Fájl R.
12
Fejlett Programozási Technológiák 2. 12 Elnevezés, Címtár Elnevezés (Naming): LDAP, DNS, COS, … Kötés – binding Referenciák, Címek Konteksztus (Context) (név-objektum kötés halmaz) Névterek, Elnevezési rendszerek – konteksztusok halmaza Címtár (directory): Az objektumok rendelkeznek tulajdonságokkal is Tulajdonság azonosító Címtár szolgáltatás Directory Schema Keresések, …
13
Fejlett Programozási Technológiák 2. 13 JNDI csomagok javax.naming Kontesztus (Context) Kezdő kontesztkus (Initial Context) list, lisBindings, bind, reBind, unBind Al kontesztus - subContext Nevek (Name, CompositeName ) String, Name Kötések Referenciák javax.naming.directory Attribútumok lekérdezése DirContext, getAttributes(), modifyAttributes(), search() javax.naming.event javax.naming.ldap (Teljesebb LDAP) LDAP v3 LdapContext javax.naming.spi
14
Fejlett Programozási Technológiák 2. 14 Használata (fájl rendszer) import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.util.Hashtable; class Lookup { public static void main(String[] args) { if (args.length != 1) { System.err.println("usage: java Lookup "); System.exit(-1);} String name = args[0]; Hashtable env = new Hashtable(11); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFact ory"); try { Context ctx = new InitialContext(env); Object obj = ctx.lookup(name); System.out.println(name + " is bound to: " + obj); NamingEnumeration list = ctx.list("awt"); while (list.hasMore()) { NameClassPair nc = (NameClassPair)list.next(); System.out.println(nc);} ctx.close(); } catch (NamingException e) { System.err.println("Problem looking up " + name + ": " + e); } }}
15
Fejlett Programozási Technológiák 2. 15 Kötés, Konteksztus Kötés: bind, rebind, unbind, rename Fruit fruit = new Fruit("orange"); ctx.bind("favorite", fruit); Fruit fruit = new Fruit("lemon"); ctx.rebind("favorite", fruit); ctx.unbind("favorite"); ctx.rename("report.txt", "old_report.txt"); Al kontesztus: createSubcontext, destroySubcontext ctx.createSubcontext("new"); ctx.destroySubcontext("new");
16
Fejlett Programozási Technológiák 2. 16 Használata címtár esetén import javax.naming.Context; import javax.naming.directory.InitialDirContext; import javax.naming.directory.DirContext; import javax.naming.directory.Attributes; import javax.naming.NamingException; import java.util.Hashtable; class Getattr { public static void main(String[] args) { Hashtable env = new Hashtable(11); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial"); env.put(Context.SECURITY_PRINCIPAL, "joeuser"); env.put(Context.SECURITY_CREDENTIALS, "joepassword"); try { DirContext ctx = new InitialDirContext(env); Attributes attrs = ctx.getAttributes("cn=Ted Geisel, ou=People"); System.out.println("sn: " + attrs.get("sn").get()); ctx.close(); } catch (NamingException e) { System.err.println("Problem getting attribute: " + e); }
17
Fejlett Programozási Technológiák 2. 17 Attribútum, Attribútum hierarchia: Név – vezetéknév Attributes answer = ctx.getAttributes("cn=Ted Geisel, ou=People"); for (NamingEnumeration ae = answer.getAll(); ae.hasMore();) { Attribute attr = (Attribute)ae.next(); System.out.println("attribute: " + attr.getID()); /* Print each value */ for (NamingEnumeration e = attr.getAll(); e.hasMore(); System.out.println("value: " + e.next())) ; } Módosítás: ModificationItem[] mods = new ModificationItem[3]; mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("mail", "geisel@wizards.com")); mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("telephonenumber", "+1 555 555 5555")); mods[2] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("jpegphoto"));
18
Fejlett Programozási Technológiák 2. 18 Keresés, Kötés Search Attributes matchAttrs = new BasicAttributes(true); // ignore attribute name case matchAttrs.put(new BasicAttribute("sn", "Geisel")); matchAttrs.put(new BasicAttribute("mail")); NamingEnumeration answer = ctx.search("ou=People", matchAttrs); String[] attrIDs = {"sn", "telephonenumber", "golfhandicap", "mail"}; NamingEnumeration answer = ctx.search("ou=People", matchAttrs, attrIDs); Search control, Search filter String[] attrIDs = {"sn", "telephonenumber", "golfhandicap", "mail"}; SearchControls ctls = new SearchControls(); ctls.setReturningAttributes(attrIDs); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); ctls.setCountLimit(1); ctls.setTimeLimit(1000); String filter = "(&(sn=Geisel)(mail=*))"; NamingEnumeration answer = ctx.search("ou=People", filter, ctls); Binding Attributes attrs = new BasicAttributes(true); // case-ignore Attribute objclass = new BasicAttribute("objectclass"); objclass.add("top"); objclass.add("organizationalUnit");attrs.put(objclass); Context result = ctx.createSubcontext("ou=Fruits", attrs);
19
Fejlett Programozási Technológiák 2. 19 Elosztott rendszerek Gyakran kliens-szerver Problémák: A távoli objektum megtalálása Bájt kód betöltése Kommunikáció Socket használat RPC használat RMI Corba RMI IIOP SOAP XML RPC
20
Fejlett Programozási Technológiák 2. 20 RMI Remote Method Invocation Objektum orientált RPC Teljes objektumokat tudunk átküldeni, nem csak előre definiált típusokat Java specifikus Elosztott szemétgyűjtő Biztonságos Egyszerű (nincs IDL) URl szerű: rmi://host:port/objektumnév
21
Fejlett Programozási Technológiák 2. 21 Különbségek Elosztott vs. Normál Java alkalmazás Távoli objektum hivatkozása használható A Cast ugyanúgy működik instanceOf is A távoli objektumoknál az interfésszel kommunikálunk nem a megvalósító osztállyal A távoli eljárás hívások eredménye és paraméterei érték szerint adódnak át A távoli objektum hivatkozásként adódik át Külön hibakezelés kell
22
Fejlett Programozási Technológiák 2. 22 Felépítése Java.RMI.remote interfész Ezt kell bővítenünk Minden metódusnál specifikálni kell a java.rmi.RemoteException kivételt A távoli eljárás deklarálásánál a benne szerepelő objektumokat interfészekkel kell megadnunk RemoteException Kommunikációs hiba Paraméter átalakítás hiba Protokol hiba RemoteObject java.lang.Object java.rmi.server.UnicastRemoteObject java.rmi.activation.Activatable
23
Fejlett Programozási Technológiák 2. 23 Működése Hagyományos RPC megoldás: Csonkok (stubs) elrejtik a hálózati protokollokat és a serializációt Kliens oldali reprezentáció vagy proxy Ugyanazt az interfészt valósítja meg mint a távoli osztály Egy csonk metódus hívás: Kapcsolatot kezdeményez a távoli JVM-mel Átalakítja és átviszi a paramétereket (marshalls) Megvárja az eredményt !!!!!! Kiolvassa és visszaalakítja a paramétereket (unmarshalls) Visszaadja az eredményt a hívónak Vázak (skeletons) a szerver oldali ragasztó (Java2 ben nem kötelező) Szerver oldali reprezentáció: Kiolvassa a paramétereket és visszaalakítja őket (unmarshals) Meghívja a megfelelő objektum megfelelő metódusát Átalakítja és átküldi az eredményt (marshals)
24
Fejlett Programozási Technológiák 2. 24 Használata Távoli interfész deklarálás public interface WeatherService extends Remote { public List getWeatherInformation() throws RemoteException;} Osztály megvalósítás public class WeatherServiceImpl extends UnicastRemoteObject implements WeatherService { public WeatherServiceImpl() throws RemoteException { super();updateWeatherConditions();} public List getWeatherInformation(){} public static void main( String args[] ) throws Exception {WeatherService service = new WeatherServiceImpl(); String serverObjectName = "rmi://localhost/WeatherService"; Naming.rebind( serverObjectName, service );} Kliens megvalósítás String remoteName = "rmi://" + server + "/WeatherService"; WeatherService weatherService =( WeatherService ) Naming.lookup( remoteName ); List weatherInformation = weatherService.getWeatherInformation(); Fordítás Javac Rmic -> csonk osztályok (rmic –v1.2 -> vázat is gyárt) Futtatás rmiregistry Java Server Java Kliens
25
Fejlett Programozási Technológiák 2. 25 Paraméter átadás Serializable (menthető) objektumok (java.io.Serializable) Távoli objektumok (nem exportált) Érték szerint adódik át (serialization) Távoli objektumok (exportált) Referencia szerint adódik át (csonk) Referencia integritás Osztály kommentár (Annotation) Az osztály elérési útvonala is átküldődik Paraméter átvitel java.rmi.Remote megvalósító osztály Exportált: csonk adódik vissza Nem exportált: az objektum adódik vissza Egyéb osztály: Nem exportált: az objektum adódik vissza
26
Fejlett Programozási Technológiák 2. 26 Szemét gyűjtés Referencia számláló szemét gyűjtő Minden JVM-en belül számon tartja az aktív referenciákat Referenced üzenet Együttműködés a helyi szemétgyűjtővel: Gyenge referencia Normál referencia
27
Fejlett Programozási Technológiák 2. 27 Dinamikus osztály betöltés Bármilyen objektum átvihető (serializable) Szükség van az osztály definícióra a másik oldalon is Unmarshalling: Megpróbálja a helyi gépen feloldani Ha nem megy akkor megpróbálja a távoli (az átivteli folyamban megadott annotateClass ) címről betölteni java.rmi.server.RMIClassLoader.getClassAnnotatio n
28
Fejlett Programozási Technológiák 2. 28 RMI és a tűzfalak java.rmi.server.RMISocketFactory Alapértelmezett próbálkozás 1099-es port HTTP-be csomagolva HTTP POST 1099-es port 80-as port + cgi script
29
Fejlett Programozási Technológiák 2. 29 UnicastRemoteObject Távoli objektumok létrehozása és exportálása Tulajdonságok: A referencia csak a létrehozó processz futása alatt él TCP protokollt használ protected UnicastRemoteObject() protected UnicastRemoteObject(int port) protected UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) public Object clone() public static RemoteStub exportObject(java.rmi.Remote obj) public static Remote exportObject(java.rmi.Remote obj, int port) public static Remote exportObject(Remote obj, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) public static boolean unexportObject(java.rmi.Remote obj, boolean force)
30
Fejlett Programozási Technológiák 2. 30 Aktiválható távoli objektum Sok objektum -> erőforrás foglalás A klienseknek meg kell őrizniük a referenciát (szemét gyűjtő) Szerver leállás esetén is megmarad Aktiválható objektum -> kérésre aktiválódik Aktív objektum Passzív objektum Lusta aktiválás Objektum aktiválás ID Tranziens objektum ID Aktiváló protokol: Aktivátor (aktiválás ID class hozzárendelés, JVM menedzselés) Objektum csoport azonosító (JVM) Osztály név URL Objektum specifikus adat Aktivációs csoport (ő kapja meg a kérést és továbbítja az aktivátornak) Távoli objektum
31
Fejlett Programozási Technológiák 2. 31 Használata rmid démon (egy JVM-et indít) Aktiválás regisztrálása Speciális konstruktor megvalósítása ActivationDesc osztály Csoport azonosító Osztálynév URL MarshalledObject ActivationID osztály Távoli hivatkozás az aktivátorra Az objektum egyedi azonosítója Activatable osztály Ebből érdemes származtatni az osztályunkat
32
Fejlett Programozási Technológiák 2. 32 Példa: Interfész deklarálás: import java.rmi.*; public interface MyRemoteInterface extends Remote { public Object callMeRemotely() throws RemoteException;} Activatable megvalósotás: import java.rmi.*;import java.rmi.activation.*; public class ActivatableImplementation extends Activatable implements examples.activation.MyRemoteInterface { public ActivatableImplementation(ActivationID id, MarshalledObject data) throws RemoteException {super(id, 0); } public Object callMeRemotely() throws RemoteException { return "Success"; }}
33
Fejlett Programozási Technológiák 2. 33 Példa Setup osztály: public static void main(String[] args) throws Exception { System.setSecurityManager(new RMISecurityManager()); Properties props = new Properties(); props.put("java.security.policy", "/home/rmi_tutorial/activation/policy"); ActivationGroupDesc.CommandEnvironment ace = null; ActivationGroupDesc exampleGroup = new ActivationGroupDesc(props, ace); ActivationGroupID agi = ActivationGroup.getSystem().registerGroup(exampleGroup); String location = "file:/home/rmi_tutorial/activation/"; MarshalledObject data = null; ActivationDesc desc = new ActivationDesc (agi, "examples.activation.ActivatableImplementation", location, data); MyRemoteInterface mri = (MyRemoteInterface)Activatable.register(desc); Naming.rebind("ActivatableImplementation", mri); System.exit(0);
34
Fejlett Programozási Technológiák 2. 34 Futtatás javac rmic rmiregistry rmid -J-Djava.security.policy=rmid.policy & java setup java server java client
35
Fejlett Programozási Technológiák 2. 35 Összefoglaló RMI – java RPC Java IDL, RMI IIOP java.rmi.Remote RemoteException Exportálás Rmiregisrty, rmic Rmid UnicastRemoteObject, Activable
36
Fejlett Programozási Technológiák 2. 36 CORBA OMG - Object Management Group www.omg.orgwww.omg.org OMA – Object Management Architecture Common Object Request Borker Architecture Feladata: A távoli eljárás hívások és az Objektum orientált fejlesztés összeházasítása Előnyei: Nyílt szabvány Objektum orientált Helyszín transzparens Platform, nyelv és implementáció független Ada, Cobol, C, C++, Smalltalk, Lisp, Java Támogatja az átjárókat (DCE RPC,DCOM) Lehet szinkron, aszinkron (3.0) QoS
37
Fejlett Programozási Technológiák 2. 37 Szolgáltatásai 1. Naming Service 2. Event Management Service 3. Life Cycle Service 4. Persistent State Service 5. Transaction Service 6. Concurrency Service 7. Relationship Service 8. Externalization Service 9. Query Service 10. Licensing Service 11. Property Service 12. Time Service 13. Security Service 14. Notification Service 15. Trader Service 16. Collections Service
38
Fejlett Programozási Technológiák 2. 38 CORBA tartományok 1. Common Enterprise Models 2. Finance/Insurance 3. Electronic Commerce 4. Manufacturing 5. Healthcare 6. Telecommunications 7. Transportation 8. Life Science Research 9. Utilities 10. C4I (Command, Control, Communications, Computers, and Intelligence) 11. Space
39
Fejlett Programozási Technológiák 2. 39 Fontosabb elemei OMG Interfész definiáló Nyelv – IDL C++ - hoz hasonló Nyelv és platform független IDL fordítók Proxy objektumok: Csonk, Váz kód (stub, skeleton) Internet Inter-ORB Protocol GIOP speciális jól definiált verziója (TCP) Object Adapter Típusai: BOA - Basic Object Adapter POA - Portable Object Adapter A megfelelő nyelvben definiált adatstruktúra és az IDL interfész összerendelése A CORBA objektumok életciklusának menedzselése Aktiválás Deaktiválás Object Request Broker A váz és csonk kódok kezelése Runtime az alkalmazásokhoz kapcsolásra Távoli szerverek megtalálása és aktiválása Démon vagy könyvtár
40
Fejlett Programozási Technológiák 2. 40 CORBA alkalmazások telepítése CORBA objektumok megtalálása IOR Inter Operable object Reference (a szerverekre mutat) IP cím Port Objektum ID IOR beszerzése: Fájlból CORBA név szolgáltatásból CORBA objektum kereskedés szolgáltatásból Szerverek megtalálása és aktiválása: ORB daemon processz Implementáció tár Szunnyadó szerver használata Szerver megkeresése Szerver aktiválása CORBA hívás Aktív szerver használata Tranziens CORBA objektum használata
41
Fejlett Programozási Technológiák 2. 41 CORBA fejlesztés lépései IDL interfész definiálása SystemClock A kiszolgáló implementálása Az IDL fordító által generált váz fájlok használatával A kliens implementálása Az IDL fordító által generált csonk fájlok használatával Az objektum referenciák kiosztása A kiszolgáló és a kliens futtatása
42
Fejlett Programozási Technológiák 2. 42 SystemClock.idl module clock { // The definition of the CORBA-enabled service interface SystemClock { long long currentTimeMillis(); }; idlj SystemClock.java public interface SystemClock extends SystemClockOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity { } SystemClockOperations.java public interface SystemClockOperations { long currentTimeMillis (); } _SystemClockImplBase.java
43
Fejlett Programozási Technológiák 2. 43 SystemClockImpl.java/1 import org.omg.CORBA.ORB; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; public class SystemClockImpl extends _SystemClockImplBase { public long currentTimeMillis() { return System.currentTimeMillis(); } public SystemClockImpl( String params[] ) throws Exception { register( "TimeServer", params ); } private void register( String corbaName, String params[] ) throws org.omg.CORBA.ORBPackage.InvalidName, org.omg.CosNaming.NamingContextPackage.InvalidName, CannotProceed, NotFound { if ( ( corbaName == null ) || ( corbaName.trim().length() == 0 ) ) throw new IllegalArgumentException( "Registration name cannot be null or blank." );
44
Fejlett Programozási Technológiák 2. 44 SystemClockImpl.java/2 ORB orb = ORB.init( params, null ); orb.connect( this ); org.omg.CORBA.Object corbaObject = orb.resolve_initial_references( "NameService" ); NamingContext naming = NamingContextHelper.narrow( corbaObject ); NameComponent namingComponent = new NameComponent( corbaName, "" ); NameComponent path[] = { namingComponent }; naming.rebind( path, this ); } public static void main( String[] args ) throws Exception { SystemClock timeServer = new SystemClockImpl( args ); java.lang.Object object = new java.lang.Object(); synchronized( object ) { object.wait(); }
45
Fejlett Programozási Technológiák 2. 45 SystemClockClient.java import org.omg.CORBA.ORB; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; public class SystemClockClient implements Runnable { private SystemClock timeServer; … private void connectToTimeServer( String params[] ) throws org.omg.CORBA.ORBPackage.InvalidName,org.omg.CosNaming.NamingContext Package.InvalidName,NotFound, CannotProceed { ORB orb = ORB.init( params, null ); org.omg.CORBA.Object corbaObject = orb.resolve_initial_references( "NameService" ); NamingContext naming = NamingContextHelper.narrow( corbaObject ); NameComponent nameComponent = new NameComponent( "TimeServer", "" ); NameComponent path[] = { nameComponent }; corbaObject = naming.resolve( path ); timeServer = SystemClockHelper.narrow( corbaObject ); } …
46
Fejlett Programozási Technológiák 2. 46 Futtatás idlj tnameserv –ORBinitialPort 1050 java SystemClockImpl –ORBinitialPort 1050 java SystemClockClient –ORBinitialPort 1050 Az alapértelmezett port a 900-as lenne
47
Fejlett Programozási Technológiák 2. 47 Minta IDL module maptest { struct StructMap { boolean boolValue; char charValue; short shortValue; unsigned short uShortValue; long longValue; unsigned long uLongValue; long long longLongValue; unsigned long long uLongLongValue; float floatValue; double doubleValue;}; interface interfaceName { attribute long anAttribute; readonly attribute long roAttribute; const long constantValue = 42; oneway void seqMethod( in StructMapSeq seq ); void boundSeqMethod( in BoundStructMapSeq seq ); void arrayMethod( in IntArray array ); void intOutMethod( inout long intValue ); };
48
Fejlett Programozási Technológiák 2. 48 Összefoglaló IDL IIOP IOR tnameserv
49
Fejlett Programozási Technológiák 2. 49 A következő előadás tartalma EJB
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.