Weblogic Workshop als integrierte Entwicklungsumgebung mit Java

Die BEA-Bank

Torsten Langner und Daniel Reiberg

Nachdem in Ausgabe 12.03 der Direktbank-Implementierungs-Vergleich zwischen Microsoft Visual Studio und der mit diversen Open Source Plug-ins ausgerüsteten Eclipse IDE die Vorzüge schneller und einfacher Entwicklung mit einer integrierten Entwicklungsumgebung deutlich gezeigt hat, fällt nun das Augenmerk auf einen Vertreter der integrierten Entwicklungsumgebungen aus der Java-Fraktion.

Anpassung der Datenbankkonfiguration:

Da sich die MySQL-Datenbank bei einfachen Datenstrukturen als durchaus performant erwiesen hat, soll sie auch bei der Weblogic Workshop-Implementierung des Direktbank-Beispiels zum Einsatz kommen. Leider ist in der Standardkonfiguration des Weblogic Servers die MySQL-Datenbankanbindung nicht vorhanden, sodass einige Anpassungen notwendig sind. Zunächst muss in dem Verzeichnis BEA_HOME%WebLogic 81serverextjdbc der Ordner mysql angelegt und anschließend der JDBC-Treiber von MySQL in den Ordner kopiert werden. Danach ist der Pfad zum JDBC-Treiber (;%WL_HOME%serverextjdbcmysqlmm.mysql-2.0.4-bin.jar) im Weblogic Classpath in der Datei %BEA_HOME%WebLogic 81commonbincommEnv.cmd anzugeben (Listing 1).

Listing 1

Modifikation des Weblogic Sever Classpath in der Datei commEnv.cmd

@rem set up WebLogic  Server's class path
set WEBLOGIC _CLASSPATH=%JAVA_HOME%libtools.jar;%WL_HOME%serverlibwe blogic_sp.jar;%WL_HOME%serverlibWebLogic .jar;%WL_HOME%serverextjdbcmysqlmm.mysql-2.0.4-bin.jar

Die Architektur des Weblogic-Direktbank-Beispiels ist größtenteils identisch mit der Architektur der Open Source Applikation [2], jedoch sind einige Detailverbesserungen zu erkennen. So werden bei dieser Implementierung Enterprise JavaBeans für Datenanbindung und Businesslogik verwendet, was eine höhere Skalierbarkeit zur Folge hat. Außerdem ist der Web-Gateway nach dem MVC 2 Pattern gestaltet, wodurch eine bessere Trennung zwischen Businesslogik und Design erreicht wird. In Abpictureung 1 ist die für Web-Applikationen typische 4-Schichten-Architektur dargestellt. Jedoch ist auf der zweiten Ebene zusätzlich zu dem normalen Web-Gateway für einen Browser-Client, ein Web Service-Gateway angesiedelt, wodurch andere Applikationen auf die Direktbank-Implementierung zugreifen können. Auf der dritten Ebene befinden sich Businesslogik und Entitäten der Applikation, die mittels Session bzw. Entity Beans mit Container Managed Persistence implementiert sind. Auf der vierten Ebene läuft die MySQL-Datenbank, die über JDBC mit dem Weblogic Server kommuniziert.

Abb. 1: Die Applikationsarchitektur

Nachdem die Architektur festgelegt ist, geht es nun mit der Implementierung der Entitäten und der Geschäftslogik weiter. Die Entity Beans können direkt aus der Datenbank generiert werden. Dazu muss man jedoch erst den Weblogic Server starten und anschließend den DataSource Viewer aufrufen, um einen neuen Connection Pool und eine neue DataSource für die MySQL-Direktbank-Datenbank anzulegen, wie in Abpictureung 2 zu sehen ist. Auch muss der Connection Pool der cgDataSource, der Datenbank zur Verwaltung des Serverstatus, auf den neu angelegten Pool verweisen, da der Weblogic Server keine zwei DataSources aus verschiedenen Pools innerhalb einer Transaktion verwenden kann. Danach wird ein neues EJB-Projekt angelegt, in dem dann die EJBs aus den Tabellen generiert werden können. Leider kann man nicht direkt für die gesamte Datenbank alle Entity Beans auf einmal generieren, sondern muss dies für jede einzelne Tabelle bzw. Entity Bean separat durchführen. Gerade bei komplexen Datenbanken hätte man sich hier eine Option für Mehrfach-Selection gewünscht. Auch wurden die Relationen nicht direkt mit generiert, sondern mussten nachträglich, mit einem Wizard, der in Abpictureung 3 zu sehen ist, manuell eingefügt werden. Dies kann jedoch auch daran liegen, dass die verwendete Version des MySQL-JDBC-Treibers nicht gerade die Neuste ist. Bevor die Relation KundeAuftrag erstellt wird, muss noch der Datentyp des CMP-Feldes Kundennummer im Auftrag-Bean von long nach Long geändert werden, da kein CMP-Feld, das gleichzeitig CMR-Feld ist, einen primitiven Datentyp haben darf. Der in Abpictureung 4 dargestellte EJB Designer macht aber insgesamt einen sehr smarten Eindruck, wobei ein Designer wie der des JBuilder X, der alle Entitäten und deren Beziehungen untereinander darstellt und darüber hinaus eine stärkere Übereinstimmung mit UML-Klassendiagrammen oder Datenbankdesignern aufweist, sicherlich übersichtlicher ist.

