Komponententechnologien Winter2016 Komponenten EnterpriseJavaBeans Übersicht • JavaBasics – RTTIundReflection – Annotations – Beans • EJBs (c)PeterSturm,UniTrier 1 Komponententechnologien Winter2016 RTTIUNDREFLECTION ReflektiveProgrammierung • Run-TimeTypeInformation – ZurÜbersetzungszeit • ReflectionAPI – ZurLaufzeit (c)PeterSturm,UniTrier 2 Komponententechnologien Winter2016 Beispiel • GenerierungeinerXML-Beschreibungfüreinebestimmte Java-Klasse • ZentraleAnlaufstelleistdieKlasseClass – getDeclaredConstructors • liefertArrayallerdefiniertenKonstruktoren– unabhängigvonder Sichtbarkeit – getConstructors • liefertArraydersichtbarenKonstruktoren – getDeclaredFields undgetFields – getDeclaredMethods undgetMethods – ... • ZugriffaufALLEsprach-relevantenEigenschafteneinesTyps möglich package syssoft.reflection; import java.io.*; import java.lang.reflect.*; ClassTalkAbout public class TalkAbout { private Class c; public TalkAbout ( Class candidate ) { c = candidate; } public void print ( PrintStream out ) { out.println("<?xml version=\"1.0\" encoding=\"UTF-8\">"); out.println("<class name=\"" + c.getCanonicalName() + "\">"); printConstructors(c.getDeclaredConstructors(),out); printDeclaredFields(c.getDeclaredFields(),out); out.println("</class>"); } private void printConstructors ( Constructor ctors[], PrintStream out ) { for (Constructor ctor : ctors ) { out.println("\t<constructor name=\"" + ctor.getName() + "\" modifiers=\"" + Modifier.toString(ctor.getModifiers()) + "\" >"); printArgumentTypes(ctor.getParameterTypes(),out); out.println("\t</constructor>"); } } private void printDeclaredFields ( Field fields[], PrintStream out ) { for (Field field : fields ) { out.println("\t<field name=\"" + field.getName() + "\" type=\"" + field.getType().toString() + "\" modifiers=\"" + Modifier.toString(field.getModifiers()) + "\" />"); } } private void printArgumentTypes ( Class argts[], PrintStream out ) { for (Class arg : argts) { out.println("\t\t<type name=\"" + arg.getName() + "\" />"); } } (c)PeterSturm,UniTrier 3 Komponententechnologien Winter2016 UntersuchteKlasse package syssoft.reflection; public class Candidate { public Candidate ( int x) { this.x = x; } public Candidate () { Reset(); } private int x; public int get_x () { return x; } public void f ( int y, double d ) { if (d < 0) x = y; else x = -y; } } protected void Reset () { x = 42; } Ergibt: <?xml version="1.0" encoding="UTF-8"> <class name="syssoft.reflection.Candidate"> <constructor name="syssoft.reflection.Candidate" modifiers="public" > <type name="int" /> </constructor> <constructor name="syssoft.reflection.Candidate" modifiers="public" > </constructor> <field name="x" type="int" modifiers="private" /> </class> (c)PeterSturm,UniTrier 4 Komponententechnologien Winter2016 ANNOTATIONS Ziele • AnreicherungdesProgrammcodes • AnwendungsspezifischeErweiterbarkeit • ÜberprüfbarkeitdurchCompiler • AuswertungderAnnotationen – VerarbeitungderQuellen – Übersetzung – Laufzeit • ScopeeinerAnnotation – AufwelcheElementeeinesTypsbeziehtsichdieAnnotation? • Klasse,Interface,Methode,... • VergleichbarAttributenin.NET (c)PeterSturm,UniTrier 5 Komponententechnologien Winter2016 Scope • ElementType Retention • ReichweitederAnnotation (c)PeterSturm,UniTrier 6 Komponententechnologien Winter2016 Beispiel • AusgangspunktTalkAbout(BeispielReflection) – MethodenkönnenüberAnnotationumKommentareerweitertwerden, dieanentsprechenderStelleingeneriertenXML-Beschreibungerscheinen sollen • DefinitionderAnnotationComment packagesyssoft.annotation; importjava.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public@interfaceComment{ Stringvalue()default""; } VerwendunginTalkAbout • ZugangebenfallsüberKlasseClass – getAnnotation odergetAnnotations privatevoidprintDeclaredMethods(Methodms[],PrintStreamout){ for(Methodm:ms){ out.println("\t<methodname=\""+m.getName()+ "\"modifiers=\""+Modifier.toString(m.getModifiers())+ "\"return_type=\""+m.getReturnType().getName()+ "\">"); printArgumentTypes(m.getParameterTypes(),out); Commentc=m.getAnnotation(Comment.class); if(c!=null){ out.println("\t\t<comment>"); out.println("\t\t\t"+c.value()); out.println("\t\t</comment>"); } out.println("\t</method>"); } } (c)PeterSturm,UniTrier 7 Komponententechnologien Winter2016 VerwendungderAnnotation package syssoft.reflection; public class Candidate { public Candidate ( int x) { this.x = x; } public Candidate () { Reset(); } private int x; @Comment("Hier kann man x lesen") public int get_x () { return x; } public void f ( int y, double d ) { if (d < 0) x = y; else x = -y; } } protected void Reset () { x = 42; } UnddasErgebnis ?xml version="1.0" encoding="UTF-8" ?> <class name="syssoft.annotation.Candidate"> <constructor name="syssoft.annotation.Candidate" modifiers="public" > <type name="int" /> </constructor> <constructor name="syssoft.annotation.Candidate" modifiers="public" > </constructor> <field name="x" type="int" modifiers="private" /> <method name="get_x" modifiers="public" return_type="int"> <comment> Hier kann man x lesen </comment> </method> <method name="f" modifiers="public" return_type="void"> <type name="int" /> <type name="double" /> </method> <method name="Reset" modifiers="protected" return_type="void"> </method> </class> (c)PeterSturm,UniTrier 8 Komponententechnologien Winter2016 JAVABEANS JavaBeans • KomponentenbasierteProgrammierunginJava • JavaBeanswerdeninderJVMderAnwendungausgeführt • JavaBeanssindKomponenten,die – – – – überZugriffsklassenverfügen bestimmteNamenskonventionenbeidenMethodeneinhalten überDialogboxenkonfigurierbarsind neuenProgrammiermethoden(VisualProgramming)zugänglichsind • Vergleichbarmit – ControlsinOLE,COM,ActiveX(inproc) – KonfiguiermöglichkeiteninVisualStudio (c)PeterSturm,UniTrier 9 Komponententechnologien Winter2016 DieBeanBox • PrototypeinerIDEmitvisuellen Programmiereigenschaften • 4Fenster – BeanBox:AktuelleAnwendung – ToolBox:Auflistungaller verfügbarenBeans – PropertiesBox:Eigenschaftender aktuellenBeanlesenundkonfigurieren – MessageTracer Beispiel:JugglerBean(1) • JugglerBeanausToolboxauswählenundplazieren (c)PeterSturm,UniTrier 10 Komponententechnologien Winter2016 JugglerBean(2) • 2ExplicitButtonmit„Start“und„Stop“hinzufügen JugglerBean(3) • „Stop“:Edit->Events->buttonpush->actionPerformed (c)PeterSturm,UniTrier 11 Komponententechnologien Winter2016 JugglerBean(4) • ...mit JugglerBean verknüpfen JugglerBean(5) • AutomatischgenerierterCode package tmp.sunw.beanbox; import sunw.demo.juggler.Juggler; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class ___Hookup_1653fe1423 implements java.awt.event.ActionListener, java.io.Serializable { public void setTarget(sunw.demo.juggler.Juggler t) { target = t; } { public void actionPerformed(java.awt.event.ActionEvent arg0) } target.stopJuggling(arg0); private sunw.demo.juggler.Juggler target; } (c)PeterSturm,UniTrier 12 Komponententechnologien Winter2016 BeanProperties • BeanBoxerkenntPropertiesüberNamender Zugriffsfunktionen • BeanPropertyX – VerwendungsogenannterDecapitalization: • aussetMeineProp bzw.getMeineProp wirdmeineProp • AngabederZugriffsfunktionen: – public X getX () • Ausnahme:public boolean isX () – public void setX ( X x ) • Nurleseeigenschaften:KeinesetX()-Methode Property-Arten • SimpleProperty – VariablespeicherteineneinfachenWert • IndexedProperty – SpeicherungeinesFeldes – Zugriffsfunktionen • X[] getX () • void setX ( X[] x) • X getX ( int i ) void setX ( int i, X x ) (c)PeterSturm,UniTrier 13 Komponententechnologien Winter2016 Property-Arten(contd.) • BoundProperty – ListenerwerdenüberÄnderungeninformiert – ZusätzlicherImplementierungsaufwand • BeanmußbeiÄnderungPropertyChange-Eventsenden • VerwaltungallerListener: – voidaddPropertyChangeListener(...) – voidremovePropertyChangeListener(...) • Convenience-KlassePropertyChangeSupportvorhanden • ConstraintProperty – BoundPropertymitVetorechtderListener Property-Editoren • BeanBoxstellt fürGrundtypen Editorenzur Verfügung • Editorenfür anwendungsspezifische Methoden integrierbar (c)PeterSturm,UniTrier 14 Komponententechnologien Winter2016 Alternativen • BeanBoxistveralteteaberschöneDemonstrationder wesentlichenBean-Eigenschaften – KleinereInkompatibilitätenmitneuerenJava-Versionen • NeuereFassung:BeanBuilder • PrimärerEinsatz:IntegrierteEntwicklungsumgebungen – – – – JBuilder NetBeans Eclipse … EJB (c)PeterSturm,UniTrier 15 Komponententechnologien Winter2016 Motivation • Bean=Komponente • Zielgruppe Datenbank – KommerzielleAnwendungen – E-Commerce • Evolutionfrüherer – Client/Server-Systeme – Transaktionsmonitore Business Logic • 3-Tier-Applikationen – Client – BussinessApplication – Database Clients BusinessObjects • Komponenten-basierteAnwendung Datenbank • Varianten – EigenständigeKomponenten – WrapperfürLegacySoftware – Client-Transaktionen Business Objects • Laufzeitumgebung – EJBServer Business Logic Clients (c)PeterSturm,UniTrier 16 Komponententechnologien Winter2016 AufbaudesEJB-Server • Laufzeitumgebung – Namensverwaltung – AnbindunganDB – Nachrichtenkommunikation Bean Bean • EJBObject=BeanWrapper Bean – Indirektionsstufe – ZugriffüberReflection • Beantypen – EntityBean X Bean EJB Object Bean EJB Object • Zustand,Persistent – SessionBean • Transient • Stateless,Stateful – Message-DrivenBeans EJB Server AufgabendesServers • ResourceManagement – InstancePooling:Beansvorinstanziiert – InstanceSwapping:WechselderEJB-Object-Bindung – Activation:StilllegenundReaktivierenvonBeans • PrimaryServices – – – – – – (c)PeterSturm,UniTrier Concurrency:Single-ThreadedBean-Implementierung Transactions:ACID-Prinzip Persistence:Container-Managed,Bean-Managed Distribution:RMIoverJRMPoderRMI-IIOP Naming:JNDIunterstütztLDAP,NIS+,DNS,... Security:MethodenbasierteZugriffskontrolle 17 Komponententechnologien Winter2016 EntityBeans • RepräsentierenzustandsbehafteteAnwendungsobjekte – „Canbeexpressedasnounsinthebusinessmodel“(Burke) • PersistenteSpeicherunginDatenbank – AbbildungüberAnnotationenausJavaPersistenceSpezifikation • EntityBean – istkeineKomponenteimEJB-Sinn • sondernein„POJO“(PlainoldJavaobject) – wirddurchKlassebeschrieben – bildetFieldsüberAnnotationenaufSpaltenineinerDB-Tabelleab • AlternativüberMap-File(XML) – besitzteinenPrimärschlüssel – wirdvonEntityManagerverwaltet BeispielNode package syssoft.ejb_graph; import javax.persistence.*; @Entity @Table(name="GRAPH_NODES") public class Node implements java.io.Serializable { private static final long serialVersionUID = 42; private int id; private String name; @Id @Column(name="ID") public int getId() { return id; } public void setId ( int id ) { this.id = id; } } (c)PeterSturm,UniTrier @Column(name="NAME") public String getName() { return name; } public void setName ( String name ) { this.name = name; } 18 Komponententechnologien Winter2016 BeispielEdge package syssoft.ejb_graph; import javax.persistence.*; @Entity @Table(name="GRAPH_EDGES") public class Edge implements java.io.Serializable { private static final long serialVersionUID = 1L; private int id; private int weight; private int l; private int r; @Id @Column(name="ID") @GeneratedValue public int getId() { return id; } public void setId ( int id ) { this.id = id; } @Column(name="WEIGHT") public int getWeight() { return weight; } public void setWeight ( int weight ) { this.weight = weight; } @Column(name="LEFT") public int getLeft() { return l; } public void setLeft ( int l ) { this.l = l; } @Column(name="RIGHT") public int getRight() { return r; } public void setRight ( int r ) { this.r = r; } } AbbildungaufDatenbank <?xml version="1.0" encoding="UTF-8"?> <persistence> <persistence-unit name="syssoft_graphs"> <jta-data-source>java:/DefaultDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto“ value="create-drop"/> </properties> </persistence-unit> </persistence> • DefaultDS=Standard-DBdesjeweiligenApplicationServers • hibernate.hbm2ddl.auto – AutomatischeAbbildungderEntityBeansaufDB-Tabellen • Create-drop – TabellenbeimDeployerzeugenundbeimRemovewiederlöschen (c)PeterSturm,UniTrier 19 Komponententechnologien Winter2016 StatelessSessionBean • Remote-InterfacedefiniertFunktionalität • Bean-KlasseimplementiertRemote-Interface • PersistenceContextrealisiertZugangzuEntityBeans InterfaceGraphRemote package syssoft.ejb_graph; import javax.ejb.*; @Remote public interface GraphRemote { public void createNode ( Node n ); public Node findNode ( int id ); } (c)PeterSturm,UniTrier public void connectNodes ( int left_node, int right_node, int weight ); 20 Komponententechnologien package syssoft.ejb_graph; Winter2016 StatelessSessionBeanGraph import javax.ejb.*; import javax.persistence.*; @Stateless public class Graph implements GraphRemote { @PersistenceContext(unitName="syssoft_graphs") private EntityManager em; public void createNode ( Node n ) { em.persist(n); } public Node findNode ( int id ) { return em.find(Node.class, id); } public void connectNodes ( int left, int right, int weight Edge e = new Edge(); e.setWeight(weight); e.setLeft(left); e.setRight(right); em.persist(e); } ) { StatefulSessionBeans • Speichern„conversationalstate“ – FesteBindungzujeweilseinemClient • SpeicherungrelevanterZustandsinformationüberJNDI-ENC (c)PeterSturm,UniTrier 21 Komponententechnologien Winter2016 MessageDrivenBeans • AsynchroneKommunikationüberNachrichten – ClienterwartetkeineAntwort – LebenszyklusderBeanunabhängigvonClient-Requests – ImplementiertkeinRemoteInterfacesondernonMessage(Message m( • UnterstützungfürverschiedeneMessagingSysteme – KonformitätzuJCA1.5(J2EEConnectorArchitecture) • Definiertu.a.auchJDBCStandards • JCAkannauchJavaCryptographyArchitectureJ MöglicheUmsetzung • ApplicationServer – – – – – JBoss,Version4.0.5 jems-InstallerfürEJB3.0 Standardinstallation WirdspäternochmalfürWebservicesverwendet;-) SeiJBOSS_HOMEdasgewählteInstallationsverzeichnis • StartenmitJBOSS_HOME/bin/run.sh • Webzugangüberhttp://localhost:8080 • VerwendungderDefault-DBHypersonicSQL (c)PeterSturm,UniTrier 22 Komponententechnologien Winter2016 Webzugang MBeanJNDIView (c)PeterSturm,UniTrier 23 Komponententechnologien Winter2016 Deployment • JAR-FileindenOrdnerDeploykopieren – JBossbeobachtetdasVerzeichniskontinuierlich – EinfügenheißtDeploy – LöschenheißtRemove META-INF/MANIFEST.MF syssoft/ syssoft/ejb_graph/ syssoft/ejb_graph/GraphRemote.class syssoft/ejb_graph/Edge.class syssoft/ejb_graph/Graph.class syssoft/ejb_graph/Node.class META-INF/ META-INF/persistence.xml ErfolgreichesDeployment (c)PeterSturm,UniTrier 24 Komponententechnologien Winter2016 package syssoft.graph_client; Client import syssoft.ejb_graph.*; import javax.naming.*; import javax.rmi.*; import java.util.*; public class Client { public static void main(String[] args) { try { Context jndiContext = getInitialContext(); Object ref = jndiContext.lookup("Graph/remote"); GraphRemote graph = (GraphRemote) PortableRemoteObject.narrow(ref, GraphRemote.class); Node n1 = new Node(); n1.setId(1); n1.setName("Knoten 1"); graph.createNode(n1); […] } } Node n = graph.findNode(2); System.out.println(n.getName() + " found"); } catch (NamingException ne) { System.out.println("Failed to create initial context"); ne.printStackTrace(); } public static Context getInitialContext () throws NamingException { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces);"); p.put(Context.PROVIDER_URL, "jnp://localhost:1099"); return new javax.naming.InitialContext(p); } (c)PeterSturm,UniTrier 25 Komponententechnologien Winter2016 Datenbankinhalt Video (c)PeterSturm,UniTrier 26 Komponententechnologien Winter2016 StandVideoprojekt(Mai2008) • DieBindungüberjta-data-sourcefunktioniertnochnicht • jndiBindinggehtebenfallsnochnichtwieerwartet AndereMeinungendazu • IchbinnichtalleinJ • Esisthäufigerzu hören,daßNetBeans dasbesserkann! (c)PeterSturm,UniTrier 27 Komponententechnologien Winter2016 Literatur • BruceEckel ThinkinginJava 4.Auflage,PrenticeHall • BillBurke,RichardMonson-Haefel EnterpriseJavaBeans3.0 5.Auflage,O‘Reilly (c)PeterSturm,UniTrier 28