ࡱ > bjbjUqUq .@ 7 7 S l L L L 8 , 4 $ T ? [ $ :" ` k @ k k A A A A k A k A N A @ p*1l 8 L k 0 $ " k " A
Umgebungsvariablen ( Environment variables )
Enterprise-Anwendungen mssen oft mit Daten arbeiten, die nicht von aussen direkt vernderbar sein sollen. Dabei muss es sich nicht unbedingt um Konstanten handeln, sondern es kann sich auch um Variablenwerte handeln, die nur kontrolliert und innerhalb des Containers verndert werden drfen.
So wrde in einem realittsnheren Anwendungsbeispiel beispielsweise ein Kredit-Zinsatz nicht vom Kunden festgelegt, sondern von der Bank, also innerhalb der Session-Bean selbst. Zins-Konditionen knnten u.U. individuell gestaltet werden. Das bedeutet, dass eine Session-Bean mit einem objekteigenen Attributwert (Zinssatz) arbeitet, der vernderbar sein msste. Dazu knnte bspw. in der Sessionbean-Klasse ein Objektfeld vom Typ double angelegt werden, das mit einem bestimmten Anfangswert initialisiert wird. Spezielle Zugriffsmethoden ermglichen die Vernderung des Attributwerts.
Diese Vorgehensweise hat allerdings gravierende Nachteile. Jede Session-Bean verwaltet ihre Attributwerte selbst. Bei stateless Session-Beans, die unter Umstnden von mehreren Clients zugleich benutzt werden, ist nicht klar definiert, welchen Zustand ein solcher Attributwert zu einem bestimmten Zeitpunkt hat. Schliesslich kann es viele unterschiedliche Instanzen von Session-Beans im Container geben. Auch bei stateful Session-Beans wre der aktuelle Zustand von Attributwerten nicht sicher und eindeutig festgelegt. Ausserdem ist der Sourcecode in der Session-Bean festgelegt und bei jeder Vernderung muss zumindest ein Teil der J2EE-Anwendung neu kompiliert und die gesamte Anwendung deployt werden. Es ist daher schwer, die Kontrolle zu behalten, da der Quellcode nicht an einer einzigen Stelle gewartet werden kann, sondern u.U. an verschiedenen Stellen gendert werden muss.
Umgebungsvariablen (Environment variables) sind die Lsung der angesprochenen Probleme mit Attributen von Session-Beans. Umgebungsvariablen sind Bestandteil des JNDI Umgebungsnamenskontext (JNDI ENC: Environment Naming Context), eines speziellen Namensraums im J2EE-Applikationsserver, der selbst definierte Variablen verwaltet. Umgebungsvariablen sind vergleichbar mit globalen C-Konstanten bzw. static Java-Konstanten. Wenn sie einen Wert besitzen, dann ist dieser fr alle Beans gltig. Der konkrete Inhalt einer Umgebungsvariablen muss im Verlauf des Deployments festgelegt werden und kann zur Laufzeit des Programms nicht gendert werden. Die Festlegung erfolgt im XML-Descriptor unter dem Eintrag
zinssatz
Double
4.0
Im Deploytool wird eine Umgebungsvariable beim Eintrag Env. Entries festgelegt (siehe Abbildung). Es gibt keinen Java-Sourcecode, der Umgebungsvariablen definiert.
Der Namensraum fr Umgebungsvariablen hat den reservierten Prfix "java:comp/env/". Eine existierende Umgebungsvariable wird von EJBs angesprochen, indem zuerst ein InitialContext erzeugt wird, der den Bezug zum Applikationsserver herstellt:
import javax.naming.*;
. . .
InitialContext ic = new InitialContext( );
Dann wird die Verbindung zum Container dazu benutzt, um per lookup eine Referenz auf die Variable zu erhalten. Hierbei muss natrlich der Name benutzt werden, der im Deployment-Descriptor zur Definition verwendet worden ist.
Object o = lookup("java:comp/env/zinssatz")
Die Referenz ist immer vom Java-Typ Object und muss deshalb explizit in den richtigen Objekttyp gecastet werden, bevor sie verwendet werden kann. Dies kann auch in einer Zeile mit lookup erfolgen.
Double d = (Double) o;
Da ihr Wert zur Laufzeit nicht vernderbar ist, werden Umgebungsvariablen oft zur Abfrage von feststehenden Informationen (z.B. Datenbankname, Passwrter usw.) eingesetzt. Indirekte Nutzung: Umgebungsvariablen sind geeignet, Session-Beans einen eindeutigen Startwert vorzugeben. Damit ist es mglich Attributwerte von Sessionbeans auf einen eindeutigen gemeinsamen Anfangswert zu setzen. Im weiteren Verlauf der Anwendung knnen diese Attributwerte auf beliebige angemessene Art und Weise verndert werden. Allerdings ist auch hierbei die Identitt und Integritt von Session-Beans-Instanzen zu beachten.
Der grsste Vorteil von Umgebungsvariablen ist, dass sie leicht kontrolliert werden knnen, da sie an einer Stelle (ausserhalb des Java-Codes) festgelegt werden. Bei nderungen muss nicht die gesamte J2EE-Anwendung neu kompiliert werden, sondern es wird nur der entsprechende Eintrag im Deployment-Descriptor gendert bzw. im Deploytool gesetzt und die Anwendung neu deployt.
HYPERLINK "http://skripta.de/java5/Examples/BankApp2_ENV.zip"Download: BankApp2_ENV.zip
//////////////////////////////////////////////////////
//
// BankBean.java:
public class BankBean implements javax.ejb.SessionBean {
Double zins; // Attribut
// Aktueller Zinssatz wird unten (in ejbCreate()) aus der
// Umgebungsvariable java:comp/env/zinssatz ausgelesen
....
public void ejbCreate() {
try {
InitialContext ic = new InitialContext();
zins = (Double) ic.lookup("java:comp/env/zinssatz");
} catch (Exception e) {
System.out.println(
"Error in Session-Bean.ejbCreate()");
}
System.out.println("ejbCreate called...");
}
/////////////////////////////////////////////////////
// gibt den aktuellen Zinssatz zurck
public Double getRate() {
return zins;
}
Grundlagen der Informatik, FB Informatik, FH Heidelberg, Dr. Peter Misch - J2EE
zinssatz
Double zins=(Double) lookup(
"java:comp/env/zinssatz");
J2EE-Bean-Container
JNDI ENC
(Namensraum fr Umgebungsvariablen)
"java:comp / env /"
1. BankClient gestartet...
2. Suche ...
3. InitialContext erstellt...
4. lookup...
Der Kredit-Zinssatz betraegt z.Z.: 4.0 %
Beanmethode berechneAmortisation (3000,13) aufgerufen:
Monat Abzahlung Zinsbetrag Rest
01 330,77 150,00 2819,23
02 330,77 140,96 2629,42
03 330,77 131,47 2430,12
04 330,77 121,51 2220,86
05 330,77 111,04 2001,14
06 330,77 100,06 1770,42
07 330,77 088,52 1528,18
08 330,77 076,41 1273,81
09 330,77 063,69 1006,74
10 330,77 050,34 726,30
11 330,77 036,32 431,85
12 330,77 021,59 122,67
- . 1
b r ,
;
+
& , S \ o | } & ' m { = i L m ҾҾҾ{ii #5B*OJ QJ \^J mH ph sH #5B*OJ QJ \^J mHph sH5B*OJ QJ \^J ph B*CJ OJ QJ ^J ph j 5OJ QJ U\^J 5\mH sH '5B*CJ OJ QJ \^J mH ph sH 5CJ OJ QJ \^J mH sH 5CJ OJ QJ \^J 5\ B*ph 5B*\ph ' . / 0 1 X Y
A o | } " # $ % & $^`a$ $L^La$ $^a$ $a$ & ( ) * 6 = h i K L x y ? @ X Y Z [ \ ] _ ` a b c $`a$ $^a$ $a$ $a$ m u w y - 3 @ A X [ ] ^ u y F G H I ϷϏχχ~x_K '5B*CJ OJ QJ \^J mH ph sH 0j 5B*CJ OJ QJ U\^J mH ph sH
5CJ \ 5\mH nH u5B*\ph j 5U\mH nH u 5\mHsH #5B*OJ QJ \^J mHph sH5OJ QJ \^J 5B*OJ QJ \^J ph 5\ 5\mH sH #5B*OJ QJ \^J mH ph sH #5B*OJ QJ \^J mH ph sH c d e f g h i j k l m n D E F H + , I $a$ / ; ) 1 L b e f k ˹˥pp]G]p **5B*CJ OJ QJ \^J mH ph sH $*B*CJ OJ QJ ^J mH ph sH !B*CJ OJ QJ ^J mH ph sH *CJ OJ QJ ^J mH sH CJ OJ QJ ^J CJ OJ QJ ^J mH sH '5B*CJ OJ QJ \^J mH ph sH "0J 5CJ OJ QJ \^J mH sH 0j 5B*CJ OJ QJ U\^J mH ph sH 6j]~ 5B*CJ OJ QJ U\^J mH ph sH ) f > g h ^` ! 7 : ; < = Q [ zm\ \ SC 5B*CJ OJ QJ \^J ph CJ OJ QJ ^J !B*CJ OJ QJ ^J mHph sHCJ OJ QJ ^J mHsH '5B*CJ OJ QJ \^J mHph sH!B*CJ OJ QJ ^J mHph sHCJ OJ QJ ^J mHsH 5B*CJ \ph 5B*CJ OJ QJ \^J ph B*CJ OJ QJ ^J ph B*
CJ OJ QJ ^J ph CJ OJ QJ ^J j CJ UmH nH u 5OJ QJ \^J ; < = Q [ $a$ . $ $d %d &d 'd N O P Q ] ^ a$ 1 2 i M { 3 ` 1 2 5OJ QJ \^J B*CJ OJ QJ ^J ph CJ OJ QJ ^J B*CJ OJ QJ ^J ph , 1h. A!"#$n% ]~ D d #wpp 0
# A b } 8HBnd qE } D { n} 8HBnd qEPNG
IHDR f :d sBIT3 sRGB }GIDATx^hם} A,l2
DIamhD
kFamxO't~!kЍX
;bZ"/H
)Q!+H^Aj>9yܟLƣ9sΙ3p @*_x9Y" H"qg×̝IHHH wnC2/! !e}o&Nzza~~XZ^9j۵C<fYkj]i"I;/X8Pۗc6Q3}\3Q}V~+_94$MW4#.HB<@QP]pKz7IMr6O/VZN?l>6B&ڵ}ˁ>WKŦE,h9ڏpJޱB~;6i&RkmB4__j_6'M7Z*l}+.+S àMbM?MvڒI&vڤضLǨCokm+V[A=_b"кdF~w}Zl}q2_LZR/uxmH0^{==П ҧ4%GIMz%/M^h_;KK&WTTGO/sJzu#>)ZeP#/'`f:)}Ư$/<
>1I;J/vg
EDKOE)_E5=qz1=+G (Iޕ Lp] t/4;|2ڏnEqk~ۡCZcL4mRz̿+~ϥ/ՋvD/-+BYv)[Yt1PJ_/=|tOWxFZCA߸{9zvKոjoh6ٹcy֫mw&PcG#;}IA}Q
ڼO^`e`ߋ=zbɠ/P~W(yGLΥO+>fOwEf2*[/sZ"a}&ZA].(z)wqڿw/MkсH^(sƿ}ȿ4NKcz_~k4UH_)1ݿ4s=9a^;>=/h<(Ih?=/~w2>##gݾ1~]K/U|%ykgg/
59'x"_#ezV eH&N_
/GB#*Ҷ+xdCzn6i~k$=o`)g'w]e$
C-ݤ%< #iGwF2us7G:J)ܾӎ8aBu` A#MOYǠ`wu9FfRڤ92>#2bj:H<8Jx^BnnٙЌ@\%|ЛQ
=<߱~L&_,/'Ƿ1 1CF5&e<㿝ߝiMb4-2ڏdZBRHSx-9b
v xj;=ww.cA>US))xGດrCXsrZ()U;uՂչjJ5庴fluK?*(oJ]_o0([P~p[WN:
^
:͠md&3*ys]_W7'/SxtO k{\^U&z̿$|W"ǷWW:AQMz+0a|4)Iۧ>rT}~ћg
zo6_JLpn9{וd.-K`#iwIi?F3uۖ.&I3h2ڤ?w4Lv>wIJS~1l}_l7w:^uCt_Tƌi=QrM+]}t1:Nٌ~#g9\*cYu19k͝8v;Zeꒋvٵ`!a.ܾ2du.qw퓻/8Y1)\o_\6oq;m.Sj7ye:Ɍ18҂96/%=[WNoM7zΌ82Oez_}~qsѝ53z%Y\\;{n6fqǁ_e)w3|J_}jwzUIMs/_=5}>zWyw|=[JVzNiP%KKP]hj0& W{Μf'oޥV{ӗӗ柾>knԻ`4L8grkQM![y?OipwJ<>kwo\yOu@;OW0[x3ұ92/ާn_SYӿ/A!ZJ+~(_J:mſ4Fh?IǶ1_vg*h_3mCRK[_5viƬnrzð)*w=6k
l:#6ڏ>"ݾ_wvƋlKki1fL緣>