Abb. 4: Der EJB Designer

Nachdem alle Entity Beans generiert und alle Relationen eingefügt sind, muss nur noch der Finder findByUsernameAndPassword in das KundeBean, findByWkn in das KursBean und findByKundennummer in das AuftragBean eingefügt werden. Wenn man in die SourceView wechselt (Abb. 5), kann man erkennen, dass die Finder als EJBGen-Tag eingefügt sind, XDoclet lässt grüßen!

Abb. 5: Der Source View

Anschließend beginnt die Implementierung der Businesslogik. Genau wie bei der Open Source-Implementierung werden hier die Geschäftsvorfälle Anmelden, Kursanzeige, Auftragsanzeige und Auftragsaufgabe behandelt. Dazu wird lehrbuchgerecht, damit die Businesslogik nicht in WebGateway oder WebServiceGateway implementiert wird, zunächst eine neue zustandsbehaftete SessionBean namens KundenServiceBean erzeugt, in der zunächst alle notwendigen ejb-refs angegeben werden. Anschließend werden die notwendigen Business-Methoden login() addOrder(), getOrders() und getKurse() geschrieben. Wie in Listing 2 zu sehen, ist die Implementierung der Businesslogik ein Kinderspiel, da bei getKurse und getOrders jeweils nur ein Finder aus der jeweiligen Entity Bean aufgerufen wird und bei addOrder auch nur eine Bean-Instanz erzeugt wird und alle CMP-Felder gesetzt werden.

Listing 2

KundenServiceBean

public class KundenService extends GenericSessionBean implements SessionBean
{
private Kunde kunde;
private Context ctx;
/**
* @ejbgen:remote-method
*/
public void ejbCreate(String username, String password) throws CreateException {
ctx = getInitialContext();
try{
Object home = (KundeHome) ctx.lookup("java:comp/env/ejb/KundeHome");
KundeHome kundeHome = (KundeHome) PortableRemoteObject.narrow(home, KundeHome.class);
kunde = kundeHome.findByUsernameAndPassword(username, password);
}catch(Exception ex){
throw new CreateException(ex.toString());
}
}

/**
* @ejbgen:remote-method
*/
public void addOrder(String wkn, String kuerzel, double anzahl, double limit, long zusatz, String status)
{
try{
Object home = (AuftragHome) ctx.lookup("java:comp/env/ejb/AuftragHome");
AuftragHome auftragHome = (AuftragHome) PortableRemoteObject.narrow(home, AuftragHome.class);
Auftrag auftrag = auftragHome.create();

auftrag.setAnzahl(anzahl);
auftrag.setGrenze(limit);
auftrag.setKuerzel(kuerzel);
auftrag.setKundennummer(kunde.getKundennummer());
auftrag.setWkn(wkn);
auftrag.setZusatz(zusatz);
auftrag.setZustand(status);
} catch(Exception ex){
}
}

/**
* @ejbgen:remote-method
*/
public Collection getOrders(long kundennr)
{
Collection orders = new ArrayList();
try{
Object ref = (AuftragHome) ctx.lookup("java:comp/env/ejb/AuftragHome");
AuftragHome auftragHome = (AuftragHome) PortableRemoteObject.narrow(ref, AuftragHome.class);
orders = auftragHome.findByKundennummer(kundennr);
}catch(Exception ex){
}
return orders;
}

/**
* @ejbgen:remote-method
*/
public Collection getKurse(String wkn)
{
Collection kurse = new ArrayList();
try{
Object ref = (KursHome) ctx.lookup("java:comp/env/ejb/KursHome");
KursHome kursHome = (KursHome) PortableRemoteObject.narrow(ref, KursHome.class);
kurse = kursHome.findKurseByWkn(wkn);
}catch(Exception ex){
ex.printStackTrace();
}
return kurse;
}
}

