> Inhalt: Einführung in das Programmieren mit Java > Inhalt: Einführung in das Programmieren von Enterprise Java Beans |
|
Letzte
Bearbeitung dieses Dokuments: |
Dieses Tutorial ist nur mehr sinnvoll, wenn Sie Kenntnisse für EJBs vor dem EJB3-Standard erwerben wollen. Mit
der Einführung des Standards EJB3 wird das Konfigurieren des
Deployment-Descriptors vereinfacht und die dafür notwendigen
XDoclet-Anweisungen innerhalb des Java-Codes sind nicht mehr
notwendig. Die Kenntnisse für das Entwickeln von EJBs vor dem EJB3-Standard sind nur dann sinnvoll wenn Sie älteren Code – mit den darin enthaltenen Xdoclet-Anweisungen zum Generieren des Deployment-Descriptors - für EJB adaptieren wollen. |
Voraussetzungen für das Verständnis dieses Dokuments:Grundkenntnisse in der Programmierung von Java (Klassen, Methoden, Schleifen) oder anderer Objekt-Orientierter Programmiersprachen (z.B. C++, Modula-2, Pascal). Kenntnisse im Umgang mit Eclipse; empfohlen ist das Durcharbeiten der Einführungsbeispiele für das Programmieren mit Java. |
Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:Arbeitszeit:
|
Dieses Dokument enthält die Anleitungen zum Codieren der Einfachen Session Bean.
Dabei wird ein kleiner Schritt zur Modularisierung gesetzt; es wird eine Interface mit den möglichen Länder-Codes 'abgespalten'. Diese Interface kann dann auch von Client-Programmen importiert werden.
Vorigerer Schritt: Einrichten des Projects
Vorbemerkung
und Funktion des Codes
Vorbedingungen
Statische_Werte
für den Input definieren
* Interface
CountryConstants
eröffnen
* Quell-Code
für CountryConstants
Session-Bean
codieren
* Class
ShowTimeDateBean
eröffnen
* Quell-Code
für ShowTimeDateBean
Weitere
Schritte und verwandte Dokumentation
Nächster Schritt: XDoclet-Anweisungen
Ein
Session-Bean ist ein Java Enterprise Bean ohne integrierte
Funktionalität für den Zugriff auf eine permanente
Speichermöglichkeit (z.B. Datenbank).
(Der Zugriff auf eine
Datenbank kann aber einfach in einem Session Bean codiert werden; das
wird in Tutorial:
Session-Bean mit Datenbank-Zugriff - Codieren
gezeigt.)
Innerhalb
einer 'Session' werden die Input-Daten verarbeitet und das Ergebnis
(Output) an das Programm, daß die Session-Bean aufgerufen hat,
zurückgeliefert. Dieses Konzept führt das schon seit
Jahrzehnten bewährte Konzept der Transaktions-Verarbeitung
weiter.
In
diesem Tutorial wird:
* Als Input der ISO-Länder-Code
für Deutschland (DE), Frankreich (FR) und USA (US)
akzeptiert.
* Im Session Bean das aktuelle Datum und die
aktuelle Uhrzeit ermittelt.
* Im Session Bean ein
länderspezifischer Text für Datum / Uhrzeit erstellt und
dieser Text als Ergebnis zurück geliefert.
Dieses
Beispiel wurde gewählt weil:
* Der Code für die
Funktionalität sehr kurz ist und damit für das Codieren
wenig Zeit verbraucht wird.
* Als Input nicht nur eine
Variable eines einfachen Typs verwendet wird,
sondern
diese aus einem 'Set' erlaubter Eingaben sein muß.
Damit
wird ist es erforderlich, die Werte des Sets in einem 'Interface' zu
definieren.
Dieses Interface wird dann vom EJB
und einem Client-Programm importiert
und damit
ist schon im Client-Programm eine Prüfung auf eine erlaubte
Eingabe möglich.
Schritt 1: Einrichten des Projects ausgeführt – und dessen Vorbedingungen auch.
Wie
schon unter
Vorbemerkung
und Funktion des Codes
erläutert,
sind die erlaubten Werte für den Input des EJB in einem 'Set'
definiert.
Dieses Set wird in einem Interface codiert.
Interface
CountryConstants
eröffnen
Um ein neues Interface zu eröffnen wird mit der rechten Maustaste das Project (Java_EJB_01) angeklickt und aus dem Kontext-Menu >New>Interface ausgewählt. |
|
Im darauf hin erscheinenden Fenster (New Java Interface) wird
Die anderen bereits vorgegebenen Werte werden nicht verändert. Durch Anklicken der Schaltfläche [ Finish ] wird die Datei für den Quell-Code der Interface angelegt. |
|
Quell-Code
für
CountryConstants
package
js_ejb01.staticvalues;
import
java.util.*;
/**
*
* @author kurt@javascout.biz
*
@date 2007-10-22
*
* @description
* Interface
mit den Werten für möglichen Input in das
EJB
* Java_EJB_01 (erstellt im Tutorial für
das Session Bean).
* Nähere Beschreibungen
sind bei den Datenstrukturen zu finden.
*
*
@change-log
* when who why
*
--------------------------------------------------------
*
*/public
interface
CountryConstants
{
/*
* Zwei-dimensionales
Array für die 'implementierten' Länder-Codes und
* den
erklärenden Text in der jeweiligen Landessprache. */
public
static final
String[][]
Country
=
{
{"US"
,
"Time/Date-representation
in US-style"
},
{"FR"
,
"Indication
de Temps et Date en Format francaise"
},
{"DE"
,
"Datums/Zeit-Anzeige
in deutschem Format"
},
};/*
* Array
für die 'Locale' der einzelnen Länder. Im Locale iat auch
* die Information, wie Datum/Zeit in einem Textstring
dargestellt wird. */
public
static final
Locale[]
Country_Locale
=
{
Locale.US
,
Locale.FRANCE
,
Locale.GERMANY
,
};}
Anschließend
wird der Code durch Anklicken des Save-Symbols (
/ Diskette links oben) gespeichert.
Eine
kurze Erklärung der einzelnen Teile des Codes:
import
java.util.*;
Damit
wird die Programm-Bibliothek importiert, die die Klasse für die
'Locale' enthält.
In 'Locale' ist definiert, in welcher Form
der Text für Zeit und Datum für ein Land dargestellt
werden.
public
static final
String[][]
Country
=
{
{"US"
,
"Time/Date-representation
in US-style"
},
{"FR"
,
"Indication
de Temps et Date en Format francaise"
},
{"DE"
,
"Datums/Zeit-Anzeige
in deutschem Format"
},
};
Zwei-dimensionales
Array mit den Länder-Codes (als Input beim Aufruf des EJB) und
den dazugehörigen, beschreibenden Texten.
public
static final
Locale[]
Country_Locale
=
{
Locale.US
,
Locale.FRANCE
,
Locale.GERMANY
,
};
Mit
dem Array für Länder-Codes und beschreibenden Texten
koordiniertes Array mit den 'Locale' für die jeweiligen
Länder.
Diese werden über die selbe Index-Zahl
angesprochen wie der Länder-Code im zwei-dimensionalen Array..
Wie
schon unter
Vorbemerkung
und Funktion des Codes
erläutert,
sind die erlaubten Werte für den Input des EJB in einem 'Set'
definiert.
Dieses Set wird in einem Interface codiert.
Class
ShowTimeDateBean
eröffnen
Um eine neues Java-Klasse zu eröffnen wird mit der rechten Maustaste das Project (Java_EJB_01) angeklickt und aus dem Kontext-Menu >New>Class ausgewählt. |
|
Im darauf hin erscheinenden Fenster (New Java Class) wird
Die anderen bereits vorgegebenen Werte werden nicht verändert. Durch Anklicken der Schaltfläche [ Finish ] wird die Datei für den Quell-Code der Klasse angelegt. |
|
Quell-Code
für
ShowTimeDateBean
Aus
der implementierten Interface () werden die Basis-Methoden (ohne
funktionalen Code) generiert.
Zur Unterscheidung zwischen zu
schreibendem und generiertem Code sind die generierten Methoden, die
nicht verändert wurden, und importierten Bibliotheken komplett
in schwarzer Schrift dargestellt.
Code, der zu schreiben ist,
wird in Fettschrift dargestellt.
package
js_ejb01.ejb.bean;
import
java.rmi.RemoteException;
import
javax.ejb.EJBException;
import
javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import
java.text.DateFormat;
import
java.util.*;
import
js_ejb01.staticvalues.*;
/**
*
* @author kurt@javascout.biz
*
@date 2007-10-23
*
* Anweisungen für
XDoclet
* @ejb.bean name =
"ShowTimeDate"
* jndi-name
= "ejb/js_ejb01/ShowTimeDate"
* view-type
= "remote"
* display-name
= "ShowTimeDate EJB"
* description
= "EJB (Session Bean) aus EJB-Tutorial 01"
*
*
@description
* Klasse für das Session-Bean
Java_EJB_01 (erstellt im Tutorial für das Session
Bean).
* Nähere Beschreibungen sind bei den
Methoden zu finden.
*
* @change-log
*
when who why
*
--------------------------------------------------------
*
*/public
class
ShowTimeDateBean
implements
SessionBean
{
/*
* Eindeutige
Identifikation der Klasse;
* Jahr (einstellig), Monat,
Tag, Stunde, Minute. */
static
final long
serialVersionUID
=
710221254;
/*
* Constructor-Methode;
wird aufgerufen wenn die Klasse erstellt wird. */
public
ShowTimeDateBean()
{
/*
* Kein
spezieller Code; nur jenen aus der geerbten Interface ausführen.
*/
super
();
};
public
void
ejbCreate()
throws
EJBException,
RemoteException {
//
TODO Auto-generated method stub
};
public
void
ejbActivate()
throws
EJBException,
RemoteException {
//
TODO Auto-generated method stub
};
public
void
ejbPassivate()
throws
EJBException,
RemoteException {
//
TODO Auto-generated method stub
};
public
void
ejbRemove()
throws
EJBException,
RemoteException {
//
TODO Auto-generated method stub
};
public
void
setSessionContext(SessionContext
arg0)
throws
EJBException,
RemoteException {
//
TODO Auto-generated method stub
};
/*
* Methode
zum Ermitteln von Zeit und Datum und Aufbereiten des
Text-Strings.
* (Hauptgeschäftszweck dieses EJB).
*/
/**
* Anweisungen für XDoclet.
* @param
parmCountryCode
* @return String[]
* 1.Teil
des Arrays: Länder-Code wie im parmCountryCode
übergeben.
* für
Kontrollzwekce (das ist ein Übungsbeispiel).
* 2.Teil
des Arrays: Text mit Erklärung und aktueller
Uhrzeit/Datum.
*
* @ejb.interface-method
view-type = "remote" */
public
String[]
getTimeDateString(String parmCountryCode) {
/* Array
für return erstellen. */
String[]
arrayReturnValue = new
String[2];
/* 1.
Teil des Array: übergebener Länder-Code.
*/
arrayReturnValue[0]
= parmCountryCode;/* 2.
Teil des Array: vorläufig
Fehler-Hinweis;
* wenn
übergebener Wert gültig ist: Text mit Datum Uhrzeit später.
*/
arrayReturnValue[1]
= "Unbekannter
Länder-Code"
;
/*
* Durchsuchen
des Arrays ob der Input-Parameter darin vorhanden ist. */
int
intIndex;
int
intCountryArraySize
= CountryConstants.
Country
.
length
;
for
(intIndex
= 0; intIndex < intCountryArraySize; intIndex++) {
/* Vergleichen
ob der Länder-Code aus dem Input-Parameter jenem in Array
entspricht. */
if
(parmCountryCode.trim().compareToIgnoreCase(
CountryConstants.Country
[intIndex][0].trim())
== 0) {
/* Passenden
Array-Eintrag gefunden;
* Zeit/Datum ermitteln, in
Länderspezifischen String bringen und zurückliefern.
*/
Date
now = new
Date();
/* Sprachspezifischen
String in den Länderspezifischen String übertragen.
*/
arrayReturnValue[1]
= CountryConstants.Country
[intIndex][1]
+
": "
;
/* Datum
in voller Länge entsprechend dem länderspezifischen Format
aufbereiten
* und zum Länderspezifischen String
hinzufügen. */
arrayReturnValue[1]
+= DateFormat.getTimeInstance(
DateFormat.FULL
,
CountryConstants.
Country_Locale
[intIndex]).format(now);
/* for-loop
beenden. */
break
;
}
}/*
* Gefülltes
Array zurückliefern. */
return
arrayReturnValue;
};}
Anschließend
wird der Code durch Anklicken des Save-Symbols (
/ Diskette links oben) gespeichert.
Eine
kurze Erklärung der einzelnen Teile des Codes die nicht
kommentiert sind:
import
java.rmi.RemoteException;
import
javax.ejb.EJBException;
import
javax.ejb.SessionBean;
import
javax.ejb.SessionContext;
Programm-Bibliotheken,
die durch die Interface SessionBean
implementiert
werden.
In diesen Paketen ist die Funktionalität für
das Session-Bean enthalten.
import
java.text.DateFormat;
import
java.util.*;
Programm-Bibliotheken
für das Ermitteln und Formattieren von Zeit/Datum.
import
js_ejb01.staticvalues.*;
Interface
mit den Arrays die Länder-Codes, beschreibenden Text und Locale
enthalten.
* Anweisungen
für XDoclet
* @ejb.bean name =
"ShowTimeDate"
* jndi-name
= "ejb/js_ejb01/ShowTimeDate"
* view-type
= "remote"
* display-name
= "ShowTimeDate EJB"
* description
= "EJB (Session Bean) aus EJB-Tutorial 01"Anweisungen
für das Eclipse-Plugin XDoclet.
Mit XDoclet werden weitere
Klassen und XML-Dateien mit Beschreibungen des EJB für den Java
Application Server (JAS) generiert.
Die Parameter für die
Generierung werden im Schritt XDoclet-Anweisungen vorgestellt.
Hier
eine kurze Beschreibung der Auswirkungen.
* name
= "ShowTimeDate"
ist
der Name, unter dem das EJB von Client-Programmen verwendet werden
kann.
* jndi-name
= "ejb/js_ejb01/ShowTimeDate"
ist
der Name der Java-Klasse (inklusive der Verzeichnis-Struktur
entsprechend dem Java-Package), unter dem das EJB innerhalb der
JAR-Datei, die an den JAS übergeben wird, 'gepackt'
ist.
* view-type
= "remote"
ist
die Anweisung an den JAS, daß dieses EJB von Client-Programmen
außerhalb des JAS aufgerufen werden kann.
* display-name
= "ShowTimeDate EJB"
und
description
= "EJB (Session Bean) aus EJB-Tutorial 01"
sind
Beschreibungen des EJB ohne weitere Auswirkungen auf andere
Programmteile.
/*
* Constructor-Methode;
wird aufgerufen wenn die Klasse erstellt wird. */
public
ShowTimeDateBean()
{
/*
* Kein
spezieller Code; nur jenen aus der geerbten Interface ausführen.
*/
super
();
};In
der Constructor-Methode wird durch den Aufruf von
super
();
jener
Code aufgerufen, der in Consturctor der geerbten Interface
SessionBean
vorhanden
ist
.
/**
* Anweisungen
für XDoclet.
* @param parmCountryCode
* @return
String[]
* 1.Teil des Arrays: Länder-Code
wie im parmCountryCode übergeben.
* für
Kontrollzwekce (das ist ein Übungsbeispiel).
* 2.Teil
des Arrays: Text mit Erklärung und aktueller
Uhrzeit/Datum.
*
* @ejb.interface-method
view-type = "remote" */Jene
Methode, die die 'Geschäfts-Logik' enthält muß von
Methoden, die auf dem Client (Fat-Client oder Web-Server) laufen,
aufrufbar sein.
Diese 'Erlaubnis' wird durch
@ejb.interface-method
view-type = "remote"
festgelegt.
Wenn
diese XDoclet-Anweisung fehlt, ist die Methode nur von anderen
Methoden, die innerhalb des Java Application Server laufen,
aufrufbar.
Dokument |
Inhalt |
Tutorial: Einfache Session Bean (Java_EJB_01) – XDoclet-Anweisungen |
Im nächsten Schritt des Tutorial werden die Parameter für das Generieren von weiteren Klassen und XML-Dateien mit Beschreibungen des EJB für den Java Application Server vorgestellt. |