Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Fejlett Programozási Technikák 2. 15/11. Fejlett Programozási Technológiák 2. 2 A mai előadás tartalma Probléma a Java Servlet-tel Template eszközök.

Hasonló előadás


Az előadások a következő témára: "1 Fejlett Programozási Technikák 2. 15/11. Fejlett Programozási Technológiák 2. 2 A mai előadás tartalma Probléma a Java Servlet-tel Template eszközök."— Előadás másolata:

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 The RMI tutorial 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 Megvalósítások Tomcat JBoss WebSphere iPlanet J2EE SDK …

11 Fejlett Programozási Technológiák 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 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 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 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 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 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 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", mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("telephonenumber", " ")); mods[2] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("jpegphoto"));

18 Fejlett Programozási Technológiák 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Ö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 CORBA OMG - Object Management Group 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 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 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 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 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 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 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 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 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 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 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 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 Összefoglaló IDL IIOP IOR tnameserv

49 Fejlett Programozási Technológiák A következő előadás tartalma EJB


Letölteni ppt "1 Fejlett Programozási Technikák 2. 15/11. Fejlett Programozási Technológiák 2. 2 A mai előadás tartalma Probléma a Java Servlet-tel Template eszközök."

Hasonló előadás


Google Hirdetések