Nachdem nun die Datenanbindung und die Businesslogik implementiert sind, geht es an die Realisierung des Web-Gateways. Das Web-Modul des Weblogic Workshops basiert auf einer modifizierten Version des Struts-Frameworks. Es gibt also Actions, die auf die Businesslogik zugreifen (Controller), FormBeans, in denen die Daten gehalten werden (Model) und JSPs (View). Der geübte Struts-Entwickler wird sich also sofort zurechtfinden. Aber auch der weniger Struts-versierte Webentwickler wird sich durch die grafische Unterstützung schnell einarbeiten können. Allerdings bekommt man hier durch den so genannten Flow View, der auf Abpictureung 6 zu sehen ist, im Gegensatz zum EJB-Designer eine wirklich übersichtliche Visualisierung geboten.

Abb. 7: Der Action View

Darüber hinaus bekommt man auch noch Designfehler oder Verbesserungen sofort angezeigt, sodass man, wenn man Fehler machen sollte, diese sofort offenkundig sind und daraufhin verbessert werden können. Aber auch die Action View (Abb. 7), die einen detaillierteren Ablauf der Actions darstellt, ist wirklich gelungen. Neben der guten Darstellung helfen einem auch die zahlreichen Wizards, schnell zu entwickeln. So kann zum Beispiel zu einer erstellten Action mit definiertem FormBean die notwendige Input-Jsp automatisch generiert werden.

Nach so viel Lob nun aber zur Sache! Nachdem der Pageflow mit seinen Actions, FormBeans und Jsps defniert ist, muss nun der Weblayer mit der Businesslogik verknüpft werden. Dazu verwendet man bei BEA Java Controls. Als Nächstes muss also, wie in Abpictureung 8 dargestellt, die Businesslogik in Form des KundenServiceEJB als EJB Control in der Data Palette hinzugefügt werden. Damit man einfach mit dem Browse local EJBs…-Button das KundenServiceEJB ausgewählt werden kann, muss der Weblogic Server laufen! Anschließend kann man von den Actions auf die jeweilige Business-Methode zugreifen.

Abb. 8: Add EJB Control

Die Realisierung des Web Service-Gateways gestaltet sich noch einfacher als die des Web-Gateways. Genauso wie beim Web-Gateway wird auch hier die Entwicklung grafisch unterstützt. Die Web Service-Design View erinnert dabei stark an die Action View des WebModuls, wie in Abpictureung 9 zu sehen ist. Aber auch die Vorgehensweise gleicht der bei der Web-Gateway-Implementierung. So muss auch hier, nachdem ein neuer Web Service innerhalb des WebModuls angelegt ist, das KundenServiceEJB als EJBControl registriert werden, damit man Zugriff auf die Business-Methoden hat. Wer es sich einfach machen möchte, kann aber direkt durch Mausklick auf das im WebGateway erzeugte KundenService-EJBControl einen Test-Web-Service erstellen und diesen weiterbearbeiten. Nachdem nun die Business-Methoden innerhalb des Web Services zur Verfügung stehen, müssen nur noch die Methoden login, addOrder, getOrders und getKurse implementiert werden, wobei die Implementierung quasi nur aus einer Weiterleitung der Aufrufe an das KundenServiceBean besteht. Allerdings müssen noch die Rückgabewerte der Methoden getKurse und getOrders bearbeitet werden, da diese eine Collection von KursBeans bzw. AuftragBeans zurückgeben, die vom Web Service nicht einfach als XML ausgegeben werden können.

Abb. 9: We Service Design View

Die gerade für Puristen unter den Entwicklern etwas gewöhnungsbedürftige grafische Darstellung der einzelnen Entwicklungsabschnitte hilft sicherlich dem weniger versierten Entwickler, sich schnell zurechtzufinden. Auch die sehr gute Hilfe beantwortet einem, sofern man den Pfad zum Browser richtig eingestellt hat, gezielt offene Fragen. Um sich in bestimmte Technologien einzuarbeiten, hält diese zusätzlich Tutorials bereit, die ebenfalls sehr gut gestaltet wurden. Neben der Gestaltung der Entwicklungsumgebung, die mit ihren grafischen Elementen und Wizards schon sehr an Microsofts Visual Studio erinnern, erleichtert die enge Anbindungs-Entwicklungsumgebung an den Weblogic Server das Entwickeln ungemein. Bis auf die unkomplizierte Einbindung der Datenbank waren keine zeitraubenden Konfigurationsarbeiten mehr notwendig. Insgesamt kann man sagen, dass Weblogic Workshop und Server ein abgerundetes Paket darstellt, mit dem es sich schnell und komfortabel entwickeln lässt.

Auch architektonisch ist eine solche mit dem BEA Weblogic Workshop realisierte Applikation vom Feinsten, da Datenbankanbindung und Businesslogik mit einem mittlerweile ausgereiften Komponentenmodell (EJB) erstellt werden und der Web-Gateway nach dem MVC 2-Pattern aufgebaut ist.

Links und Literatur

Geschrieben von
Torsten Langner und Daniel Reiberg
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.