2016W CT07 EJB

Werbung
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
Herunterladen