ࡱ> ~F7xt>|q~JFIF`` Photoshop 3.08BIM Print InfoxHH ,6G{HH d'`8BIM Resolution``8BIM FX Global Lighting Anglex8BIMFX Global Altitude8BIM Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMColor Halftone SettingsH/fflff/ff2Z5-8BIMColor Transfer Settingsp8BIM Layer State 8BIM Layer Groups8BIMGuides.@@\|@@@8BIM URL overrides8BIMSlicesqIntro BG8BIMLayer ID Generator Basew8BIM New Windows Thumbnail#pTPn@JFIFHHAdobed            Tp"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I\`RI$I$'kKDz c[OrT"s ux=]P bI $I)I\`RI$\S'iQRd"ikvIkK>l6;NMNs+:`hGQ e-"c%+K?fϡUlC7yzeM 52vo׽C?M4MGtV>S-c9ͧLVHem1;g=7W,/>ʨcÍo6aT4 ŵ{_Mn9keG__}B9} 5moVY8umX6)s6&9h[쮡s"LWYk[sck{zUV쩥#l{\ MLɯmUu-m4WVI$t›}=lٻ{}EQ$ n_.}/3?il7{rHu!ۻD>߳){șg RD}>6w_nX}9nKTKS8BIM!Version compatibility infoUAdobe PhotoshopAdobe Photoshop 6.08BIM JPEG Quality XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km!Adobed@        0@P1`!6"2345&pAB$%7#G !1AQ 0@Paq"2`rst5B34Rb#$TcDd!1 `0p@Pa ? S Qdt Y<Ԁr;\A |1urv .9K/tRkp'Wi ~H/P ]@FT d[. nX Mn@ ꘀ]lt5&v)(qk71bp (c+-ƿ0Xjz5 ~8@Pn.Vv[ l >rT Q[ 'P,F` nHL`f 3\? 7,.{w`Akh_Raf Dk a@ lT MWU[~`rW3t_bpAH%=f0sevW/Z 7E1ybu ^@e@k2  @v ^@:Df c@ܱ8  6Ze nH/Vv2:fv-Dj@Wc/ ^@g@,rluVjz^+YAH 3/,^Uޗj@j2T[QDe` ֠~\, hM ;E/% TlkPaj/j1Y. `[ [OL`f$*I][^m@ l5pgeaC*.k; M~j`t kgZ 讀3t^F'+\{^08D50dQn1Y$-FhHI_lܱ8k?@dgn3XY~ks a`[]` 7K]18cl&pu/G@kp2:Z DW(RA I D*H$DPk(~B`g((KUH$P!CY5@$DQTWC`V_vH0Z^h $fh0@cev ̠)( )*3tH @(Ф )  B_U B+Р !@@ ))!HR Dn ,( ( (( )) ))) EZ$ H ov@) $A$@  /v nP\(,^ ][eB) !@*@B@ \@ka n 6PX&c~18 33MI$$ 0/-@UglAA$ z <\A H$II H US%ʈ$$/!H HR [ݲ@$@aHP @(  @R3u TLAޗH@I ݨ , .Ҁ2;0S R.[@U $$ 18UY[ $ k ܎H$H $ -Ō.o @$A $$PLm}4!@((s΀(!A ( +k4rD(!@ !@*.wnt# Nh1MWҪV@")bT*lSAA *H\gh@H  Lr(P W'KIc)D 2*`H$ݯvDILS@-,rw[G2 9!@*V2[wŮ%%( 25꾀wLv<їvo_\K9AKGm} X㇇}kxq=3G/U<{6Q8N?)x..in@HZQӖ=.U=N'<֓kzw Ig>E{gwqNRwOۯBu%kհwOHy~zgmu618syN޷/!@B ^Ŭ2T{NXj {ƛ;=s#_5'ps'yt zVsef맘z:42>CYÞ9nh3lNSys:^ J(W 'e=x]zŤ_w8N?k0*{jϟQYaor۰q=+ҍ%NS\kYL觕9v:l9⻾Qwv|@9庳^z_}r8s<#ֺѱ||̧x> P@$ų=z2zRb'51u]W3U^sz3@s_+㞍rR(S;vGwNC*=_y7L  eAE5֚tSZʽ7qsE(q5{G Y@}@qU"2 sޏ/K[U.|Ly3yqw}3Kuz^'2`͓q涴}Zw-Xʹs5rt?NS[lK] Vۗ3V칚C滽ͦ{kW@c?a\^mi;,wOJ2u=gįﻣ寭.Su>-pۚ_NX8 a9_ 7mWVzIw< t]wyN#[L20@*{jp< E-ww8X0fGs-w|W˝ ZJKע1,&AI ,z5fs[s7}9M/MÖXoKѲm wuZm}X&ڪ#@ G ٠E,#z[c h-e(&@-e(tG*hm} ZE૫_`H zG!`ۢlwzjL8=UڻG CzG#qrHoQ:CQϨGN:C!=8@=9ߑ"=x!9.~p:)p? !בKz6<DyshGzzsQבY]FznIp .xznoIpWq]9NSĐ;tzR;Ӂ܀-=x[l"=.\NLDQ=67r<mȝ⻓4zc--ˮ9 vv~ ;;./!` _~:s(F;_l\v A#;d7zm I"9ސނD#tx9ߐG1<pD"7`4pv܃G :p?5dۀY$pK~9Qd;vc#ܜ'Eȁ`7K"xyr0y %pWr% < 8C@? /A r/^,)#ӄN^6.So"9DxSӗlB]1M&(GYAd9,O bBHy/1$$9, CGBHHpǂp߸p]w'<@ .ӕWq]w9"[ .w :h(3zHໂ|\.ໂ]9ވ8bGtm@(Ң;4!я@t"ۢYp/CG̹(!яtn̹,}[;YF@/_|E_|E1e9NS9BEJLr+,+5#QEӔ9NS9NS$P.ʁ!ݒȗڙa@d1LpS1MR>һJ({J(b) )*}9mٓn*u1t)=xSil OEϪC(T}P}9c3 bF!z)]0(u=:>=\#&_ ( ja:`z(Ec u>ǦTl$huوG\gG TfFL! HCYPD}qT{;@8&%vbWi'Q,{ )=tbWi]v U3L! S #!zϢ/x #P,e tRQۏC5߱.:a>la}9tcϬ#̜ |d&@ g iCuػb!IuN:PBLuSt}P&W._|F}F1&;JlQ]0=:<#cj!T t1Q>C|Cw>D2.Bx]H: +» @2!v( vWa]lv*!'Ӱ8TCrȆtCn'cCbChuRuxۙ@9Ԇ,"AD2DK YJLԋ] :uhMz%۽ :r،@d$ |L 6_JL"2t9\C8TǶC6$>3 #=bY;}#P2=݀-!bH@T. Kj}v@=nS焘ܐ JtTÉ(GMEv\w(iu@pB-bB "!C$u@LA \8=v0)ЂH1ܞGdr }.vdc'ltِlG^Bcc׆1rmcMvPE _mY7[oJ@'i]vWi]vWi]BdqOc)BP7t18s& a)2 nܶ` U>ˮ1)0%c1;1TcP{S(/"bF4L6#S軋؏x]J.%D8R~p*IЀF-(!&ܜ'&MIT)™ ]Q'l#1TNDe e@4ɓ&M 6M&L2mCldBd= U>2%B (SP>E.,BBN|a:tS>/`0tӧD}Ҫ|>!y2ћ'8ʘQl !_``E·?;]E|9/%$r_K|9(mml6>+S8ގYL(T9װi[FޜKz+RTc NtϭiНEN)eVi+hyWthՒRQ;=Sf*6ԢcEjFJΩZDp)Le0 4( cv??Ps]Sm C]ǧr:qN IT#By{jь*4cH`ag+ZF2-a T*Q%;jcېWu.9T:qJ4*-CRTl*TVPi}V3DsLvÐҥ*#hƨ% sx+ TVQa !V$y;TVPa7܊=-8JӍ8QL%m?\~12*Q->kiz;У]Es[_U ymE\=.knZ"[j=犘29loRjK(j B+TPPJKj; 4 Py3Y~fb5Tg2c)EBaB* j[Z^T۸GF63V`='!!&&AVWe(SpGxUh4XU۶/KS0AWpxVKv$ӀKq(FQ1m>ڻm-Jo-S) AeNbv@ݖSÆJФWLDTnjFF96ޯÖB 96z8k5IۍZQQ$<֍%LSRRRg۸#ٝKDEjBFT"g0ʕ9)ҩ EB6h-KUƤNđZwGm.ei}ӚHo14k گG@\&{ai|^wяtOsR:'1Z5F̢')l>j)hGU.eo:}OU- e(5TbTjFp9o5UT#,+p߀IN ;iQQT7`5MX&'D*LԞ֗3LFERq]7.ܾz"H c]aHՐ }|]:t5;E*5bn(ܘ D.|-Q$DNfr|p>ʬ:QptӧN:tӧN:tӧNSHcNuP:t)]MNU%F]:tӧN:tӧN:~CoMjbF&ȖUS]~rJCV[0#9R)EӧN:tӧN:tӧN:tYҸ5aӪTMӧN:tӧN:tӧN:t|>/|_AHR>N:|өVnBQNJu!VN>çN:I@ү:eG>t>|-I|:t:t:|?THpUkFYb^*}Eo]GN:tӧN:tӧN:tӧN:LNiN:tӧN:tӧNdd]:tӧN:tӧN:t;WHtӧN:tӧN:tӧN:tӧN:ttӧN:tӧN:tdALSN:tӧN:tӧNϾ|sFAӧN:tӧN:t|>/ӧV#ԗe7O>ç:t/:tӧN:tӧ.:t'(u>UBtӧN:tӧN:tӫ}@ӸPtӧN:tӧO:t:|]>.:tl|]:tӧN>bӧN:t|]:|ӧO:t.:ttӧO9FX>.O~&x[(ys'N:tӧN:tӧN\@<:tӧN:t>/|:|]:tOONN:t:t|:ttӧN:t|:| ;NHhTQN:t[r{y4:tӧN:tӧN:t귽>_NB3tӧN@BF4c t#"*BN:tӧN:~.$ĉ8tӧN:tӧN:t•n:tӧN:t:tӧN:tӧN?o7 PvϘS`(sH@|NtBF\300ttt>*'N:tӧN:tӧN:(MN̡ZQQ 'N:tӧN:tӧN:tӧOT$AƴZ>/Bf]:tӧӧNTO|t>_s*7 >.d10"BAӧN:tӧN:tӧOhVB (TON:|XkF!CcA߹nĚƨ5E/Q|I'mӧN:tӧN:tӧN:tӧN:tH HvF7FH֨Q)ӧN:u1PN:tӧN:tӧN:tӧN:uNa4%*%(N:tӧN:tӧN:tӧN:t0HBWā]8NtQhkkȣReNvgKQ*RӧN:tӧN:tӧN:tӧN:tӧN:t:tӧN:t:t13Q`:tөEtӧN:tӧN:tӧN:t*ӧR$H}N:tӧN:tӧN:tӧOaED *u;ģ)Q!A_}ӧ|_t}c)E:tӧN:A)GitO>DT:t@IJN>|?<%:tӧN:V]x#N:tQRGӧN:tӧN:tӧN:tӧN:tӧN:tӧN:tӨ;e::tӧN:tӧN:tӧN:tӧN LLm%ӧN:tӧN:tӧpJ2͵[N<}M/K/Kxb/%x.!_/+|h?ϲ̂i=W<Ӷ_W !W[NS՚*IH9Mw/2e`ȗ"R jZJʕƦ"RәGOdA|BHYZ;|R!_/+|=+@Z_/+ȹ}aN:t>:tӧN:t:tӧNN:t:tӧNdaӧN:tԦ"%3"ӧN>GJtӧSNn:|/f6vwNZ]fmaW9 DKsS}RqsoiK|ÐrouowJ*ufv/t_ ?9GD`ȕifl}uD`ȕLgXCVu[9-|2G:.j:n]NV7?.:~a FuQ$F 9)kKʑ^]/USg_DG1^-B u($:鏨WOBRi0Ly j9S1O-A䟧o e7MM`P;uMJT.ms4ڱ-3:䗋QC~N^A>^MwԚ`c)baQ.2'ϖ}3 C<<__QS^8:yj'f@<IfKu֞35ޯ<>Ӛ6( <(1 o8mJ%2! :#-([ִ׋y :uZ4?OxArP;u~]*fVYQ uNQFyE!mfo5iufx^-xu5MVL#4?:i(:$iVɯṣ N@ NFI}W}IwMW䌦zQ|zQe#ͮ#0Wiw!I>Yބy Nm se䟧m t ӧ:tzw5j)gyd Rwnfd3[Z?ZgPRX]. J˳o_߭a{ HCf(HIxאO,?y'i·52yR,\>. w7Q<^KKz&5^ai}t/~8:LH 7  N>'RU%oq eT3jkJGN76vqmuIٰ4tU쎯]Uh]C70+0~ 0tYl)3':`s-Cj$>AR,mJc:a4꧐#Vu3e[u,k2FY>sh"ο4{}Chp3+LgfM=*TJ 8/2^QBp䰥CR/x@"Q1<sLNKKF2ʖi/n/ VS2;wgB56Gcr*v }81ZgM|<-qhy=_Q^GVsu}~ɚh^<9ކWPӿLcYgz"Y^[\Ư-7ơg?%xҌ6V{ecJ^Z)ec4̵w:|EvCs 6g h(mOڙՍOZjT 9}[>ԚzN_E(qu ;IFQux֩oZZwYgK7̳&*5$zWvRk-kwY|0?AfwJd O(yp#^LYC2sZX,Ts+&PpQkbo: 7G$hjh+tVg7m[\x9y[PkYFWCLZtiƇ#aL}z;?|Li29tf{ktekkAg}sK> ]UeS,Ggvmi-8Ɩu-A -t6ugP˨B21Qw4r?~:n/?z5u]ZkzzQS%COL0q(SB ibd{d|㓀Å%FazGl=r_{E^zu,poxlٍC.NREYIFk.x `w$ioCqߎ<^{џ|"ňk__Hڣܜh*MQxG[#|=G=GIc,14gH@ڻUgܡNe>ē"3č;Bv3 Tx"BwrBgBņHKp Cg-im=黋hPm6(plxyg~_0wzlͱ'E=;0c7̤`,@fU w6=St ቃ1xP@Pϳ%n E i<9ˤz_/uSeI- tVE@w#U;2q O!7,%<o. \DͧhELEixb`poRŦl ;"ԙiqvjѳZxHlƕZv /16#m2<2sHbBvä="m\:ICo9Sv6Ԯv"3ح9F6DKnc9JP7&Յ]$xDbIGxҮC7%"dƕVŀq>M&Q#be27 ꫟|LңyvڣpM۔#"Uo~Ӿ)ąw,Is0.$'=p+ǽR&LK2aULb=exR&(Z7ިP4nऻSF>WGz1?kя;^|aA4{L;9$tOz -PڦIqF3ujƬaH 4mZN:ʼF>WGz1?kя;^մIa~xL)[?Zr<11| J@byuP't@3>WIz1Okя|;^YI#u*R'ĒLO( @SbmJIE>WIz11vUR|;^|ctף+vOoч^lfƙFDZN``]YzBSyQOkя|;^|ctף ^@*DDRs&lPђ{hʵT4Xmą) o|;^Q ;tuVR !=&m;]艝>ؒMNx6Hi!JJo.M*:U q*-;+'?.Mg5μ)4P#H ">iG zQJOkҀ$}K%Cڌ{CJч9S8Iu LfƠNa! . H^u 2uA T|ғ攟ץ4(R6PZIڒD8 eԔ8qJ! Q >%UčRgH /#QJOkҏR|C^p 2Pdrjj5R/-G C"d$)>!J>iI zPQ5R(:pkqBiK!FD|ғ),lz5H_quhnxx{"̼ۏ60H1J?kҏR|C^%}aLʱ-jQD֩<Ü`3 +ݜ󑒃ԯ=LHmr!d K'R6 /n}H9!Ia NCX)UiZ [ZGwUi$lvR'&^EصbIfg5"c66՞ߜ2SգV laݛDUa #W-7 ٜ .^Eln]ߚW9#%_S7h$О1 Nid% 9Pg PR3f!BV'ӪXS:xNUs[mHZnPI:^[_tkp!Dld(X)Zi I1J^O*@Y-%?V{Yz#VK6*PT4)2RB"$n.&S+c«8Pm I9LJQ2/!usԷrLXa`&ʏV]Wtz½9(=J\!vҞ1/; Wwx2E$rO+ Q[a26;C݄!Xq-+I2lɬy&%D]0 }R?tG#DL4##S#)IŀNLcV{~pOvrk/\y& (RM<)P I$LBݡmzP -ZEÔ(-ҊA(e^C\oTSFʏV]Wz9(=Jk>| ($J\N!ff۽ݜJ0Օn%!6$,Z"YSEC#jq2`J`K/Z4<&^AO_V_)Bp =#?qF%Ei Bi" ;+hh6I$[FhTo*PLdQT}~8*>տ~jߥ>*I”flas}iJoJpa)h]@5%%Ɖ0C\/0q/WVj* _,iL#)\[$ ]e5μzQ-u%3K*;bT}~8*>տJ(jBb\Wh$`$ȟyo\/ݜ󑒃ԯmkOz&M"ffmŕ @&efܳv ?zq$CAԂtRNiPTS-ҡk-&f&?L*:?l 4 e7εg&V:I jbZPQS#(OʴiӅU\!RN5<5acp&*@ĵi%$ <QW^(+f0!tjAHZFTvh$p"^C\ȿR1ʯxsNJjul 1I2՜iJ>S#(V- PhR\PH2;NUH fm\TQ\uٛvW_2a֝-I\X#٨i>J]o  T)@pϲ8KH!JɜΙXإBԩs峓$k0ogyZ9Uyɭ=UU?ަ8a>ߚQ"dSGI9(!NyϽ![I\dh^\æ0-b’zP RBBZa!$_h$JWA¬r9T%"d ʅUEU!ğH-ҘRc|!0VIVF<JBRTA6-p/cK'=RF?sяĮc7d uU:|ܷ $tauΗjF33(MS•eJd[%PP&])Zql*iuwB Ftfgd~%g(dMXp' Q:Zl*AQIN2<2$Q?iXGNxK'=^uiS)]mT-)'0'aY@ !.%%@ag_9Õx>!*PNiU{e8A#D*VxKEek`Roŕ{i+ No)"XT X'1is-׻dTPP-0* u1a* +d~)d)Ji' ԥNm;F86W_2rKG@)u"(EP+*}BAA̩u"uA MJQ"R9$&4 4p}C %ڄҤ8UIv{02L_-F87n) ZA/*|IȺF":-⥛*xWx f5Q(R-HX9JN$" r TϵBTxȴr+aa%EIeA݁.[mMc`xcU=dEQIm)u+V;L8LN+"k$GeϳJxS h! ( KEd/ZRkW0 `HTc>kٰOԄ+:Ѻ'*Tm^Es  F LIk'l"Ԃ=&( {^!0I+QD*0s1IA7bN1OE?i,Xq"r)/V>M';9KF* ͶzTRm/E;5tu o8-5^ qc<:)TϭE=]~nʄ6@ 2Vdm)+ۮa) Ėm"qim_^мXxe1>%.+t*'$^&dycWVOoǃJx>2 v JVH')V0%%SPuZt@s[7HZ) R%xD[!&\’ @VgzeZ5) m+1SFsZPk&,$&BH!kSBEj(iR INjl]B,g8OBM==:ByCObs׭-@i$ST+pJF"7Z N!M(/Np(p<ۉy#$̋D̈#NrDT*L=Uq AD1KsmKJHND>j IB[J&@ RS* HPĥLh $i)h]+LdRx1qV[Z>9n(f(DԱlZ RNc XKuZV3$2Nj_5HtI3H)׫uƽ.$ maja¢/"O#EXS Sq?ӚŕJFij]b/cYkK *l'Dk/yO޳է[W9D+eCgB:"DEQQCia kOUW}ԕSI"e{IO0J[*Ao $޳іX8PT.9^uǵRWˊ #5++5ݒ_i@(%K¥$a z  Vպ_aAē1z'_ҍ3n 2-*ڧSTOh^T.bTU% C8T9V5zH[mPJDMubZVuëH(6)Z7:Ųۮ+!C"$S*]pm^ΒrVOkoLPL"SiXRM$zCkWU*׻fgՅH(KaoV{;햔 A@8jPˉ} cJ 4> @ӭIJnSQ uՕ$HY U.8C3 HB@#`#SR=?JRpL|4m) iT/GҠTzI$l&дun-.h) 4pi)m &JDj l \Ҵ2iXґ)CRR A5.@8]3{9ʣ)Hf6a֙'`|9Θy,ɳU_xty)GS/g8gs 硗Y65ɣqy|̓$9r6H;Km J[[nυl uSOxc  쿄[zՇa9ZCoGkJ|s6*yg:mI<@@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@ kD@@007$  PXU$  !@@F"Q@@(   5t"  `.@`nH@@H@@s sC"   `5]E   P@@k(*E@@\ܐ  X#@`MW(  D@@@G<&YE@@3q4  V PX]$  G#  `UE   G# ۘ@(zMm]C+OiWI:Fω@@+ ^|Ӛև:c?vV6Nٺg$69# =ִwVn`?,^DFל[A d \; l'2k%S7LxA< 8pG]ʹ p8@ؖ۟ӛe|5#]+-O.k 8C@@$K NC~2O?]dZ:݊9. l@@zp8\т+]υ# xh]NrxqӻV -"6B@_pQ{5pCgpI?v$@u& L+$*(.d04   Dc~MInߏeC@mT`B@r h2?cv (tOR`V. @gx,W~k;EZ_WJ<ʊ&(o7t% ۹@4rC϶? N38B5M{v!@W@ئ"uk5o}GX"[ue b /@ 것&OL%0  ` 4txbX'kOdCWSY25i~V8pǤsAjjG  ëvM/vV%_T#TSVKUZ?>S8ެ5#+zۙ@VD@>)@hEs mrWQ~}\TS2mHձ凕7^YM, Gw܃e z@@`; ,\GZ:_ 7ŞC+>[WqDIa^i׼k ,v8 \Nor=?К?X]6)~BN |-@@/0Y|[{n~7q;t!G8;iE+ݱ6p̧Ýwwl].+޹i] PlE! (|R#kJZyB}^`ÑuXGAA(.wD |@@OT 9HWrNGז8ꤚ=v(:  @ު۞l FE<5/+7!Vq~"$h4` UB*-Iy{H`{E@5>nwj߽_oED-?Xw*4oݮP8Q'P9   (?*ipC*);(P/i : ^sUS9:|dN Q30/n.,H? EWiGSqmqm_x}G_Zt>c|ᕇ3&cnX ׯQr8[bX< D3b]9ENgV 1fDv+lóea)̍@@`B^XF]Z'O0]f7~oQ.ol_#ngqv(Z[ 8vRmҖWYQXm ӾS-._+| 5>\zcN;rRZGP]RҒZ)J[׻hLeck\yTIy md`t} EŞե5AtLDiϵDZb`<ؓ];dck+ouZWG峾%U%{זTS~HR  `@<ђ޼uꞱgҖɟs/XM֮~yҷ8R[ˋޙY]<05zźw&(./\]!Sw !qagSM/ ju?:g縊n|krEKOBURCL9Hܬe>jx0a ED5^|?ڃk(W ].>^PYuWyGӽQV>jQkAnQDVuVkKs?~qHJOOzu4|}+5@mcZu3v;5%{0C*O'P E3@C n\:1ƎEJVure^[p /ⰋԖZܫk纓Oyku7;'mlhNu4Ech< h'ӿ8_;ſx.6+I!ᨲxy9{M%~ԟYR=N7j?ί,:DC[RӕX9)Gw`w13j+̮V_ x\^>﫱nϠ2zwW|5۩ueYK$rv񃿕%x,xw5EݮBg֩>ɰ6;}>{>y4C@>ex䣆_>o.utn ,lyK&ٴ]Gw݅5y^Lm7@iUfxܮG(F^WiYQieFW{Y۩{:*/Y=`(rFK?Q,,.+<_ZV.s%&F7 CΆŅr_dͫOXt$筸lֲ6OYJ*&m{}ɩKc;Bw缩bIMSz{ŷ7h닎'MRx<9Ex{fѦN[a7i9r>h |Hk~gܛj@qGHi൸曙%OpuwëRm:yM)ьܓuooѲbڻU4d\)cj27<%z>^K g_쫡ڬhHsW|?%蟪1(!u*fiᚵ<Җ6Qf`uF*"<1}U+\o>\U/v*4ј#.33=T6wH̒*t/ham9?3 @@OCq+۞I܅M,k*֠3şHSZ.iE<ԗ R V6v$[k*rL-/s齋V+.1C.cp$AU kł<UOqӴΧyFK43~wV~ctG<*ל~MUcH:4wK4Xɓ?@_C犢Iz>`cLLUA*Q쏬*D=vxgeN褾r\5S_*~TwYuhPA9g79]y5N}ю1{^9bg&]irq`p,n1?DЏo,M@@`684DZ~W{Z@#ycY6՜-Fw(Ҷ7;B+ @@` Zrʲ>=3;^3/?Xkזv%LYش=@o{ovI|cO˘7X2D##w){hO~ *=p\ k}9 kʦQ %U5ם|Qٖ6zE_>)|]Wgg{?sи4wvm(Z5#>\|GR;#O푗Nwkҿ0'Y% ~6gՉ7F?q>eNF}}w$1Yr+c1>g ONKI+dr 6-CN=W&rȆ{JQUIgG<ɛ8zS[tRr,>>sZ|r@??PW({Zu}󺧖L=;{Z|fO;w_ܭ_=fuzG^U6Nîٕ+HoxiJ͢?t_ц\C=ڋ 5@CKo~da#^[(MRڲ}"19LAwv״=޴ѯ`_WoѿBz; 8mwJ(r~h ۮ@P5B齳U͂6]G\_y?O;ob>ј6CsuO u==nxt R1ui 􊪔/}̡;tŞƦ]Dﰫ;n}H/x]s~_:qWn?g]>|m狡dUnlzYq6d׸wȷkvSKZscwLs }5٦h,fCumlT8Ҽk_; םmÄd&+OiK=Y{SO2ψ2_uC3{6oZ- =92_-@@`?J_j?%6O m5>1m`P=5EEF_hغGtٳZ֥268QʺWoשV?̇gOxsnťJz6~Ow]8! =0_w K'ҮmKL@[[PQѽp⣙̹YXq֮91zxghUbS#(5|r+?*Lrx;:v?r2+;}0.faӭ]l2%Bwmu~ٓȧh ۨ@8~K3Z>0iKG _&Fw}up_oݏղ?'MMK\{o2̞& 9x ;WٕF;Gj\MSOYؘls]owK״U|z楧gOS̤gqȧOf-ǔ_Z8NjMi>JfTu52hGXK$OpC8.xuۣFU_OΥE=VOJ<JvUݵnW_ZG;'ǃ[qDbiŅ'COg@Q"rMyn"ϰ^UGWP+pb_Vsވ#C u{N=DHG#bOݠ>Z9iw{`ӄ^߰3pOh8'\q퓪Jt$4}vɁ\Z4\3XWݵu; C5k_vzj17a K{Gy 6< +@hEH4ƎӹtLRyL_$;F%z Z=-j:M1=[{ah9h ۮ@UѮnǦ9y&QWUN 4{GZW>yt|}E}@x)Cvl>t1HS鲜7<|ڮ.M=pѬVO?{ƌ)(JbV=gP%|,nc(OݡTc[ E?xx׽| 5=|My]e?J#ϛǩ3%&f"-Yk:oS, T3@N"  +PWqTYئUJU#NN͜Fk[4׻ѴBwE7-n'w񫺊OuhMzL sW2i%DlzΣz:r/ęʋ>TƽJ/;xbwƦV!ήEC/-<{ФgB4gJL@3@&^7Ьe_YpM\o{=E05(Q-ǔCŏ&hPUyQMU& ʲ z' ]\^TkA@Gcٶ.+|wk^[7;^>y1e^0d|ԮbOVJ&*" 8OhBF}"=+sN\aVhQ%ڱ/A۹Me,]ok]hS̠/tޣ._#Dcu%L+ҡ3wi?sS8!tv#O.?ߞŮ>fwPwe},TK ߸kڷ[c#~Pk\7:~K3M/]-:|)*=}r;rz>^^E :~_HfZHdO <-4C@ Mxll)h&zƭW4eZ)mGKֲWYpٺ{x?{jײ2o!w\z6[FrW]yw9%@ji?:*9 W_vs~i܈q.e"ф]DL5ͥi{:m␫V[vp}C}S 9"_}QM兣T~`m^gIjʍ5>+x? 5dx7Z_T;mڷXۖW(cR9@C }o?l9)#j}?T/f:7KN#//:zoE yn۩ťr|.?ѿ+T wC:>ڽB?{ag~M " 9ӿ|L&;&7Qϙ3ֶvsk3ytg~2'z~ș8DexLsgm΄#k/Ҡmzֹ8m\a5?yoM~H#8=C:^llM>x,.W_rJ6HǸ{O7N(]*+S͒VeIJ=`#>?F@# ; Y_9+K3}(Eތmwo܎qqV৏٥vU.$%i }ξw4q[wJnS(d7Z;;d'?]\V׊ɓ D7d%D]|-ҳW=u+o1wyGmno~BwjG}fB˚ozkל#ÇqL~|ڿBZe|{1__H<%D p9teE;p+ ?31u{yMmZzn0JQ~0ܹߏ<{f  0b_W_qoxZ]'6ۜ*db|J=>=bό~.KjRH[.-/J*(+atuf )TabU3sk pU"Pzΐ[ZX7"}d/Uj6TDcM׻m]u?v|ݥ%覵\ng?"p%˿}vdPp=]&]gT옾Ҏ,Z{EǴwh^[|Җ. G;~rO, -W}8흥4;u!*hwִѿ#U*'9  =z@_+h|Y;Νqj M;{Ƈmg^kȮ45N>Ɋljݒ'_trb_]r~>=oַ9kƢ<$**F siv<ʢۥYo?Iq+)F}9d%^B^_V*ՔW~WhYs+PǝCoiD7=)^WimeET4B-K5%g:fl7:=`X\.G#ѐ_a;kšH"SA,iWuGñg';H]19x  @ǫZpGWϰ1^[{&?!ѿ>:w4W'g$f7=hl錅ADH-,`z59@UUVcuG8a7rsĵ׵qB5hM85?m_ЇMxh &DCלӈdw`įqyhMoݒu ˜):=sGjCk^V2nW?ҲͷY÷V\_o5,Yz%]\ei#bFߔ_gɧSi ls5k"y_{l"!e+#{4j̸{Wck0[#hN_%#cE!57JW}^q@[0u-A[tu/et py;ΒBϐ {ct k'sdzW;ɏ#׼M)îSbC]YM Vy~k%5zo#mU$qotrE9)Mwڋ7H'@@`@ 1u}[͆S14Ghژ ]:VC_-ήUwz( _$|O߾bjaWX1C&6lh T@C]W 3μh#p5'sف;7?^a$7.ȡ0cѮnz2e\[ƝVvūytu܆+g{f*}}ޚ;o<Lf;s;7=-z4~a%៙qu_9KnX/_hubaǍϯGWp7?&L>I={[Q4g7}8 @8+wiZF7hu[ߙw|P ړk* B*+V.çNZ;嵏okg0=NJ=hZ#ć֔z3/|:"w"7.H'VC+q *RbNGa5ChkۭHv,/.ۿd/*뫍izwofWhnk!mf\]Bw*޳h   \JiUq6i~|qۘV)k"@@` ^\Ľ@Щo=r"}/@@v>=m]glL۷S@@H@;XMҌK2/>y޵k`oovQQ~;ׯ_6s `=W 9~}kdȗO}`t:?^{o;wܜ4(>. @F^RؽfO 7>}?ܜW~6jkk[reL[I|mݦN:gΜiӦs? N*fglzŊk׮Y:@ =E@V%-g|p4qg/iwBg? >͟???O{5k>6>Pzo\?|w#<)jjj8C=+w3lX./~:5{ꩧt`$`kj @7>kw7tx3ګ͘0'|?cc---s=7xС=yx?O*zz h_G>cUUUW׫ 2yW^7 OD#0FX,4;9眗^zwޙ={v2… _~eUky=P{O$:zdV^ꫯ7G+:c9FiU$y j* ''ҥp@@@`uCJ 3N,~7U$5(</첋.+_RnEtY5 hxjllC{O &̛7OUN:PwG^aJKKg͚={ } aCru^V>HuBUWW붽c U(%(kҥKuyݺu͋/$SՈY s~ կ^r% ,-튊 ]_wriN׈;::4hV3gμ[4u]B8Q1qIJ2ɋ;|뭷BеurPtM@dم$gN Dw'')ot.Ge.)Ho@J&EΊߌ;VHˠWJ_?uR]YB?L39X=f̘<G6  0 _o+W?  EckRѤƅ=yoK5F@\q7?4|DpH4HZC@3c Ts_hl}OuZCm O?tHZi4m\;h|.kiѳ[v+g? /?VKq׹4DV-O 5S!F4O4I3A\i/_\?r4}q͛ TtR*4gFV*T *A9(C*_В/}Ku}tITK |3*$GYWA;z_򗺵JO'7A3R_Z#P1 ްkB ^ީk裏62O:2V-5Fu^'WW/)93viS'떶&&>jz]SO=nPg&s8TKVQR4蝃Ū!4]]bC"DwGz *4WjD*HA{QJCx-*`4L|֤o2rP)jM}Iu/_eT/(=IW堮}da~B_TBo~<\ׅKRgQ/8yB @Oz???[U9P܎;~q'߯,;D5b5ԠVG55H##QVxh^$G**4IFPKoMzя:P-d4Lc5MHF4ՈS꿞pX":k|G7'5i|r,I"U/i7MQCK8uw_) ,XՋ*(,ͯNy4@WѥP:X4.7ʹ?ӥ2@wJМ%= T1Uq z'T=+&&eKSݥWcUz@*?Fbz*T [,%5փ Ð|ȓχ %  v+PU^dUk+TVYv9w@cU=zgKoMR;GuZ6ݦM5dLMk 56MFSLѸ\7tK8vHqձѼ $Gj ! c҈99E˽[c!R=pc&@S\j'zq3$(d_5M$*_Ww}&q+UVit\2HAAs5J>|ΫV] G$KX&(ukh}[5}(g j8 %2@gSQ'NT4u_?~UzzJ e:DT YdbT窜:B*'t_i$Qk|/gD2JLgNj`^>u.A:hH_KnRh* |=ϼC Fi{ҚQ&~.Ά>"RA׫BKǪsEuB_ץuQz@_0U;7a`e\ /0it{~x56 i~e%ތau_V{ 4~ 5n\54~1k֊Fo i$LNmmUW75_*6# AA?ꮼƻתGEиPwVblL4aF1jZ4 Vա*4WOt]s47] 돺 u"=8C4YH8 5HhL$.mҢFWzC5V |4G%qȺ qłҋ(U*4 ѥij0Zz@AuerBGi,.$ E>ɗW4S?l(q&^eHT!dq4CLtX=uCխBKh s%.V>:QֵUw:\K[zD 3{̩rlnds%  `K[9#&DcA_oᗝ>'ݓtYp_+vx>sQ48{*oTb;@@$[^w{bHeu1;ݎw4zZ5Znħv='F@mJ33b#QM$Ovsi\-=E  ,oh*+(+Ϥu tt_@@Sxé+*81u_2Ue@js  L\H<᧚ 'X<X" #K D; /mV﹎M84ASpd^t۹(2(>"C@nuƒ;kT>e1wh`]m$ں m G}QXYWQ5gW~k> O  @y3?>m^y1o|y+˴uhζ#^CX*Pwю~t}"Io  ) B+XrJSNgAgd 6p403)-H@;HtK_n;>pA;{>YVd} #{kΉ.GrOOtycKޚ!?G@f  @<'W'rF>$(  @ccku;O,j ,ZB   6!V@ uM\I#{L@@`{GZmXσh>=`\?  "я6ev:(@@no܂8d P @@`p;ˋ=CW;E;(p @@`pʋb bn%k |C+s$DjJT:Ϟ H@SkKvG}y$Ð;프(>)Y"  8;FfF&]8OAK|@@mBG& Fc,H Ws.#o&& M  l o"#T͝F\ǝmĺ^#g@؞|Ko\D OK]SWq_*g{~  l/As3mpU^^K}%{nQ0B`@@/R@@;  @ͥ"  @w@@$@0:KE@@wJQ@@@"\&        \*  |@@@T@@(   0(Pgs  P@@@` P R@@;  @ͥ"  @w@@$@0:KE@@Qy=)2alPPП[8cRƳ'Wkty)GS/g8gs 硗Y65ɣqy}7}?c}urlv>$V Ϗ1[nυl uS7'<.|[zGǭ=U.|hѿ?9S_ud  @(Ec@@@@~ P  -@`w=  @@[#{@@%@/.#  `G  K_\4F@@n @@@h  v#  / ~q@@(?G@@_1  v Pd  @(Ec@@@@~ P  -@`w=  LsIENDB`nIMvk e9 PNG  IHDRF5PsRGB pHYs.>IIDATx^ fEuDQB:(%[C#j̨Y2NȘ]+0ں4.'qh1QKb$`yh#gw_6Uuy~uiwz:U9vZ!@ l۶mUt֭[Ι @5;vl.l0p V D茻'A 4m.@ &v&u>#3vH} @`*۷G:e 0bKV⯬,hvtܥ4lbB QpJMgH}lΰ#vuUV; W?5[/ɪV5:U!ڊV8dh>Q)1ߞN/3UB,LR#Nw^ "T^+5q1!HBZ]]?m " 57V24;>Z3P v9(eQHRۼ~&zPӽtA+mWwisMDR9Xꅚ-ɪm%g!0 x&FgzXLHXos + K8( 'hKGGİOT̉u9'a8Kt-2JݩgOi]G.m#*VlIiEtqTDA=^q!ٮ/,m۶_96>rG]N?m(Li$LܮUE[P/lrʪdUBddVzuۓYm3ӎ[zGNTP VᄶN2S킀3SjM!5ccA;@ɆEL]lj =VfאM)jR4B%|6Ͱ,ai.9k1z$ ЯZT?7E/Wh:E}/RNKsΉb)ꠊmjtfY g31Z"ɓ=uQ.ڢQ~RC$Z)[1(Ɨ&/Щwd%@LaHֻߤE~EG QZD&zU^uW4B~Yla#+oȴM;^)Z#UxO 3 @h@`G9I5,ܫq @%|1J0 %(K!@z>gN@ "Do &-AV LܜR32ǝ܁ L%x>{Xψ?wO(  @gLf  ЈM-۲iӦAΨΌ IX6o޼.l޼oR1閂s $UTaزN;mӉ'Yg-NI]]jTjW\̣97/:ܜ8wV-(~|{kfӺ͵6Kj@B@I X([O~^w_r%|;,FPMgHX Q$mtd]/Y|hM7%fMdVC4h2 83X3.ݻ3̍QG]#c36K4*H: (UMO|zt"˖C3$زþkti2{e 'p{띏;l9-0{差l}c*:ëpQvhzR- ]lKJl=]wO9Jv3!H|UW4Sz+BDC8vffά7v3YL[YRJ;m=&99@GsH|~2C=A\y_ڳGd,hY?dbclG~hGg?jòm$;;gh 4P(4BN)^Rq 5LwQN#$ МxCrBm|y{7vIZٙ!⢳[w֭x{ZfzA 042缯UZodg:I{["UN&Z+ŮF4` #^i#=x1t]_I Sg5M7/|K_oQnvm:۱w1OzQvI/tF(  u,,ť/K[>iqu}o^y},;@VPgTޟQgB 00 OZ>ysųѶ͔Zg75Hj^OةxZ^6B+'xDWJN~).tMoy[z"ӟ|?]\32nFXٳ窫~+__}Co{#ORSO%f/__./WZ~S": C/ַaǚ@Q%U!w-Ozja"2o}2>q)}kޕ"Ct '?77K9'>(ڝ( QDG>yWdt!>Pa( K^7XKmyh'P!=Q*2,.MSqGy)6Z9 䣞<<1vwwxZk$Ua4tNfH-616\ۗJRc:eˢ:0=˞PJS~c쩋j϶d z3gq+5d ݯ 3k^y AwONGw.Z||z:p+WV! CxLDdo}s%c.lN/x%.Mg.ZwfDyGjhHу`/yK4׿uʠ!'0"C0-a:+/V! dSPR&i P{LdO1V t3l1A?FNfD Ԍ֗M6ܽ|Y8XL{fUS$t5RxUgx"CF4(ʚp&wbb3/Bd k^na!_^gm+5$(.?Ch&e{ 7H7("CNMoRy!ʄ"cʞ ^wB^ CDyLB:CEWL %{oѸ{*:-z{\X$. 5Cg5u<@%Lcd[`nj~JQ!BE%\"2e7cO( HN8fg:C;cbBaVuvV1;v'='iMf8>Od1e`Q%L:}CjRC#I9Z)#u\E̐ r+oo?#y]/}K+"5$/IcU'5c4,GʭAY=pmȰG5{"ݫ]w]EY:!ADOZ.=6CYNɅ,Ϙ`,(m]zgqLdӖKw Wdn 7}^:qJ Rw*5ddžlcUhKRJe *DkHtGNu.Gg 5J[E6AC~Nl2CJ=\uY츴I ? ,xow,/ Q@'a!]5ȱ<{MU#L{ k\2 -xI'S4$pǥBK-u-MgXV_a&-Kdx\W?*5Lab2 qmק).fW1'4`Q<. Bo /_"DdRg !XNc&CHU6d+P!(Aiȕ>g:c Rýktw#]}^o7HO-Sʪ*ܠW( ZHQ˖QG"y.׆y"}{+5 O^ \251C ڐNI!JP!;3$h&3rϤj}5$CDF>ff͠g94R1{yJ{)ݣs6Q~K齷͢fgn*ɰ誉rMʱ!hjXNs 2 Jp6bQ^V!Df]Y:#Z mx[/}imYхN,ORn"j^$v&QUI KM-Rp^PdfU+y76m^XF"uNfHzwJCOjl՘]Oxlޔ;AE%9/',;E.MFlw.%rN"%)BDe%=?Z^?UthyQ-D[[aC5̿R.'zxB[lEX*bPN a&5)w\iå.;l( h(rQ^q͔E5O5&7N%u<<#xqt-jL @hNP0e# @pW'4A5A lFd݄XI@M0 @ x=rC#v$ @`BQo=pDvXV!/hDc* u2DT𜮉U1@D1@3&V@tƀ*S @#ΘX @`@ L L:cb; @g 20 01茉U(@D1@3&V@tƀ*S @#{ԖY;~x2+[󂼸K{Ԗ"!ߣXfcxAU޼7sa{_+{+{xn.e~߿ ^r=5Ji.*3ZKrMĶo8-{ZLDd<<1 a@gd^b=z2#3 { aV>׋eE< ^0j=ZąVs z'E<-5;VEAvZQE(yWdhRsqFpՋR qL!J1+caP@%[~qmd`?3EI?EjT 9iB =lH 'ܔռ6/y 9V"Fd@wޑg(zBA UE=d6(2F{hC_(I~ c&"$Rdx_*BF )Nu='6qrJA"VtjL:#2e}DdXpD7mA?糋͌I-2T)]uƗ@C8^zIFyOx o!kL?bhNc tF{UyrDw>YIJS?suU]{T8/O׿؈`EI243 EdB"""CTUK/@@`I-w7LjG(hĤFr+,"2nJpsNو ~Dl>Xl }bYg޵A*JS\+q~lZ۫!t駉y:ycS8rl5\˿ՍO4>}ϴJ%juH]@gTk"hR%v$%IHVȐޅH#+G}bB~|_r ᚛M:Fjÿ[VYM2"wsb#SBZ<,}k5,O_ԅ:)WQ#fe|.]u pdD 3U $f"޲!KH  y@gT\=9Ԕ,Q۠"ݠ߆'kq 1/9Rh\ @ tXj ;L@vSӨOW A"ΘUu/][[ݝav\p: &@2$;i͈Uߐ&5A , 3DgȳiAFr 2".'ʮSwꍸoI]- @`j} *1jH@K'Xz`@h(Ah@t5GR@*~@@6tF6*"B PTjtߤ:l,BJò`kx~Ɛk  @V# {$ǀ @`T؟1jXyUNFi@&Θc3K3 Mq0їbE`'ïJ˪4> @"82_{yNFM"#|YhzhUߚ6+ 0茂jh 1,*Ќ!@o"Z*T܁I)!z^3U> @@gsLKN/;*֯'5rD> %: @ ElERCtp#DOJv>o$B) wV#GdHUe v 3jEݙ.%@dj $ 3ĔNT9HKUQyȨʍ C J԰Ux F|DF h$ J+E&y[1**čc"~PI`~DdJ -έ,"܏'ZS GJ @{Q5X*JS)#341&*t#<ߺPaTނtyfhC2>$\h,qk!ncp[NN#7R5l"#]CKgW\$?Dg\'vIOokg!\su?z_ŚBnoÓWS6NǛڝZUD];/*ku#>!dz{K8 9hm-*/:# v8>RJ(ho~Bg{0K{1!:'Ez5*!ꍎjl RW:!E [ANy6֛8-$t;NZ'UH-ڄ pKJ,r']iDEdQ?x2]0ע>z G7t]s6"$!A7&kKQmZ ycEZ[kW}"zigomu`> QB4gNjB3'%t;Ej}][̺#.EdZUͬM(L ,<,yk Af[Z_e亻BDjwUfx\j-; mF۷o7ǘ6ܶXxoCUugEj*Jh]aDV6`Ҕ;1L!wr/kYs{@&н6a'3uL|.1Ur+,UFI{aX:A"g0ZX_фժ6sĽ$ ob@d,?B@:#-a;z(OUo%ݘɨ0\s!P7ACd z0@{3l0W']VHL 辊J0  t\DP1!f)Gkv wOMrxKa45Qғ(2GQx>}-M XcK5xf; 2 cS$rl"Lj ,Lkme }N ylݤ6NwV1'kA~ ,Ei(J > oݤRMuN P@nΨN397d? 2ucu /LH4@h:u2 T".@FC*  :ctU @g0 0:B[EH/ya0 ̜ttF~E-7S_bLˣ3\"+ P0Qs>"$@M`":#-=h"zҋlI%/KldȡG !@QSׯ4谪+&nbiݘn>a&2E~ShdW @uS (0,j|_[TCopFM`:&KuIXKr2Iz6Q\fރ%@ ]qCo5rR_ Ap[gזj5$&[h\^5$  uF)qw!Y۟70~1DꭨEz 1XH& #0nQ$;)lc/a߆9XZiai铡׭XK& u5 @ 3kǽS#R1 @s"(Ā ̛:c . 3K yXE[^veAwر/_[[%-i *uco /j *uXy+*6Ȯ4o M`T:cUE4@=u3zN @g̴q tF) 0S茙VMv&ﯛx@?( /܄fE}!yT7Mr?~鳪qmdO=%OĦw[ !@7ܹ޺w+wM7۷OFo6P茻. \w̯W}'!Luv{}[ߚ%:yoY+w:X=[ӷ>w]Z-OpC[<# D/5JۊgD@W*ħ<7N٫婇y?1ny嫟 {x|>Z,<,F#{ ̛gYyi|#:s92J[|f۴lsw]_T99G.O?uӷO|=}حo%C9Ԑg_eoEwl|_dkWEdyEuƍ߿s~vÏ>}KqWԕ8z_~gz`+)_?ڱqr#dA4@'33?k}܆菍;Bfyĝ!H(yI%:ܤMbJ#1"C"Dt<1|{ON~w6sӍ?8cz㏾{oINd–Q…wD\pGT >k>p 7|82ۙĐƱ)랉:~`"#PqOn嚛ŏ}?\y_|;bw_[քZHp$ А*иkM6^6nlhXn& C~ S1<5eIEi!"㆟}߱wwx_7w?cao5Ӿ j-ܼS?Q:c>L^too+{cb:#5 Ȝ gxM≌W~=}7{ro}=v>лVW}]nT {UE\@'?u;~{߻Idq#5wl,k75,\Rnմ MexTdHՏ^h/{ēO? z!s|=uqY:CۊokFnrw1wG(cCG,~~sMgG3^]~ڙ5/%9JQ9 \ߣ&1yww}Oܼa3~ǎ?+:Ӟ.pRK`%]YE~.g>oxddž,HW]ug?Y~w衇jq_k/6'P$2g{1Q_οw^^gOskVt> h @ M| @ |wv4!HZ@d2 @+5PjIENDB`F5_9gKu CJFIF`` Photoshop 3.08BIM Print InfoxHH ,6G{HH d'`8BIM Resolution``8BIM FX Global Lighting Anglex8BIMFX Global Altitude8BIM Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMColor Halftone SettingsH/fflff/ff2Z5-8BIMColor Transfer Settingsp8BIM Layer State 8BIM Layer Groups8BIMGuides.@@\|@@@8BIM URL overrides8BIMSlicesqIntro BG8BIMLayer ID Generator Basew8BIM New Windows ThumbnailbpTPn@FJFIFHHAdobed            Tp"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I\`RI$I$'kKDz c[OrT"s ux=]P bI $I)I\`RI$\S'iQRdUv]UZّYex{GgAf=GnNK3X$;]CQ z`˪3u\1ٟshȬQӲjƦّ":]#"weWces_}UCh>=%?=cR~WOsX(fcBYWPL̗Ru cme_CݏûAvyw۟*:T8#ӿf:\Wcz ǻ'WC~ <*-ģoLg٭ح,wחpgG~VzW2Kx%̑?WVI$t›N9'}m}ذPU/SؽڽG>?ޏO>bbGtxS/~e_;R[O;O_W+wば}Sz?O~z_,tPW/~f]rcoCo;m~>RnXI$7*8BIM!Version compatibility infoUAdobe PhotoshopAdobe Photoshop 6.08BIM JPEG Quality XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km!Adobed@         0@P1`3!8 24567"p#9AB$(  !1QPAaq"2 0@t6`Bu7Rb#s$r3SvCT&ƒ4EU  !1q AQ"2`ar0BR34b@Pps#CS$ .JR*2` Z-@"̻ 0H%u ,`*2ȰF=@\J]TX_e `f6e] A;E j(*@c@ɳ.ܔv@1Ġ=RTrkP&vB-Uj͸bP.H1ʻ*[0gh1(3^$gV%lTk[gh`fgaяP.K;E@ l4 j(+~-X,0Xkr@͸Z`?Etc͸[0gh X fu]vM%(5fm 5*6Zfa@ lTRA*Xk ^@~@bP !H%2n`ʻ*~ۀ P 3t^V-[  6Z h TX.vE5W-@fmT:$V%7E dU@5y l$nEHjluTţ *  pĢl+V5yzYAHģθ1jŠvRWuEZ˻&a*j3]aQfv@ lHQ@gh cT f% TlkPp5yɳ.1.k0.KaRkrɳ.03Z 6z@i1k6*L0kpQ 6E :5MjvUg]v@ILW!0 @ @/HĪ@,ۯH(fm]7eXQnYIvMj9@ $wdٍV%g7Y[2,̼Vpn[Sàk5ე7I@ J1lu0W,& vE 2, ed;IRA ID"@($,[pH$ A 6:MR@`7I B 1hXeoYkU ֜$ Y$rdQ :Elu1 - A $H H  EFn\ @ !@ A I/TͺŨI$  A r&Q$I$$A$ !2\nAH A  I$IH$IfVHy`8$H$H T7dkrrYHX e^d n@(IR1$T Be3,T&[ d5$m H@l5c?y |L5vɔ A HD~anglAA$ m 5\A H$II H RD[0H vM5؁ IIz쫠A ny@$@@ @H@$+D%S !L Wld$`LvX@.ݓ0S$3@RdH$ L|K#Id@$@@ ~0yȼ$A @ ,g.oT̐H  `c $k-R1B H\I  TQV6QH A   @$ @ W`!HỲ(@ 2ʥUL "S *TuS@H"A )"2dA)$$אQU0"@̝&QDIr۬[I$/5\"L)5SdB 9Ū@j+! J\[QL-R-]@(*&FB""`$A$@I$@$ Y@BQL$LuY-H$H A $.7tH A$ZPL6IZn$JUX-$$@L5)qE@.^n2DEiw<,.cEx):GQ}km;z:[ϴۍ'>Z8KNm"3sY =:H$H$I@@$I$Ui̐$ [Y a]@w~w=nt?^rgq_],opvq}+og?eWExpy_ҏN]>CxZw?_OZ)kl[ׯto@cì @$H  $ ̀ky k/{8϶r/?^WG꾋ܽK}kN^M6< 쭌+')?U|c:U2S[c_z4xk!n[EP3ty+1]hoۚgk[ϝto#_,{uIL&6]뾇?0O6r? E-ߞ:<.~'/Mmr"7U>p?*og =Oُ E?-`ӧ_ȟ˅u䷃YwS=>FXw?@  /i5@0S]=Hq_?Euy}_W?_\wY`#w]#=k^^o菞D.Ù|K>t)_u:W@g"?:5!>X&]nzӺ\poך|wìY^6gz=fPHWy od&cſ}{|o߳|-e_}5t?yyzy/p?q*)ꯝ~݀>sL:5󃻗Op"D}F<-k>KS?^FWw? .k74,y 6]t|w}ߧ}DƇ t^E Ӽz˷}w7SY G4[w?$l?6˫?A_}_4qw:z3׫u@;ӝ<ήt IuCN{p9vo:;z ÿ'ʿF}ߪ Qe φ}5 w YE5m_ɾ{|}W' +jE_W)'<\sI1M@&W(+Y"Ue!g?6~IGk>->t\~;>!17O:N_,KkG:x=u}.d[vp*|8x,\%ܧev5s'yuס^Dr&~9Dn*l}jw7~:7tgrϖx^~۪|^/m5X"0zuGsN# ~{~[4|97A_nOg6$&OjMi^K}3hnON4Cxhזz>KXrx{ޑUeo5^ߞ7zOPW\SV=?ktxo~,g99?<-DzЯ0]k<2UJ1M@ D" # o8yQk(/&@EU74)0V^@yk(H *S (u <Ui$'Pm2^:&/("Mђx7ze!p^*'ɼI\ixǟK' >9Zv y b%I|B}8B%I2\9-;.D}x%ÎH2^p]y%\ݽyox5ow6o#>$]͛ב>Ժ#qf;O#>%p AHw!C<&˜]8]rwӁ#]÷$K5v<,^6pO|Eᆟݓ/ۋvhq #MpMk[Fʎ\؈vМOlx&;ɞl ۋnɚ˧2nwkdu۰f-nl8#V .f[ e#] { 3Hóhˇ+O"e-ђͱsF;BnHR/5"&p"PE#2=#.hD"{;O2$d|pfiÑf'gψi~ Gʈwܥ+\WxWsh0rӗx O/.h;Hva-@ /#m>>rG¸w9iỈ mdN.lF1EN.x48qAKyCpS$hׅwNvLw1c˜S$!;rDAqh;H"xcqHw!;)I&5iJlڼkO`Ȍ|*M852PmjnFFJ &܀ْo&ȈA<Mݙ3]K]AH< tHHLlq:AH<5###*׹H)njnfɽ{5׾XEcx^ѹ-mLqvR@qF_NҊZ梚+pWE2G=PtE)!I+cw=!q  bl){e(|/e ?FX{&^ELn`xt^.kxzFm+r}-F$l5qݲ{khʥqMLSP#s0WEQEuժ2tU[_鋹//(+=mAEַn_^ח}m:늝FIJtzPKc~tWOiE4=ժyx<~&pK2'wwW8l]``id@cZ-_sL\.ݙ/X3;&`ΊT1!A_3ceegYȔ|d7U~ksqq9>ȦdcM)l w 0%*t13q{Кҝ{FvS=9C6B(9G CRڪw~04r>Bb3|~0tbW\G K̩drF5WMRنKO園M}_kj* @K1QO惮U8YCz킯t'Zf&9_ӟV')J :8*|v Q2Vz5x*GMXqx)Քw:? ^id#Q~g0S~JrUUMU}5by##qJӿ ]5VHU9Y6m:ZNQNoC>|" ;ӡj\HH+LG5E_vlWz$@WखVfs}*D*S8f/l29KIOyn+kc^Up޵V?/1#yٗ?/1yaKteDG#<:\B:sڦ,.=6,Rj!Js)#tq@ y>NªchteE k"S'I,Ďc:t72723 j!AHfd > GS)TӛLS"PLcr}wnnr>wTݗ{eeĖ^BmV፪dIⵅoM%; P+S&r T**T4ϣ}ǟF<1я>ycϣe Mǰ,a BIcZBC(&BA!hi{PBA! DA! 0!SLf>k$ءH)+^%;Rli! jAJ AH0H) -gP2uKaD;ט zOkm1GDKı:'^ vѽCRkk,wP6<2 ^ҜcƋƟ͊i287~:R66u6<2,uOd*+fq,E$QUE%);ǐoPQci>h ;w FGc;LvkMC,_^oqBmLZwˮ6-IҒy3ҽ1,w]to]mgP[cޛO | zum՞ڋIǹSPSXeVP9kbˆX%ޠxl0@ZΡup>?^iKYwI#C9 ? yo@aq`XԽ}{i=*M#\'v5ii?V>a C4w!Cqu׸vh;4Cqi v!AơOze=3u=T_\SX֛STPڛFF/?X\QxVGޤZsD{(F]G<69vHUQ2r҈("v2A gh2(Ooh2@dP "P v D;l@v%v$;Oߩ̐]D%Һc&SӜ힪)d|Lx""!SL}UYCCz#D pq( h`wV}\? 82 AB ] hw?=5T+ΒqOxi4A%Fq4A uHE]~>R0F=}ƠFHh)3 @3 F (3;$Rc@{@.Y%HtogXA,r4 q Ibl] b쭔ĐI7l]ضEsLo3[(PB (PB (PB&>$=|G͐(P#.U=7H1B (PB (PB4$lm8IFq?QHrz]ZƱͭ7(&PB (PB (PB (nbtakB3D(PB (PB (PB űBڶ-jm[T4 E(P-(Pl[ 4MUTa– .… (da;dEC{$[-b쭊 bض-ղ^-b   byb. Y>W´բǑSμ" (PB (PB (PB 5Gc% (PB (PB %aj(PB (PB (P:cNēFPB (PB (PB (PB (PB (PB (PxƑ⌣j (PB (PB '{S\ (PB (Pm[ ([WeB )o##P-b([-b .… (PB ([-B 1a;_ʠg{(PB (PB (PN' (PB ([űBBڡmPB bHڡB (PlPGBB (PBڶP-b alPvT(PmPB űmQX-j 0YT ^ T/7rv9XB (PB (PB<Űw6 ^B (PB am[T.ءBڡBXJmPlPB b űB  (PB ձBN(!k(Pm[(a=;(PB (PB (Q7>_PB `B =ND (PB (PxJ(PB (PB (?is B (PB b (PB (PBVkr\8c#R[ P &ců6&kض([T(P([tx$ (PB (PB (PdɜXB (PB (PB (Pxނ7p22>bٞ٘1Bڼ3ls\N% bPB b (-[mlP+kڃ+(] j7|r N% (PB (PB -5I@y; 0(PBA s#ϐCaypvw< lxS= (PB (PB (PB (PBqpN#- eB9X@(PB xkZtmx{B (PB (PB (PBg '4(PB (PB (PB (PB  fcR# s9`y3=!|\lR%ǨPB (PB (PB (PB (PB -(PB -(kMk (PԍB (PB (PB (PBI(P1 (PB (PB (PB DEG'yl9pt&@ձlP-ilPl[ձl[-vֹ& (PB8 ([-bN26HO% (P'Dd H(P-jlPB (PCA׏'M' (P擃2(PB (PB (PB (PB (PB (PB (P֛&PB (PB (PB (PB (Pm6<[nc\4(PB (PB (Py"3DE7I7lXb\о5I-[ ,n>X2|e`qҶ[Sfj.HH|)~K,*V2cf~X⼤ţM:;j+Mi~K QŔDfGy`}!^ #L90/?}r뺴_p590>~K,>Ĺ8{,f.= fF?%9 5pN}vޗer: 'g煪(PBض(PB (PBءB ([(PBءB (PDn60(PB (sɤ盍B =zqʊ v]4-fz=Z8[(o/m0WL2CmS0׎_\ ::KnL=IS,L2]{c\%tc'{]W5륜C!$<|Sr/.˧䶶)".\AH/lun ϊ`1.n]&6_F*s/.(>*e8'VV 1DM-&33-k& imQ\uZ b9kzhAԜ]Ʈ>4>F6E=? ʿ C=ȶH^Q"gۭ<5l]tf4DZt{uE,}?do5+tݾKk &ۊNJJel\R؜*[ smjIֆ58jf>­OJ Mg%["39>xb>_ƭ~' $v4>}z b (PB П!s`;Sr_W-%EDs 'yyXC 0Hc |i&uψ4>­O #feߘ+x7]⫮BOS!B%};li,}do~5ݹX[> ev:Ew]O\]7|lxbֲhm'o~1~^6v:~+*Frjpƴr{/԰/԰/԰Ҟ[⬬᚟M&qNצKb*/::: 9]\x: 筟ncVQ6i+^:'e-o~~/9܇Oc^P@Bػ (>-Q-Nj1#jl×sxZj)૆t61E-M<SJ5d>ۿ c`_W|j$`qM#}EEg.'N2;6s/jheW~{]w?cQG⫫6GVX5Zh'ۣPշMIvq8?ɭofaFƗ=~Vw;([VŵAlFw )F{N WAE[#,]_Ix^XC&ֿR:FqV;fsVLْHTyG9̇ە5mf~Q" .]][TȜFF(ɰ_x <kXq󧥭eHc9O$t ǭFP`! @eMFZӣGGAN3')(1N*8Loseo|k7PuWMLSVI=:c crӘӘӘuۧ|֖)k-~ӨLqufNmYZq܆6\F.F߁^Ә&fVơö6 'z^WD7ya6렄 /khO"kS5wum>VƩ&DdOoK>!/kA}^\55o/5eM;*i!ŷ\؆}yR^鬌-?|g¹g&da.G1vt|g|C!o|E١-Pz~<;@$We& 4 :2=(V"a"4yre_jf5]WJ@d%QZz EIu經+F2C*K93:Odn0;#qM.ysKo)FRf øVc+ %۞Q!:3e= w,>A.,OpLQcTơpNoq&LYCq8KLuNo8CiΦTmme+^tW=F&ca\m|7,9G5Ypǹ[M/0K~hc>_DC6fgL .Ht2ZFG֑O?h*ŸR?I9 qfp农 UBgj Ƒ_F#//L9+u#40n;n'f|JF0>eH2P.2b)S%̾I O,Ylݠlգ](e zUl ^]NxT@uK86u]Y~c-I\فܡ :_u;D 2a6go]>HmvՎ` #fʪ}h/,& %Ue]1Uo3Wsj9r4jΫHtx''qӄsWT fFsIISWF3Ŧ{5 4gNSDY#ziP8s.۶W-6Uc7%=d {T9 cc{T'i{{Nƒ!6%a+cgs;#/f3%/,ǖa2>E?HC?j|]O G*,"嘲\\\\\\\\\O>[d(ؾ `t#q+SDm+#q+T4T¥tttUQ##q+\GJ:WҢTt#q+P|D!tC6nT{; ӈ)ߧ3w2}4BF0TAT!$ʂ*@J(t.p q ' p I0*Y%PUN$-ț&~C?v,zrq47VbW¼3'/Frir6AnFC*FC\)297y] 7tJ)(8PD\hoZl; B$l>4kMRTFpLMC؅gTKE1&H8̯KLAa2F1TITlFCAR9 `6+LMC؅gء,}i4Dn%@AښѱeyͦW#dD˅Pɠ!U;U:APP*i BU4F#f*ES297b\h(8hPC8zv;_Pi0b^C:Q{kDr?g#s8! *S+(F7&bnG|5I'ZSwG`Ӽj˄ FrTHT2B0\ZWūYThRT!V#etWjڸv9oPn5ur4:Fcl1Lj k2?gkFC*D8`eH]ȇ] b1o(UJɄ , bh[pGR{~xn%BZZZoB *.ULU D3ZփM"RUFmcB C?VeCV>Umx:0ۂC}&UӗQ_wx;D^i:QsJ#%F7O(ڃ1i!W֝@NW"د14iB]q!4IS̾ eFhAn!Y"B]sVHDY)B.Ⱦ$= 4"a-+$@j fsf0!M֒9+$@!\1@B$@ЭS;9|;q4m24"w#oKJxgnvdBg3_+ڻ򽫿y ߾n[ﯕ{w~^߼XAc:%dPP-õ¤mRQ@V؅6i`f_IAԠ[KU J&ujpQ >b)D8oE"!•k|M)!d!o"o& A+.ki o?Oe NEFFFFFFFFFF]B/cu;܋mfsy6a6F>/YE狷M,vE: `»=#cdj RADRdnU*˄ kQ`6bֈ$.+f6yr0,n8*N#@8/K넭 dj4RPihgQ1*0 3?ˆ4H-ukVZ#{Y6t(7.:#{Y6fD5Q$d dj !T 34bPp9;?:ǣn]i86;MmF,3FX-i $w|N˵Fq6;M=!fYcVZ >MO;iT Pt.E<ʬ]Hrx=lÞZFy BӍ/bpu3IfA[€ːcxY7;L3eVZ =N\zԸ;zWu.=N\zԦts;mв2_T?ؓ #tmI|`hn'hu.8m"h9h~qǼP6̛ѷg8$GWV}6|.|v/-щ= +Eg/'@q? 1SG lRq /' fU?I֫|2 b9>`Ṇ)>){.xSq@۬˼"OAZG*|vǏR"MwoH>+tanjh(@'`w+weOOxvxG8mr Px.TeO~э97.lwȹ[8 Dߤ`Į;rF&)oCb H4 16 HCmq9chyo?g8 YiCY;sO\/f<`pǐSnpw$݀18X pcc8'vRp6)8]ܬC 9{#)A1 =tr+8D{6Fy{q~h`݊ICG%/=cݔ6)>#x."{WMsTas1u9O G,^o\HP4c޹E<ۏ$lPwE*@p='a㻻H7THGp;#o=/1SO=)&[b#ʯlR{Lۦm(IN qn]8x' cwchrv{ -W/zCb\GGDw 8 lT|C:w$p0x hSO6Ǽ` :c|JzE.|9BFפUޞ-bs=!࣎&G}'al@=[#mq׎pN8x"F,>v |NE&#z#£S#`Q r9Fބ/II!F@G$qD6x(;=鿊sU[\#k9a˽;U~$Z\-Dal-p>Ka[EfU)erȕ0'.z*n Jzv1Ɨ-q~i)bM}9['z6)*N[V=s LJ@ /P&TzLD!m* \VS!J 2kQTB@~\>8zAk|V9rSſtܔ1oÝ1%?XL{m@Zt;.(Ay`LxRjJl, fzJg8"޵dvqHQd`6'oÍ/%?[KOSsbYI2i*[L; _ynfyBTZY2zfig$.ZrQ:(hRNmc3h2UJ,TDܻfiǃ] AQ )~n68rSŪT'LbJvJNo%C7-j1H myw=' HHAKH6%HCmBP\XORК}fuI Zޒ~v~փ5*L3遙W.$" :^Ve\}*9Iyіr0G,MIMF(r;5%F%ԆG~;-疖m%n8"$n {AOZޒ~vP~y:v!WTOfhfꖨFGr1PiW@v f\D&g^@q)Bs,.'P~҃j2IſJ}sNvw :iTRRvz^YtICJx -I?;jڄnQ)Wf@ B*Q&IkVul3PiT5@[yg'F㲓z‰/4;RCZ %N7mI?;o}?zI }RR%+#=/2D⬍-Jw_ӚC+JyoWmRu(g>grs+| pDTt-!HTT"/$A ^VO-;Felc'.rn(b>#c0[ĸJo'מ`X pRs"7^C`CI*TnvTϣֹT,$Lxͮ/nkU{hOZ)#q̘I!5JH<oU=hi~ջDRR* L(J)Ħ N0EɍfUeT aI){D^74$?̟,▵-DJQ$I'wBRLII")T"7;>[U}$tVD᳾A>^E_M/q4cCIS-8Ҵ;Bx"72,Eڣ>['m+7 fe1ai_ئ;Agk5)%)pRԂDLb6,wT"$p v$iTLU=. hOZ)ϳKJs[}Tm~VRIM9Ai%kQ ()܁ag5vv5+>˼n5IP[H pl$cTv%dޔE>RNA.%BhJqD;R[obcr"mgf; S>1TZݠ3&w'>˧*w-y&ϗ݌v=ĉV!ěn"<'i\ˏ8bI yԛ)t JI㴫̬8 Bb) ֩G3ԩ9Мvj]ZIܥ/K{K_nfVNbaRl!iPI@ {юyij eJ73^}'LRgq%Cӹު{c2%ڡV%&)BN(Wrej2*bi> |-7;)kOjd)ߩn?D,8@ yZ&壝%I SOJVJT$"n_%kZ&7t/k΄b֪G-nнV;eQ[{kL#G>^ͤw!Φ]^9;w^a lRRq 53(^f VapnzpSg\iNi"䡠n7bf\BF+2?&#v쿱nvTϣ^R\iuqg 6R`mԯӾb:Wiԣ:H:h.4y`38)BG㝭Q/4_i0T:aˀOIm8˗BzϱLniMOERI8̒YirfJg)vF?ⴏ-G#Himg.ܝ{mLuIX)JR "r)I-mWzG̥)!=W)9/(RHZEXٯiH3.YǪzQ(ƚrNo~v;=RVgZ2%K%A) nMH6է@ZzjSbIkuR/}Vgf7&%4s2:jy)0 J^m= Vor?i[܏ZGzYP(˘rzFeK+u! ʾ*X%!11ݞO>grw+{q}~Wdhgf]0m$FM34y#c :)97⍕/!JP%*Ba%k*PCg!ˀ) l s :c4@1y,**Q1{U?h)$f2 ɘJit8Vvc什}~WdheҤYRz)^xwV[`Ia9.p$lO5)[!B e ʶJvG ĨTH!vkT&P0J¡nL6A7)_nh^L9YR&iȦ;'4īδh2!$8I&U?q[~1K7-/*>MF`KYdēV[e=jgئ7)UhKUiIɦdI!!ˋZ-;/*mWfu.a5RPeӒU1([IHodM:yAS/nZyRV2ֽ4`vM~AFT%e[)'|սw[)'|ՔJRtD9a Ri#*dTԧ8գj6U(My53 Ji9iICe !J Ӗ:};歪u [Uf!0]-2l) fC;wF mvwL-8̺D+) 8ٷBܳT餭rR\B %i]iRҦV.Ķ3&"9J/g|մ?ALO}NK9,%!Е5͆Tx5YTKN0R%)Z|}wZ4y?0envॄ+t`7<' mh+ɲ?sf+Ik#` VRZ*<,f\&qSi<ă| :Gp `"L;I uJ D9ߗE;N\ Vf.TKQ+.uf̤46kݩvw0g>==M†OJOS{tiij4Uk fc?R3]SIJGl꓉WJ7NiJqiIT?gRZu%Pv^"W3U6de Ce he@^h]ڃBT^e3W1}~54OUNxpu};KgYKCᢠ GZrVV3 WJk-0&+?1/.%QB8"ZT<3)4C6OCՄN'Һt9-O=Ӵvqԥ!N(=/\ciMyDղK09i B_KJTB’M\j2TeofqeTm+HUO9Yf0%&KIJJ˩ amuX3%K=/s.nΞu@ ?]?Xu>uLzgM@gУs4T#辐1 ~Il1B)*-h 5EZ]ST :6!m/"JL֜LJh4$WΥz,V$[R  N1O%Szm)RMJ]vz\)J ̈́qj]a&'54ĸS.V2 PXRWvLHڝ~ڙwG̞އUֳajA^VAma)%YrQ(W -ZsM1u%5^Y!=!9d1VNA RaJLaSl殦v#fbXReYa%AXR'6dڅ\JJU(&EQ>Ҕd=(qڥ3='͊|5w\.%0UHgy I+qd%H%ED$Akڝ;NWKI6Z*)ur A3ai-yErKLL&Nfj^\J)\+RB_K̂(,)+&$SC՚KFk*&ɚSN-sRBJJsrmZz+ b SؔL(qV$!A99U 5Q;nU&B]R %)BVNT niSAJa[3  񩖨R^dʼu6'_XY2rӞqAMaN)`*MM _q)Bb=S 8Ӊ*z*x7xrqe,mGIʇ#s'*I1Ix ٩cLO f0qq@(*Do+0)U HX;bX2JV"+Iy@F!9R9+5[L?bDDí+0O[m=-?QRLyxC=e\*jlMNs[_}s6.$ZE]--v}hZ\RRfs!JNO٫7hv4enS8'eBW*ǒ1)TOUe0&.Q(8_E+*s m+?թI {N:Ӳ[II8b/}aN].+Rmo8RR`8ޒ6ҿj;&Y-9jӓ-CLͤ ]C%jRs!E mJk~T vJf^UNu]cSL%m|=O#vWOz'LŜ;me%8'ʯlM#&-~w=VN^˴TNմ:ѵdXmmf7bj R{8U{bmEv^u)DN2}u8ˇ&1rٟimPZnRT6F;PR:_ʲf&2NHN& Dc.vޏ 5QM5qO&"#Ѭ/R0PRmJn?5` oz?*?YN]vu H%gi-,06AmW!)dU-{-YYeǨ32S*ގ3PKl4Td@*TH'eZFObIyīmXEfiu-.52PԍQڍVERrI4C@N)9m`-J `{C[zK j^a$ĞDK2>vn+iɻn;]K MmPO*!iO;o4[igua$%23m8˲qke%eFe,?YkꚐӚms*΂XaƗ[)t) KjWS$r]EMjuJ\)OK2Q-)bԺXʼWq3JܛLTQreDaD&,791= &&Y(a'=<:9 65321G<5+(&"'%!?Z1FFFF8  0h$ " #OLs_Ko-  d]WVR87nm}"~#w!v!u%r l"jc&a^(Y*XUT,SQ.PNJ2H4FB;405,7+7*0)++!M  /.OR$t>|q~?x b$x/ٷ{V!MX+?x b$Mvk e9 Jj R$_9gKu C=qF  0e0e     A@ A5% 8c8c     ?A)BCD|E||S" 333((f31f@38  ~ ʚ;$B5ʚ;g4KdKd0pppp@ <4!d!d 0,8<4dddd 0,8<4BdBd 0,8c ___PPT9phXYS T R? % *Web-Applikationen mit Struts Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht T%PNQ51FB3BJ(BJ(B.BBBBBFB B  b  B Bb  i     C4$3 Tier Architektur Persistence  $   5#)3 Tier Architektur Business, Persistence(*$$8    7%73 Tier Architektur Presentation, Business, Persistence(8 $$0    6"3 Tier Architektur   0 3 Tier Architektur   Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht T%PNQ51%BFBJ(BJ(B.BBBBBFB B  b  B Bb  i     C%3 Tier Architektur Presentation Tier&$2    VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+  VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+  VPresentation Tier Model  View  ControllerV,($$$$$ $+  "Presentation Tier Vorteile von MVC#($.   Das Model kann unabhngig von View und Controller realisiert werden Zugriff mehrerer Views bzw. Controller auf ein Model Austauschbare Komponenten.  ` `3````` `` ``,3:"Presentation Tier Vorteile von MVC#($.   iLeichtere Wartung, Einfacheres Verstndnis fr Entwickler/Designer durch MVC-Paradigma Wiederverwendung pi  ``` `-``Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht l%PNQ51%BFFN(FBJ(B.BBBBBFB B  b  B Bb  i     C )MVC & Internet Zustandslosigkeit von HTTP*($   ;Von statischen Inhalten zu dynamischen Inhalten im Internet<<$CGI (Common Gateway Interface) hoher Ressourcenverbrauch, da fr jede Anfrage eigener Prozess gestartet werden muss plattformabhngig keine komponentenbasierte und serviceorientierte Architektur.     >         MVC1& Servlet& 0( "   MVC1& Servlet & JSP& 0(.    Pro und Kontra von MVC1( 0( *Unberschaubare JSP-Seiten, die HTML-, JavaScript- und Java-Code enthalten Erfordert Programmierer mit Java-, Java Script- und HTML-Kenntnissen. Ergebnis: Entweder schlechter Java-Code oder unschne HTML-Seiten Versto gegen das Architekturprinzip  Seperation Of Concerns -D-@-bbb bbb bbbb bbbb b, Pro und Kontra von MVC1( 0( Eine nderung in der Geschftslogik erfordert eine neue Implementierung aller betroffenen JSP-Seiten Integrierte Steuerung der Seitenabfolge in JSP-Seiten Mhsame Fehlerbeseitigung + Geeignet fr einfache GUIs--3bb.bB BBBFBBBAgenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht d%PNQ51%B3FN(FFN(B.BBBBBFB B  b  B Bb  i     CEntstehung von MVC2 0("    Was wir brauchen sind: eine View, die wei, wie die Daten reprsentiert werden einen Controller, der wei, wie mit der Geschftslogik umgegangen werden soll ein Model, das die Daten hlt aber von beiden nicht wei : Entstehung von MVC2 0("    Aus beiden Komponenten (JSP und Servlets) musste ein neues Konzept -MVC2- erstellet werden. Die Servlets als Controller steuern den Control-Workflow, whrend die JSP s als Views nur die Daten darstellen. ``.`@H(&` `5```v  !MVC2& 0(  MVC2 Controller4 0(( (  ist ein JavaServlet nimmt die Benutzeranfragen (Requests) entgegen erzeugt das Model (JavaBeans) greift auf die get und set Methoden des Models zuJp`````b  MVC2 Controller4 0(( (  pwhlt die zu zeigende Seite aus trennt die technischen Controller von fachlichen Controllern ist konfigurierbar *pp`eMMVC2& 0(  %MVC2& 0(  &MVC2& 0(   MVC2 Model4  0((( Mist ein JavaBean hlt die Daten wei nichts ber die View und den Controller0N&``"`,& MVC2 Model4  0((( stellt die Daten fr die JSP bereit ermglicht es dem Controller, die Daten durch get und set Methoden zu ndern reprsentiert den Zustand der AnwendungTR````;`@,R<'MVC2& 0(   MVC2 View4  0((( ist eine JSP liest die Daten aus dem Model erstellt die darzustellenden Dokumente stellt die Daten dar greift nicht auf die set Methoden des Models zu:|```@{ MVC2 View4  0((( kennt den Controller nicht wird die View ausgewhlt, wenn das Model gendert wurde ist austauschbar: Java Klassen JSP XML/XSLT :ee``@$X+MVC2& 0(  -MVC2& 0(  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht j%PNQ51%B3FN(FN(FFBBBBBFB B  b  B Bb  i     CaDefinition von Struts@Ein MVC Model2 basiertes  Open-Source Framework fr die Prsentationsschicht von Web-Anwendungen. Bestandteile: kooperierenden Klassen, Servlets JSP-Tagsr/bbjb*bb%bbbbb#,f  Bestandteile von Struts Bestandteile von Struts Bestandteile von Struts Bestandteile von Struts Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht |%PNQ51%B3FN(FN(BBFF FBBBFB B  b  B Bb  i     C Initialisieren Struts Controller*!(( (  web.xml von Action Servlet$ }Die Elemente der Datei web.xml: servlet-class: Definition des ActionServlet s application: Definition eines Resource Bundles config: Pfad zur zentralen Konfigurationsdatei (struts-config.xml) mapping: Requests mit URL-Erweiterung .do werden an das ActionServlet weitergereicht welcome-file: Startseite der Anwendung taglib: Deklaration von bentigten Tag-Librariesb $ $ ! >  ):  / *" A-web.xml von Action Servlet,  action org.apache.struts.action.ActionServlet application ApplicationResources config /WEB-INF/struts-config.xml ...... h  &     # & 4      D  !  !   V       N9web.xml von Action Servlet,  action org.apache.struts.action.ActionServlet application ApplicationResources config /WEB-INF/struts-config.xml ...... h  &     # & 4      D  !  !   V       O:web.xml von Action Servlet,  action org.apache.struts.action.ActionServlet application ApplicationResources config /WEB-INF/struts-config.xml ...... h  &     # & 4      D  !  !   V       B.web.xml von Action Servlet$  action *.do 30 index.jsp ...  &!L'!( '(     web.xml von Action Servlet$  action *.do 30 index.jsp ...  &!L'!( '(     Q<web.xml von Action Servlet$  ... ... /WEB-INF/app.tld /WEB-INF/app.tld /WEB-INF/struts-bean.tld /WEB-INF/struts-bean.tld : !)#*#          Initialisieren Struts Controller*!(( (  jOAction Servlet Cdas org.apache.struts.action.ActionServlet ist abgeleitet von javax.servlet.http.HttpServlet dient als FrontController (J2EE-Designpattern) das ActionServlet und die Action bilden zusammen die Controller-Komponente wird auch als technischer Controller bezeichnet initialisiert alle Struts-Komponenten (beim ersten Starten)Db&cbb bbbc bcb cbbbbbcbb bb b%bb*b   ~#  Initialisieren Struts Controller*!(( (  struts-config.xml6Die Elemente der Datei struts-config.xml: form-bean : Definition von ActionForm global-forwards : Definition von globalen ActionForward action-mappings: Definition von ActionMapping action: Name der Action name: logischer Name des Models path: Pfad zu einem neuen View scope: Kontext dieses ActionForms input: Eingabeform dieser Action forward : Definition von lokalen ActionForward* ?         E1struts-config.xml6<struts-config> <!-- === Form Bean Definitions === --> <form-beans> <form-bean name="formModel type="com.oisoft.view.form.FormModel"/> </form-beans> <!-- === Global Forward Definitions === --> ... <!-- === Action Mapping Definitions === --> ... ...j)  ?       ..      R=struts-config.xml6 ... ...F2).?*.   S>struts-config.xml6 ... ... ...}C).0?*(* * *? *      F2struts-config.xml6.... ...>/ ?3*3'*3 *3 *3?3 *3?3*3-*3 *3 *3?3 *3           \GA Initialisieren Struts Controller ActionMapping / ActionForward,B!(($>   A Initialisieren Struts Controller ActionMapping / ActionForward,B!(($>   A Initialisieren Struts Controller ActionMapping / ActionForward,B!(($>    Initialisieren Struts Controller*!(( (  `I'Initialisieren Struts Controller Action6((( ((   ? 3    3 %  3   3   3     3   * 3    ? 3   3 '  3   3   3    ? 3   * 3  0                    Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FFFF BFB B  b  B Bb  i     C Struts zur Laufzeit / Controller !( ( K6web.xml von Action Servlet$  action *.do ...n &!( mPController (Action Servlet)5 Mapping der Requests auf die spezifizierten Actions 66b.  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FFFF BFB B  b  B Bb  i     CStruts zur Laufzeit( web.xml von Action Servlet$ \action org.apache.struts.action.ActionServlet ... action *.do 30 ... B$J#&  &  !  L  '  ~ Struts zur Laufzeit / Model (( L7$struts-config.xml von Action ServletH  ... ...."0Z20Z2 0Z2(   ? 3   * 3   ,  ? 3   *3'*3 *3*3?3 *3 Z        Model (ActionForm) Das Model in Struts ist eine von der abstrakten Klasse org.apache.struts.action.ActionForm abgeleitete Klasse Die von der abstrakten Klasse ActionForm abgeleiteten Klassen beinhalten in einfachster Form Getter- und Setter Methoden, jedoch keine Geschftslogik. bb.b#cb bbb c6bcbcbb ( 2 55qVModel (ActionForm) Annahme: fr jedes Eingabeformular in der Anwendung zugehrige ActionForm vorhanden Aufgaben:Formulareingabedaten zwischenspeichern und fr andere Teile der Anwendung verfgbar machen Sie reprsentiert den Zustand der jeweiligen Views in jeweiligen Scope (PAGE, REQUEST, SESSION APPLICATION) Die zu prsentierenden Daten werden von der View mittels Struts-Tags aus dem Model abgeholt.<l]?b cobbbb b%bbbbb b b bb bb> Q-JavaBeans und ihr Gltigkeitsbereich (scope)  ., ,$ PAGE: Beans, die sichtbar sind innerhalb einer einzelnen JSP-Seite, fr die Lebenszeit des aktuellen Requests. (Lokale Variablen der service()-Methode). REQUEST: Beans, die sichtbar sind innerhalb einer einzelnen JSP-Seite, auerdem fr jede andere Seite / jedes Servlet, welche/s in diese Seite inkludiert ist oder an die/das von dieser Seite aus weitergeleitet wurde. (Request Attribute). SESSION: Beans, die sichtbar sind fr alle JSP-Seiten und Servlets, die - ber einen oder mehrere Requests hinweg - einer besonderen User-Session angehren. (Session Attribute). APPLICATION: Beans, die sichtbar sind fr alle JSP-Seiten und Servlets, die Bestandteil einer Web-Applikation sind. (Servlet Kontext Attribute). ZY _e+  U+ /tWModel (ActionForm) In der Klasse ActionForm sind zwei wichtige Methoden implementiert, die bei jedem Request (je nach Konfiguration) von dem ActionServlet aufgerufen werden. b cbb bbb b!bcb#> :! uX(Model (ActionForm) Die Methode validate,) ( b(,  Methode validate() berprft die Gltigkeit der Benutzereingabe in der HTML-Seite geprft. Wenn das Attribut validate in der struts-config.xml-Datei auf "true" gesetzt ist, wird die Methode validate() vom ActionServlet automatisch vor dem Setzen der gemappten Felder in der Klasse ActionForm aufgerufen, um die Plausibilittsprfungen auszufhren. Methode validate() gibt ein Objekt der Klasse ActionErrors zurck, dem als Container die Objekte der Klasse ActionError hinzugefgt werden, falls ein Fehler aufgetreten ist. Diese Fehler werden von Struts in der View (JSP) an der Stelle angezeigt, an der der Tag definiert ist. ^" &b cbb.bcbbcb bbcbbbb bb b bbb b$b cbbbb cb cb bb cbb bAb bbcb bb:\     C 1 N0vY%Model (ActionForm) Die Methode reset,& (b(, Methode reset(), die bei jedem Request vom ActionServlet zuerst aufgerufen wird, um die Defaultwerte der Klasse (Model) zu setzen.  b c c b b b c b b b c >LModel (ActionForm) 8public final class FormModel extends ActionForm { & public void setSelectedOriginName(String newSelectedOriginName) { selectedOriginName = newSelectedOriginName; } public String getSelectedOriginName() { return selectedOriginName; } public void reset(ActionMapping mapping, HttpServletRequest request) { this.selectedOriginName=null; } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if(mapping.getPath().equals("/bookingSubmitAction")){ if ((customerFistName == null) || (customerFistName.length() < 1)) errors.add("customerFistName", new ActionError("error.customerfistname")); } }... }c g 3 c g c C c c oc c *c C c c c g 3 c g 3?c g 3c c c g 3 c g 3c g 3c g 3c g 3(c C                                                                         !       Struts zur Laufzeit / Model (( pSModel (ActionForm) JActionServlet ruft die Methode reset() auf. Wenn das ActionServlet einen Request erhlt, berprft der Controller in der User-session, ob ein Objekt der Klasse ActionForm fr den aktuellen User erzeugt wurde. Wenn nicht, wird ein Objekt erzeugt und mit jeweiligem Key (user) und Value (ActionForm) in einer HashTable gespeichert. K " cbbcb c%b b/b bbbb b b#b. c  Model (ActionForm) Fr die Requests, die mit dieser Form(HTML-Seite) gemappt sind, werden die jeweiligen setter Methoden der Klasse ActionForm aufgerufen (JavaBean) ActionServlet ruft die Methode validate() auf  " Vbbb cbb cbb ab! !     rTModel (ActionForm) Die vom ActionServlet aktualisierte ActionForm wird als bergabeparameter beim Aufruf an die Methode perform() der Klasse Action weitergegeben. ` a` a ```aa `a`b!> 6&Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht |%PNQ51%B3FN(FN(BBFF FBBB%FB B  b  B Bb  i     C Struts zur Laufzeit / Controller !( ( Controller (Action)Alle Actions sind abgeleitet von der Klasse org.apache.struts.action.Action Die Action und das ActionServlet und bilden zusammen die Controller-Komponente Wird auch als fachlicher Controller bezeichnet. Die Action-Klasse soll die Event- und Dialogsteuerung (flow of events and flow of control ) und die Fehlerbehandlung der Applikation kontrollieren, aber keine Geschftslogik beinhalten.  2bcb bbbbbbb cbbc b cbbbbbb bbcbbbb/bb%bbb$ {bsUController (Action)Die Klasse Action ist als Command[GoF] implementiert und wird vom ActionServlet aufgerufen. Die Action Klasse ist gleichzeitig nach dem Adapter Entwurfsmuster[GoF] implementiert, welches die Schnittstelle einer Klasse an eine andere vom Client erwartete Schnittstelle anpasst. Singleton: Das Action-Objekt ist nicht thread safe (keine Instanzvariable in den abgeleiteten Klassen anlegen )Vp 2 bc b bb cbbc"bbrb bbc bbb b=b!bO >xZController (Action)public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ //do something ... } c g3cc c g3c g3cg3cg3Ic O                   nRController (Action) Fr die Action-Klasse sind die folgenden Anweisungen auszufhren: Aufruf der Business-Schicht Business-Schicht gibt die Ergebnisse zurck aktualisiert das Model whlt eine passende neue View gibt die Kontrolle (als ActionForward) an den Controller ActionServletC 2  2 ``4````` ` ``````a` a`>  Struts zur Laufzeit / Controller !( ( !Controller (Action) ActionMapping -public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Kunde kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R.c g3cc c g3c g3cg3cg3:c)gc Oj                       !Controller (Action) ActionMapping  definiert einen Pfad, der mit der URI (Uniform Resource Identifier) eines eingehenden Requests verglichen wird wird es vom ActionServlet der Action-Klasse weitergeleitet, die fr diese Request verantwortlich ist stellt eine Menge von Mglichen Weiterleitungsadressen-ActionForward bereit\!{ x  t/  /K!Controller (Action) ActionMapping ,Controller (Action) Aufruf der Businesslogik'public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R(c g3cc c g3c g3cg3cg34c)gc OX                        Struts zur Laufzeit / Controller !( ( Controller (Action) ActionForm -public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Kunde kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R.c g3cc c g3c g3cg3cg3:c)gc Oj                       Controller (Action) ActionForm *Das Model, das die Formularinhalte enthlt++  Struts zur Laufzeit / Controller !( ( #"Controller (Action) ActionForward -public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Kunde kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R.c g3cc c g3c g3cg3cg3:c)gc Oj                       "Controller (Action) ActionForward Wird von der Action nach der Bearbeitung des Requests an das ActionServlet zurckgegeben In vielen Fllen ist die Anweisung ActionForward die Ausfhrung einer JSP-Seiter ) # >- 1  $"Controller (Action) ActionForward Es ist aber mglich, die Kontrolle durch die Defnition neuer Actions <forwardname= something path= /something.do /> wieder an eine andere Action weiterzuleiten. Ein ActionForward kann sowohl lokal als auch global definiert werdenx=.1   -    83{]VController (Action) ActionForward  lokal    VController (Action) ActionForward  global   Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FF B  b  B Bb  i     C%Struts zur Laufzeit / View (($ |^Action Servlet 'Struts zur Laufzeit / View (($ }_View (Struts Tags)$Wird mit JSP (Java Server Pages)erstellt Struts befreit die JSP-Seiten von Java-Code (scriptlet) durch die eigenen Tags. Diese Tags sind fr viele Anforderungen ausreichend. Sie knnen entweder angepasst oder eigene Taglibs erstellt werden.0bbb bb*  P ' y )View (Struts Tags)$\Diese Tag-Libs sind in vier Teile aufgeteilt: Bean-Tags HTML-Tags Logik-Tags Template-Tags J.. .> ~`Tag-Libs Bean-Tag  ^In Standard-JSP Seiten wird <jsp:useBean> verwendet, um die Bean zu erzeugen Mit Hilfe von  scriptlets wird auf das Bean-Objekt zugegriffen. Struts Bean-Tag erweitert diese Standards, um neue Beans aus verschiedenen Quellen zu definieren und Beans bzw. Bean Property in JSP-Seiten wieder zu rendern. NA  (. L  (,b"Tag-Libs Bean-Tag Bean Properties:# , Erweitert Syntax zum Referenzieren von JavaBean-Properties wie folgt: einfacher Name property= name" ist equivalent zur Methode getName() vom JavaBean verschachtelter Name property=" kunde.name" ist equivalent zu den Methodenaufrufen getKunde().getName() vom JavaBean indexierter Name property=" kunde[0].name" ist equivalent zu den Methodenaufrufen getKunden().getName() vom JavaBeanF < F $((            c"Tag-Libs Bean-Tag Bean Creation: $# ,  tStruts stellt Tag zur Verfgung, um ein neues Bean in irgendeinem Scope zu erzeugen bzw. zu kopieren.ru & Z #*"Tag-Libs Bean-Tag Bean Creation: $# ,  xDieser Tag untersttzt das Attribut  property , so dass die mchtigen Eigenschaften vom das Attribute  property verwendet werden knnen : //Erzeugen eines neuen Bean <bean:define id="foo" value="This is new"/> //Erzeugen eines neuen Referenz auf existierendes Bean <bean:define id="foo" name="bar"/> //Erzeugen eines neuen Bean aus Bean-Proporty <bean:define id="bar" name= form" property= name"/> //Erzeugen eines neunen Bean aus Bean-Proporty und in andere Scope kopieren <bean:define id="last" name= form" property= name scope= request" toScope="session" />   / 7 & . 6  %:+7"-4KW~%:3 7        d Tag-Libs Bean-Tag Bean Output: ! ,  6Struts definiert Bean-Tags, um Bean- Proportys in JSP-Seiten zu zeichnen: Zeichnen  Internationalized Message basierend auf Key-Value-Konzept. <bean:message key="booking.surname"/> Zeichnen Bean oder Bean Property <bean:write name="formModel" property="selectedFlight.price"/> J F ) " A J %&cC #>c   & &           gTag-Libs HTML-Tag   erstellt die Eingabe-Formulare bildet die normalen HTML-Tags nach diese Tags sind eine Brcke zwischen JSP-Views und anderen Komponenten einer Web-Applikation.$XC Nl/i$Tag-Libs HTML-Tag HTML "form" tags:%  #button zeichnet einen Button cancel zeichnet einen Abbrechen Button checkbox zeichnet ein  Checkbox Input Feld errors zeichnet evtl. aufgetreten Fehler file zeichnet ein  File Select Input Feld hidden zeichnet ein verstecktes Feld image zeichnet ein  input tag vom Type "image" multibox zeichnet ein  Checkbox Input Feld password zeichnet ein Passworttextfeld#&$) 1&!& #" $W 0V 0 &X 0IQY 0w}[ 0\ 0] 0^ 0*2_ 0X`j$Tag-Libs HTML-Tag HTML "form" tags:%  #Lradio zeichnet ein  Radio Button Input Feld reset zeichnet ein  Reset Button Input Feld select zeichnet Auswahlliste option zeichnet eine Menge von Auswahlmglichkeiten innerhalb einer Auswahlliste options zeichnet  Collection of Select Options submit zeichnet einen  Submit Button text zeichnet ein Eingabetextfeld textareas zeichnet ein mehrzeiliges Textfeld form zeichnet einen HTML form-Element))U+!! $3#'6  !   #i 0j 0.3k 0\bn 0zl 0o 0 p 0.2q 0S\r 0kfTag-Libs HTML-Tag Gemeinsame  Form Tag Attribute:04 !$ 2,lStruts: id Name der neuen Variable name Attributname von Beans, deren  Property in diesem Eingabefeld angezeigt wird property Name der Property des Beans value Wert eines Elements, der als der Wert des Request-Parameters  submitted wird <html:text name= myBean property="mailingAddress.street"/> X<$SQ= 2 *  -  lfTag-Libs HTML-Tag Gemeinsame  Form Tag Attribute:04 !$ 2,Javascript Event Handlers: onblur  JavaScript event handler wird ausgefhrt, wenn dieses Element den Focus verlieren. disabled ermglicht es dieses Element  enable bzw.  disable gesetzt wird. onclick  JavaScript event handler wird ausgefhrt, wenn auf dieses Element geklickt wird onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onkeydown, onkeyup, onkeypress, onfocus, ondblclick, onchange <... name="backPictureShow" type="button" onClick="showPicture()" .../>N&|HWF,%         *   @   9          +fTag-Libs HTML-Tag Gemeinsame  Form Tag Attribute:04 !$ 2,"CSS Attributes style definiert  CSS styles fr dieses HTML- Element styleClass definiert  CSS stylesheet class fr dieses HTML-Element 3 < >% m&Tag-Libs HTML-Tag TagH' $$$ > 6Fehler erzeugen : public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ... if(mapping.getPath().equals("/bookingSubmitAction")){ if ((customerFistName == null) || (customerFistName.length() < 1)) errors.add("customerFistName", new ActionError("error.customerfistname")); if ((customerLastName == null) || (customerLastName.length() < 1)) errors.add("customerLastName", new ActionError("error.customerlastname")); & }" c gccc g+cgcccc5c         !                                      n&Tag-Libs HTML-Tag TagH' $$$ > :Anzeigen Fehlertext in einer Stelle in JSP : <body bgcolor= red"> <html:errors/> Anzeigen von Fehlertext an mehreren Stellen der JSP : <td align="left"> <html:errors property="customerFistName"/> </td> <td align="left"> <html:errors property="customerLastName "/> </td> -& 6 ,#5C,Cc:CcC/  <   'Tag-Libs HTML-Tag Internationalisierung  b//ApplicationResources_de.properties error. customerfirstname =
  • Bitte geben Sie den Nache ein.
  • error.customerlastname=
  • Bitte geben Sie den Nachname ein.
  • error.customerphonenumber=
  • Bitte geben Sie Telefonnummer ein.
  • error.bookedseats=
  • Bitte geben Sie fr die Passagierzahl eine Zahl ein.
  • //default ApplicationResources.properties error. customerfirstname =
  • Please enter the name.
  • error.customerlastname=
  • Please enter the surname.
  • error.customerphonenumber=
  • Please enter the phone number.
  • error.bookedseats=
  • Please enter for the seat the digit.
  • c%gBcgc*g9cgcC         $% 7                    !        '   'Tag-Libs HTML-Tag Internationalisierung  Xweb.xml action org.apache.struts.action.ActionServlet application ApplicationResources ...... JSP K  &     # & 4      !    H    oTag-Libs logic-Tag$  ,&Die "struts-logic" Tags werden verwendet, um Prsentationslogik in JSP zu implementieren, ohne  scriptlets zu verwenden. Mit Hilfe von "struts-logic" Tags kann man bedingten Textausgaben erzeugen, ber Objekt-Container navigieren und Kontrollfu  flow managment verwalten.  O   .   tO cpTag-Libs logic-Tag   $Diese "struts-logic" Tags sind in vier Teile aufgeteilt: Value Comparisons:  The purpose of these tags is to print out the body of the tag if the comparison evaluates to true equal <logic:equal name="testsForm" property= konferenz" value= JAX"> //do something </logic:equal> notEqual <logic:notEqual name="testsForm" property=" konferenz " value=" JAX "> //do something </logic:notEqual>V9  e  i   i     _h   ,   @&            | 0} 0!),Tag-Libs logic-Tag   Diese "struts-logic" Tags sind in vier Teile aufgeteilt: Value Comparisons: greaterEqual lessEqual greaterThan lessThan present notPresent 9  B      &     0LX! 0Yb" 0do# 0pxqTag-Libs logic-Tag    Substring Matching:  The purpose of these tags is to match substrings inside of other Strings match notMatch Presentation Location  The purpose of these tags is to change the location of the presentation page forward redirect Collection Utilities iterate 0ZL0Z0Z0ZP0Z0Z0Z 0ZLP      @     0`e 0fn 0 0 0rTag-Libs template-Tag   BDie "struts- template" Tags werden verwendet, um JSP-Templates zu erzeugen, die gemeinsames Format fr verschiedene JSP s Seiten definieren. insert  Inserts a template. Templates are JSP pages that include parameterized content. That content comes from put tags that are children of insert tags. put  Puts content into request scope get  Gets the content from request scope that was put there by a put tag w$K -: O *(  0 0-0 0TWtTag-Libs template-Tag    //Definieren eines Templates <%@ taglib uri='/WEB-INF/tlds/struts-template.tld' prefix='template' %> ... //Einbinden eines Templates <%@ taglib uri='/WEB-INF/tlds/struts-template.tld' prefix='template' %> <template:get name='title'/> ... d;  $ ' 1 : P             -Struts zur Laufzeit / View (($ ?Neues in Struts 1.1  Multiple Application Support: Mit einem ActionServlet knnen mehrere Struts-Applikationen bedient werden Request-Prozessor: Das ActionServlet leitet die Request-Behandlung an eine Instanz der RequestProcesser-Klasse, der in der Datei struts-config.xml definiert wirdL 3\   @Neues in Struts 1.1 1Deklaratives Exception-Handling: Die deprecated Methode perform wirft nur IOException und ServletException. Die neue Methode execute kann alle Exception werfen. Es wird in der Datei struts-config.xml festgelegt, wie das Framework auf die Exception reagieren soll. ... !)!  1Ax   d     &  ANeues in Struts 1.1 Validator: Der Validator erlaubt es, in Konfigurationsdateien Regeln zur berprfung der Gltigkeit von Formulareingaben zu definieren, ohne dass eine Validationslogik programmiert werden muss. Tiles>  6  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  B Bb  i     C/Struts Multikanalfhigkeit   0Struts Multikanalfhigkeit   1Struts Multikanalfhigkeit   5Struts Multikanalfhigkeit   |!Struts Multikanalfhigkeit Cocoon"  $ ~!Struts Multikanalfhigkeit Cocoon"  $ }!Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ 7Struts zur Laufzeit / View (($ Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  F Bb  i     C Struts & Multiprotokoll ((  Struts & Multiprotokoll (( Struts & Multiprotokoll( 4  3 3 3 3 p   Struts & Multiprotokoll(package org.apache.struts.action; public class SecActionMapping extends ActionMapping { protected boolean secure; public void setSecure(boolean b){ this.secure = b; } public boolean getSecure(){ return this.secure; } } d0f5   Struts & Multiprotokoll( action org.apache.struts.action.SecActionServlet config /WEB-INF/struts-config.xml mapping org.apache.struts.action.SecActionMapping http-port 8080 https-port 8443       #       "  #  $ !  !  f) !  (    "  !  !    f     f   f   r               Struts & Multiprotokoll(6public class SecureActionServlet extends ActionServlet { protected String httpPort = "80"; protected String httpsPort = "443"; public void init() throws ServletException { super.init(); initPorts(); } protected void process(HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { // Redirect to https/http if necessary. if( checkSsl(mapping, request, response) ){ return ; } super.process(request, response); }7 3  333Cf6  >      Struts & Multiprotokoll(Ypage import="test.ssl.*" %> <%@ taglib uri="/WEB-INF/sslext.tld" prefix="sslext"%> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
    This posts to a secure action.

    // This posts to a non-secure action This posts to a non-secure action.

    rZ'%)                  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  F F Bb  i     CVorteile von Struts  @Robust und fehlerarm: Dadurch, dass Struts  Open Source ist, wird der Quellcode immer wieder eingehend durchforstet, Fehler frhzeitig gefunden und behoben.< g,&g9Vorteile von Struts  6Sicherheit Da der Quellcode offen liegt, sind  Hintertren in Struts praktisch unmglich, da sie fr jeden ersichtlich wren, der den Code durcharbeitet.(  ?VVorteile von Struts  Literatur und Support Es gibt bereits eine groe Menge an Anleitungen, Artikel und Ratschlgen; der Support wird mit Hilfe von Mailinglisten abgewickelt Modifizierbar- und Erweiterbarkeit Der Struts-Code ist modifizierbar; dadurch knnen Fehler behoben werdenP#I#I, 5>Vorteile von Struts  Leicht Modifizierbar Ablauflogik wird externalisiert (xml-File) SEP durch die Trennung der Komponenten JSP-Designer brauchen keine Java-KenntnisseP,'-,'-,'[:Vorteile von Struts  Standard! kompatibel zur Sun J2EE Plattform basiert auf JSP&Servlet Technologie Anschaffungspreis Struts ist kostenlos Stndige Weiterentwicklung Fr sehr groe Anwendungen geeignetb F? F?,<NNachteile von Struts  "Fehlende Produktverantwortlichkeit Bei  Open Source -Projekten gibt es keinen Produktverantwortlichen. Es haftet somit niemand fr einen eventuell entstandenen Schaden aufgrund des fehlerhaften Produkts. Lngere Einarbeitungszeit Die Struts Tag-Libs sind relativ komplex.b#+# +>-;Nachteile von Struts  Keine offizielle Supportstelle Zu einem Produkt wird vom Hersteller meist ein teurer Support angeboten; das ist bei Open Source-Software nicht blich. Noch kein Standard Wird nach der Einfhrung von JSF nicht mehr weiterentwickelt?Py?y?yjNachteile von Struts  Releaseplanung schwer mglich Die Behebung von Fehlern bzw. die Implementierung von neuen Funktionalitten kann zeitlich nicht festgelegt werden, da  Open Source -Projekte schlecht planbar sind.($"<Nachteile von Struts  TZugriff in der Methode perform der Klasse Action auf xxxResponse und xxxRequest Objekte. Bietet die Mglichkeit Objekte in die Session zu stellen. public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {& }( bccc g3 cg3 ccg3 cc   E                  $ 0% 0& 0Nachteile von Struts  3Struts kennt keine Dialoge, sondern nur Aktionen. J( ( c.Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  F F Ff  i     ChDie Architektur der Anwendung  Fliegen in der Nacht 55b$ =hDie Architektur der Anwendung  Fliegen in der Nacht 55b$ >hDie Architektur der Anwendung  Fliegen in der Nacht 55b$ hDie Architektur der Anwendung  Fliegen in der Nacht 55b$  LiteraturStruts User Guide, Struts API Documentation: http://www.jakarta.apache.org/struts Muhammet ztrk : Fliegen in der Nacht, Jaxmagazin 4/2002, page 48 http://www.javamagazin.de/ Boost Struts with XSLT and XML http://www.javaworld.com/javaworld/jw-02-2002/jw-0201-strutsxslt.html Mix protocols transparently in Struts http://www.javaworld.com/javaworld/jw-05-2002/jw-0510-struts.html StrutsCX: Struts ohne JSP - aber mit XSLT http://www.devx.com/Java/Article/11381 x-&DG'C*),  $  A =& 0.R 0 0 0A 0 (Danke fr Ihre Aufmerksamkeit! FRAGEN ?. )*/"()*,.f   !"& (!."2#3$4%6&8( ` ̙33` ` ff3333f` 333MMM` f` f` 3>?" dd@,t?dd@  @` n?" dd@   @@``PT   @ ` `$p>> 6(    < "Ttm  JTitel Folienmaster   68 "|Oo   > Folienmaster Textstil 2. Ebene 3. Ebene 4. Ebene 5. Ebene    ?   xA6޽h ?C:\WINDOWS\Desktop\jax.tif 333 MasterJAX20039   @1(    <} "E d } a-Klicken Sie, um das Titelformat zu bearbeiten. .  6(} "2E   } r>Klicken Sie, um das Format des Untertitelmasters zu bearbeiten? ?  xA6޽h ?C:\WINDOWS\Desktop\jax.tif 333 0 `p((  p p 0`* P    P*   p 0.     R*  d p c $ ?  4 p 0l1  @  pKlicken Sie, um die Formate des Vorlagentextes zu bearbeiten Zweite Ebene Dritte Ebene Vierte Ebene Fnfte Ebene=     q p 65 `P   P*   p 6p; `   R*  H p 0޽h ? ̙33f  0(    c $}E <$D  0 }   s *}2E  <$  0 } |  < ?"p{ *,$D  0 DDipl. -Ing. (M.E.) Muhammet ztrk IT-Architekt, W&W Informatik GmbHLE 23 *  A޽h ?C:\Eigene Dateien\PowerPoint\BASTA2002_2\Ressourcen\BG_intro.jpg ̙33    T*(  Tx T c $`_Ppp  _ r T S _@`  _ H T 0޽h ?    p  G(  8   P   NL _3f?  cJ2EE/.Net/SAP/... \  C x _ж1? 0,$ 0 xPersistence Tier   hh88r  S T_Tt  _ H  0޽h ? h   `  (  8    P   N4^3f?  cJ2EE/.Net/SAP/... Y  C x8^ж$1? ,$ 0 u Business Tier   hh88\  C x8_ж1? 0,$ 0 xPersistence Tier   hh88r  S _Tt  _ H  0޽h ?    }uP   (  [8    P   Np^3f?  cJ2EE/.Net/SAP/... Y  C x^ж$1? ,$ 0 u Business Tier   hh88]  C x^ж1?,$ 0 yPresentation Tier   hh88\  C x^ж1? 0,$ 0 xPersistence Tier   hh88r  S ^Tt  ^ H  0޽h ?    @ G(    T^3f?P  cJ2EE/.Net/SAP/... W  S ~^ж$1?n ,$ 0 u Business Tier   hh88[  S ~^ж1?n ,$ 0 yPresentation Tier   hh88Z  S ~^ж1?n 0 ,$ 0 xPersistence Tier   hh88r  S H^Ttm  ^   B ^< @    <^qX \Tiers (logische Sicht)*H  0޽h ? =   0 0 i(    TT^3f?P  cJ2EE/.Net/SAP/... c  s $Y^1?L|,$ 0 u Applikation     hh88e  s `^1?DQ ,$ 0 w Standard APIs P  hh88u  s Li^$1?n Q ,$ 0 System-umgebung P    hh88[  s lp^L1? L ,$ 0 mBasis   hh88W  S ~x^ж$1?n ,$ 0 u Business Tier   hh88[  S ~^ж1?n ,$ 0 yPresentation Tier   hh88Z  S ~d^ж1?n 0 ,$ 0 xPersistence Tier   hh88  Ht^< @  ^  6&    H^o  xLayers (technisch Sicht)*  B(^qX \Tiers (logische Sicht)*r  S (^Ttm  ^ H  0޽h ?     X6(  X~ X s *K^Ttm  ^ x X c $lL^@`  ^ H X 0޽h ?     '(  ]  c ^1?L|,$ 0 u Applikation     hh88_  c $^1?DQ ,$ 0 w Standard APIs P  hh88o  c ^$1?n Q ,$ 0 System-umgebung P    hh88U  c <^L1? L ,$ 0 mBasis   hh88Q  C x^ж$1?n ,$ 0 u Business Tier   hh88T   C x&^ж1?n 0 ,$ 0 xPersistence Tier   hh88   BL/^< @  X   0&     B\2^o  xLayers (technisch Sicht)*   <7^qX \Tiers (logische Sicht)*x  c $9^Tt@  ^   N8=^3f?P  cJ2EE/.Net/SAP/... U  C x|A^ж1?n ,$ 0 yPresentation Tier   hh88H  0޽h ? 8    $x(  x  c $l]Tt  ] 8 ` $ i   N]3f?` Model: definiert die Datenstruktur der Anwendung, speichert die Daten und stellt Methoden zur nderung der Daten zur Verfgung.D}bfbb   ]G^v2? 0<P  9ModelH  0޽h ?    |t , (  , ,  $]G^v2? 0<P   5Model+ , N ]3f?   View: stellt die Daten des Models auf dem Bildschirm darstellt, Benutzer fhrt auf der View die Aktionen aus. (die Aktionen werden durch den Controller an das Model weitergeleitet) |*"/J# bpbIbb,#Y]~ , s *]Tt  ]  ,  \]G^v2? 0<P RViewH , 0޽h ?    E= 0(  0 0  \]G^v2? 0<P NView 0  L]G^v2? 0<P   5Model 0 N]3f?  n Controller: reagiert auf die Interaktionen der Anwender/-in der View berprft die Benutzereingabe und ruft die jeweilige Methode des Models auf. n!r " bbb,FT~ 0 s *X]Tt  ]  0  H]G^v2? 0<P  > Controller  H 0 0޽h ?      4&(  4 4 N]3f?  : ~ 4 s *,]Tt  ]  4  ]G^v2? 0<P NView 4  ,]G^v2? 0<P   5Model 4  ]G^v2? 0<P  : Controller  XB 4 0D>ppXB  4 0D>` @`   4 <d] ;  Uhat Referenz auf (H 4 0޽h ?    PH  8(  8 8 Nh]3f?  : ~ 8 s *]Tt  ]  8  ̕]G^v2? 0<P NView 8  ]G^v2? 0<P   5Model 8  ]G^v2? 0<P  : Controller  XB 8 0D>ppXB 8 0D>p 00 p RB  8 s *D>00p XB  8 0D>` @`   8 <] ;  Uhat Referenz auf (H 8 0޽h ? Z      <(  < < N{]3f?  : ~ < s *|]Tt  ]  <  t]G^v2? 0<P NView <  ]G^v2? 0<P   5Model <  X]G^v2? 0<P  : Controller  XB < 0D>ppXB < 0D>p 00 p RB  < s *D>00p XB  < 0D>p p RB  < s *D>p XB < 0D>` @`  < <] ;  Uhat Referenz auf (H < 0޽h ?       @Y (  @ @ N[]3f?  : ~ @ s *\]Tt  ]  @  8T]G^v2? 0<P NView @  4b]G^v2? 0<P   5Model @  e]G^v2? 0<P  : Controller  XB @ 0D>ppXB @ 0D>p 00 p RB  @ s *D>00p XB  @ 0D>p p RB  @ s *D>p ^B  @ 6D>` XB  @ 0D>` `  @ <Hj]p [j  Vnotify() XB @ 0D>` @`  @ <8]] ;  Uhat Referenz auf (^B @ 6D> @  @ <r] M  Usendet Nachricht (H @ 0޽h ? I      L (  L L N5]3f?  : ~ L s *6]Tt  ]  L  \9]G^v2? 0<P NView L  <]G^v2? 0<P   5Model L  ?]G^v2? 0<P  : Controller  XB L 0D>ppXB L 0D>p 00 p RB  L s *D>00p XB  L 0D>p p RB  L s *D>p ^B  L 6D>` XB  L 0D>` `  L <D]p [j  Vnotify() ^B L 6D> L <LI]   Vaction() XB L 0D>` @`  L <M] ;  Uhat Referenz auf ( L <R] M  Usendet Nachricht (^B L 6D> @ H L 0޽h ?     P<(  Px P c $\-]Tt  ]  P  0.] |Oo  ] H P 0޽h ?    p H(  ~  s *0&]Tt  ]    6&] |Oo  ] H  0޽h ?    ` \6(  \~ \ s *[Ttm  [ x \ c $[@`  [ H \ 0޽h ?    3+P D(  D D N<[3f?  APrsentation Tier~ D s *L[Tt  [  D  [G^v2? 0<P   NView D  [G^v2? 0<PP P  5Model D  [G^v2? 0<P    : Controller  XB D 0D>XB D 0D> 00 RB  D s *D> 00 XB  D 0D>  RB  D s *D>  ^B  D 6D>  XB  D 0D>   D <] [  Vnotify() ^B D 6D> D <]   Vaction() XB D 0D> @  D <$ ] ;  Uhat Referenz auf (XB D 0D>F @F  D <X ] M  Usendet Nachricht ( D 6p]@ ; Web Browser   D 6H]  : Web Server   D 68]   :  D <P] 0  HTTPRB D@ s *D3>pp RB D s *D3>pp H D 0޽h ?    @ l0(  lx l c $[Tt  [ x l c $[Oo  [ H l 0޽h ?    0 $`7(  `I ` # lX[ж1? P ,$ 0 yPresentation Tier   hh88XB #` 0D) N ` 3 rؕ[ж1?`P ,$ 0 xPersistence Tier   hh88K ` 3 r[ж$1? P ,$ 0 u Business Tier   hh88~ ` s *`[Ttm  [  ` C xLܦ[?0<PP@`  7Browser ` # l[?0<PP  : Web Server   ` # l[?0<PP   ; App. Server  B  ` N<[XX?   9 Datenbank  XB  ` 0D>`2  ` 6[00  3EJB2  ` 6[p  3EJB2  ` 6t[` 0  3EJB" ` 0[` `  UServlet^B ` 6D>` 0 XB ` 0D>` ^B ` 6D> `  ` 0[4 U Request 1  ` <[$  32 ` <[@  33 ` <|[ D  34 ` <[   < Response 5 " ` 0[ `  TSevlet:  ` <[ 0  out.println( <HTML><HEAD> ); out.println( <TITLE> Strutst</TITLE>  ); if(bobject!=null){ for(;;;) } out.println( <BODY></BODY>  );     dB !` <D>p ` p dB "` <D>`   XB $` 0D> 0 H ` 0޽h ? E    d(  dI d # l@8[ж1? P ,$ 0 yPresentation Tier   hh88XB d 0D) N d 3 rA[ж1?`P ,$ 0 xPersistence Tier   hh88K d 3 rE[ж$1? P ,$ 0 u Business Tier   hh88~ d s *F[Ttm  [  d C xLxH[?0<PP@`  7Browser d # ltO[?0<PP  : Web Server   d # lS[?0<PP   ; App. Server  B  d NtW[XX?   9 Datenbank  XB  d 0D>`2  d 6p[[00  3EJB2  d 6P[p  3EJB2  d 68b[` 0  3EJB" d 0Le[` @ UServletXB d 0D>` 0 XB d 0D>` ^B d 6D> ` XB d@ 0D>p 0p  d 0j[4 U Request 1  d <m[$  32 d <0q[@  33 d <xt[ D  34 d <w[ pp  < Response 5 " d 0{[ `  7JSP d <][0C  if(bobject!=null){ for(;;;) }!! 6 dB d <D>p ` p dB d <D>@   7 d <[   O Strutst <% new Date().toString() %> PP > dB d <D> ` H d 0޽h ?     \6(  \~ \ s *P/[Ttm  [ x \ c $ 0[@`  [ H \ 0޽h ?     6(  ~  s *|'[Ttm  [ x  c $8([@`  [ H  0޽h ?     `6(  `~ ` s *[Ttm  [ x ` c $<[@`  [ H ` 0޽h ?     6(  x  c $[Ttm  [ ~  s *8[|OB [ H  0޽h ?     X*(  Xx X c $t[Ttm  [ r X S 0[@`i  [ H X 0޽h ?     S K  (  I  # lZж1? P ,$ 0 yPresentation Tier   hh88XB  0D)PP ~  s *ZzTt  Z   C xL\Z?0<PP  7Browser  # lTZ?0<PP.  : Web Server  XB  0D>  04Z$ U Request 1 T  C x,Zж1?kP ,$ 0 xPersistence Tier   hh88Q  C xZж$1? P ,$ 0 u Business Tier   hh88  3 rZ?0<PPX   = App. Server  B  T[XX?   ; Datenbank  2  <T[0) 3EJB2  <[ b  3EJB2  < [` U  3EJB.   l[G^v2?)0<P hController Servlet H  0޽h ?      0(   x   c $ZTtm  Z x   c $Z|Oo  Z H   0޽h ?     <(  ~  s *N   3 rZж1?kP ,$ 0 xPersistence Tier   hh88K   3 rZж$1? P ,$ 0 u Business Tier   hh88   # l`Z?0<PPX   = App. Server  B   NZXX?   ; Datenbank  2   6Z0) 3EJB2  6Z b  3EJB2  6dZ` U  3EJB.   ܺZG^v2?)0<P hController Servlet   0DZ4 dAufruf B.Logic 2   0Z $ U Request 1 ^B  6D>H  0޽h ? e     (  I  # lEZж1? P ,$ 0 yPresentation Tier   hh88XB  0D)PP ~  s *$GZzTt  Z   C xLOZ?0<PP  7Browser  # lRZ?0<PP.  : Web Server  XB  0D>N  3 rVZж1?kP ,$ 0 xPersistence Tier   hh88K  3 r_Zж$1? P ,$ 0 u Business Tier   hh88  # lhZ?0<PPX   = App. Server  B  NkZXX?   ; Datenbank  2  6oZ0) 3EJB2  6drZ b  3EJB2  6LvZ` U  3EJBXB  0D>` ^B  6D> 2 .   yZG^v2?)0<P hController Servlet ^B  6D>  0~Z4 dAufruf B.Logic 2   0LZ $ U Request 1 H  0޽h ?    p A(  I  # lZж1? P ,$ 0 yPresentation Tier   hh88XB  0D)PP ~  s *HZzTt  Z   C xLZ?0<PP  7Browser  # l Z?0<PP.  : Web Server  XB  0D>N  3 rpZж1?kP ,$ 0 xPersistence Tier   hh88K  3 rZж$1? P ,$ 0 u Business Tier   hh88  # l Z?0<PPX   = App. Server  B  N!ZXX?   ; Datenbank  2  6&Z0) 3EJB2  6(Z b  3EJB2  6,Z` U  3EJBXB  0D>` ^B  6D> 2 .   ,1ZG^v2?)0<P hController Servlet ,   4ZG^v2?)0<P@  fModel Java Beans   0H9Z4 dAufruf B.Logic 2 RB  s *D>P XB  0D>P P @  0bY4 FErzeugen/Set Model 3^B  6D>  0=Z $ U Request 1 H  0޽h ?    ` $0(  $x $ c $YTtm  Y x $ c $DY|Oo Y H $ 0޽h ?    P <(  ~  s *TYTtm  Y ~  s *lY|Oo/  Y H  0޽h ? H   @ (  I  # lYж1? P ,$ 0 yPresentation Tier   hh88XB  0D)PP ~  s *ܞYzTt  Y   C xLY?0<PP  7Browser  # lШY?0<PP.  : Web Server  XB  0D>N  3 rYж1?kP ,$ 0 xPersistence Tier   hh88K  3 r@Yж$1? P ,$ 0 u Business Tier   hh88  # l4Y?0<PPX   = App. Server  B  NYXX?   ; Datenbank  2  6 Y0) 3EJB2  68Y b  3EJB2  6 Y` U  3EJBXB  0D>` ^B  6D> 2 .   YG^v2?)0<P hController Servlet ,   8YG^v2?)0<P@  fModel Java Beans   04Y4 dAufruf B.Logic 2 RB  s *D>P XB  0D>P P @  0Y4 FErzeugen/Set Model 3    YG^v2?)0<P   VView JSP  XB @ 0D>PP   6Y` D  U forward 4 ^B  6D>  0HY $ U Request 1 H  0޽h ?    0 (0(  (x ( c $\YTtm  Y x ( c $Y|Oo  Y H ( 0޽h ?     <(  ~  s *XYTtm  Y ~  s *Y|Oo  Y H  0޽h ?      (  I  # l6Yж1? P ,$ 0 yPresentation Tier   hh88XB  0D)PP ~  s *7YzTt  Y   C xL?Y?0<PP  7Browser  # lBY?0<PP.  : Web Server  XB  0D>N  3 rTGYж1?kP ,$ 0 xPersistence Tier   hh88K  3 rOYж$1? P ,$ 0 u Business Tier   hh88  # lpXY?0<PPX   = App. Server  B  N8\YXX?   ; Datenbank  2  6_Y0) 3EJB2  6|cY b  3EJB2  6fY` U  3EJBXB  0D>` ^B  6D> 2 .   P XB  0D>P P @  0wY4 FErzeugen/Set Model 3   {YG^v2?)0<P   VView JSP  XB @ 0D>PP   6LY` D  U forward 4 XB @ 0D> P P  RB  s *D> P    0ԃY |  qExtract/Gets data 5$ ^B  6D>  08Y $ U Request 1 H  0޽h ?      " (  I  # l,Wж1? P ,$ 0 yPresentation Tier   hh88XB  0D)PP ~  s *|WzTt  W   C xLPW?0<PP  7Browser  # l8W?0<PP.  : Web Server  XB  0D>N  3 rlWж1?kP ,$ 0 xPersistence Tier   hh88K  3 rWж$1? P ,$ 0 u Business Tier   hh88  # lW?0<PPX   = App. Server  B  NYXX?   ; Datenbank  2  6$Y0) 3EJB2  6Y b  3EJB2  6 Y` U  3EJBXB  0D>` ^B  6D> 2 .   YG^v2?)0<P hController Servlet ,   YG^v2?)0<P@  fModel Java Beans   0 Y4 dAufruf B.Logic 2 RB  s *D>P XB  0D>P P @  0Y4 FErzeugen/Set Model 3   YG^v2?)0<P   VView JSP  XB @ 0D>PP   6 "Y` D  U forward 4 XB @ 0D> P P  RB  s *D> P    0&Y |  qExtract/Gets data 5$ XB @ 0D>    0*YZ `  = Response 6 ^B ! 6D> " 0@/Y $ U Request 1 H  0޽h ?    d6(  d~ d s *xWTtm  W x d c $4W@`  W H d 0޽h ?    0(  x  c $WTtm  W x  c $0W|Oo~  W H  0޽h ? m   (  ~  s *rWTtm  W   THuW3f?DY  :   C xtWd @? P  @ 2L  P  # " p   3 r${Wd @? P `  B Action Form     3 rh|Wd @?P   B Action Form     3 rWd @?  @ B Action Form     3 r8Wd @?p  P Action Form (  L   # "     3 rW̙d @? `  gAction Servlet   3 rW̙d @?P  gAction Servlet   3 rW̙d @?@ p gAction Servlet   3 rW̙d @?  9JSP    C xW̙vd @? P  xCustom Tag Libraries $   C x6(    3 rUd @? P  @ 2L  P  # " p   3 rPUd @? P `  B Action Form     3 rUd @?P   B Action Form     3 rVd @?  @ B Action Form      3 rVd @?p  P Action Form (  L    # "     3 r@ V̙d @? `  gAction Servlet   3 rU̙d @?P  gAction Servlet   3 r<V̙d @?@ p gAction Servlet  3 r(V̙d @?  9JSP  3 rV̙vd @? P  xCustom Tag Libraries $    3 rVd @?m gAction ServletL ` p #  pT  3 rTVd @?` P =Action   3 rt#Vd @? 0 =Action   3 r%Vd @?  =Action   3 r )Vd @? @p KAction (+  3 r -Vd @?0  struts-config.xml 6~  s *0VTtZ  V   N\3V3f?DY  : XB  0D   C xL6V?0<PD3  7BrowserW  3 r:Vж$1?DY ,$ 0  Business Tier&    hh88  3 rBVd @? cweb.xml XB  0D>EP  <TFVpP Vread 11  N$JV ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "H  0޽h ?    p6(  x  c $UTtm  U ~  s *hU|O0  U H  0޽h ?    me`(  x  c $UTtm  U x  c $U|Oog  U   BU3p`@ SEorg.apache.struts.action.ActionServletRF( &   H  0޽h ? }   -%PH(  H~ H s *(UTtm  U ~ H s *U|Oog  U y H BxU3p@ /ApplicationResourcesR0(    bH H 0޽h ?    WO@L(  L~ L s *UTtm  U ~ L s *\U|Oog  U  L BU3p `  15/WEB-INF/struts-config.xmlR6(     H L 0޽h ? B   0(  x  c $$UTtm  U x  c $U|Oo  U J  BU3pp   *.doD!(PH  0޽h ? y   )!  (   ~   s *UTtm  U ~   s *TU|Oo  U u   B U3p 0P  ' index.jspD(( tH   0޽h ?    ~vT(  T~ T s *}UTtm  U ~ T s *@~U|Oo  U G T BrU3pP0p ]/WEB-INF/app.tld /WEB-INF/app.tldt* 40Z   { T B U3p @  o /WEB-INF/struts-bean.tld /WEB-INF/struts-bean.tldrp     H T 0޽h ?     !$<(  $ $ 3 r8Ud @? P  @ 2L  P  $# " p  $ 3 rUd @? P `  B Action Form    $ 3 r"Ud @?P   B Action Form    $ 3 r&Ud @?  @ B Action Form    $ 3 r*Ud @?p  P Action Form (  L   $# "    $ 3 rD U̙d @? `  gAction Servlet  $ 3 r1U̙d @?P  gAction Servlet  $ 3 r\3U̙d @?@ p gAction Servlet  $ 3 r:U̙d @?  9JSP  $ 3 r=U̙vd @? P  xCustom Tag Libraries $ L ` p $#  pT $ 3 r0BUd @?` P =Action  $ 3 r@Ud @? 0 =Action  $ 3 rHUd @?  =Action  $ 3 r`KUd @? @p KAction (+ $ 3 rOUd @?0  struts-config.xml 6~ $ s *EP $ <LhUpP Vread 11 $ N0  $ 3 rqUd @?m gAction ServletXB !$ 0D>00 $ <vU0 @ erzeugen 2 H $ 0޽h ?    0(  x  c $lUTtm  U x  c $(U|Oo  U H  0޽h ? &   "",f(  , , 3 rRd @? P  @ 2L  P  ,# " p  , 3 rȰRd @? P `  B Action Form    , 3 rRd @?P   B Action Form    , 3 rRd @?  @ B Action Form    , 3 rRd @?p  P Action Form (  L   ,# "    , 3 rR̙d @? `  gAction Servlet  , 3 rR̙d @?P  gAction Servlet  , 3 rR̙d @?@ p gAction Servlet  , 3 r`R̙d @?  9JSP  , 3 rR̙vd @? P  xCustom Tag Libraries $ L ` p ,#  pT , 3 rPRd @?` P =Action  , 3 r0Rd @? 0 =Action  , 3 rLRd @?  =Action  , 3 rRd @? @p KAction (~ , s *tRTtZ  R  , N R3f?0E  : XB , 0D  , C xLpR?0<PD3  7BrowserW , 3 rhRж$1?DY ,$ 0  Business Tier&    hh88 , 3 rRd @? cweb.xml XB , 0D>EP , < RpP Vread 11 , N\R ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "RB , s *D>0  , 3 r$Ud @?m gAction ServletXB  , 0D>00XB !,@ 0D>C  ", <tU" ` Vread 3 , <\U0 @ erzeugen 2 + , 3 rh Ud @?0  struts-config.xml 6H , 0޽h ?    <(  ~  s *`RTtm  R ~  s *R|Ooa  R H  0޽h ?    $Z(  $x $ c $ЋRTtm  R ~ $ s *R|O  R  $ BR3p   <form-beans> <form-bean name="formModel type="com.oisoft.view.form.FormModel"/> </form-beans> 0ZY    ? 3    3       H $ 0޽h ? H   \(  \~ \ s *8wRTtm  R ~ \ s *wR|Oo[  R D \ B(yR3p0p@ \ ] ?3*3   H \ 0޽h ? S   `(  `~ ` s *PPRTtm  R ~ ` s * QR|Oo  R O ` BXR3p@   4  ?3 *3( *3  *3  *3?3 *3   H ` 0޽h ?    (0(  (x ( c $HRTtm  R x ( c $IROo  R H ( 0޽h ?    :2((  ~  s *QTt  Q B  64QP@{   ... <action path="/bookingAction" type="com.oisoft.view.action.BookingAction" name="formModel" scope="session" input="/ListFlightPlan.jsp"> <forward name="success" path="/Booking.jsp"/> <forward name= failed" path="/Fehler.jsp"/> </action> 0Z2   ? 3   * 3 '  * 3   * 3   * 3    ? 3   * 3    ? 3   * 3    *            8 0` (0`   0Q;m@J ^ActionMappings(2  0$R;m0J@ ] ActionServlet(2 fB  6D @@  0R;m@I XActionMappings 2  0R;mSp XActionMappings 2  0tR;m  XActionMappings 2   0,R;m`0h ] ActionMapping(2 fB   6D    <Rl  31   <$RL   31   <pRC 50,n  <RU 31  0R;mpp @  `ActionForwards(2  0 "R;mp @n  XActionMappings 2  0L&R;mz   XActionMappings 2  0x*R;m0 / XActionMappings 2  0-R;m: ` _ ActionForward(2 fB  6D @ @&   <1Rh ;  50,n  <84RL {  31fB  6D @@@`   <8R|8(  31  <;R,  31  00>R;m  t [ xxxAction (2  fB B 6D  `  <?R H  31   <8CR \ 31H  0޽h ?    p <%(  <~ < s *8QTt  Q B < 6;QP@{   ... <action path="/bookingAction" type="com.oisoft.view.action.BookingAction" name="formModel" scope="session" input="/ListFlightPlan.jsp"> <forward name="success" path="/Booking.jsp"/> <forward name= failed" path="/Fehler.jsp"/> </action> 0Z2   ? 3   * 3 '  * 3   * 3   * 3    ? 3   * 3    ? 3   * 3    *             < 6xcQm@@u ^ActionMappings(2 < 6fQ;m@0@u ] ActionServlet(2 dB < <D @@ < 6jQm@ XActionMappings 2  < 6oQmp9 XActionMappings 2  < 6rQm] XActionMappings 2  < 6uQm`0 ] ActionMapping(2 dB  < <D Z  < ByQl  31 < B}QL  31 < BLQ  50,n < B܃Q] 31 < 6܆Q;mp@  `ActionForwards(2 < 60Z2   ? 3   * 3 '  * 3   * 3   * 3           H < 0޽h ? z   *"` @(  @~ @ s *PTt  P B @ 6TPP@{   ... <action path="/bookingAction" type="com.oisoft.view.action.BookingAction" name="formModel" scope="session" input="/ListFlightPlan.jsp"> <forward name="success" path="/Booking.jsp"/> <forward name= failed" path="/Fehler.jsp"/> </action> 0Z2   ? 3   * 3 '  * 3   * 3   * 3    ? 3   * 3    ? 3   * 3    *             @ 6|P;m@@u ^ActionMappings(2 @ 6P;m@0@u ] ActionServlet(2 dB @ <D @@ @ 68P;m@ XActionMappings 2  @ 6TP;mp9 XActionMappings 2  @ 6P;m] XActionMappings 2  @ 6dP;m`0 ] ActionMapping(2 dB  @ <D Z  @ BPl  31 @ BPL  31 @ BLP  50,n @ BP] 31 @ 6Pmp@  `ActionForwards(2 @ 6 <forward name= failed" path="/Fehler.jsp"/>d\0Z2   ? 3   * 3    ? 3   * 3      H @ 0޽h ? :   P$$Dz(  D D 3 r(?Pd @? P  @ 2L  P  D# " p  D 3 r,2Pd @? P `  B Action Form    D 3 rEPd @?P   B Action Form    D 3 rIPd @?  @ B Action Form    D 3 rMPd @?p  P Action Form (  L   D# "    D 3 rPP̙d @? `  gAction Servlet  D 3 rTP̙d @?P  gAction Servlet  D 3 rlYP̙d @?@ p gAction Servlet  D 3 r^P̙d @?  9JSP  D 3 r\aP̙vd @? P  xCustom Tag Libraries $ ~ D s *8]PTtZ  P  D N@fP3f?0E  : XB D 0D  D C xLiP?0<PD3  7BrowserW D 3 rlPж$1?DY ,$ 0  Business Tier&    hh88 D 3 rvPd @? cweb.xml XB D 0D>EP D <TzPpP Vread 11 D N}P ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "RB D s *D>0  D 3 r؃Pd @?m gAction ServletXB D 0D>00XB D@ 0D>C   D <P" ` Vread 3 !D <P0 @ erzeugen 2 + "D 3 rPd @?0  struts-config.xml 6XB #D 0D>` ` $D <Pc p @ erzeugen 4 L ` p D#  pT D 3 rPd @?` P =Action  D 3 r Pd @? 0 =Action  D 3 r̠Pd @?  =Action  D 3 r@Pd @? @p KAction (H D 0޽h ?    @ 8(  x  c $<%PTt  P   <%P q  P o  B,'P3p @ )type="com.oisoft.view.action.QueryAction"D*0Z2 3 % l q  B/P3p `  +type="com.oisoft.view.action.BookingAction"D,0Z2 3 ' l H  0޽h ?    0l6(  l~ l s *PTtm  P x l c $pP@`  P H l 0޽h ?    _W L(  L L 3 rDNd @? P  @ 2L  P  L# " p  L 3 rNd @? P `  B Action Form    L 3 rNd @?P   B Action Form    L 3 rNd @?  @ B Action Form    L 3 rNd @?p  P Action Form (  L   L# "    L 3 rlN̙d @? `  gAction Servlet  L 3 r$N̙d @?P  gAction Servlet  L 3 r,N̙d @?@ p gAction Servlet  L 3 rXN̙d @?  9JSP  L 3 rN̙vd @? P  xCustom Tag Libraries $ L ` p L#  pT L 3 rNd @?` P =Action  L 3 rNd @? 0 =Action  L 3 rNd @?  =Action  L 3 rNd @? @p KAction (~ L s *NTtZ  N  L NN3f?0E  : XB L 0D  L C xLN?0<PD3  7BrowserW L 3 rPж$1?DY ,$ 0  Business Tier&    hh88 L 3 rPd @? cweb.xml 1 L N P ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B L 6D>@@ L <P@ qxx.do request 1$  L 3 rPd @?m gAction Servlet+ L 3 rPd @?0  struts-config.xml 6H L 0޽h ? O   <(  <x < c $DNTtm  N x < c $N|Oo N W < BN3p0  *.doR ( PH < 0޽h ?    <(  ~  s *ܨNTtm  N ~  s *N|Oo N H  0޽h ?    x6(  x~ x s *TNTtm  N x x c $N@`  N H x 0޽h ? 6   v(  x  c $`NTtZ  N X  0A?` ^2  63m H  0޽h ?    C(  ~  s *NTtm  N x  c $|N@  N H  BN3pP@  *.doB!    P  BN3p0@ CEorg.apache.struts.action.ActionServletBF & H  0޽h ?    91!!T(  T T 3 r+Nd @? P  @ L   T# "    T 3 rts̙d @? `  gAction Servlet  T 3 r}̙d @?P  gAction Servlet  T 3 r0/N̙d @?@ p gAction Servlet  T 3 r2N̙d @?  9JSP  T 3 r5N̙vd @? P  xCustom Tag Libraries $ L ` p T#  pT T 3 r:Nd @?` P =Action  T 3 r=Nd @? 0 =Action  T 3 r@Nd @?  =Action  T 3 r@@ T <bN@ qxx.do request 1$  T 3 rfNd @?m gAction Servlet+ T 3 rkNd @?0  struts-config.xml 6XB T 0D>@p p ^B T 6D> p  XB  T 0D>@p @ !T <pN0 @ @ erzeugen 2 2L  P  T# " p  T 3 rtNd @? P `  B Action Form    T 3 rxNd @?P   B Action Form    T 3 ryNd @?  @ B Action Form    T 3 rNd @?p  P Action Form (  H T 0޽h ?    =5@(  @x @ c $NTt@  N x @ c $DN|Oo  N   @ BxN3p`  P  name="formModel"@3 $  @ B<~3p0p CD ?3 *3    ^B @ 6D3Ԕ@` ` ` H @ 0޽h ?    \<(  \~ \ s * NTtm  N ~ \ s *<N|OoT  N H \ 0޽h ?    0(  x  c $NTtm  N x  c $4N|Oo<  N H  0޽h ?    <(  ~  s *Tt@   ~  s *`|Oo^  H  0޽h ?    pF(  x  c $DLTtm  L   c $L|Oo L "P@08XH  0޽h ?    `R(  ~  s *LTt.  L   s *L|Oo  L "p`PpH  0޽h ?    PR(  ~  s *LTt-  L   s *LcOo  L "p`PpH  0޽h ?    @*(  x  c $ĭLTtm  L r  S L@` L H  0޽h ? a    0%%d(  d d 3 rdMLd @? P  @ L   d# "   d 3 r)~̙d @? `  gAction Servlet d 3 r~̙d @?P  gAction Servlet d 3 rOL̙d @?@ p gAction Servlet d 3 rSL̙d @?  9JSP d 3 r8WL̙vd @? P  xCustom Tag Libraries $ L ` p  d#  pT  d 3 r[Ld @?` P =Action   d 3 rRLd @? 0 =Action   d 3 raLd @?  =Action   d 3 reLd @? @p KAction (~ d s *fLTtZ  L  d NjL3f?0E  : XB d 0D  d C xLmL?0<PD3  7BrowserW d 3 rpLж$1?DY ,$ 0  Business Tier&    hh88 d 3 rzLd @? cweb.xml 1 d N}L ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B d 6D>@@ d <dL@ qxx.do request 1$  d 3 rLd @?m gAction Servlet+ d 3 rLd @?0  struts-config.xml 6XB d 0D>@p p ^B d 6D> p  XB d 0D>@p @ d <L0 @ @ erzeugen 2 2L  P  d# " p  d 3 rLd @? P `  B Action Form    d 3 rLd @?P   B Action Form     d 3 rLd @?  @ B Action Form    !d 3 r0Ld @?p  P Action Form (  XB "d 0D> ^B #d 6D>  XB $d 0D>  %d <Lp]  >setzen 3 H d 0޽h ?     R(  ~  s *:LTtm  L   s *EL|Oo  L "P@08XH  0޽h ?    lR(  l~ l s *.LTtm  L  l s *6L|Oo  L "p`PpH l 0޽h ?    R(  ~  s *LTtm  L   s *L|Oo%  L "p`PpH  0޽h ?    p6(  p~ p s *|LTtm  L x p c $8L@`  L H p 0޽h ?    /'''p(  p p 3 rKd @? P  @ L   p# "   p 3 r~̙d @? `  gAction Servlet p 3 rK̙d @?P  gAction Servlet p 3 rK̙d @?@ p gAction Servlet p 3 rHK̙d @?  9JSP p 3 rK̙vd @? P  xCustom Tag Libraries $ ~ p s *KTtZ  K  p NhK3f?0E  : XB p 0D  p C xLK?0<PD3  7BrowserW p 3 rt~ж$1?DY ,$ 0  Business Tier&    hh88 p 3 rKd @? cweb.xml 1 p NK ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B p 6D>@@ p <$K@ qxx.do request 1$  p 3 rKd @?m gAction Servlet+ p 3 rKd @?0  struts-config.xml 6XB p 0D>@p p ^B p 6D> p  XB p 0D>@p @ p <K0 @ @ erzeugen 2 2L  P  p# " p  p 3 rKd @? P `  B Action Form    p 3 rKd @?P   B Action Form     p 3 r,Kd @?  @ B Action Form    !p 3 rKd @?p  P Action Form (  XB "p 0D> ^B #p 6D>  XB $p 0D>  %p <8Kp]  >setzen 3 ^B &p 6D>` ` 'p <$L ` Dweiterleiten 4L ` p  p#  pT  p 3 rLd @?` P =Action   p 3 rxLd @? 0 =Action   p 3 rLd @?  =Action   p 3 rLd @? @p KAction (H p 0޽h ?    <(  ~  s *KTtm  K ~  s *K|Oo  K H  0޽h ?    <(  ~  s *KTtm  K ~  s *|K|Oom  K H  0޽h ?    <(  x  c $PKTtm  K    0 K |Oo<  K H  0޽h ?    R(  ~  s *KTtm  K   s *ЈK|Oo  K "P@08XH  0޽h ?    ia))x(  x x 3 r Kd @? P  @ L   x# "   x 3 rtK̙d @? `  gAction Servlet x 3 r K̙d @?P  gAction Servlet x 3 rK̙d @?@ p gAction Servlet x 3 r|$K̙d @?  9JSP x 3 r'K̙vd @? P  xCustom Tag Libraries $ ~  x s **KTtZ  K   x N,K3f?0E  : XB  x 0D   x C xL/K?0<PD3  7BrowserW  x 3 r3Kж$1?DY ,$ 0  Business Tier&    hh88 x 3 r0Kd @? cweb.xml 1 x Nh?K ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B x 6D>@@ x <pEK@ qxx.do request 1$  x 3 rJKd @?m gAction Servlet+ x 3 rKKd @?0  struts-config.xml 6XB x 0D>@p p ^B x 6D> p  XB x 0D>@p @ x <DTK0 @ @ erzeugen 2 2L  P  x# " p  x 3 r8XKd @? P `  B Action Form    x 3 r$\Kd @?P   B Action Form    x 3 rh]Kd @?  @ B Action Form    x 3 rdKd @?p  P Action Form (  XB x 0D> ^B x 6D>  XB x 0D>   x <iKp]  >setzen 3 ^B !x 6D>` ` "x <xnK ` Dweiterleiten 4L ` p #x#  pT $x 3 rpKd @?` P =Action  %x 3 rtKd @? 0 =Action  &x 3 rwKd @?  =Action  'x 3 ryKd @? @p KAction (dB (x <D>`p` )x <0~Kpz0 Z aufrufBO 5 H x 0޽h ? F   (  ~  s *DKTt@  K    6K |Oo<  K 6  BLK3p ` ActionMapping mapping,T  e3aea "    H  0޽h ?    p0(  x  c $HJTt@  J x  c $J|Oo  J H  0޽h ?    B:`(  ~  s *JTt@  J   BJ3p@  N ... ...40Z"0Z0Z ,   ? 3   * 3 (  * 3   * 3   * 3    ? 3   * 3        H  0޽h ?    PV(  ~  s *JTt@  J    6J |Oo<  J   BJ3p @`   Kunde kunde = bo.getKunde();( ,H  0޽h ?       @++: (    3 rhRJd @? P  @ L   # "    3 rTJ̙d @? `  gAction Servlet  3 r|YJ̙d @?P  gAction Servlet  3 r]J̙d @?@ p gAction Servlet  3 raJ̙d @?  9JSP  3 reJ̙vd @? P  xCustom Tag Libraries $ ~   s *tgJTtZ  J    NtjJ3f?0E  : XB   0D    C xLmJ?0<PD3  7BrowserW   3 rpJж$1?DY ,$ 0  Business Tier&    hh88  3 r{Jd @? cweb.xml 1  N~J ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B  6D>@@  <J@ qxx.do request 1$   3 rJd @?m gAction Servlet+  3 r$Jd @?0  struts-config.xml 6XB  0D>@p p ^B  6D> p  XB  0D>@p @  <dJ0 @ @ erzeugen 2 2L  P  # " p   3 rXJd @? P `  B Action Form     3 rDJd @?P   B Action Form     3 rJd @?  @ B Action Form     3 rpJd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>    <ȧJp]  >setzen 3 ^B ! 6D>` ` " <DJ ` Dweiterleiten 4L ` p ##  pT $ 3 rJd @?` P =Action  % 3 rܱJd @? 0 =Action  & 3 rJd @?  =Action  ' 3 rJd @? @p KAction (dB ( <D>`p` ) <Jpz0 Z aufrufBO 5 ^B * 6D>g    + BJ/  asetBusinessData 6H  0޽h ? g   0(  ~  s *=JTt@  J    6>J |Oo<  J   B?J3p @`  form.setBusinessData(kunde);( ,I  BEJ3p ` ActionForm form, l  e3aea "   H  0޽h ?     0(  x  c $7JTt@  J x  c $8JOo`  J H  0޽h ? "   !!--X!(    3 rXHd @? P  @ L   # "    3 rH̙d @? `  gAction Servlet  3 rlH̙d @?P  gAction Servlet  3 rH̙d @?@ p gAction Servlet  3 rH̙d @?  9JSP  3 rtH̙vd @? P  xCustom Tag Libraries $ ~   s *HTtZ  H    NtH3f?0E  : XB   0D    C xLH?0<PD3  7BrowserW   3 rXHж$1?DY ,$ 0  Business Tier&    hh88  3 rHd @? cweb.xml 1  NH ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B  6D>@@  <H@ qxx.do request 1$   3 r\Hd @?m gAction Servlet+  3 r4Hd @?0  struts-config.xml 6XB  0D>@p p ^B  6D> p  XB  0D>@p @  <J0 @ @ erzeugen 2 2L  P  # " p   3 rJd @? P `  B Action Form     3 rJd @?P   B Action Form     3 r Jd @?  @ B Action Form     3 rJd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>    <Jp]  >setzen 3 ^B ! 6D>` ` " <|J ` Dweiterleiten 4L ` p ##  pT $ 3 r8Jd @?` P =Action  % 3 rhJd @? 0 =Action  & 3 r"Jd @?  =Action  ' 3 r&Jd @? @p KAction (dB ( <D>`p` ) <<*Jpz0 Z aufrufBO 5 ^B * 6D>g    + BPJ/  asetBusinessData 6^B , 6D>  - <2J`X  Dweiterleiten 7H  0޽h ? t   $(  ~  s *pHTt@  H    6ĩH |Oo<  H   B4H3p0 @  *return (mapping.findForward("success")); },+ +e.    B  BH3pP 0 ActionMapping mapping,`  e3aea "    H  0޽h ?    L0(  Lx L c $ ... 4t0Z2/?3*3(*3 *3 *3? *+      BH3p   |45(?3 *3b H  0޽h ?    PP(  P~ P s *OHTt@  H  P 6UHT b ...";0Z210Z20Z2     P B`H3p0 P0 10Z2 33b  H P 0޽h ?    t6(  t~ t s *hHHTtm  H x t c $$IH@`  H H t 0޽h ? <#   ""/1|"(    3 rTGd @? P  @   3 rG̙vd @? P  xCustom Tag Libraries $ ~   s *GTtZ  G    N(G3f?0E  : XB   0D    C xLpG?0<PD3  7BrowserW   3 rGж$1?DY ,$ 0  Business Tier&    hh88  3 rHGd @? cweb.xml 1  NG ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B  6D>@@  <G@ qxx.do request 1$   3 rpGd @?m gAction Servlet+  3 rHGd @?0  struts-config.xml 6XB  0D>@p p ^B  6D> p  XB  0D>@p @  <@G0 @ @ erzeugen 2 2L  P  # " p   3 rHd @? P `  B Action Form     3 rHd @?P   B Action Form     3 rpHd @?  @ B Action Form     3 r$ Hd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>    <Hp]  >setzen 3 ^B ! 6D>` ` " <H ` Dweiterleiten 4L ` p ##  pT $ 3 r Hd @?` P =Action  % 3 rDHd @? 0 =Action  & 3 rHd @?  =Action  ' 3 r8"Hd @? @p KAction (dB ( <D>`p` ) <&Hpz0 Z aufrufBO 5 ^B * 6D>g    + B*H/  asetBusinessData 6^B , 6D>  - <.H`X  Dweiterleiten 7L   # "    3 r H̙d @? `  gAction Servlet  3 r6H̙d @?P  gAction Servlet  3 r;H̙d @?@ p gAction Servlet  3 r2H̙d @?  9JSP 0 B2BH@  Dweiterleiten 8^B 1 6D>22 H  0޽h ?     @ 8 (  ~  s *`GTtm  G   6G@?  ^ protected void processActionForward(ActionForward forward, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { if (forward != null) { String path = forward.getPath(); if (forward.getRedirect()) { if (path.startsWith("/")) path = request.getContextPath() + path; response.sendRedirect(response.encodeRedirectURL(path)); } else {0Z2% 2 2 72J$>@CE      F  BG3p   8response.sendRedirect(response.encodeRedirectURL(path));9 9Z   BG3pP $ protected void processActionForward,% $$H  0޽h ? $  ! $$238$(    3 r8 Gd @? P  @ ~  s *P!GTtZ  G   N#G3f?   : XB  0D   C xL&G?0<PD3  7BrowserW  3 r)Gж$1?DY ,$ 0  Business Tier&    hh88   3 r1Gd @? cweb.xml 1   N@5G ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B   6D>@@   <H;G@ qxx.do request 1$    3 r@Gd @?m gAction Servlet+  3 rAGd @?0  struts-config.xml 6XB  0D>@p p ^B  6D> p  XB  0D>@p @  <JG0 @ @ erzeugen 2 2L  P  # " p   3 r\Gd @? P `  B Action Form     3 rPGd @?P   B Action Form     3 rxTGd @?  @ B Action Form     3 rUGd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>   <^Gp]  >setzen 3 ^B  6D>` `  <aG ` Dweiterleiten 4L ` p #  pT  3 reGd @?` P =Action    3 rhGd @? 0 =Action  ! 3 rkGd @?  =Action  " 3 r\oGd @? @p KAction (dB # <D>`p` $ <psGpz0 Z aufrufBO 5 ^B % 6D>g    & BxG/  asetBusinessData 6^B ' 6D>  ( <D|G`X  Dweiterleiten 7L   )# "   * 3 r4G̙d @? `  gAction Servlet + 3 rG̙d @?P  gAction Servlet , 3 rG̙d @?@ p gAction Servlet - 3 r(G̙d @?  9JSP . B2XG@  Dweiterleiten 8^B / 6D>22 ^B 1 6D>p  p ^B 2 6D>p pp   3 rDG̙vd @? P  xCustom Tag Libraries $  3 <G @@  |$Mit Hilfe von Tags/getBusinessData 9%%H  0޽h ?    p0(  x  c $GTtm  G x  c $G|Oo  G H  0޽h ?    `<(  ~  s *GTtm  G ~  s *G|Oo  G H  0޽h ?    P 0(   x   c $l GTtm  G x   c $ G|Oo  G H   0޽h ?    @<(  ~  s *HGTt@  G ~  s *G|Oo  G H  0޽h ?    0 6(   ~   s *FTt@  F x   c $\F@Q F H   0޽h ?     <(  ~  s *LFTt@  F ~  s *F@f  F H  0޽h ?    $6(  $~ $ s *FTt@  F x $ c $F@j  F H $ 0޽h ?    0<(  0~ 0 s *\FTtm  F ~ 0 s *F|Oo/  F H 0 0޽h ?    8<(  8~ 8 s *FTt@  F ~ 8 s *TF|Oof  F H 8 0޽h ?    <<(  <~ < s *(FTt@  F ~ < s *F|Oo&  F H < 0޽h ?    @0(  @x @ c $FTt  F x @ c $F|Oo  F H @ 0޽h ?    D<(  D~ D s *8FTt  F ~ D s *F|Oo+  F H D 0޽h ?    <(  ~  s *FTt  F ~  s *F|Oo  F H  0޽h ?    \TL(  L~ L s *@FTt  F x L c $F@ q  F  L BF3pP P  `Jerrors.add("customerLastName", new ActionError("error.customerlastname"));K   gggggeb          L BDF3pP  bLerrors.add("customerFirstName", new ActionError("error.customerfirstname"));M   gggggeb         H L 0޽h ?     PB(  Px P c $FTt  F r P S `F@d  F N P BF3p0   *L+  GgGB j  P BF3p   , f- GgGCB H  P BXF3p@`0 H<body bgcolor= red"> <html:errors/> ,%  # >  H P 0޽h ?    ?(  x  c $uFTt@  F ~  s *lvF|O  F   BwF3pPP@ 0Berror. customerfirstname =
  • Bitte geben Sie den Nache ein.
  • BC BgG        W  BCF3p` PP  9error. customerfirstname =
  • Please enter the name.
  • .: :gZ       H  0޽h ? 6   pv(  x  c $pfFTt@  F x  c $,gF|Oo  F    Bܬ3pPp Tapplication ApplicationResourcesfU        *  B3p@ P  "... ...V#GcgG H  0޽h ?    `T<(  T~ T s *laFTtm  F ~ T s *(bF|Oo  F H T 0޽h ?    PXR(  X~ X s *QFTtm  F  X s *h|Oo  F "p`PpH X 0޽h ?    @R(  ~  s *8NFTtm  F   s *Ӂ|Oo  F "p`PpH  0޽h ?    0\R(  \~ \ s *!FTtm  F  \ s *@(F|Oo  F "p`PpH \ 0޽h ?     `6(  `x ` c $FTtm  F ~ ` s *F|O`~  F H ` 0޽h ?    h0(  hx h c $FTtm  F x h c $F|OoQ  F H h 0޽h ? 0&  " %%44p%(    3 rDd @? P  @ ~  s *@@   <D@ qxx.do request 1$    3 r@p p ^B  6D> p  XB  0D>@p @  <D0 @ @ erzeugen 2 2L  P  # " p   3 r ^B  6D>  XB  0D>   <Dp]  >setzen 3 ^B  6D>` `  < D ` Dweiterleiten 4L ` p #  pT  3 rDd @?` P =Action   3 rDd @? 0 =Action    3 rDd @?  =Action  ! 3 rDd @? @p KAction (dB " <D>`p` # <\Dpz0 Z aufrufBO 5 ^B $ 6D>g    % BlD/  asetBusinessData 6^B & 6D>  ' <|D`X  Dweiterleiten 7L   (# "   ) 3 rD̙d @? `  gAction Servlet * 3 rdD̙d @?P  gAction Servlet + 3 rD̙d @?@ p gAction Servlet , 3 rD̙d @?  9JSP - B2 D@  Dweiterleiten 8^B . 6D>22 ^B / 6D>p  p ^B 0 6D>p pp  1 3 rF̙vd @? P  xCustom Tag Libraries $  2 <PF @@  |$Mit Hilfe von Tags/getBusinessData 9%%^B 3 6D>p p  4 < F p  ^HTMLAntwort 10 H  0޽h ?    $(  r  S DTtm  D r  S D|Oo  D H  0޽h ? 333   0(  x  c $zDTtm  D x  c ${D|Oo@  D H  0޽h ? 333    0(  x  c $0Ttm   x  c $|Oo   H  0޽h ? 333   |6(  |~ | s *PsDTtm  D x | c $ tD@`  D H | 0޽h ? '  # X'P'66&(    3 rCd @? P  @ ~  s *CTtm  C XB  0D   C xLC?0<PD3  7BrowserW  3 rCж$1?DY ,$ 0  Business Tier&    hh88  3 rCd @? cweb.xml 1   NC ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B   6D>@@   <4D@ qxx.do request 1$    3 r(Dd @?m gAction Servlet+   3 r Dd @?0  struts-config.xml 6XB  0D>@p p ^B  6D> p  XB  0D>@p @  <D0 @ @ erzeugen 2 2L  P  # " p   3 rpDd @? P `  B Action Form     3 r4Dd @?P   B Action Form     3 rxDd @?  @ B Action Form     3 rDd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>   <$Dp]  >setzen 3 ^B  6D>` `  <)D ` Dweiterleiten 4L ` p #  pT  3 r,Dd @?` P =Action   3 r/Dd @? 0 =Action    3 r83Dd @?  =Action  ! 3 rt6Dd @? @p KAction (dB " <D>`p` # <:Dpz0 Z aufrufBO 5 ^B $ 6D>g    % Bt>D/  asetBusinessData 6^B & 6D>  ' <AD`X  Dweiterleiten 7 - B2ED@  Dweiterleiten 8^B . 6D>22 ^B / 6D>p  p ^B 0 6D>p pp  2 <@ID @@  |$Mit Hilfe von Tags/getBusinessData 9%%^B 3 6D>p p  4 <MD p  ^HTMLAntwort 10   NRD3f?0E  : 2 5 HTUDԔ  : L   (# "   ) 3 rWD̙d @? `  gAction Servlet * 3 r\D̙d @?P  gAction Servlet + 3 raD̙d @?@ p gAction Servlet , 3 r0fD̙d @?  9JSP 1 3 riD̙vd @? P  xCustom Tag Libraries $  6 0\mD@   VView(H  0޽h ?   $ *6V(  ~  s * yCTtm  C XB  0D   C xLzC?0<PD3  7BrowserW  3 r~Cж$1?DY ,$ 0  Business Tier&    hh88  3 r8Cd @? cweb.xml 1  N@C ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B   6D>@@   <C@ qxx.do request 1$    3 r0Cd @?m gAction Servlet+   3 rCd @?0  struts-config.xml 6XB   0D>@p p ^B  6D> p  XB  0D>@p @  <|C0 @ @ erzeugen 2 2L  P  # " p   3 rCd @? P `  B Action Form     3 rCd @?P   B Action Form     3 r0Cd @?  @ B Action Form     3 rlCd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>   <ܱCp]  >setzen 3 ^B  6D>` `  <C ` Dweiterleiten 4L ` p #  pT  3 r\Cd @?` P =Action   3 rCd @? 0 =Action   3 rCd @?  =Action    3 rCd @? @p KAction (dB ! <D>`p` " <lCpz0 Z aufrufBO 5 ^B # 6D>g    $ BC/  asetBusinessData 6^B % 6D>  & <`C`X  Dweiterleiten 7 ' B2C@  Dweiterleiten 8^B ( 6D>22  . N@C3f?;P  : 2 / HCԔ  :  6 0C@   VView(H  0޽h ? !  % !!//+!(  ~  s *BTtm  B XB  0D   C xL C?0<PD3  ; WAP/Browser  W  3 rTCж$1?DY ,$ 0  Business Tier&    hh88  3 rCd @? cweb.xml 1  NC ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B  6D>@@   <C@ qxx.do request 1$    3 r\Cd @?m gAction Servlet+   3 r4!Cd @?0  struts-config.xml 6XB   0D>@p p ^B   6D> p  XB  0D>@p @  <D&C0 @ @ erzeugen 2 2L  P  # " p   3 r*Cd @? P `  B Action Form     3 rlCd @?P   B Action Form     3 r1Cd @?  @ B Action Form     3 rH2Cd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>   <:Cp]  >setzen 3 ^B  6D>` `  <4C ` Dweiterleiten 4L ` p #  pT  3 rlACd @?` P =Action   3 rDCd @? 0 =Action   3 rlHCd @?  =Action   3 rLLCd @? @p KAction (dB   <D>`p` ! <`PCpz0 Z aufrufBO 5 ^B " 6D>g    # BTC/  asetBusinessData 6^B $ 6D>  % <8XC`X  Dweiterleiten 7 & B2\C@  Dweiterleiten 8^B ' 6D>22  ( Nl`C3f?;P  : 2 ) HcCԔ  :  * 0fC@   VView( + 3 riC̙d @? p  d XSL Servlet   , 3 r$hC̙d @? p  lXSL Stylesheet   ^B - 6D>   . <rC `/  mWAP/HTML/PDFAntwort 9 ^B / 6D>  H  0޽h ? /  & **o(  ~  s *ܒBTtm  B XB  0D   C xLB?0<PD3  7BrowserW  3 rBж$1?DY ,$ 0  Business Tier&    hh88  3 rBd @? cweb.xml 1  NB ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B  6D>@@   <\B@ qxx.do request 1$    3 rLBd @?m gAction Servlet+   3 r@p p ^B   6D> p  XB  0D>@p @  <B0 @ @ erzeugen 2 2L  P  # " p   3 rXBd @? P `  B Action Form     3 rXBd @?P   B Action Form     3 rBd @?  @ B Action Form     3 rBd @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>   < Bp]  >setzen 3 ^B  6D>` `  <B ` Dweiterleiten 4L ` p #  pT  3 rBd @?` P =Action   3 r0Bd @? 0 =Action   3 rhBd @?  =Action   3 rBd @? @p KAction (dB   <D>`p` ! < Bpz0 Z aufrufBO 5 ^B " 6D>g    # B@B/  asetBusinessData 6^B $ 6D>  % <B`X  Dweiterleiten 7 & B2B@  Dweiterleiten 8^B ' 6D>22  ( NB3f?;P  : 2 ) H BԔ  :  * 0Bp  o View= Cocoon?$H  0޽h ?    nf(  x  c $BTt@  B 8 Ppp ` f2   6Pppf   60pp`2  0pp  <̍BP p :Pipeline  H  0޽h ? O   p(  F Ppp  ` `2  0Ppp`  00ppZ2  s *pp~  s *psBTt@  B   <tBP>V \ Pipeline Datenquelle-Generatoren ! b  <dvBP 9RDB   <0}B p  :File   <B pP  >beliebig  R2   s * R2   s * ? 2   6B  DFile GeneratorR  s *3fPR  s *3f  R  s *3f0  H  0޽h ?      { `!  (  F Ppp  ` `2  0Ppp`  00ppZ2  s *pp~  s *(OBTt@  B   <HPBPV 1Pipeline Datenquelle-Generatoren/XSLT-Transformer(2  & b  <WBP 9RDB   <XTB p  :File   <YB pP  >beliebig  R2  s * R2  s * ? 2  6aB  DFile GeneratorR  s *3fPR  s *3f  R  s *3f0  R2  s *1 P R2  s * 2   6fB   kXSLT Transformer $  ! 6kB`  >XML(SAX)  H  0޽h ? "   P b(  F Ppp  ` `2  0Ppp`  00ppZ2  s *pp~  s *BTt@  B b  <lBP 9RDB   <B p  :File   <B pP  >beliebig  R2   s * R2   s * ? 2   6#B  DFile GeneratorR  s *3fPR  s *3f  R  s *3f0  R2  s *1 P R2  s * 2  6\)B   kXSLT Transformer $    <8.BPGV <Pipeline Datenquelle-Generatoren/XSLT-Transformer/Serializer(= ) ,&  R2  s *  R2  s *̙@_ 2  6T5Bf  jHTML Serializer $ R  s *R  s *̙P p R  s *    6H;Bf0  <HTML   6H!B̙ @  ;PDF   6AB P  ;WAP   6DB`  >XML(SAX)     6LIB` P >XML(SAX)  H  0޽h ? L   @ (  x  c $ BTt@  B   6 B nh "Alles ist gut" "Madonna" XML-Quellei0Z2    P   H  0޽h ? f   0(  ~  s *@Tt@  @   6@  FJ<xsl:template match= "cd " > <b> <xsl:value-of select= titel" /></b> interpret: <xsl:value-of select= interpret" /></br> <xsl:template> XSL-Stylesheet0Z2"  - :    X  0Z` @  6$B nh "Alles ist gut" "Madonna" XML-Quellei0Z2    P   H  0޽h ? 4      t(  ~  s *@Tt@  @ f  6@}   6Music , Interpret : Madonna
    Output 70Z2 $X  0ZP   6d@  FJ<xsl:template match= "cd " > <b> <xsl:value-of select= titel" /></b> interpret: <xsl:value-of select= interpret" /></br> <xsl:template> XSL-Stylesheet0Z2"  - :    X   0Z` @   6l@ nh "Alles ist gut" "Madonna" XML-Quellei0Z2    P   H  0޽h ? s&  ( #&&=L%(  ~  s *PB@TtZ  @   ND@3f?0E  : XB  0D   C xLH@?0<PD3  7BrowserW  3 rK@ж$1?DY ,$ 0  Business Tier&    hh88  3 rT@d @? cweb.xml 1   NV@ ?" -Web Server (JSP1.1 bzw. Servlet 2.2 tauglich):.   "^B   6D>@@   <\@@ qxx.do request 1$    3 r@p p ^B  6D> p  XB  0D>@p @  < k@0 @ @ erzeugen 2 2L  P  # " p   3 ro@d @? P `  B Action Form     3 rr@d @?P   B Action Form     3 rv@d @?  @ B Action Form     3 r0x@d @?p  P Action Form (  XB  0D> ^B  6D>  XB  0D>   <@p]  >setzen 3 ^B  6D>` `  <,@ ` Dweiterleiten 4L ` p #  pT  3 rć@d @?` P =Action   3 rT@d @? 0 =Action    3 r,@d @?  =Action  ! 3 r$@d @? @p KAction (dB " <D>`p` # <`@pz0 Z aufrufBO 5 ^B $ 6D>g    % B̙@/  asetBusinessData 6^B & 6D>  ' <@`X  Dweiterleiten 7 - B2(@@  Dweiterleiten 8XB .@ 0D>02 L Ppp 5#  ` `2 6 0Ppp` 7 00ppZ2 8 s *ppX2 9 0 e X2 : 0 4 2 ; B@   @ X2 < 0 ; X2 = 0 q 2 > B@ ?  < X2 ? 0 X X2 @ 0̙ ' 2 A <@f ]  A $X B 0~ b X C 0̙ b X D 0 b  E 6@ b  <HTML  F 6@̙@ b0  ;PDF  G 6L@` bP  ;WAP ^B K 6D> ` ^B L 6D> H  0޽h ?    6(  ~  s *:@Ttm  @ x  c $;@@`  @ H  0޽h ?       0 (  ~  s * @TtZ  @   0?;m`  bActionMappings(2  0P @;m` a ActionServlet(2 ^B  6Dmp`` p   0@`$T 31  0@d T 31   0H@;m`  a ActionMapping(2  ! 0@@;m bActionForwards(2 " 0@;m p  a ActionForward(2 ^B $ 6Dm ^B % 6Dm ^B & 6Dmp p  ' 0#@l 0  31 ) 0&@p  51,n * 0*@<| @ 31 + 0-@< 31 , 0d1@xL  31 - 00@   51,nH  0޽h ?    kc(  ~  s *?TtZ  ?   0d?;m`  bActionMappings(2  0?;m` a ActionServlet(2 ^B  6Dmp`` p  0?`$T 31  0?d T 31  0v?;m`  a ActionMapping(2    0?;m bActionForwards(2   0X?;m p  a ActionForward(2 ^B   6Dm ^B   6Dm ^B   6Dmp p   0?l 0  31  0t?p  51,n  0 ?<| @ 31  0T?< 31  0?xL  31  0?   51,n  0$@m` dSecActionServlet(2  0@m ` \  dSecActionMapping(28 P PZB  s *DV`lR  <VP`$F P  @ ZB  s *DV`lR  <VP`H  0޽h ? w   '(  x  c $?TtZ  ? x  c $t?pOo  ?   Bd?3pD4 /j0 3 3 PH  0޽h ?    0(  x  c $T?TtZ  ? x  c $?|Oo ? H  0޽h ?    <4(  x  c $ܐ?TtZ  ? x  c $?|Oo  ?   Bl?3p BHorg.apache.struts.action.SecActionServlet>I )  B?3p fF org.apache.struts.action.SecActionMappingdG  )H  0޽h ? C   (  x  c $(?TtZ  ? x  c $?|Oo  ? K  s *? p@   // Redirect to https/http if necessary. if( checkSsl(mapping, request, response) ){ return ; } super.process(request, response);T0Z(f     H  0޽h ?    0(  x  c $0n?TtZ  ? x  c $n?Oo  ? H  0޽h ?    6(  ~  s *e?Ttm  ? x  c $dg?@`  ? H  0޽h ?    p,0(  ,x , c $_?Ttm  ? x , c $a?|OoS  ? H , 0޽h ?    `<(  ~  s *Z?Ttm  ? ~  s *[?|OoS  ? H  0޽h ?    P0<(  0~ 0 s *T?Ttm  ? ~ 0 s *DU?|Oo  ? H 0 0޽h ?    @4<(  4~ 4 s *hO?Ttm  ? ~ 4 s *P|Oo   H 4 0޽h ?    0<(  ~  s *G?Ttm  ? ~  s *H?|Oo  ? H  0޽h ?     86(  8~ 8 s *B?Ttm  ? x 8 c $C?@   ? H 8 0޽h ?    6(  ~  s *=?Ttm  ? x  c $X>?@ z  ? H  0޽h ?    <<(  <~ < s *8?Ttm  ? ~ < s *T9?|Oo`  ? H < 0޽h ?    <(  ~  s *+?Ttm  ? ~  s *,?|Oo  ? H  0޽h ?    D<(  D~ D s *x?Ttm  ? ~ D s *4?|Oo ? H D 0޽h ?    6(  ~  s *?Ttm  ? x  c $ ?@`  ? H  0޽h ? >     ~(  ~  s *pTt   8      N3f?  : _  C x(ж$1?$ p,$ 0 { Business Tier    hh88{  C x<ж1?,$ 0 Presentation Tier SWING2   hh88b  C x8?ж1?0,$ 0 ~Persistence Tier    hh88Z2  s * ZB  s *DV fB   6DV  ZB   s *DV  fB   6DVp  Z2   s *  H  0޽h ? m    (   ~   s *Tt      T3f?  : ]   S ~ж$1? P ,$ 0 { Business Tier    hh88`   S ~ж1? ,$ 0 ~Persistence Tier    hh88X2   0 XB   0DV dB   <DV`XB   0DVdB   <DVP pX2   0p H   0޽h ? +    k(  ~  s *ԲTt     Nh3f?  : W  C xXж$1? P ,$ 0 { Business Tier    hh88Z  C xж1? ,$ 0 ~Persistence Tier    hh88R2  s * RB  s *DV ^B  6DV`RB   s *DV^B   6DVP pR2   s *p H  0޽h ?    QI,/(  ~  s *uTt   8 0 .@P _  C xwж$1?,$ 0 { Business Tier     hh88b  C xTж1?0,$ 0 ~Persistence Tier     hh88ZB  s *DV`  fB  6DV  Z2  s *     T? HPrsentation Tier   3 rd @?Z8` iAction Servlet(T ` p  #  8    3 r@d @?` P =Action    3 rd @? 0 =Action   3 rzd @?  =Action   3 r4d @? @p MAction *<T  P  #  i   3 rd @? P `  B Action Form     3 r܂d @?P   B Action Form     3 r d @?  @ B Action Form     3 rPd @?p  R Action Form *  T   # Zi P  3 r@̙d @? `  gAction Servlet  3 r̙d @?P  gAction Servlet  3 rH̙d @?@ p gAction Servlet  3 r̙d @?  9JSP3  3 rd @?8  struts-config.xml  6#  3 r\d @?  yStruts Tag Libraries $    3 rd @?Z/ `  cweb.xml ZB  s *DVp@@fB  6DV @@`B   0DoppZB ! s *Do  `B " 0Do ZB # s *DoO ZB $ s *Do9 `B % 0Do9 9 ZB & s *DoOfB ' 6Do` `B ) 0DoXX^ `B * 0Do` ` ^ `B + 0Do  `B , 0Do#  `B - 0Do R2 / s * @H  0޽h ?    0(  x  c $`Ttm   x  c $|Oo   H  0޽h ?    p(  ~  s *u=Tt   ~  s *v   |  <} ?"p{ *,$D  0 DDipl. -Ing. (M.E.) Muhammet ztrk IT-Architekt, W&W Informatik GmbHLE 23 *  A޽h ?C:\Eigene Dateien\PowerPoint\BASTA2002_2\Ressourcen\BG_Folie.jpg 22333| 0 <4 t(  tX t C p   4 t S p @   Als Sun die Technik der Java Servlets zum ersten Mal vorstellte, haben sich viele Programmierer darber gefreut, weil diese schneller und mchtiger war als der kommerzieller CGI-Ansatz. Aber das Problem war, da das Schreiben von HTML-Seiten mit endlosen print() Anweisungen in der Servlet-Klasse zum Einen sehr lstig, zum Anderen fr die Weiterentwicklung der Views mhsam war. Es gab nur eine Servlet Klasse, die die Aufgabe von drei Komponenten (MVC) ausfhrte. d!! !!!!!t +H@H t 0޽h ? ̙33 0 C; x(  xX x C p   ; x S ,& 1H x 0޽h ? ̙33[ 0  (  ^ S      c $@6 @   Umsetzung der MVC2-Architektur auf die Serverseitige Programmierung mit JSP und Java Controller: JavaServlet Entgegennehmen von Benutzeranfragen (Requests) Erzeugung des Models (JavaBeans) Auswahl der zu zeigenden Seiteda{H!!!!!{!>a % !H  0޽h ? ̙33 0 } (  ^ S    w c $ @   Model: JavaBeans Datenhaltung Datenpersistenz Bereitstellung der Daten fr JSP Ermglichung der Datennderungen durch durch den Controller0!!, ]H  0޽h ? ̙33 0  F(  ^ S     c $| @   <! H  0޽h ? ̙33s 0 3+ (  ^ S    % c $l @   QView: JSP Lesen der Daten aus dem Model Erstellung des darzustellenden Dokumentes2L!L!NH  0޽h ? ̙33 0  F(  ^ S    l c $l @  l <! H  0޽h ? ̙33 0  F(  ^ S    l c $l @  l <! H  0޽h ? ̙33M 0  F(  ^ S     c $_ @   <! H  0޽h ? ̙331 0 TL` (  X  C p   lL  S ,$lp @  l 6scope ("page", "request", "session", or "application"  67l H  0޽h ? ̙33O 0 @ I(  X  C p   l  S /lp @  l K7Die zentrale Klasse von Struts ist das ActionServlet. Es implementiert die Aktionssteuerung der Anwendung. Das ActionServlet nimmt alle eingehenden HTTP-Anfragen der Anwendung entgegen, fhrt die zugehrigen fachlichen Aktionen (Action) aus, und leitet zu den JSPs weiter, die die HTTP-Antwort erzeugen. 8  hHP ; 0H  0޽h ? ̙33V 0  /(  X  C p   l  S olp @  l 1 H  0޽h ? ̙33 0 P (  X C     S L @   " H  0޽h ? ̙335 0  (  X  C p   l  S "lp @  l 5JSP1.1 bzw. Servlet 2.2 tauglichen Applikationsserver66  #H  0޽h ? ̙33A 0 0 ((  (^ (S    l (c $P)l @  l 5JSP1.1 bzw. Servlet 2.2 tauglichen Applikationsserver66  #H ( 0޽h ? ̙33 0 P 0/(  0^ 0S    l 0c $@l @  l %yDie anwendungsspezifische Beschreibung der Aktionssteuerung erfolgt in der Konfigurationsdatei struts-config.xml. Hier wird in XML beschrieben, welche Aktion fr welche URI ausgefhrt werden soll und gegebenenfalls welches Formular serverseitig fr die Benutzereingaben verwendet wird. Sowohl fr Aktionen als auch fr Formulare stellt das Struts-Framework Basisklassen bereit.8z+$ P^ H 0 0޽h ? ̙33 0 p H((  H^ HS    l Hc $8Xl @  l  H H 0޽h ? ̙33A 0  P(  P^ PS    l Pc $p\l @  l 5JSP1.1 bzw. Servlet 2.2 tauglichen Applikationsserver66  #H P 0޽h ? ̙33 0  XD(  X^ XS    l Xc $cl @  l :  H X 0޽h ? ̙33 0  `;(  `^ `S    l `c $4il @  l 1 H ` 0޽h ? ̙33 0  hD(  h^ hS    l hc $ul @  l :  H h 0޽h ? ̙33 0  tD(  t^ tS    l tc $zl @  l :  H t 0޽h ? ̙33 0  |D(  |^ |S    l |c $^l @  l :  H | 0޽h ? ̙33 0  D(  ^ S    l c $l @  l :  H  0޽h ? ̙33 0  D(  ^ S    l c $dl @  l :  H  0޽h ? ̙33 0  D(  ^ S    l c $l @  l :  H  0޽h ? ̙33 0  D(  ^ S    l c $l @  l :  H  0޽h ? ̙33 0 0 D(  ^ S    l c $a"Y$)8.F~{ JB0kG\I6@ZXayjˀt,Dxh-< &wPZ2w{SLb&BgNo}\zv;rc!njCIp]fLbDBLq^]A{_ZVRnNJ&42:4>6BQXFAvZ(    NVhttp://jakarta.apacheOh+'0R `h  8 DPX!Das Web-Framework Struts Teil 1 Midiaamo-PC:\WINNT40\Profiles\diaamo\Anwendungsdaten\Microsoft\Vorlagen\MasterJAX2003.potdiaamoT391Microsoft PowerPointiaa@0Bl@[GPg  R('& &&#TNPP 2OMi & TNPP &&TNPP     'A x(xKʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwwNJkefeeeeeeeeeefefeeeeefeeeeeffeeefeefeef_efeefeeee_fee_fBef_eefe_eefeee Tag'Tag-Libs HTML-Tag Tag(Tag-Libs HTML-Tag Internationalisierung(Tag-Libs HTML-Tag InternationalisierungTag-Libs logic-TagTag-Libs logic-TagTag-Libs logic-TagTag-Libs logic-TagTag-Libs template-TagTag-Libs template-TagStruts zur Laufzeit / ViewNeues in Struts 1.1Neues in Struts 1.1Neues in Struts 1.1AgendaStruts MultikanalfhigkeitStruts MultikanalfhigkeitStruts MultikanalfhigkeitStruts Multikanalfhigkeit"Struts Multikanalfhigkeit Cocoon"Struts Multikanalfhigkeit Cocoon"Struts Multikanalfhigkeit Cocoon"Struts Multikanalfhigkeit Cocoon"Struts Multikanalfhigkeit Cocoon"Struts Multikanalfhigkeit Cocoon"Struts Multikanalfhigkeit CocoonStruts zur Laufzeit / ViewAgenda Struts & Multiprotokoll Struts & MultiprotokollStruts & MultiprotokollStruts & MultiprotokollStruts & MultiprotokollStruts & MultiprotokollStruts & MultiprotokollAgendaVorteile von Struts Vorteile von Struts Vorteile von Struts Vorteile von Struts Vorteile von Struts Nachteile von Struts Nachteile von Struts Nachteile von Struts Nachteile von Struts Nachteile von Struts Agenda5Die Architektur der Anwendung Fliegen in der Nacht5Die Architektur der Anwendung Fliegen in der Nacht5Die Architektur der Anwendung Fliegen in der Nacht5Die Architektur der Anwendung Fliegen in der Nacht LiteraturPowerPoint-Prsentation Verwendete Schriftarten Entwurfsvorlage Folientitel  8@ _PID_HLINKSA<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlcancel<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlbutton<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html checkbox<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlerrors<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlfile<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlhidden<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlimage<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html multibox<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html password<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlradio<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlreset<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlselect<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmloptions<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmloptions<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlsubmit<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmltext<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html textarea<http://jakarta.apache.org/struts/doc-1.0.2/struts-html.htmlform=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.htmlequal=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html notEqual=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.htmlmatch=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html notMatch=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.htmlforward=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html redirect=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.htmliterate@http://jakarta.apache.org/struts/doc-1.0.2/struts-template.htmlinsert@http://jakarta.apache.org/struts/doc-1.0.2/struts-template.htmlput@http://jakarta.apache.org/struts/doc-1.0.2/struts-template.htmlget%http://www.jakarta.apache.org/strutshttp://www.javamagazin.de/Fhttp://www.javaworld.com/javaworld/jw-02-2002/jw-0201-strutsxslt.htmlBhttp://www.javaworld.com/javaworld/jw-05-2002/jw-0510-struts.html'http://www.devx.com/Java/Article/11381=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html greaterEqual=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html lessEqual=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html greaterThan=http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html lessThan,org\apache\struts\action\ActionForward.html,org\apache\struts\action\ActionMapping.html)org\apache\struts\action\ActionForm.html_ 2 diaamodiaamoRoot EntrydO)@V-@PicturesCurrent User5SummaryInformation(]DR_ 2 PhilippPhilipp  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\^_`abcdefghijklmnopqrstuvwxyz{|}~Root EntrydO)[@PicturesCurrent User2SummaryInformation(]DRPowerPoint Document(D2 DocumentSummaryInformation8\4.org/struts/doc-1.0.2/struts-html.html#cancelWhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#buttonXhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#checkboxYhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#errors[http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#file\http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#hidden]http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#image^http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#multibox_http://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#passwordihttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#radiojhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#resetkhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#selectlhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#optionsnhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#optionsohttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#submitphttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#textqhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#textarearhttp://jakarta.apache.org/struts/doc-1.0.2/struts-html.html#form|http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#equal}http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#notEqualhttp://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#matchhttp://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#notMatchhttp://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#forwardhttp://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#redirecthttp://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#iteratehttp://jakarta.apache.org/struts/doc-1.0.2/struts-template.html#inserthttp://jakarta.apache.org/struts/doc-1.0.2/struts-template.html#puthttp://jakarta.apache.org/struts/doc-1.0.2/struts-template.html#get\Hhttp://www.jakarta.apache.org/strutsH4http://www.javamagazin.de/http://www.javaworld.com/javaworld/jw-02-2002/jw-0201-strutsxslt.htmlhttp://www.javaworld.com/javaworld/jw-05-2002/jw-0510-struts.html`Lhttp://www.devx.com/Java/Article/11381 http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#greaterEqual!http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#lessEqual"http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#greaterThan#http://jakarta.apache.org/struts/doc-1.0.2/struts-logic.html#lessThanj$Vorg\apache\struts\action\ActionForward.htmlj%Vorg\apache\struts\action\ActionMapping.htmld&Porg\apache\struts\action\ActionForm.htmlv/ 0DTimes New Roman7|d0|Wo 0 DOfficina Sans Bookd0|Wo 0" DWingdingsans Bookd0|Wo 0 0DArialngsans Bookd0|Wo 0 "@DArial Narrow Bookd0|Wo 0 "PDCG Omegarow Bookd0|Wo 0`DCourierrow Bookd0|Wo 0pDCourier New Bookd0|Wo 0 1DArial Unicode MSkd0|Wo 0 ` . @n?" dd@  @@``   H $H<O?%FG$! )% . !#     F  ,|y.(,qk0{ze,i.p54x7k+;.x)'t FF FpZb`\igfe[qMIGEFDCA@z?>=<:9 65321G<5+(&"'%!?Z1FFFF8  0h$ " #OLs_Ko-  d]WVR87nm}"~#w!v!u%r l"jc&a^(Y*XUT,SQ.PNJ2H4FB;405,7+7*0)++!M  /.OR$t>|q~?x b$x/ٷ{V!MX+?x b$Mvk e9 Jj R$_9gKu C=qF  0e0e     A@ A5% 8c8c     ?A)BCD|E||S" 333((f31f@38  ~ ʚ;$B5ʚ;g4KdKd0pppp@ <4!d!d 0,8<4dddd 0,8<4BdBd 0,8c ___PPT9phXYS T R? % *Web-Applikationen mit Struts Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht T%PNQ51FB3BJ(BJ(B.BBBBBFB B  b  B Bb  i     C4$3 Tier Architektur Persistence  $   5#)3 Tier Architektur Business, Persistence(*$$8    7%73 Tier Architektur Presentation, Business, Persistence(8 $$0    6"3 Tier Architektur   0 3 Tier Architektur   Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht T%PNQ51%BFBJ(BJ(B.BBBBBFB B  b  B Bb  i     C%3 Tier Architektur Presentation Tier&$2    VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+  VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+   VPresentation Tier Model  View  ControllerV,($$$$$ $+  VPresentation Tier Model  View  ControllerV,($$$$$ $+  "Presentation Tier Vorteile von MVC#($.   Das Model kann unabhngig von View und Controller realisiert werden Zugriff mehrerer Views bzw. Controller auf ein Model Austauschbare Komponenten.  ` `3````` `` ``,3:"Presentation Tier Vorteile von MVC#($.   iLeichtere Wartung, Einfacheres Verstndnis fr Entwickler/Designer durch MVC-Paradigma Wiederverwendung pi  ``` `-``Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht l%PNQ51%BFFN(FBJ(B.BBBBBFB B  b  B Bb  i     C )MVC & Internet Zustandslosigkeit von HTTP*($   ;Von statischen Inhalten zu dynamischen Inhalten im Internet<<$CGI (Common Gateway Interface) hoher Ressourcenverbrauch, da fr jede Anfrage eigener Prozess gestartet werden muss plattformabhngig keine komponentenbasierte und serviceorientierte Architektur.     >         MVC1& Servlet& 0( "   MVC1& Servlet & JSP& 0(.    Pro und Kontra von MVC1( 0( *Unberschaubare JSP-Seiten, die HTML-, JavaScript- und Java-Code enthalten Erfordert Programmierer mit Java-, Java Script- und HTML-Kenntnissen. Ergebnis: Entweder schlechter Java-Code oder unschne HTML-Seiten Versto gegen das Architekturprinzip  Seperation Of Concerns -D-@-bbb bbb bbbb bbbb b, Pro und Kontra von MVC1( 0( Eine nderung in der Geschftslogik erfordert eine neue Implementierung aller betroffenen JSP-Seiten Integrierte Steuerung der Seitenabfolge in JSP-Seiten Mhsame Fehlerbeseitigung + Geeignet fr einfache GUIs--3bb.bB BBBFBBBAgenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht d%PNQ51%B3FN(FFN(B.BBBBBFB B  b  B Bb  i     CEntstehung von MVC2 0("    Was wir brauchen sind: eine View, die wei, wie die Daten reprsentiert werden einen Controller, der wei, wie mit der Geschftslogik umgegangen werden soll ein Model, das die Daten hlt aber von beiden nicht wei : Entstehung von MVC2 0("    Aus beiden Komponenten (JSP und Servlets) musste ein neues Konzept -MVC2- erstellet werden. Die Servlets als Controller steuern den Control-Workflow, whrend die JSP s als Views nur die Daten darstellen. ``.`@H(&` `5```v  !MVC2& 0(  MVC2 Controller4 0(( (  ist ein JavaServlet nimmt die Benutzeranfragen (Requests) entgegen erzeugt das Model (JavaBeans) greift auf die get und set Methoden des Models zuJp`````b  MVC2 Controller4 0(( (  pwhlt die zu zeigende Seite aus trennt die technischen Controller von fachlichen Controllern ist konfigurierbar *pp`eMMVC2& 0(  %MVC2& 0(  &MVC2& 0(   MVC2 Model4  0((( Mist ein JavaBean hlt die Daten wei nichts ber die View und den Controller0N&``"`,& MVC2 Model4  0((( stellt die Daten fr die JSP bereit ermglicht es dem Controller, die Daten durch get und set Methoden zu ndern reprsentiert den Zustand der AnwendungTR````;`@,R<'MVC2& 0(   MVC2 View4  0((( ist eine JSP liest die Daten aus dem Model erstellt die darzustellenden Dokumente stellt die Daten dar greift nicht auf die set Methoden des Models zu:|```@{ MVC2 View4  0((( kennt den Controller nicht wird die View ausgewhlt, wenn das Model gendert wurde ist austauschbar: Java Klassen JSP XML/XSLT :ee``@$X+MVC2& 0(  -MVC2& 0(  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht j%PNQ51%B3FN(FN(FFBBBBBFB B  b  B Bb  i     CaDefinition von Struts@Ein MVC Model2 basiertes  Open-Source Framework fr die Prsentationsschicht von Web-Anwendungen. Bestandteile: kooperierenden Klassen, Servlets JSP-Tagsr/bbjb*bb%bbbbb#,f  Bestandteile von Struts Bestandteile von Struts Bestandteile von Struts Bestandteile von Struts Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht |%PNQ51%B3FN(FN(BBFF FBBBFB B  b  B Bb  i     C Initialisieren Struts Controller*!(( (  web.xml von Action Servlet$ }Die Elemente der Datei web.xml: servlet-class: Definition des ActionServlet s application: Definition eines Resource Bundles config: Pfad zur zentralen Konfigurationsdatei (struts-config.xml) mapping: Requests mit URL-Erweiterung .do werden an das ActionServlet weitergereicht welcome-file: Startseite der Anwendung taglib: Deklaration von bentigten Tag-Librariesb $ $ ! >  ):  / *" A-web.xml von Action Servlet,  action org.apache.struts.action.ActionServlet ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}-param> application ApplicationResources config /WEB-INF/struts-config.xml ...... h  &     # & 4      D  !  !   V       N9web.xml von Action Servlet,  action org.apache.struts.action.ActionServlet application ApplicationResources config /WEB-INF/struts-config.xml ...... h  &     # & 4      D  !  !   V       O:web.xml von Action Servlet,  action org.apache.struts.action.ActionServlet application ApplicationResources config /WEB-INF/struts-config.xml ...... h  &     # & 4      D  !  !   V       B.web.xml von Action Servlet$  action *.do 30 index.jsp ...  &!L'!( '(     web.xml von Action Servlet$  action *.do 30 index.jsp ...  &!L'!( '(     Q<web.xml von Action Servlet$  ... ... /WEB-INF/app.tld /WEB-INF/app.tld /WEB-INF/struts-bean.tld /WEB-INF/struts-bean.tld : !)#*#          Initialisieren Struts Controller*!(( (  jOAction Servlet Cdas org.apache.struts.action.ActionServlet ist abgeleitet von javax.servlet.http.HttpServlet dient als FrontController (J2EE-Designpattern) das ActionServlet und die Action bilden zusammen die Controller-Komponente wird auch als technischer Controller bezeichnet initialisiert alle Struts-Komponenten (beim ersten Starten)Db&cbb bbbc bcb cbbbbbcbb bb b%bb*b   ~#  Initialisieren Struts Controller*!(( (  struts-config.xml6Die Elemente der Datei struts-config.xml: form-bean : Definition von ActionForm global-forwards : Definition von globalen ActionForward action-mappings: Definition von ActionMapping action: Name der Action name: logischer Name des Models path: Pfad zu einem neuen View scope: Kontext dieses ActionForms input: Eingabeform dieser Action forward : Definition von lokalen ActionForward* ?         E1struts-config.xml6<struts-config> <!-- === Form Bean Definitions === --> <form-beans> <form-bean name="formModel type="com.oisoft.view.form.FormModel"/> </form-beans> <!-- === Global Forward Definitions === --> ... <!-- === Action Mapping Definitions === --> ... ...j)  ?       ..      R=struts-config.xml6 ... ...F2).?*.   S>struts-config.xml6 ... ... ...}C).0?*(* * *? *      F2struts-config.xml6.... ...>/ ?3*3'*3 *3 *3?3 *3?3*3-*3 *3 *3?3 *3           \GA Initialisieren Struts Controller ActionMapping / ActionForward,B!(($>   A Initialisieren Struts Controller ActionMapping / ActionForward,B!(($>   A Initialisieren Struts Controller ActionMapping / ActionForward,B!(($>    Initialisieren Struts Controller*!(( (  `I'Initialisieren Struts Controller Action6((( ((   ? 3    3 %  3   3   3     3   * 3    ? 3   3 '  3   3   3    ? 3   * 3  0                    Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FFFF BFB B  b  B Bb  i     C Struts zur Laufzeit / Controller !( ( K6web.xml von Action Servlet$  action *.do ...n &!( mPController (Action Servlet)5 Mapping der Requests auf die spezifizierten Actions 66b.  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FFFF BFB B  b  B Bb  i     CStruts zur Laufzeit( web.xml von Action Servlet$ \action org.apache.struts.action.ActionServlet ... action *.do 30 ... B$J#&  &  !  L  '  ~ Struts zur Laufzeit / Model (( L7$struts-config.xml von Action ServletH  ... ...."0Z20Z2 0Z2(   ? 3   * 3   ,  ? 3   *3'*3 *3*3?3 *3 Z        Model (ActionForm) Das Model in Struts ist eine von der abstrakten Klasse org.apache.struts.action.ActionForm abgeleitete Klasse Die von der abstrakten Klasse ActionForm abgeleiteten Klassen beinhalten in einfachster Form Getter- und Setter Methoden, jedoch keine Geschftslogik. bb.b#cb bbb c6bcbcbb ( 2 55qVModel (ActionForm) Annahme: fr jedes Eingabeformular in der Anwendung zugehrige ActionForm vorhanden Aufgaben:Formulareingabedaten zwischenspeichern und fr andere Teile der Anwendung verfgbar machen Sie reprsentiert den Zustand der jeweiligen Views in jeweiligen Scope (PAGE, REQUEST, SESSION APPLICATION) Die zu prsentierenden Daten werden von der View mittels Struts-Tags aus dem Model abgeholt.<l]?b cobbbb b%bbbbb b b bb bb> Q-JavaBeans und ihr Gltigkeitsbereich (scope)  ., ,$ PAGE: Beans, die sichtbar sind innerhalb einer einzelnen JSP-Seite, fr die Lebenszeit des aktuellen Requests. (Lokale Variablen der service()-Methode). REQUEST: Beans, die sichtbar sind innerhalb einer einzelnen JSP-Seite, auerdem fr jede andere Seite / jedes Servlet, welche/s in diese Seite inkludiert ist oder an die/das von dieser Seite aus weitergeleitet wurde. (Request Attribute). SESSION: Beans, die sichtbar sind fr alle JSP-Seiten und Servlets, die - ber einen oder mehrere Requests hinweg - einer besonderen User-Session angehren. (Session Attribute). APPLICATION: Beans, die sichtbar sind fr alle JSP-Seiten und Servlets, die Bestandteil einer Web-Applikation sind. (Servlet Kontext Attribute). ZY _e+  U+ /tWModel (ActionForm) In der Klasse ActionForm sind zwei wichtige Methoden implementiert, die bei jedem Request (je nach Konfiguration) von dem ActionServlet aufgerufen werden. b cbb bbb b!bcb#> :! uX(Model (ActionForm) Die Methode validate,) ( b(,  Methode validate() berprft die Gltigkeit der Benutzereingabe in der HTML-Seite geprft. Wenn das Attribut validate in der struts-config.xml-Datei auf "true" gesetzt ist, wird die Methode validate() vom ActionServlet automatisch vor dem Setzen der gemappten Felder in der Klasse ActionForm aufgerufen, um die Plausibilittsprfungen auszufhren. Methode validate() gibt ein Objekt der Klasse ActionErrors zurck, dem als Container die Objekte der Klasse ActionError hinzugefgt werden, falls ein Fehler aufgetreten ist. Diese Fehler werden von Struts in der View (JSP) an der Stelle angezeigt, an der der Tag definiert ist. ^" &b cbb.bcbbcb bbcbbbb bb b bbb b$b cbbbb cb cb bb cbb bAb bbcb bb:\     C 1 N0vY%Model (ActionForm) Die Methode reset,& (b(, Methode reset(), die bei jedem Request vom ActionServlet zuerst aufgerufen wird, um die Defaultwerte der Klasse (Model) zu setzen.  b c c b b b c b b b c >LModel (ActionForm) 8public final class FormModel extends ActionForm { & public void setSelectedOriginName(String newSelectedOriginName) { selectedOriginName = newSelectedOriginName; } public String getSelectedOriginName() { return selectedOriginName; } public void reset(ActionMapping mapping, HttpServletRequest request) { this.selectedOriginName=null; } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if(mapping.getPath().equals("/bookingSubmitAction")){ if ((customerFistName == null) || (customerFistName.length() < 1)) errors.add("customerFistName", new ActionError("error.customerfistname")); } }... }c g 3 c g c C c c oc c *c C c c c g 3 c g 3?c g 3c c c g 3 c g 3c g 3c g 3c g 3(c C                                                                         !       Struts zur Laufzeit / Model (( pSModel (ActionForm) JActionServlet ruft die Methode reset() auf. Wenn das ActionServlet einen Request erhlt, berprft der Controller in der User-session, ob ein Objekt der Klasse ActionForm fr den aktuellen User erzeugt wurde. Wenn nicht, wird ein Objekt erzeugt und mit jeweiligem Key (user) und Value (ActionForm) in einer HashTable gespeichert. K " cbbcb c%b b/b bbbb b b#b. c  Model (ActionForm) Fr die Requests, die mit dieser Form(HTML-Seite) gemappt sind, werden die jeweiligen setter Methoden der Klasse ActionForm aufgerufen (JavaBean) ActionServlet ruft die Methode validate() auf  " Vbbb cbb cbb ab! !     rTModel (ActionForm) Die vom ActionServlet aktualisierte ActionForm wird als bergabeparameter beim Aufruf an die Methode perform() der Klasse Action weitergegeben. ` a` a ```aa `a`b!> 6&Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht |%PNQ51%B3FN(FN(BBFF FBBB%FB B  b  B Bb  i     C Struts zur Laufzeit / Controller !( ( Controller (Action)Alle Actions sind abgeleitet von der Klasse org.apache.struts.action.Action Die Action und das ActionServlet und bilden zusammen die Controller-Komponente Wird auch als fachlicher Controller bezeichnet. Die Action-Klasse soll die Event- und Dialogsteuerung (flow of events and flow of control ) und die Fehlerbehandlung der Applikation kontrollieren, aber keine Geschftslogik beinhalten.  2bcb bbbbbbb cbbc b cbbbbbb bbcbbbb/bb%bbb$ {bsUController (Action)Die Klasse Action ist als Command[GoF] implementiert und wird vom ActionServlet aufgerufen. Die Action Klasse ist gleichzeitig nach dem Adapter Entwurfsmuster[GoF] implementiert, welches die Schnittstelle einer Klasse an eine andere vom Client erwartete Schnittstelle anpasst. Singleton: Das Action-Objekt ist nicht thread safe (keine Instanzvariable in den abgeleiteten Klassen anlegen )Vp 2 bc b bb cbbc"bbrb bbc bbb b=b!bO >xZController (Action)public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ //do something ... } c g3cc c g3c g3cg3cg3Ic O                   nRController (Action) Fr die Action-Klasse sind die folgenden Anweisungen auszufhren: Aufruf der Business-Schicht Business-Schicht gibt die Ergebnisse zurck aktualisiert das Model whlt eine passende neue View gibt die Kontrolle (als ActionForward) an den Controller ActionServletC 2  2 ``4````` ` ``````a` a`>  Struts zur Laufzeit / Controller !( ( !Controller (Action) ActionMapping -public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Kunde kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R.c g3cc c g3c g3cg3cg3:c)gc Oj                       !Controller (Action) ActionMapping  definiert einen Pfad, der mit der URI (Uniform Resource Identifier) eines eingehenden Requests verglichen wird wird es vom ActionServlet der Action-Klasse weitergeleitet, die fr diese Request verantwortlich ist stellt eine Menge von Mglichen Weiterleitungsadressen-ActionForward bereit\!{ x  t/  /K!Controller (Action) ActionMapping ,Controller (Action) Aufruf der Businesslogik'public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R(c g3cc c g3c g3cg3cg34c)gc OX                        Struts zur Laufzeit / Controller !( ( Controller (Action) ActionForm -public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Kunde kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R.c g3cc c g3c g3cg3cg3:c)gc Oj                       Controller (Action) ActionForm *Das Model, das die Formularinhalte enthlt++  Struts zur Laufzeit / Controller !( ( #"Controller (Action) ActionForward -public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Kunde kunde = bo.getKunde(); form.setBusinessData(kunde); return (mapping.findForward("success")); }R.c g3cc c g3c g3cg3cg3:c)gc Oj                       "Controller (Action) ActionForward Wird von der Action nach der Bearbeitung des Requests an das ActionServlet zurckgegeben In vielen Fllen ist die Anweisung ActionForward die Ausfhrung einer JSP-Seiter ) # >- 1  $"Controller (Action) ActionForward Es ist aber mglich, die Kontrolle durch die Defnition neuer Actions <forwardname= something path= /something.do /> wieder an eine andere Action weiterzuleiten. Ein ActionForward kann sowohl lokal als auch global definiert werdenx=.1   -    83{]VController (Action) ActionForward  lokal    VController (Action) ActionForward  global   Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FF B  b  B Bb  i     C%Struts zur Laufzeit / View (($ |^Action Servlet 'Struts zur Laufzeit / View (($ }_View (Struts Tags)$Wird mit JSP (Java Server Pages)erstellt Struts befreit die JSP-Seiten von Java-Code (scriptlet) durch die eigenen Tags. Diese Tags sind fr viele Anforderungen ausreichend. Sie knnen entweder angepasst oder eigene Taglibs erstellt werden.0bbb bb*  P ' y )View (Struts Tags)$\Diese Tag-Libs sind in vier Teile aufgeteilt: Bean-Tags HTML-Tags Logik-Tags Template-Tags J.. .> ~`Tag-Libs Bean-Tag  ^In Standard-JSP Seiten wird <jsp:useBean> verwendet, um die Bean zu erzeugen Mit Hilfe von  scriptlets wird auf das Bean-Objekt zugegriffen. Struts Bean-Tag erweitert diese Standards, um neue Beans aus verschiedenen Quellen zu definieren und Beans bzw. Bean Property in JSP-Seiten wieder zu rendern. NA  (. L  (,b"Tag-Libs Bean-Tag Bean Properties:# , Erweitert Syntax zum Referenzieren von JavaBean-Properties wie folgt: einfacher Name property= name" ist equivalent zur Methode getName() vom JavaBean verschachtelter Name property=" kunde.name" ist equivalent zu den Methodenaufrufen getKunde().getName() vom JavaBean indexierter Name property=" kunde[0].name" ist equivalent zu den Methodenaufrufen getKunden().getName() vom JavaBeanF < F $((            c"Tag-Libs Bean-Tag Bean Creation: $# ,  tStruts stellt Tag zur Verfgung, um ein neues Bean in irgendeinem Scope zu erzeugen bzw. zu kopieren.ru & Z #*"Tag-Libs Bean-Tag Bean Creation: $# ,  xDieser Tag untersttzt das Attribut  property , so dass die mchtigen Eigenschaften vom das Attribute  property verwendet werden knnen : //Erzeugen eines neuen Bean <bean:define id="foo" value="This is new"/> //Erzeugen eines neuen Referenz auf existierendes Bean <bean:define id="foo" name="bar"/> //Erzeugen eines neuen Bean aus Bean-Proporty <bean:define id="bar" name= form" property= name"/> //Erzeugen eines neunen Bean aus Bean-Proporty und in andere Scope kopieren <bean:define id="last" name= form" property= name scope= request" toScope="session" />   / 7 & . 6  %:+7"-4KW~%:3 7        d Tag-Libs Bean-Tag Bean Output: ! ,  6Struts definiert Bean-Tags, um Bean- Proportys in JSP-Seiten zu zeichnen: Zeichnen  Internationalized Message basierend auf Key-Value-Konzept. <bean:message key="booking.surname"/> Zeichnen Bean oder Bean Property <bean:write name="formModel" property="selectedFlight.price"/> J F ) " A J %&cC #>c   & &           gTag-Libs HTML-Tag   erstellt die Eingabe-Formulare bildet die normalen HTML-Tags nach diese Tags sind eine Brcke zwischen JSP-Views und anderen Komponenten einer Web-Applikation.$XC Nl/i$Tag-Libs HTML-Tag HTML "form" tags:%  #button zeichnet einen Button cancel zeichnet einen Abbrechen Button checkbox zeichnet ein  Checkbox Input Feld errors zeichnet evtl. aufgetreten Fehler file zeichnet ein  File Select Input Feld hidden zeichnet ein verstecktes Feld image zeichnet ein  input tag vom Type "image" multibox zeichnet ein  Checkbox Input Feld password zeichnet ein Passworttextfeld#&$) 1&!& #" $W 0V 0 &X 0IQY 0w}[ 0\ 0] 0^ 0*2_ 0X`j$Tag-Libs HTML-Tag HTML "form" tags:%  #Lradio zeichnet ein  Radio Button Input Feld reset zeichnet ein  Reset Button Input Feld select zeichnet Auswahlliste option zeichnet eine Menge von Auswahlmglichkeiten innerhalb einer Auswahlliste options zeichnet  Collection of Select Options submit zeichnet einen  Submit Button text zeichnet ein Eingabetextfeld textareas zeichnet ein mehrzeiliges Textfeld form zeichnet einen HTML form-Element))U+!! $3#'6  !   #i 0j 0.3k 0\bn 0zl 0o 0 p 0.2q 0S\r 0kfTag-Libs HTML-Tag Gemeinsame  Form Tag Attribute:04 !$ 2,lStruts: id Name der neuen Variable name Attributname von Beans, deren  Property in diesem Eingabefeld angezeigt wird property Name der Property des Beans value Wert eines Elements, der als der Wert des Request-Parameters  submitted wird <html:text name= myBean property="mailingAddress.street"/> X<$SQ= 2 *  -  lfTag-Libs HTML-Tag Gemeinsame  Form Tag Attribute:04 !$ 2,Javascript Event Handlers: onblur  JavaScript event handler wird ausgefhrt, wenn dieses Element den Focus verlieren. disabled ermglicht es dieses Element  enable bzw.  disable gesetzt wird. onclick  JavaScript event handler wird ausgefhrt, wenn auf dieses Element geklickt wird onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onkeydown, onkeyup, onkeypress, onfocus, ondblclick, onchange <... name="backPictureShow" type="button" onClick="showPicture()" .../>N&|HWF,%         *   @   9          +fTag-Libs HTML-Tag Gemeinsame  Form Tag Attribute:04 !$ 2,"CSS Attributes style definiert  CSS styles fr dieses HTML- Element styleClass definiert  CSS stylesheet class fr dieses HTML-Element 3 < >% m&Tag-Libs HTML-Tag TagH' $$$ > 6Fehler erzeugen : public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ... if(mapping.getPath().equals("/bookingSubmitAction")){ if ((customerFistName == null) || (customerFistName.length() < 1)) errors.add("customerFistName", new ActionError("error.customerfistname")); if ((customerLastName == null) || (customerLastName.length() < 1)) errors.add("customerLastName", new ActionError("error.customerlastname")); & }" c gccc g+cgcccc5c         !                                      n&Tag-Libs HTML-Tag TagH' $$$ > :Anzeigen Fehlertext in einer Stelle in JSP : <body bgcolor= red"> <html:errors/> Anzeigen von Fehlertext an mehreren Stellen der JSP : <td align="left"> <html:errors property="customerFistName"/> </td> <td align="left"> <html:errors property="customerLastName "/> </td> -& 6 ,#5C,Cc:CcC/  <   'Tag-Libs HTML-Tag Internationalisierung  b//ApplicationResources_de.properties error. customerfirstname =
  • Bitte geben Sie den Nache ein.
  • error.customerlastname=
  • Bitte geben Sie den Nachname ein.
  • error.customerphonenumber=
  • Bitte geben Sie Telefonnummer ein.
  • error.bookedseats=
  • Bitte geben Sie fr die Passagierzahl eine Zahl ein.
  • //default ApplicationResources.properties error. customerfirstname =
  • Please enter the name.
  • error.customerlastname=
  • Please enter the surname.
  • error.customerphonenumber=
  • Please enter the phone number.
  • error.bookedseats=
  • Please enter for the seat the digit.
  • c%gBcgc*g9cgcC         $% 7                    !        '   'Tag-Libs HTML-Tag Internationalisierung  Xweb.xml action org.apache.struts.action.ActionServlet application ApplicationResources ...... JSP K  &     # & 4      !    H    oTag-Libs logic-Tag$  ,&Die "struts-logic" Tags werden verwendet, um Prsentationslogik in JSP zu implementieren, ohne  scriptlets zu verwenden. Mit Hilfe von "struts-logic" Tags kann man bedingten Textausgaben erzeugen, ber Objekt-Container navigieren und Kontrollfu  flow managment verwalten.  O   .   tO cpTag-Libs logic-Tag   $Diese "struts-logic" Tags sind in vier Teile aufgeteilt: Value Comparisons:  The purpose of these tags is to print out the body of the tag if the comparison evaluates to true equal <logic:equal name="testsForm" property= konferenz" value= JAX"> //do something </logic:equal> notEqual <logic:notEqual name="testsForm" property=" konferenz " value=" JAX "> //do something </logic:notEqual>V9  e  i   i     _h   ,   @&            | 0} 0!),Tag-Libs logic-Tag   Diese "struts-logic" Tags sind in vier Teile aufgeteilt: Value Comparisons: greaterEqual lessEqual greaterThan lessThan present notPresent 9  B      &     0LX! 0Yb" 0do# 0pxqTag-Libs logic-Tag    Substring Matching:  The purpose of these tags is to match substrings inside of other Strings match notMatch Presentation Location  The purpose of these tags is to change the location of the presentation page forward redirect Collection Utilities iterate 0ZL0Z0Z0ZP0Z0Z0Z 0ZLP      @     0`e 0fn 0 0 0rTag-Libs template-Tag   BDie "struts- template" Tags werden verwendet, um JSP-Templates zu erzeugen, die gemeinsames Format fr verschiedene JSP s Seiten definieren. insert  Inserts a template. Templates are JSP pages that include parameterized content. That content comes from put tags that are children of insert tags. put  Puts content into request scope get  Gets the content from request scope that was put there by a put tag w$K -: O *(  0 0-0 0TWtTag-Libs template-Tag    //Definieren eines Templates <%@ taglib uri='/WEB-INF/tlds/struts-template.tld' prefix='template' %> ... //Einbinden eines Templates <%@ taglib uri='/WEB-INF/tlds/struts-template.tld' prefix='template' %> <template:get name='title'/> ... d;  $ ' 1 : P             -Struts zur Laufzeit / View (($ ?Neues in Struts 1.1  Multiple Application Support: Mit einem ActionServlet knnen mehrere Struts-Applikationen bedient werden Request-Prozessor: Das ActionServlet leitet die Request-Behandlung an eine Instanz der RequestProcesser-Klasse, der in der Datei struts-config.xml definiert wirdL 3\   @Neues in Struts 1.1 1Deklaratives Exception-Handling: Die deprecated Methode perform wirft nur IOException und ServletException. Die neue Methode execute kann alle Exception werfen. Es wird in der Datei struts-config.xml festgelegt, wie das Framework auf die Exception reagieren soll. ... !)!  1Ax   d     &  ANeues in Struts 1.1 Validator: Der Validator erlaubt es, in Konfigurationsdateien Regeln zur berprfung der Gltigkeit von Formulareingaben zu definieren, ohne dass eine Validationslogik programmiert werden muss. Tiles>  6  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  B Bb  i     C/Struts Multikanalfhigkeit   0Struts Multikanalfhigkeit   1Struts Multikanalfhigkeit   5Struts Multikanalfhigkeit   |!Struts Multikanalfhigkeit Cocoon"  $ ~!Struts Multikanalfhigkeit Cocoon"  $ }!Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ !Struts Multikanalfhigkeit Cocoon"  $ 7Struts zur Laufzeit / View (($ Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  F Bb  i     C Struts & Multiprotokoll ((  Struts & Multiprotokoll (( Struts & Multiprotokoll( 4  3 3 3 3 p   Struts & Multiprotokoll(package org.apache.struts.action; public class SecActionMapping extends ActionMapping { protected boolean secure; public void setSecure(boolean b){ this.secure = b; } public boolean getSecure(){ return this.secure; } } d0f5   Struts & Multiprotokoll( action org.apache.struts.action.SecActionServlet config /WEB-INF/struts-config.xml mapping org.apache.struts.action.SecActionMapping http-port 8080 https-port 8443       #       "  #  $ !  !  f) !  (    "  !  !    f     f   f   r               Struts & Multiprotokoll(6public class SecureActionServlet extends ActionServlet { protected String httpPort = "80"; protected String httpsPort = "443"; public void init() throws ServletException { super.init(); initPorts(); } protected void process(HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { // Redirect to https/http if necessary. if( checkSsl(mapping, request, response) ){ return ; } super.process(request, response); }7 3  333Cf6  >      Struts & Multiprotokoll(Ypage import="test.ssl.*" %> <%@ taglib uri="/WEB-INF/sslext.tld" prefix="sslext"%> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
    This posts to a secure action.

    // This posts to a non-secure action This posts to a non-secure action.

    rZ'%)                  Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  F F Bb  i     CVorteile von Struts  @Robust und fehlerarm: Dadurch, dass Struts  Open Source ist, wird der Quellcode immer wieder eingehend durchforstet, Fehler frhzeitig gefunden und behoben.< g,&g9Vorteile von Struts  6Sicherheit Da der Quellcode offen liegt, sind  Hintertren in Struts praktisch unmglich, da sie fr jeden ersichtlich wren, der den Code durcharbeitet.(  ?VVorteile von Struts  Literatur und Support Es gibt bereits eine groe Menge an Anleitungen, Artikel und Ratschlgen; der Support wird mit Hilfe von Mailinglisten abgewickelt Modifizierbar- und Erweiterbarkeit Der Struts-Code ist modifizierbar; dadurch knnen Fehler behoben werdenP#I#I, 5>Vorteile von Struts  Leicht Modifizierbar Ablauflogik wird externalisiert (xml-File) SEP durch die Trennung der Komponenten JSP-Designer brauchen keine Java-KenntnisseP,'-,'-,'[:Vorteile von Struts  Standard! kompatibel zur Sun J2EE Plattform basiert auf JSP&Servlet Technologie Anschaffungspreis Struts ist kostenlos Stndige Weiterentwicklung Fr sehr groe Anwendungen geeignetb F? F?,<NNachteile von Struts  "Fehlende Produktverantwortlichkeit Bei  Open Source -Projekten gibt es keinen Produktverantwortlichen. Es haftet somit niemand fr einen eventuell entstandenen Schaden aufgrund des fehlerhaften Produkts. Lngere Einarbeitungszeit Die Struts Tag-Libs sind relativ komplex.b#+# +>-;Nachteile von Struts  Keine offizielle Supportstelle Zu einem Produkt wird vom Hersteller meist ein teurer Support angeboten; das ist bei Open Source-Software nicht blich. Noch kein Standard Wird nach der Einfhrung von JSF nicht mehr weiterentwickelt?Py?y?yjNachteile von Struts  Releaseplanung schwer mglich Die Behebung von Fehlern bzw. die Implementierung von neuen Funktionalitten kann zeitlich nicht festgelegt werden, da  Open Source -Projekte schlecht planbar sind.($"<Nachteile von Struts  TZugriff in der Methode perform der Klasse Action auf xxxResponse und xxxRequest Objekte. Bietet die Mglichkeit Objekte in die Session zu stellen. public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {& }( bccc g3 cg3 ccg3 cc   E                  $ 0% 0& 0Nachteile von Struts  3Struts kennt keine Dialoge, sondern nur Aktionen. J( ( c.Agenda3 Tier Architektur Presentation Tier Model  View  Controller Model  View  Controller1 Model  View  Controller2 Struts Bestandteile von Struts Initialisieren Struts Controller Struts zur Laufzeit Model (ActionForm) Controller (ActionServlet & Actions) View (JSP & Struts Tags) Struts & Multikanalfhigkeit Struts & Multiprotokoll Zusammenfassung Beispiel:  Fliegen in der Nacht %PNQ51%B3FN(FN(BBFF FBBB%FB F  f  F F Ff  i     ChDie Architektur der Anwendung  Fliegen in der Nacht 55b$ =hDie Architektur der Anwendung  Fliegen in der Nacht 55b$ >hDie Architektur der Anwendung  Fliegen in der Nacht 55b$ hDie Architektur der Anwendung  Fliegen in der Nacht 55b$  LiteraturStruts User Guide, Struts API Documentation: http://www.jakarta.apache.org/struts Muhammet ztrk : Fliegen in der Nacht, Jaxmagazin 4/2002, page 48 http://www.javamagazin.de/ Boost Struts with XSLT and XML http://www.javaworld.com/javaworld/jw-02-2002/jw-0201-strutsxslt.html Mix protocols transparently in Struts http://www.javaworld.com/javaworld/jw-05-2002/jw-0510-struts.html StrutsCX: Struts ohne JSP - aber mit XSLT http://www.devx.com/Java/Article/11381 x-&DG'C*),  $  A =& 0.R 0 0 0A 0 (Danke fr Ihre Aufmerksamkeit! FRAGEN ?. )*/"()*,.f   !"& (!."2#3$4%6&8(rnJ2 Av