如何在鸡尾酒会上谈论Jini,J2EE和Web服务
2007-12-23 12:23:37 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備胶绮崝锕傚礈濞嗘挸绀夐柕鍫濇川绾剧晫鈧箍鍎遍幏鎴︾叕椤掑倵鍋撳▓鍨灈妞ゎ厾鍏橀獮鍐閵堝懐顦ч柣蹇撶箲閻楁鈧矮绮欏铏规嫚閺屻儱寮板┑鐐板尃閸曨厾褰炬繝鐢靛Т娴硷綁鏁愭径妯绘櫓闂佸憡鎸嗛崪鍐簥闂傚倷鑳剁划顖炲礉閿曞倸绀堟繛鍡樻尭缁€澶愭煏閸繃宸濈痪鍓ф櫕閳ь剙绠嶉崕閬嶅箯閹达妇鍙曟い鎺戝€甸崑鎾斥枔閸喗鐏堝銈庡幘閸忔﹢鐛崘顔碱潊闁靛牆鎳愰ˇ褔鏌h箛鎾剁闁绘顨堥埀顒佺煯缁瑥顫忛搹瑙勫珰闁哄被鍎卞鏉库攽閻愭澘灏冮柛鏇ㄥ幘瑜扮偓绻濋悽闈浶㈠ù纭风秮閺佹劖寰勫Ο缁樻珦闂備礁鎲¢幐鍡涘椽閸愵亜绨ラ梻鍌氬€烽懗鍓佸垝椤栫偛绀夐柨鏇炲€哥粈鍫熺箾閸℃ɑ灏紒鈧径鎰厪闁割偅绻冨婵堢棯閸撗勬珪闁逞屽墮缁犲秹宕曢柆宥呯闁硅揪濡囬崣鏇熴亜閹烘垵鈧敻宕戦幘鏂ユ灁闁割煈鍠楅悘鍫濐渻閵堝骸骞橀柛蹇旓耿閻涱噣宕橀纰辨綂闂侀潧鐗嗛幊鎰八囪閺岋綀绠涢幘鍓侇唹闂佺粯顨嗛〃鍫ュ焵椤掍胶鐓紒顔界懃椤繘鎼圭憴鍕彴闂佸搫琚崕鍗烆嚕閺夊簱鏀介柣鎰緲鐏忓啴鏌涢弴銊ュ箻鐟滄壆鍋撶换婵嬫偨闂堟刀銏犆圭涵椋庣М闁轰焦鍔栧鍕熺紒妯荤彟闂傚倷绀侀幉锟犲箰閸℃稑妞介柛鎰典簻缁ㄣ儵姊婚崒姘偓鐑芥嚄閸撲礁鍨濇い鏍仜缁€澶愭煥閺囩偛鈧摜绮堥崼鐔虹闁糕剝蓱鐏忣厾绱掗埀顒佸緞閹邦厾鍘梺鍓插亝缁诲啫顔忓┑鍫㈡/闁告挆鍕彧闂侀€炲苯澧紒鐘茬Ч瀹曟洟鏌嗗鍛唵闂佺鎻俊鍥矗閺囩喆浜滈柟鐑樺灥閳ь剛鏁诲畷鎴﹀箻閺傘儲鐏侀梺鍓茬厛閸犳鎮橀崼婵愭富闁靛牆楠搁獮姗€鏌涜箛鏃撹€块柣娑卞櫍瀹曟﹢顢欑喊杈ㄧ秱闂備線娼ч悧鍡涘箠閹板叓鍥樄闁哄矉缍€缁犳盯骞橀崜渚囧敼闂備胶绮〃鍡涖€冮崼銉ョ劦妞ゆ帊鑳堕悡顖滅磼椤旂晫鎳冩い顐㈢箻閹煎湱鎲撮崟顐ゅ酱闂備礁鎼悮顐﹀磿閸楃儐鍤曢柡澶婄氨閺€浠嬫煟閹邦厽绶查悘蹇撳暣閺屾盯寮撮妸銉ョ閻熸粍澹嗛崑鎾舵崲濠靛鍋ㄩ梻鍫熷垁閵忕妴鍦兜妞嬪海袦闂佽桨鐒﹂崝鏍ь嚗閸曨倠鐔虹磼濡崵褰熼梻鍌氬€风粈渚€骞夐敓鐘茬闁糕剝绋戝浠嬫煕閹板吀绨荤紒銊e劦濮婂宕掑顑藉亾瀹勬噴褰掑炊椤掑鏅梺鍝勭▉閸樺ジ宕归崒鐐茬婵烇綆鍓欐俊鑲╃磼閳ь剟宕橀鐣屽弳濠电娀娼уΛ娆撍夊⿰鍫熺厽闁挎洖鍊烽幉鐐叏婵犲偆鐓肩€规洘甯掗埢搴ㄥ箳閹存繂鑵愬┑锛勫亼閸婃垿宕硅ぐ鎺撴櫇闁靛牆顦悡婵堚偓骞垮劚椤︻垶宕¢幎鑺ョ厪闊洦娲栧暩濡炪倖鏌ㄩˇ闈涱潖濞差亜绠归柣鎰絻婵爼姊洪崨濠冨鞍闁荤啿鏅犻獮鍐潨閳ь剟鐛惔銊﹀殟闁靛/鍐ㄧ闂傚倷绀侀幉锟犲礉閹达箑绀夐幖娣灪濞呯娀鏌¢崶鈺佇ョ痪鎯с偢閺屽秷顧侀柛鎾跺枎閻e嘲顫滈埀顒勫春閻愭潙绶為柛婵勫劤濞夊潡姊婚崒姘g湅闁稿瀚叅闁靛牆鎮胯ぐ鎺撳€婚柛鎾崇仢濞差參寮崘顔肩劦妞ゆ帒瀚粻鎺撶節閻㈤潧孝闁挎洏鍊濋幃褑绠涘☉娆忎患濠电偛妯婃禍婵嬫偂濞戙垺鍊堕柣鎰邦杺閸ゆ瑥鈹戦垾鐐藉仮闁哄苯绉堕幉鎾礋椤愩倓绱濋柣搴ゎ潐濞叉牕鐣烽鍕厺閹兼番鍊楅悿鈧梺瑙勫劤椤曨厼危濡ゅ啰纾介柛灞捐壘閳ь剚鎮傚畷鎰版倻閼恒儮鎸冮悗骞垮劚椤︻垳绮堟径鎰閺夊牆澧介崚浼存煕閵婏妇绠栭柕鍥у瀵粙顢曢~顓犳崟濠碘剝顨呴幊妯侯潖濞差亜宸濆┑鐘插暙椤︹晠姊洪幖鐐插濠㈢懓妫涢崚鎺撶節濮橆剛顔呴梺鍏间航閸庨亶鍩€椤掑倹鏆柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝蹇撐涢崟顖涚畳闂備胶绮灙鐎规洜鏁婚幃楣冩倻濡寮挎繝鐢靛Т閸燁垶濡靛┑鍥︾箚妞ゆ劑鍨归弳娆撴煃閽樺妲搁柍璇查叄楠炲洭顢橀悙鈺佷壕闁绘垼濮ら埛鎴︽偣閸ャ劌绲绘い鎺嬪灲閺岋綁顢樿濞呭秶鈧娲╃换婵嬬嵁鎼淬劍鍤嶉柕澶堝劙缁勪繆閻愵亜鈧牕煤瀹ュ纾婚柟鎯х亪閸嬫挾鎲撮崟顒傤槬闂佺粯鐗曢妶鎼佸Υ娴h倽鏃€鎷呴崫銉х嵁闂佽鍑界紞鍡涘磻閸涘瓨鍋熸い鎰ㄦ噰閺€浠嬫煟濡澧柛鐔风箻閺屾盯鏁愭惔锛勪化閻庡灚婢橀敃顏勭暦濠婂棭妲烽梺绋款儐閹稿墽鍒掗鐐╂婵☆垳绮幃娆戠磽娴e搫校闁绘搫绻濆璇测槈閵忕姈銊︺亜閺冨倸甯舵い顐熸櫊濮婃椽鎸婃径濠冩闂佸摜濮甸悧鐘差嚕婵犳碍鏅插璺猴攻椤ユ繈姊洪崷顓€鍦偓娑掓櫊瀹曚即骞囬悧鍫氭嫼闂佺厧顫曢崐鏇㈠几鎼达絿纾界€广儱鎷戦煬顒傗偓娈垮枦椤曆囧煡婢舵劕鐓戦柍瑙勫劤娴滈箖鏌ㄩ弴鐐测偓鍝ョ不閿濆棛绡€闂傚牊绋掑婵喢瑰⿰搴濈凹濞e洤锕幃娆擃敂閸曘劌浜鹃柕鍫濐槸缁€鍫熺箾閸℃ɑ灏伴柛瀣儔閺屾盯鍩勯崘顏佹灁闂侀€炲苯澧俊顐㈠暙閻e嘲顫滈埀顒勩€佸▎鎾冲簥濠㈣鍨板ú銈囩不閸︻厾纾兼い鏃傚帶鐢劑鏌涚€n偅宕岄柟宕囧█椤㈡鍩€椤掑嫬鍚规い鎺戝€荤壕浠嬫煕鐏炴崘澹橀柍褜鍓熼ˉ鎾斥枎閵忋倖鏅搁柣妯垮皺閻涖儱鈹戞幊閸婃洟骞婃惔锝囦笉濞寸厧鐡ㄩ悡娆撴⒒閸屾凹鍤熼柛鏂跨Ч閺屾稓鈧急鍕彋闂佸搫鐭夌紞渚€鐛€n喗鏅查柛鈾€鏅滈ˉ澶岀磽娴i缚妾搁柛妯绘倐瀹曟垿骞樼紒妯锋嫽婵炶揪缍€濞咃絿鏁☉銏$厱闁哄啠鍋撴繛鍙夌矌閸掓帡寮崼鐕佹濠电偟顥愬▍鏇㈡儎椤栨氨鏆︽慨妞诲亾妞ゃ垺鐟╁畷妤呭礂婢惰宀稿缁樼瑹閳ь剟鍩€椤掑倸浠滈柤娲诲灡閺呭爼顢涢悙瀵稿帾闂佹悶鍎滈崘鍙ョ磾婵°倗濮烽崑鐐垫暜閿熺姷宓侀悗锝庝簴閺€浠嬫煙闁缚绨界痪鎯ь煼濮婅櫣鎷犻崣澶婃敪濡炪値鍋勯ˇ鐢哥嵁閹邦収妲归幖杈剧悼閻掑吋绻涢幘鏉戠劰闁稿鎹囬弻娑㈠煛閸愩劋妲愬Δ鐘靛仜椤戝寮崒鐐村癄濠㈣泛顦伴惈蹇涙⒒閸屾瑧顦︽繝鈧潏鈺佸灊妞ゆ牗绮嶉弳婊堟煃閸濆嫬鈧悂顢氶柆宥嗙厓鐟滄粓宕滃☉姘潟闁规儳鐡ㄦ刊鎾煟閻斿憡绶插┑顔哄灲閹嘲饪伴崟顐闂佺ǹ顑囬崰鏍х暦濮樿泛绠抽柟瀛樻⒐閻庡姊虹憴鍕姢闁汇倕娲獮妤呭即閻愨晜鏂€闂佺粯鍔栧ḿ娆撴倶閿曞倹鐓熸い鎾楀啯鐏堥梺瀹狀唺缁瑩銆侀弮鍫濋唶闁绘柨鎼獮宥夋⒑閼姐倕鏋戦柣鐔村劤閳ь剚鍑归崜姘跺箞閵娾晛鐐婇柕濠忕导缁ㄥ姊洪棃娑辨濠碘€虫川缁鎮欑€涙ê寮挎繝鐢靛Т閸燁垶濡靛┑瀣厸閻忕偠濮ら崵鍥煙椤旂晫鎳囬柟宕囧Х閹瑰嫭绗熼娆戠>濠电姷鏁告慨顓㈠箯閸愵喖纾兼慨姗嗗墰閵堫噣姊绘担鍛婃儓闁活剙銈稿畷浼村冀椤撶偟顔愰悷婊呭鐢晠寮崘顔界叆婵犻潧妫欓崳浠嬫煥濞戞瑦宕屾慨濠勭帛閹峰懘鎮烽柇锕€娈濈紓鍌欐祰椤曆呪偓姘緲閻g兘骞嬪┑鍐╊潔闂侀潧绻掓慨鐑藉储閹绢喗鈷戦柣鐔煎亰閸ょ喎鈹戦鍛籍鐎规洘鍨块獮妯肩磼濡粯鐝抽梺鍦帶閻°劑鏁嬫繛瀛樼矌閸嬫捇濡甸崟顖氱閻庣數纭舵慨鍥р攽閻愬弶鍣归柨鏇ㄤ邯瀵鏁嶉崟顏呭媰闂佷紮绲介惈妤呮晲閸℃瑧顔曠紒鐐緲瑜板鏌囬娑辨闁绘劘灏欑粻鍐裁归悪鍛暤闁圭ǹ锕ュ鍕節閸涱厼缂氶梻鍌氬€搁崐鎼佸磹閻戣姤鍊块柨鏇炲€归崕鎴犳喐閻楀牆绗掔痪鎯х秺閺岋繝宕堕妷銉т患缂備胶濮锋繛鈧柡宀€鍠栭弻鍥晝閳ь剟寮搁悢鎼炰簻妞ゆ劧绲剧粈瀣煛瀹€鈧崰鏍嵁閸℃凹妲鹃梺鍦櫕婵挳鍩為幋锔绘晬婵炴垶鐟ラ崬澶愭⒑閸濆嫭婀伴柣鈺婂灦閻涱喖顫滈埀顒€顕i崼鏇炵闁绘ḿ鍋i崑锟犳⒒閸屾瑧顦﹂柟璇х節楠炴劗绮欑捄銊︽濡炪倖甯掔€氀囧焵椤掍焦顥堢€规洘锕㈤、娆撳床婢诡垰娲﹂悡鏇㈡煃閳轰礁鏋ゆ繛鍫熋湁闁绘ǹ娅曢崐鎰叏婵犲啯銇濋柟绛圭節婵″爼宕ㄩ鐣屾И闂傚倷绀侀幖顐﹀箠韫囨稒鍎庢い鏍仜缁犳牕螖閿濆懎鏆為柛濠傤煼閺岋箑螣閻氬绀嗛梺闈浤涢崟顐g€惧┑鐘灱閸╂牠宕濋弴鐘差棜濠电姵纰嶉悡娆撴煕閹炬鎳庣粭锟犳⒑閸濆嫭鍣洪柣鎿勭節閻涱噣寮介銏犵亰闂佽崵鍠愬姗€鍩涙径鎰拺閻犲洩灏欑粻鎵磼婢跺本鍤€妞ゎ偄绻橀幖褰掑捶椤撶媴绱叉繝纰樻閸ㄧ敻顢氳濡嫬顓奸崨顏呮杸闂佺粯鍔栬ぐ鍐棯瑜旈弻銊╁即濡櫣浠炬繛锝呮搐閿曨亪骞冮悾宀€鐭欓悹渚厛濡茶淇婇悙顏勨偓鏍偋濡も偓椤繈濡搁埡鍌氫痪闂侀€炲苯澧存慨濠傤煼瀹曟帒顫濋钘変壕闁归棿鐒﹂崑瀣攽閻樻彃顏柣顓熺懇閺岀喖鏌囬敃鈧弸锕€鈹戦钘夆枙闁哄被鍊曢湁閻庯綆鍋呴悵鏍磼閻愵剙绀冩俊顐㈠濠€渚€姊洪幐搴g畵闁绘锕棢濠㈣埖鍔栭悡鐔兼煙閻愵剚缍戝┑顔肩墦閺岀喐绗熼崹顔碱瀳闁句紮绲跨槐鎺斺偓锝庝簽娴犮垺銇勯鈧鍛村煘閹达箑鐏抽柛鎰皺妤犲洭姊洪崨濠冣拹闁荤啿鏅犻幃浼搭敊閸㈠鍠栧畷妤呮偂鎼达絽閰遍梻鍌欐祰閸嬫劙鍩涢崼銉ョ闁挎洍鍋撻崡鍗灻归悡搴f憼闁抽攱甯掗湁闁挎繂姣ヨぐ鎺戞辈闂侇剙绉甸悡娆戠棯閺夊灝鑸瑰ù婊勫閳ь剝顫夊ú姗€宕濋弽顐e床婵犻潧鏌婇幒鏃傜煓闁圭ǹ楠搁弸鐘绘倵濞堝灝鏋﹂柛鈺傜墵楠炲棝寮崼婵堫啋闁诲孩绋掕摫婵犮垺鍨甸埞鎴︽晬閸曨偂鏉梺绋匡攻閻楁洟锝炶箛鏃傜瘈婵﹩鍎甸妷鈺傚€甸柨婵嗙凹閹查箖鏌涢悢閿嬪殗闁哄本娲樺鍕槈濠婂拋妲瑰┑鐐茬摠缁秶鍒掑澶娢﹂柛鏇ㄥ灠缁犲鎮规ウ鎸庛€冪紒顔挎硾閳规垿鍩勯崘銊хシ濡炪値鍘鹃崗妯侯嚕婵犳碍鏅插璺侯儐濞呮粓姊洪幖鐐插妧闁告劑鍔庨鍝勨攽鎺抽崐妤佹叏閻戣棄纾婚柣鎰仛閺嗘粓鏌ㄩ悢鍝勑ョ€规挷绶氶幃妤呮晲鎼粹剝鐏堢紓渚囧亜缁夊綊寮诲鍫闂佸憡鎸鹃崰鏍嵁閸愩剮鏃€鎷呴搹鍦婵犳鍠楅敃鈺呭储閹间礁绠繛宸簼閻撶喖鏌i弬鎸庢喐闁瑰啿鍟撮幃妤€顫濋悡搴$睄閻庤娲樺ú鏍亙闂佸憡渚楅崰姘跺储閸楃偐鏀介柍钘夋閻忋儵鏌曢崱蹇撲壕闂備胶枪椤戝棝骞戦崶顒€绠栭柕蹇嬪€曠粻鐢告煙閻戞ê鐏╅梻鍐e亾婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒妯虹伌濠碉紕鏁诲畷鐔碱敍濮橀硸鍟嬮梻浣告啞椤ㄥ牓宕戦悢鍝ヮ浄闁兼祴鏅濈壕濂告煟閹伴潧澧柛鏂诲€栭妵鍕敇閻樻彃骞嬮悗娈垮枛椤兘骞冮姀銈嗗亗閹艰揪缍嗗Σ鍫曟煟閻斿摜鐭婄紒缁樺浮瀵偊顢欑亸鏍潔闂侀潧楠忕槐鏇㈠储閹剧粯鈷掑ù锝呮憸娴犮垺銇勯幋婵囧殗闁诡喗锕㈤弫鍐磼濞戞艾甯鹃梻浣规偠閸庢粓宕橀崣銉х>濠德板€楁慨鐑藉磻閻愬灚鏆滈柍銉ョ-閺嗭箓鏌涘Δ鍐ㄥ壉婵炴挸顭烽弻鐔碱敍閸℃婀版い銉磿缁辨捇宕掑顑藉亾閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛闂佽姤蓱缁诲牆顫忓ú顏嶆晢闁逞屽墰缁棃骞橀鐓庡殤婵炶揪绲跨涵鍫曞绩娴犲鐓熸俊顖涘閻濐亪鏌i妸锕€鐏╅柍褜鍓濋~澶愬箰妞嬪孩顐芥慨妯挎硾閽冪喐绻涢幋娆忕仼闁绘帗妞介弻娑㈠箛閸忓摜鎸夋繝娈垮枛濞差厼顫忛搹鍦煓闁告牑鈧啿顫犻梻浣呵圭换鎴︽晝閵忕媭鍤曢悹鍥ㄧゴ濡插牊淇婇鐐存暠闁哄倵鍋撻梻鍌欒兌绾爼宕滃┑瀣ㄢ偓鍐疀閺傛鍤ら梺閫炲苯澧ǎ鍥э躬閹瑩顢旈崟銊ヤ壕闁哄诞灞剧稁閻熸粎澧楃敮鎺旂矆婢舵劖鐓涢柛銉e劚閻忊晠鏌i幘杈捐€块柡宀€鍠愬ḿ蹇斻偅閸愨晩鈧秹姊虹粙鍖″伐妞ゎ厾鍏樺璇测槈閵忕姈銊╂煏韫囧﹤澧查柣婵囩墵閺屸€愁吋韫囨洜鐦堝┑顔硷功缁垶骞忛崨鏉戝窛濠电姴鍊瑰▓姗€姊绘担鍛婅础閺嬵亝銇勯鐘插幋妤犵偛鍟撮幃婊堟嚍閵夛附鐝曢梻浣风串缁茶姤寰勯崶顒€缁╅柧蹇e亞缁♀偓闂佹眹鍨藉ḿ褍鐡繝鐢靛仩椤曟粎绮婚幘宕囨殾闁汇垻枪缁€鍐┿亜閺冨倹娅曢柛妯绘崌濮婃椽宕ㄦ繝鍕暤闁诲孩鍑归崜鐔奉嚕閹惰姤鍋勯柛蹇氬亹閸欏棗鈹戦悙鏉戠仸闁荤啙鍥ㄥ剹闁圭儤鎸婚崣蹇撯攽閻樺弶宸濈紒鍙樺嵆閺屾洟宕堕妸銉ヮ潚濡ょ姷鍋炵敮锟犵嵁鐎n亖鍫柛鎰ㄦ櫇閳ь剚濞婂濠氬磼濞嗘埈妲梺纭咁嚋缁绘繈骞冮悜钘壩ㄩ柨鏃傜帛椤旀棃姊鸿ぐ鎺擄紵缂佲偓娓氣偓閹€斥攽鐎n偆鍘甸梺缁樺姦閸撴岸鎮橀柆宥嗙厱妞ゆ劦鍋傞柇顖炴煛鐏炲墽娲存い銏℃礋婵″爼宕ㄩ鍙ョ按闂傚倷绀侀幉陇鎽梺璇″枛閸婂灝顕f繝姘櫜闁割偁鍨婚弶鎼佹⒑閸濆嫭宸濋柛瀣耿楠炲顦版惔锝囷紲缂傚倷闄嶉崹褰掔嵁閺嶎厽鐓熼柡宥庡亜鐢爼鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷顔荤盎闁汇劍妞介弻锝夊Χ閸屾矮澹曟繝鐢靛Х閺佹悂宕戦悩璇茬妞ゅ繐妫楃欢銈吤归悩宸剰缂佺姷鍠栭弻銊╂偄閸濆嫅銏㈢棯閹规劦娼愰柕鍥у瀵粙顢曢~顓熷媰闂備焦濞婇弨閬嶅垂瑜版帗鍎夋い蹇撶墱閺佸洭鏌i幇顓熺稇婵炲拑绲剧换娑氣偓娑欋缚閻﹦绱撳鍜冭含妤犵偛鍟伴幑鍕偘閳╁喚娼旈梻浣告惈鐠囩偤宕橀妸鎰礋濮婄粯鎷呴搹骞库偓濠囨煛閸屾瑧绐旂€规洘鍨块獮姗€骞囨担鐟扮槣闂備線娼ч悧鍡椢涘Δ鍐當闁圭儤顨嗛悡鏇㈡煟閺囨氨顦﹀ù婊€鍗抽弻鐔碱敍濮橆剚娈柣鎾卞€栭妵鍕疀閹炬潙娅ч梺鍛娒幉锛勬崲濞戞瑦缍囬柛鎾楀啫鐓傛繝鐢靛Л閸嬫捇寮堕崼娑樺婵炲懐濮甸妵鍕疀閹捐泛顤€闂佺粯鎸搁崯鎾箖瀹勬壋鏋庨煫鍥ㄦ惄娴犲ジ姊虹拠鑼闁瑰憡濞婂濠氭偄绾拌鲸鏅╅梺浼欑到閺堫剟宕虫导瀛樺€垫繛鍫濈仢閺嬫盯鏌i弽褋鍋㈤柣娑卞枤閳ь剨缍嗛崰妤呭磻閹版澘绾ч柛顐亞閸樻盯鏌℃担鍛婂枠婵﹤顭峰畷鎺戭潩椤戣棄浜惧瀣捣閻棗霉閿濆浜ら柤鏉挎健瀵爼宕煎☉妯侯瀷婵炲濮靛畝绋款潖缂佹ɑ濯村〒姘煎灡閺侇垱绻濆▓鍨灁闁稿﹥顨婂畷姘跺箳閹炬潙鍔呴梺闈浨归崕鎶剿囬锔解拺闁革富鍘奸崝瀣亜閵娿儲鍣介柣姘劤椤撳吋寰勭€n剙骞堟俊鐐€栭崝鎴﹀磹閺囥垹鍑犻幖绮瑰煑瑜版帗鍋愰柣鎴烇供娴犫晝绱撴担浠嬪摵闁圭ǹ顭烽獮蹇涘川閺夋垹顦梺鍦帛鐢帗绔熷鍡曠箚闁绘劦浜滈埀顒佺墪鐓ゆ俊顖濆吹缁犳儳鈹戦悩鍙夋悙闁哄绶氶弻娑㈠箛闂堟稒鐏堢紒鐐劤閸氬鎹㈠☉銏犵闁绘劘娉涢ˉ婵單旈悩闈涗粶闁绘鎸搁~蹇曠磼濡顎撻梺鍛婄☉閿曘儵宕曢幘鏂ユ斀闁绘劘灏欏﹢鎾煕閵娿劍顥夐柣锝呭槻閳规垿宕卞▎鎰暦闂備礁鎲″ú锕傚礈濞嗘挸鐒垫い鎺嗗亾闁绘牕銈稿濠氭晲閸涘倻鍠栭幊鏍煛娴d警鍋ч梻鍌欒兌缁垶骞愮拠瑁佹椽鎮㈤悡搴ゆ憰闂佺粯鏌ㄩ崥瀣吹鐎n偁浜滈柟鍝勬娴滅偓绻濈喊澶岀?闁告鍥ㄧ畳婵犵數濮撮敃銈団偓姘煎墴瀹曟繈濡舵径瀣帗闁荤喐鐟ョ€氼剟鎮橀幘顔界厸濞达絽鎽滄晥閻庤娲滈崰鏍€侀弴銏犵労闁告劏鏅濈粣鏃堟⒒閸屾艾鈧兘鎳楅懜鐢典粴闂備焦瀵уú蹇涘磿閻㈢ǹ绠栫憸鏃堝箖閳哄懏鍤戞い鎺嶇劍椤旀洘绻濋悽闈涒枅婵炰匠鍥舵晞闁糕剝绋戦悿鐐節闂堟侗鍎愰柣鎾冲暟閹茬ǹ饪伴崼婵堫槶闂佺粯姊婚崢褔鎮橀幎鑺ョ叆闁哄洨鍋涢埀顒佹倐閺屻劑濡堕崱鏇犵畾闂侀潧鐗嗛崐鍛婄妤e啯鈷戠紓浣姑粭鎺楁煟韫囨柨鍝哄┑锛勬暬瀹曠喖顢涘槌栧敽闁诲骸绠嶉崕閬嶆偋閸℃稑鍌ㄩ柨娑樺绾捐棄霉閿濆懏鎯堢€涙繃绻濋埛鈧崒婊呯厯闂佺硶鏂侀崑鎾愁渻閵堝棗鍧婇柛瀣崌閺屾稑螣閼姐倗鐓夐悗瑙勬礃閸ㄥ潡鐛鈧顒勫Ψ閿旇姤婢戦梻鍌欒兌缁垱鐏欐繛瀛樼矤閸撴稓鍒掗敐澶婄睄闁割偆鍠撻崢閬嶆煟鎼搭垳绉甸柛瀣笒閳绘捇寮崼鐔哄帗闁荤喐鐟ョ€氼剟鎮樼€涙ǜ浜滈柕蹇ョ磿閹冲懏绻涢幋鐘虫毈闁诡喗绮撻幃鍓т沪閽樺鍞ㄥ┑鐘垫暩婵兘寮幖浣哥;婵炴垯鍨圭粻顖炴煙鐎电ǹ孝缂佽翰鍊濋弻娑⑩€﹂幋婵囨疇闂佹寧绻傞ˇ顖滅不濞戙垺鐓涘璺哄绾埖銇勯弬鍖¤含婵﹥妞介幃鐑藉级閹稿孩鐦g紓浣稿⒔閾忓酣宕i崘銊ф殾濞村吋娼欑粻濠氭偣閸ヮ亜鐨烘い鏂挎濮婅櫣绱掑Ο鍓佺窗缂備緡鍣崹璺虹暦閻㈢ǹ绠i柨鏃傛櫕閸樺墽绱撴担鍓插創婵炲娲樼粋鎺戔槈濞嗘劕寮块梺鎸庣箓濡鎱ㄥ鍡樺弿濠电姴鍋嗛悡鑲┾偓瑙勬礃鐢帡锝炲┑瀣垫晞闁芥ê顦竟鏇㈡⒑缂佹ê鐏卞┑顔哄€濆畷鐢稿礋椤栨稓鍘鹃梺鍛婄缚閸庢煡寮抽埡浼卞綊鎮╁畷鍥舵殹缂備胶绮换鍫ュ箖娴犲顥堟繛鎴烆殘閹规洘淇婇悙顏勨偓鏍洪敃鍌氱煑闁告劑鍔庨弳锔戒繆閵堝倸浜鹃柧浼欑到閵嗘帒顫濋悡搴d哗濠电偛鐗勯崝宀勨€旈崘顔嘉ч柛鈩冾殔椤洭姊虹粙鍖℃敾闁绘绮撻崺鈧い鎺嶈兌椤e弶鎱ㄥΟ绋垮闁糕斁鍋撳銈嗗笒閸婂綊宕甸埀顒佺節閵忋垺鍤€闁挎洦浜滈悾閿嬪閺夋垵鍞ㄩ悷婊冾樀瀵悂寮崼鐔哄帾婵犵數濮寸换鎰般€呴鍌滅<闁抽敮鍋撻柛瀣崌濮婄粯鎷呴崷顓熻弴闂佹悶鍔忓Λ鍕幓閼愁垼妲奸梺缁橆殔濞撮妲愰幘瀛樺闁告繂瀚竟鏇炩攽閻橆喖鐏畝锝堟硶閸掓帡寮崼鐔蜂画闂備緡鍙忕粻鎴濃枔閵娾晜鈷戦柛婵嗗椤箓鏌涙惔銈勫惈缂侇喖顭烽幃浠嬪川婵犲嫬骞嶉梻浣虹帛閸ㄨ泛鐜荤捄銊т笉婵せ鍋撻柡灞剧洴閹瑩宕归锝嗙槗闂備礁鎼惌澶岀礊娓氣偓楠炲啴鍩¢崨顔尖偓缁樻叏濡も偓濡棃宕Δ鍛拺閻犲洩灏欑粻鎵磼鐠囪尙澧︾€规洘绻傞悾婵嬪礋閸偅娅撻梻濠庡亜濞诧妇绮欓幋婵囨殰闂佽崵鍠愮划宀勊囬棃娑氭殾闁硅揪绠戠粻濠氭煠閹间焦娑ч柡瀣€垮娲川婵犲啫顦╅梺鍛婃尰閻熝囧窗婵犲偆鍚嬮柛娑变簼閺傗偓闂備礁鐤囧Λ鍕涘Δ浣侯洸婵犻潧鐗忕壕濂告偣閸ャ劌绲婚柍褜鍓欏ḿ锟犲极閹扮増鍊烽柛鎾茶兌閺夌ǹ鈹戦悙鏉戠仸闁荤噦绠撳畷鏇㈩敂閸啿鎷洪梻鍌氱墐閺呮盯鎯佸⿰鍫熺厱婵せ鍋撶紒鐘崇墵瀵偄顓奸崨顏勭墯闂佸憡鍔х徊楣冨棘閳ь剟姊绘担鍝ユ瀮婵☆偄瀚灋婵°倕鎳忛崐鍫曟煟濡偐甯涢柣鎾寸懅閻ヮ亪寮堕崹顔垮煘婵炲瓨绮堥崡鎶藉蓟閵娿儮鏀介柛顐g箑缁泛顪冮妶鍡樺碍闁靛牏枪閻g兘宕奸弴鐐靛幐闂佸憡鍔樺▔鏇㈡⒒椤栨稓绡€闁汇垽娼ф禒鈺呮煙濞茶绨界紒杈╁仦缁楃喖鍩€椤掑啯锛傞梻浣筋潐瀹曟﹢顢氳缁牊寰勭仦绋夸壕妤犵偛鐏濋崝姘亜閿斿灝宓嗛柟顔光偓鏂ユ瀻闁瑰濮烽敍婊堟煟鎼搭垳绉靛ù婊呭仦缁傛帡濮€閵堝棛鍘搁梺绯曞墲缁嬫劙骞夋ィ鍐╃厸鐎光偓鐎n剛袦闂佽桨鐒﹂崝娆忕暦閹偊妲诲Δ鐘靛仜椤戝懓鐏冮梺缁橈耿濞佳勭濠婂嫨浜滈柟瀛樼箥濡偓閻庢鍣崑濠傜暦濮椻偓椤㈡瑩鎳栭埡浣感曞┑锛勫亼閸婃牜鏁幒妤€纾圭紓浣贯缚閳绘梻鈧箍鍎遍幊澶愬绩娴犲鐓熸俊顖濇閿涘秵銇勯敐鍡欏弨闁哄本绋撻埀顒婄到婢у海绮旈鈧弻锛勪沪閸撗勫垱婵犵绱曢崗姗€鐛€n亖鏀介柛鈩兩戦宥呪攽鎺抽崐妤佹叏閺夋嚚娲敇閵忕姷鐣哄┑掳鍊曢崯顖炲窗閸℃稒鐓曢柡鍥ュ妼婢ь喚鐥弶璺ㄐょ紒杈ㄦ尰閹峰懘宕滈崣澹囨⒑閻熺増鍟炲┑鐐诧躬瀹曡銈i崘銊х潉闂佸壊鍋呯换鍕囬妸銉富闁靛牆妫欓悡銉︿繆閹绘帞澧fい锕€缍婇弻锛勪沪閸撗勫垱闂佺硶鏅涚€氭澘鐣峰Δ鍛亼闁逞屽墯缁傚秹顢旈崟搴㈢洴瀹曠喖顢曢銏″€梻浣规偠閸庮噣寮插┑瀣櫖婵犻潧娲ㄧ粻楣冨级閸繂鈷旈柛鎺撴緲椤潡鎮风敮顔垮惈閻庤娲樺ú鐔肩嵁閸ヮ剚鍋嬮柛顐犲灩楠炲牓姊绘笟鈧ḿ褎鐏欓梺绋块叄娴滃爼濡撮崒姘辨殾闁搞儮鏅濋敍婊冾渻閵堝棙鈷掗柍宄扮墦瀹曟洝绠涢弬璁崇盎闂佽鍎抽崯鍧楀箖閹寸姭鍋撻崹顐g凡閻庢凹鍣i崺鈧い鎺戯功缁夐潧霉濠婂嫮澧电€规洘鍨块獮妯肩磼濡厧寮抽梺璇插嚱缁插宕濈€n剝濮冲┑鐘崇閳锋垿鏌i悢鍝勵暭闁诡垰鐗忕槐鎺撳緞婵犲嫬鐓熼柦妯荤箞閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鎼佸煝閹捐鍨傛い鏃傛櫕娴滎亪姊绘担绛嬪殭缂佺粯鍨归幑銏ゅ醇閵夈儲妲梺缁樺姇閹碱偆绮婚敐澶嬬叆闁哄洦顨呮禍楣冩⒑缂佹ɑ鎯堢紒缁樼箞瀵鈽夐姀鐘靛姶闂佸憡鍔楅崑鎾绘偩閸忚偐绠鹃悗鐢登归宀勬煕閵娿劍纭炬い顐㈢箰鐓ゆい蹇撳缁愭稒绻濋悽闈浶㈡繛瀵稿厴瀹曟繈宕奸弴鐔叉嫼闂佸憡绋戦敃銉﹀緞閸曨垱鐓曟繛鍡楃箻椤庢鎮¢妶澶嬬厱婵炴垶锕妤冪磼鐠囧弶顥㈤柡灞炬礋瀹曠厧鈹戦崼銏╁敽闂備礁鎲$敮濠囧础閹惰棄钃熸繛鎴欏灪閸嬪棗霉閿濆懏鎲稿ù鐘虫倐閹鎲撮崟顒傤槰闂佸憡姊归悷銉╂偩閻ゎ垬浜归柟鐑樼箖閺呮繈姊洪幐搴g畵闁瑰啿瀛╃€靛吋鎯旈姀銏㈢槇缂佸墽澧楄摫妞ゎ偄锕弻娑㈠Ω閿曗偓閳绘洜鈧娲忛崹濂杆囧畷鍥╃<闁稿本姘ㄦ牎闂侀潧鐗炵紞浣哥暦濮椻偓閸┾剝鎷呴幓鎺嶅闂佸壊鐓堥崑鍛村矗韫囨柧绻嗘い鏍ㄧ矊鐢泛霉濠婂牏鐣洪柟顔筋殔椤繈鎮欓鈧锟�

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:
http://www.onjava.com/pub/a/onjava/2003/08/27/cocktails.Html
中文地址:
http://www.matrix.org.cn/resource/article/43/43781_Jini_J2EE.html
关键词: Jini J2EE Web
编辑说明:Kathy Sierra 和Bert Bates是O’Reilly的Head First系列的后台智囊。他们第一次写这篇文章是在2003年Head First Java发行的那时候。这本书变得十分流行,我们现在仍然收到订单。如此多的订单让我们决定重新带给读者,这就导致Head First Java,2nd Edition的发行。所以如果第一次发行的时候你没赶上,现在就让Kathy和Bert告诉你如何与Java初学者交谈。
这些都是可以预测到的:当你在一个宴会中,喝着次等的马提尼酒,不可避免的就会谈到分布式编程。怎么办?放松点,因为在这里我们会解决3种最有意思的分布式编程,就在用完的餐巾上画图,你可以用来提高你的 whuffie. (不知道 whuffie是什么? 读读 Richard Koman's interview with Cory Doctorow.)
但是首先,万一你真的现在就在某个宴会上,我们首先从几个即使你不懂Java也可以使用的短语。然后,对于那些确实知道一些Java技术的人,我们会谈得更深入一点。
“什么是动态发现?你知道,它的含义就是在网络上,尽管客户端和服务事先对对方一无所知,但能动态地发现对方。这所有都是基于ip广播的。”
“什么是自动诊断网络 (self-healing network) 呢?它指Jini网络总是能够反映当前所有可用的服务的状态--就像这样:‘OK,这个服务起来了,那个服务当掉了……’没有任何人的管理!”
当然,大多数路由器禁止了IP广播,所以你不准备在web上用Jini。但是Jini是为本地网络的工作,或者本地网络的集合而设计的,所以这并不是个大问题。
“J2EE最酷的东西是提供商独立,你可以专心于你的商业逻辑,将那些重担交给厂商。你可以在你特殊的商业规则上工作,把那些安全,事务,并行,持久化,甚至网络代码实现的任务交给服务器。而你只需要去学一个API,你可以重新部署你的J2EE程序给所有厂商的与J2EE兼容的服务器。所以现在厂商必须改变以前那种将你锁起来,并且你必须乞求厂商添加新的功能以解决bugs的方式。”
“Web服务中酷的东西是…嗯,OK,也许现在的情况Web services没有什么真正酷的东西。但是会变的,就在不久的未来,当所有标准都提出,工具成熟了,以及….”
“但是如果要说Web 服务酷,这也许因为你可以采用你已有的商业程序,甚至旧的程序,让他们通过xml那样的接口暴露在Web上。客户端通过可互操作的方式发送一个XML信息(通过一种叫SOAP的格式)给服务。”
“安全和事务是现在Web服务的两个明显的缺陷,这意味着所有人必须加入自己的解决方案。在Web上没有足够的事务管理设置,而你所拥有的唯一的安全是互动验证 (mutual authentication) 的Https。”
“Jini和J2EE都是Java技术。通过J2EE,就像规格说明说的那样:“哦,你不需要担心你这个小程序员去解决那些巨大的困难的东西。厂商会考虑这些问题,而你可专注于自己的特殊领域的需要(比如,如何卖出更多的妇女内衣)。但是,通过Jini,就好像规格说明说的那样:‘你必须靠自己,别指望其他人使用许多基础设施来救你。这是贫乏而又简陋的,宝贝,但你可以做最令人惊讶和体面的事情。当你在那时,检验一下Javaspaces。’”
“Web服务不是针对于java的技术,但是java可以让其更容易的使用,特别是如果你去使用J2EE 1.4。不,你说的对。J2EE 1.4还没发布,但是会在今年年底发布,你将在2004年初见到许多厂商支持。”
(在我们继续下去之前,先提出一些免责声明:首先,如果你对于这篇文章的高级含义有任何问题,重新读一下标题。对于这些内容我们有酒吧侍应的牌照,我们不会告诉你什么是错的,但是你也不会试图去了解整个故事。每个主题都需要相应的一本书(但如果我们不说出任意一本书来,这是很可恨的。比如,Head First EJB,或是哪一本呢?)让我们仅仅通过鸡尾酒会的观点来看这个问题并不是你想来操纵你的下个结构。(我们知道你知道这些,但对于那些可能会误解这篇文章是篇严肃的技术论文的人,我感到有必要谈谈我们的a**es).)[原文如此]
所以现在是时候进入下一个层次了。我们将首先开始看看什么是服务,而且更重要的是如何向别人显现你自己。换种说法,你如何将你的服务告诉你潜在的客户呢?
通过Jini,J2EE,和Web service,目的是让客户去访问服务。什么是服务呢?你所能做的事就是将消息从一个软件传递给另一软件(也许包含人工指向,也许也不包含)。你也许有一个为基因匹配进行大规模计算的服务。或者一个玩简陋的Go游戏的服务。或者一个让你买演唱会门票的程序。或者预定异国热带风情的巡游。或者甚至将你的文字传递给一台高容量(high-volume)打印机。换种说法,服务就是所有像软件一样开始但是结果并不一定留存在软件中的东西。
你也许有个服务来移动摄像机,利用打印机打印,拨电话。没关系。或者至少没关系。主要目标之一,就像OO的任何情况下的目标一样,尽可能减少耦合,—此例中,即客户端和服务器端之间的耦合。换种说法就是我们要让那些参与者(客户端和服务端)尽可能地少了解对方。
但是让我们说说你有一个服务…现在怎么办?客户端如何找到你?如果他们找到你,他们怎么知道你的服务可以干什么?换种说法,他们如何知道他们调用你的服务的方法?这样,你必须将你自己暴露给客户,我们的3种技术在这方面稍有不同。不考虑我们在讨论Jini,J2EE,或者Web服务,可是必须在某个地方有个接口。这个接口说明了你可以做的东西。
作为一个服务开发人员,你必须告诉人们你的服务可以做什么。或者说,你必须声明你的服务的方法。这包括声明客户端传递给你的方法什么(参数)以及服务返回什么(返回类型)。

上面这个接口是为一个叫Advice的服务。它具有一个方法,getAdvice()。你可以调用这个方法,得到一个字符串,里面包含极好的有用的随机选择的建议。(我们选择不在我们假的小类似于UML的图中显示返回类型。这是非常小的事)。
对于Jini和EJB(EnterPRise JavaBeans---J2EE的核心和灵魂),接口通常是Remote。一个Remote的接口通常意味着开发者写一个基于java.rmi.Remote的扩展java接口。耶,Remote所有方法(意思是Remote接口中的所有方法)必须声明一个java.rmi.RemoteException的异常。一个强制性的异常(checked exception),告诉客户端:“事情变得很糟糕,小心准备。”

对于Web Services,接口被定义在一个WSDL中(读作“wizdle”,与“fizdle”押韵)----一种特殊格式的XML文档。所以总括来说,你可以在随意的谈话中说以下这段话:
“可以说,在jini和ejb中,你通过java接口暴露你自己,但是在web服务中,你通过xml接口暴露你自己。”
(准确地说,如果你是一个java开发者,你通过写一个java接口来创建WSDL,按那个在你的开发工具中神奇的红色按钮,将你的java接口变成XML WSDL。这就够了,像他们说的,这超过了一个鸡尾酒会谈话的范围。)

OK,现在我们有了服务,有了暴露我们服务的接口。现在呢?客户端如何知道这个接口?他们如何真正取得这个接口,他们还需要和我们服务交流些什么呢?这要看服务的类型。这3种类型是不同的。你访问Jini,J2EE和Web服务将有少许不同,文章的其他部分将着重于一些细节和主要不同之处。
首先,让我们从一些Java的Remote Method Invocation(RMI)的背景开始。这是大部分的java分布式技术的主干,Jini和EJB都基于此。事实上,自从所有分布式技术在概念上如RMI的技术上运行时,你在这里了解的东西将帮助你弄清楚整个分布式的世界,Java或者非Java的。

通过RMI,你写你的服务并将此变成为Remote对象。让其成为Remote仅是小菜一碟---写分布式接口,创建Remote类来实现它。进入讨论组讨论。 创建remote接口
1. 扩展 java.rmi.Remote
2. 为每个方法声明java.rmi.RemoteException
1. public interface Advice
2. extends java.rmi.Remote {
3.
4. String getAdvice() throws
5. java.rmi.RemoteException;
6.
7. }
创建remote类
1. 实现你的Remote接口
2. 为接口方法写真正的商业逻辑
1. public class AdviceImplementation implements Advice {
2.
3. public String getAdvice() {
4.
5. // monumentally important
6. business logic here
7.
8. }
9.
10. }
(OK,所以代码对于鸡尾酒会有点多,因为在这都是初学者….)
所有东西的关键:The Stub
当你已经有了接口和类,你通过RMI编译器(rmic)运行你的类,RMI编译器已在J2SE中(如果你已经有javac,你就有rmic了)。那个程序建立了stub这个你可以几乎在所有现代分布式编程模型中发现的东西。Stub仅是客户端的助手,通过像服务那样实现远程接口来扮演远程对象的角色。但是事实上,Stub仅是一个取得方法调用,打包,并通过网线传递给真正的远程对象的小对象。或者说, stub知道如何打电话回家并叫真正的服务去做真正的工作。
Stub所有方法都是虚假的。他们是方法,有一大堆代码,包括用于服务联系的网络和I/O内容。但是他们并不是真正的商业代码。所以对于Advice服务, stub有getAdvice()方法,但是这个方法仅仅从客户的请求传递给在服务器上真正的AdviceImplementation。
那边,客户端假装他在调用远程对象,但是我们知道由于远程对象运行于不同的JVM堆中这并不真正发生。
(是的,在服务器端依然有些东西接受来自客户的Socket连接,解包方法调用,打包并装载返回值等等。但是我们并不准备在这篇文章中谈论这些。那是个更微不足道的过程,因为你不需要担心传递功能给客户。所以在服务器上Stub的功能有同伴,但是你并不需要担心这个。)
RMI基本结构
籍由rmi,远程对象是一个服务。
如果你有个客户端,你想通过远程服务(或者说远程对象)做些东西,你必须有远程服务的接口(在编译时和运行时),而且你必须有stub对象(运行时)。记住,是Stub真正知道如何传递你的方法调用给远程对象(并传递回返回值),所以你可不能没有它。很多时候,你将从服务开发者那得到接口和stub .class文件。
但是有个更酷的方式运行时取得stub类而不需要在运行前取得,那就是通过一个叫动态代码下载(Dynamic code downloading)的进程。这是你在java中可以使用的最强大的东西之一,而且也不难。但是,你也可以以守旧的方式从开发者的Email中取得stub类文件,或者从别人那里下载到你的电脑。
查找服务(例如拥有stub,这样你可以调服务中的商业方法)
在RMI中,你通过RMI登记(附在J2SE中)查找到stub。RMI登记就像一本小的电话簿,你找到名字,然后就得到stub。记得当stub对象过来的时候是串行化的。这意味着在其来到客户端时要使其反串行化。同时为了让其工作,the stub类必须在当前的classpath中或者可以用动态代码下载来找到。这是java基本知识---一个实例不能在没有其类时反串行化。

发现查找服务(rmi Registry)
通过RMI,你必须知道the stub在哪里?你必须为RMI Registry知道IP地址和TCP端口号(同时也恰好是远程对象/服务所在的服务器那里)。事实上我们大概并不一定要知道端口号,因为有默认的端口号,但是如果服务部署人员更改了,你则需要知道。客户端只做了简单的单行的查找,利用静态方法(java.rmi.Naming.lookup()),这时奇迹发生了,它有了一个即时的反串行化的stub。对象知道如何打电话回家了。

现在我们已经注意RMI,这部分将会更有意义。Jini就像是Extreme RMI。我们这里用Extreme这个词是指其运动含义,而不是XP中的意思。
动态发现:服务和查找服务如何发现对方
这是普通的RMI与Jini差别最多的地方。在RMI中,客户端必须知道很多东西,服务必须通过RMI Registry清楚地登记(用逻辑名称),注册必须在与服务的同个机器中。
但是通过Jini,所有东西仅是在那儿,在某处。没有人知道除了接口外的其他东西。这里有句话关于这个的,我们发现这放在这个对话中的战略时刻相当有意义。
“通过jini,服务通常尝试去发现查找服务,客户端也通常发现查找服务,而查找服务通常在让服务和客户端知道他们(查找服务)就在这。所有都是自动的。”




虽然在Jini中你也可以将整个服务发送给客户端本身,而不是让服务变成服务器上100%的远程对象,但是基本的Jini结构采用RMI。当客户端要求服务的参考时,将取得远程对象的stub(如果服务被实现为一个远程对象),或者重新得到整个该死的服务,在上面进行简单的旧的本地调用。事实上,通过Jini,客户端甚至可以一个混合体或者“智能代理”(公开说这句话会有特别的声望)。--那样,一个非远程java对象包含一个远程对象的stub(就好像,实例变量)。那样,客户端直接对服务进行本地调用,但是服务本身可能会将其跳转,让远程调用到其他地方。“智能代理”可以通过在客户端做某些工作提高在客户端和服务上的表现。进入讨论组讨论。
Jini架构
Jini和其他所有分布式技术(普通的RMI,EJB和Web services)有另外一个主要不同点是Jini利用分布式租约帮助建立自愈网络。如果Jini服务是远程的,例如,他给客户端一个租约并说:“这是你的租约。如果你不更新它,我将假设你已经离开,我将停止你在这里代表的任何资源。”最新的网络如何保持依赖于这些租约的时长。例如,一个两小时的租约将意味着客户端可能断开将近两个小时,而你(服务)却不知道。多么浪费!另一方面,一个一秒钟的租约意味着最近的网络,但是所有人花费其所有的周期和带宽去更新租约!所以那是笔交易,这依赖于服务的类型以及其他服务质量问题。
自愈型网络另一个很酷的东西是:既然Jini查找服务是一个Jini服务,查找服务给Jini服务一个租约。所以在这种情况下,Jini服务对于Jini查找服务是个客户。那样,当一个普通客户端(或者说,一个本身不是Jini服务的客户端,而是想用Jini服务的程序)来查找一个服务,比如打印机,如果服务没有通过查找服务更新客户端将不视其为“可用”。此外,租约时间越短,就越是最近的网络的写照,越不可能会令到一个客户选择一个不再可用的服务。


Jini暴露
如果你是一个客户端,你想从Jini服务中取得某些东西,你必须有对于这个服务的接口。不想RMI,Jini具有更灵活性,因为你除了接口外不需要知道其他东西。你并不需要知道注册的名字或者Service的位置。只要你知道接口以及你在一个可以发现查找服务的网络,你就可以工作了。
今天,幸运的是开发者给你接口。但是有少量的接口到处漂浮,变成某种标准,包括Bill Venner的名声不好的ServiceUI.
发现服务类
不像RMI,在Jini中你将不可以选择是否使用动态代码下载。你几乎被迫使用它。(你也可以不使用它,但是这违背了Jini的本来目的。)通过Jini,你不需要知道网络中内容的位置,你也不需要知道谁建立这个服务。记着,所有你要的只是接口,而且在很多情况下,你需要担心的你需要去实现服务的接口(也许是个stub,也许是真正的服务,或者集合体…)。
记着,在RMI中,你在客户端中需要的类通常是Stub类,而不是服务本身。在Jini中,如果服务被实现为远程对象,或者是真实的服务,你调用方法的应该在stub中---例如,一个实现了接口并真正工作的类就在客户端本地。进入讨论组讨论。 查找服务
通过Jini,你使用Jini 查找服务(lookup service),而不是RMI Registry。Jini查找服务更灵活和强大,而且它可以像服务对象那样提供信息给你,哪个,是或者不是远程对象stub,这依赖于服务是否是个服务器上的远程对象或者是转载在客户端上的非远程对象。最好的东西是你不需要知道查找服务在哪!在RMI中,你必须知道远程服务的IP地址和端口号来找到服务stub所在的RMI Registry。而在Jini中,你仅知道大概在某处,在那儿的网络上有不少于一个的查找服务,通过IP广播达到。
这就是Jini。但是Jini是个疯狂的边缘,这里没有人知道任何东西,而你就在你自己的模型上,J2EE正好是相反的东西。

J2EE的主要思想就是服务器(通过容器)给你一堆额外的服务,否则这些服务你也许要自己写,或者将不同的部分拼凑起来,或者从私人厂商那购买。我们现在谈论的是巨型的服务,像事务管理,并行管理,安全,资源/生命周期管理,查找服务,持久化,信息服务等等。
那样,你开始专注于你的自己的商业规则,而不是重新去做那些繁琐的重复的事情。其他应用服务器已经存在了一段时间了---如CICS和TUXEDO都是经典的例子。但是在那种环境下你必须学私有的API,你被厂商锁住了。J2EE是企业级商业中间层的标准,所以你仅仅需要学一个API,无需考虑你要选择的服务器。其中最好的就是你可以部署你的应用到任何符合J2EE标准的服务器,所以你可以对厂商的枷锁说拜拜了。
当然,事实上由于各种原因,将J2EE程序部署在不同的服务器上并不容易。但是你可以。而且如果你有足够的钱换掉你现在的提供商,知道这个不更好?更好的是,让厂商知道你可以这样做。
首先,澄清一下J2EE和EJB的不同:J2EE是一个为可运行EJB的服务器设立的规范。但是J2EE服务器同样要支持servlets和jsp。你可以认为J2EE就像一个整合的服务器—将servlet和支持JSP的Web服务器以及EJB服务器整合在一起的服务器。在J2EE领域,我们叫它子服务容器。所以我们在J2EE服务器中拥有Web容器和EJB容器。因为beans比servlets和JSP更吸引人,我们在这里专注于EJB方面。同时在EJB的世界,服务就是bean。
EJB有样很酷的东西就是基于组件的开发模型。你建立可重用组件,这些组件是可以在部署时定制而不需要改动java代码。组件比java类更易用,所以他是下一个层次的重用。你利用XML文件来部署你的组件(例如beans),而这些文件说明服务器应该如何处理bean,所以你可以配置安全,事务,资源使用等等,都声明在XML文件中,你只需要在开发工具中按几个按钮即可。(如果你真的想,你当然可以直接编写XML文件。但是现在的工具十分好,而你并不需要去做那些工作。)进入讨论组讨论。
J2EE架构
J2EE和普通RMI一个很大不同之处就是服务器必须介入客户的调用和服务(例如bean)的被调用中。如果客户端远程调用已开放的bean方法,服务器会介入并让其隐蔽的过多的bean与客户端直接联系。例如,假如客户端扮演特定的顾客调用bean中的getAddress()方法。首先,服务器必须验证客户端是否经授权去调用这个方法,但是假设客户通过了安全检查,现在服务器必须去做其他东西让bean准备好去接受调用。如果bean返回客户的地址,比方bean会重新去数据库记录中取得客户的资料。这需要变成事务的一部分,而其他客户也许准备好使用这个客户,还有….
J2EE的解决方案是让bean成为非远程对象,被远程对象保护。所以即使bean真的是服务(或者说,这里含有客户想调用的商业逻辑服务方法),而bean在RMI方式中并非是远程的。但是客户依然和RMI副本以及远程对象相互作用;就像和EJB相互作用那样,远程对象更像是bean的保镖。远程对象(在J2EE中叫做EJB对象)接受客户端远程调用(例如,客户端在stub上的调用),并同时让服务器加入来决定如何,何时和调用是否到达bean。

J2EE暴露
通过EJB,在RMI规划图(除了服务外)中加入另一层。EJBObject是远程对象,但不像RMI中,EJBObject并不是个服务。所以那样现在这里对于服务有两个帮手,而不像普通的RMI那样子有一个(stub)。你的服务接口依然是远程接口,而不是直接实现java.rmi.Remote,你的服务接口实现EJBObject---一个本身扩展自java.rmi.Remote的接口。尽管bean不含有相同的方法,注意bean如何不扩展服务接口(Advice)。(不要过于拘谨担心,绝大多数注重EJB的开发工具确认bean和服务接口会匹配。)

找寻服务接口
通过J2EE,你通常与客户端开发者同在一个企业工作,则你可发Email给他接口,或者你可以在内部的知识库中公布。无论如何,重要的是,就像RMI和Jini,客户端必须在编译时有此接口。
同样,对stub类 ,你可以选择提前给客户端或者用动态代码下载。但是这种情况下动态代码下载依赖于你特定的J2EE服务器,也许不可行,所以你也许会被困于自行将stub类传递给客户端的情况。大多数J2EE服务器为你部署bean准备了小而精的客户JAR。
找到服务
警告:我们在这节扩展了鸡尾酒会知识的限制,所以这段人们就会说:”哇噢,在你写到这之前我都跟得上你。。。”这不是我的错,是我们的。所以这里如果你想掠过,你可以直接跳入Web服务,别人也不会知&进入讨论组讨论。
(出处:http://www.cncms.com)
更多精彩
赞助商链接