WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗嗘慨娑氱磽娴e搫鈻堢紒鐘崇墵瀵顓奸崼顐n€囬梻浣告啞閹歌顫濋妸鈺佺闁靛繒濮Σ鍫熺箾閸℃ê濮囨い搴㈡崌濮婃椽宕ㄦ繝鍌氼潓閻庢鍠栭悥濂哥嵁閺嶎厼绠涙い鏃傚亾閿涘繘姊洪崨濠冨瘷闁告洦鍋呴悾顒勬⒒娴e摜鏋冩い顐㈩樀瀹曞綊宕稿Δ鈧粻鏍煃閸濆嫬鏆婇柛瀣崌瀹曠兘顢橀悙鎰╁灪閵囧嫰濡烽敂鍓х杽濠殿喖锕ら幖顐f櫏闂佹悶鍎滈埀顒勫磻閹炬緞鏃堝川椤撶媴绱遍梻浣筋潐瀹曟﹢顢氳椤㈠﹪姊绘担鍛婂暈婵炶绠撳畷褰掑箥椤斿彞绗夊┑鐐村灟閸ㄦ椽鎮¢弴鐔翠簻闁规澘澧庣粙鑽ょ磼閳ь剟宕橀埞澶哥盎闁硅壈鎻槐鏇熸櫏婵犳鍠栭敃銊モ枍閿濆洤鍨濇繛鍡楃箚閺嬪酣鏌熼鍡楀暙椤ユ劙姊婚崒娆戭槮闁硅姤绮嶉幈銊╂偨缁嬭法顦┑鐐叉閸旀帞鎹㈤崱娑欑厽闁靛繆鎳氶崷顓犵焼閻庯綆鍋佹禍婊堟煛瀹ュ啫濮€濠㈣锕㈤弻娑㈡倷椤忓嫬顫囧┑顔硷攻濡炶棄螞閸愵煁褰掑Χ閸℃瑢濮囬梺鐟板槻閹虫﹢鐛幘璇茬鐎广儱鎷嬪Λ婊堟⒒閸屾瑧顦︽繝鈧柆宥呯?闁靛牆顦埀顒€鍟村畷鍗炩槈濡厧骞堥梻浣告贡閸庛倝銆冮崱娑欏亗闁哄洢鍨洪悡娑㈡煕閵夛絽鍔氬┑锛勫帶闇夋繝濠傚閻鏌曢崶褍顏紒鐘崇洴閺佹劙宕ㄩ鐘垫綁闂傚倷绀侀幖顐e緞閸ヮ剙鐒垫い鎺嗗亾缁剧虎鍙冨鎶藉幢濞戞瑥鈧敻鏌ㄥ┑鍡涱€楀褌鍗抽弻锟犲幢濞嗗繆鏋呴梺鍝勭潤閸曨偒鍤ゅ┑鐐叉閸ㄧ敻宕哄畝鍕拺闂傚牊绋掗ˉ鐐烘偨椤栨稑娴柨婵堝仜閳规垹鈧綆鍋勬禍妤呮煙閼圭増褰х紒鎻掋偢閹粙鎳¢妶鍥╋紳婵炶揪缍€椤曟牕鈻撻弴銏$厱闁靛ǹ鍎虫禒銏°亜椤愩垻绠崇紒杈ㄥ笒铻i悹鍥ф▕閳ь剚鎸剧槐鎾存媴閸︻厸妲堝銈嗗灥閹冲酣鍩㈤幘娲绘晣闁绘劏鏅滈弬鈧俊鐐€栧褰掑几婵犳艾绀傛い鎺戝€荤壕濂告煟濡寧鐝€规洖鐭傞弻鏇㈠幢閺囩媭妲銈庡亝缁诲牓鐛崶銊﹀闁稿繐顦伴悗鍛婄節閻㈤潧啸闁轰礁鎲¢幈銊╊敇閵忕姷锛涢梺瑙勫礃缁夘喛銇愰幒鎾存珳闂佹悶鍎弬鍌炲焵椤掆偓閿曨亪寮婚敓鐘茬劦妞ゆ帊鑳堕々鐑芥倵閿濆骸浜為柛妯挎閳规垿鍩ラ崱妤冧画濡炪倖鍨堕悷鈺佺暦閻㈢鍋撻敐搴″幋闁稿鎸鹃幉鎾礋椤掆偓娴犫晠姊虹粙鎸庡攭缂侇噣绠栭幃姗€宕橀瑙f嫼缂傚倷鐒﹂埣銈夘敂閸曢潧娈ㄩ梺鍓插亝濞叉牠鎮块鈧弻锝夊箛椤旇姤姣勭紒鐐劤閵堟悂寮诲☉姘勃闁绘劦鍓涘▓銈夋煛娴e摜澧﹂柟顔筋殘閹叉挳宕熼鍌ゆО缂傚倷绶¢崰鏍崲濡寧顥ら梺璇查叄濞佳囧箺濠婂吘娑㈩敍閻愬鍘靛銈嗙墪濡梻绮堟担鍦浄妞ゆ洍鍋撻柟顔筋殔閳绘捇宕归鐣屼邯闂備胶绮悧婊堝储瑜旈幃楣冩倻閼恒儱浜楅柟鐓庣摠钃辨い顐㈢Т閳规垿鍩ラ崱妤冧户闁荤姭鍋撻柨鏇炲€归崐鐢碘偓瑙勬礀濞层劎澹曟禒瀣厱閻忕偛澧介幊鍛存煕閺傝法校闁靛洤瀚版俊鎼佸Ψ閿旂粯顥i梻浣风串缁插墽鎹㈤崼銉у祦闁哄秲鍔嶆刊瀛樻叏濠靛棙婀伴柟韫嵆濮婄粯鎷呴搹鐟扮濠碘槅鍋勯崯纾嬫"闂佽宕橀褍效閺屻儲鍊甸柨婵嗛閺嬬喖鏌i幘璺烘瀾濞e洤锕俊鍫曞磼濮橆偄顥氶梻鍌欒兌缁垶銆冮崨顓囨稑螖閸涱厾鍘洪梺鍦亾缁剁偤寮崼婵嗙獩濡炪倖妫侀~澶屸偓姘偢濮婃椽鎳¢妶鍛呫垺绻涢懠顒€鈻堥柛鈹惧亾濡炪倖甯掗崯顖炴偟椤忓牊鐓熼煫鍥э工娴滈箖姊婚崒姘偓椋庣矆娓氣偓楠炴牠顢曢敃鈧粻鐘绘煙闁箑骞楅柛娆忕箻閺岀喓绱掗姀鐘崇亶闂佺ǹ顑傞弲鐘诲蓟閿濆围閹艰揪绱曟禒婊勭箾鐎涙ḿ鐭婄紓宥咃躬瀵鎮㈤崗鐓庘偓缁樹繆椤栨繂浜归柣锝嗘そ濮婃椽宕崟顒€娅ょ紓浣筋嚙閻楀棝锝炶箛鎾佹椽顢旈崪浣诡棃婵犵數鍋為崹鍫曟嚌妤e啨鈧倿宕崟銊︽杸闂佸疇妫勫Λ妤佺濠靛鐓熼柣鏂垮级濞呭﹪鏌曢崱鏇狀槮闁宠閰i獮鎺楀籍閸屾稒绶梻鍌欑閹碱偊宕锕€纾瑰┑鐘崇閸庡﹪鏌涢鐘插姕闁抽攱鍨堕幈銊╂偡閻楀牊鎮欓梺璇茬箰瀵墎鎹㈠☉娆愬闁告劖褰冮顐c亜閳哄啫鍘撮柡灞诲姂瀵挳鎮欏ù瀣壕鐟滅増甯楅崑鍌炴煛閸ャ儱鐏柣鎾崇箰閳规垿鎮欓懠顑胯檸闂佸憡鏌i崐婵嬪蓟濞戙垹鐓涢悗锝庡墰钃辨俊鐐€戦崝濠囧磿閻㈢ǹ绠栨繛鍡樻尭缁狙囨煙鐎涙ḿ绠ユ繛鍏肩娣囧﹪濡堕崶顬儵鏌涚€n剙浠遍柡浣稿暣婵偓闁靛牆鍟犻崑鎾存媴缁洘鐎婚梺鍦亾濞兼瑥鈻撻幇鐗堚拺闁告劕寮堕幆鍫熴亜閹存繃鍠橀柣娑卞櫍婵偓闁靛牆妫岄幏濠氭⒑缁嬫寧婀伴柣鐕傚缁﹪鎮ч崼娑楃盎濡炪倖鍔戦崺鍕i幖浣圭厽闁挎繂鎳庡Σ濠氭懚閿濆鐓犳繛鏉戭儐濞呭洭鏌i幘鎰佸剰妞ゎ亜鍟存俊鍫曞幢濮楀棙鈷栭梻浣芥硶閸犲棝宕曢懠顒傜焿鐎广儱鐗勬禍褰掓煙閻戞ɑ灏甸柛妯兼暬濮婅櫣绱掑Ο铏逛桓闁藉啴浜堕幃妯跨疀閿濆懎绠归梻鍥ь槹缁绘繃绻濋崒姘缂備礁顦遍崕銈夊箞閵婏妇绡€闁告侗鍣禒鈺冪磽娴d粙鍝洪悽顖涘笩閻忔帡姊洪幆褏绠婚柍褜鍓氱粙鎺椼€佸鈧濠氬磼濞嗘垵濡介柣搴g懗閸忕姴鎼鍏煎緞婵犲嫭鐓f繝鐢靛仦閸ㄥ墎鍒掓惔銏㈩洸闂侇剙绉甸埛鎺懨归敐鍛暈闁哥喓鍋炵换娑氭嫚瑜忛悾鐢碘偓瑙勬礀缂嶅﹪寮婚崱妤婂悑闁告侗鍨伴獮鍫ユ⒒娴d警鏀伴柟娲讳邯濮婁粙宕熼娑樹簵濠电偛妫欓幐濠氭偂閻樺磭绠鹃柡澶嬪焾閸庢劖绻涢崨顓熷櫣闂囧鏌eΟ铏癸紞闁活厼锕弻宥囨喆閸曨偆浼岄梺鎼炲姂缁犳牠骞冨▎鎾村癄濠㈣泛顦崹婵嬫⒒閸屾瑦绁版い鏇熺墵瀹曟澘螖閸涱偀鍋撻崘顔煎窛闁哄鍨归崣鈧┑鐘灱閸╂牠宕濋弴鐘典笉闁规儼濮ら悡娆撴煙椤栧棗鑻▓鍫曟偡濠婂嫭绶叉繛灞傚妿濡叉劙骞樼拠鑼紲濠电偛妫欓崹鑲╃玻濡ゅ懏鈷戦柛婵勫劚鏍¢梺缁橆殘婵炩偓闁靛棔绶氬浠嬵敇閻愯尙鐛╅梻浣告贡閳峰牓宕㈡禒瀣柧闁挎繂顦伴埛鎴犵磼鐎n厽纭剁紒鐘冲▕閺屾稑螣閻樺弶鍣烘い鎰矙閺岋綁骞囬鍓х槇缂備浇顕уΛ娆撳Φ閸曨垰鍐€闁靛ě鍛帓闂佹眹鍩勯崹杈╃矙閹烘梹宕叉繛鎴欏灩瀹告繃銇勯幘璺烘瀻闁哄濮撮埞鎴︻敊绾嘲濮涚紓渚囧櫘閸ㄥ爼鐛箛娑樺窛閻庢稒锚娴狀參姊绘笟鍥у伎缂佺姵鍨甸埢鎾斥攽閸垻锛濋梺绋挎湰閻燂妇绮婇悧鍫涗簻闁哄洤妫楀ú銈囧瑜版帗鐓曟い顓熷灥濞呮﹢鏌涢妶鍡樼缂佽鲸鎸婚幏鍛嫻椤栨粎绐楃紓鍌欒濡狙囧磻閹剧粯鈷掑ù锝堫潐閸嬬娀鏌涙惔顔肩仸鐎规洘绻傞濂稿川椤忓懐鈧椽姊洪幖鐐插姶闁告挻宀搁崺娑㈠箣閻樼數锛滈柣搴秵閸嬪嫰顢氬⿰鍕瘈闁逞屽墴楠炲秹顢欓崜褝绱查梺璇插嚱缂嶅棝宕戦崨顓犳殾鐎光偓閳ь剟鍩€椤掑喚娼愭繛鎻掔箻瀹曡绂掔€n亞鐣烘繛瀵稿Т椤戝懎顔忓┑鍡忔斀闁绘ɑ褰冮鈺傤殽閻愭惌娈滄慨濠冩そ閹兘寮堕幐搴♀偓顖炴⒑娴兼瑧绉靛ù婊庝簻閻i鎲撮崟顓犵槇濠殿喗锕╅崜娑㈠储閹扮増鈷戦柛婵嗗閸屻劑鏌涢妸锔姐仢闁诡噯绻濇俊鐑芥晜閽樺浼庢繝纰樻閸ㄤ即鎮樺┑瀣亗闁规壆澧楅悡鐔兼煙閹规劖纭鹃柡瀣洴閺岋綁骞欓崘銊ゅ枈閻庤娲栭悥鍏间繆閻戣棄唯闁靛鍎涢幋鐘电=闁稿本鐟чˇ锔姐亜閹存繄澧曢柣锝囧厴閹粙宕归顐g稐闂備礁婀遍崕銈咁潖閼姐倕顥氶柛蹇涙?缁诲棙銇勯弽銊х畵濞存粌缍婇弻锝夋晲閸噥浠╃紓浣介哺閹稿骞忛崨瀛樻優闁荤喐澹嗛鑲╃磽閸屾瑦绁版い鏇嗗洦鍋嬮柛鈩冪⊕閸嬧晝鈧懓瀚伴崑濠傖缚閵娾晜鐓冪憸婊堝礈濮橆厾鈹嶅┑鐘插亞濞兼壆鈧厜鍋撳┑鐘插敪閵娧呯=闁稿本鐟︾粊鏉款渻閺夋垶鎲搁柟骞垮灲瀹曠厧鈹戦幇顓犵▉缂傚倸鍊烽悞锕佹懌婵犳鍨伴顓犳閹烘垟妲堟慨妤€妫楅崜鏉库攽閻愯尙澧涢柛鏃€鐟ラ~蹇撁洪鍕啇闂佺粯鍔栬ぐ鍐€栭崱娑欌拺闁告稑饪村▓鏃堟煕閻旈攱鍋ラ柟顕€绠栭幃婊呯驳鐎n偅娅栭梻浣虹帛閸旀ḿ浜稿▎鎰垫闁搞儺鍓氶埛鎴︽煟閻旂厧浜伴柛銈囧枎閳规垿顢氶埀顒€岣胯閸┿垽骞樺ǎ顒€浜濋梺鍛婂姀閺備線骞忛搹鍦=闁稿本鐟ч崝宥夋嫅闁秵鐓冮梺鍨儏濞搭噣鏌$仦鐣屝㈤柣锝忕節楠炲秹顢欑亸鏍у緧闂佽瀛╅鏍闯椤曗偓瀹曟垶绻濋崒婊勬闂佸湱鍎ら〃鍡涘磹閻戣姤鍊甸柣銏㈡瑜版帞宓侀柛顐犲劜閳锋帒霉閿濆洦鍤€闁崇粯娲熼弻鈩冪瑹閸パ勭彎閻庤娲橀崹鍧楃嵁濡偐纾兼俊顖滃帶楠炴劙姊绘担鍛婂暈濞撴碍顨婂畷鏉款潩鐠鸿櫣鐤囬梺鍛婁緱閸犳洜鎹㈤崱娑欑厱婵炲棗娴氬Σ绋库攽椤斿吋鍠橀柟钘夌埣閺佹劖寰勭€n亙鍝楁繝鐢靛仦閸ㄥ墎鏁幒鎾存珷闁哄被鍎查悡娑㈡煕鐏炵虎娈斿ù婊堢畺濮婂宕掑顑藉亾閻戣姤鍤勯柛鎾茬閸ㄦ繃銇勯弽顐粶缂佲偓婢舵劖鐓涢柛銉㈡櫅閳ь剨缍侀幃銏ゅ传閵壯呮闂備焦鎮堕崕婊堝礃閳轰礁濮冮梻鍌氬€烽懗鍓佸垝椤栫偛钃熼柕濞炬櫆閸庡秵绻濋棃娑卞剰缂備讲鏅犻弻銈夊箒閹烘垵濮屾繛瀛樼矋缁捇寮婚敓鐘茬闁靛⿵绠戦ˇ鈺侇渻閵堝啫鍔氭い锔炬暬瀵鈽夐姀鐘愁棟闁荤姴娲︾粊鎾磻閹炬枼鏀介悗锝庝簽椤旀垿姊洪崜鎻掍簼婵炲弶锕㈠畷鎰版倻閼恒儳鍘介梺鐟邦嚟閸嬪秶绱撳鑸电厱婵せ鍋撳ù婊嗘硾椤繐煤椤忓嫪绱堕梺鍛婃处閸撴瑩宕戝澶嬧拺闁告稑锕ラ悡銉╂煛閸偄澧寸€殿喗鐓″畷濂稿即閵婏附娅栭梻浣虹帛閸旀洟顢氶銏犲偍闁告鍋愰弨浠嬫煟閹邦剙绾фい銉︾矌缁辨帞绱掑Ο铏诡儌缂備緡鍠氱划顖滄崲濠靛棭娼╂い鎾跺Т楠炴劙姊虹拠鑼闁稿鍠栧鏌ヮ敃閿濆棙鐝¢梻浣筋嚙濮橈箓锝炴径濞掓椽鏁冮崒姘憋紱婵犵數濮撮崐濠氬汲閿曞倹鐓熼柡鍐ㄥ€甸幏锟犳煛娴e憡顥㈤柡灞界Х椤т線鏌涢幘瀵告噰闁糕斂鍨归鍏煎緞鐎n偅鐝抽梻浣规偠閸庮噣寮插┑瀣櫖婵犻潧娲ㄧ粻楣冨级閸繂鈷旂紒瀣吹閹叉悂寮堕崹顔芥缂備礁鍊哥粔褰掑箖濞嗘搩鏁嗛柛灞剧矌濡插洭姊绘笟鈧ḿ褎顨ヨ箛鏇炵筏闁告挆鍕幑闂佺粯鍔﹂崗娆愮濠婂牊鐓欓悗娑欋缚缁犳牜鈧懓鎲$换鍕閹烘鏁婇柛鎾楀啰顐奸梻渚€娼ч悧鐐电礊娴e摜鏆︽慨妞诲亾闁糕晪绻濆畷姗€濡搁妷褜鍚嬮梻鍌氬€峰ù鍥敋瑜忛埀顒佺▓閺呮繄鍒掑▎鎾崇闁瑰濮寸粻鐢告煟閻樺厖鑸柛鏂垮缁嬪顓奸崱妯哄伎濠碉紕鍋犻褎绂嶆ィ鍐┾拺闁告繂瀚~锕傛煕閺傝法鐒搁柛鈹垮劜瀵板嫭绻涢姀銏犳瀾鐎垫澘瀚伴幆鍌炲传閵夘灖鎴︽⒑闂堟稒鎼愰悗姘卞娣囧﹪骞栨担瑙勬珳闂佸憡渚楅崢鑹邦杺闂傚倸鍊峰ù鍥敋閺嶎厼绐楁俊銈呮噺閸嬶繝鏌嶉崫鍕櫡闁逞屽厸缁舵艾顕i鈧畷鐓庘攽閸偅效濠碉紕鍋戦崐鏍箰閼姐倖宕查柛鏇ㄥ幘閻棝鏌涢弴銊ョ仭闁抽攱甯¢弻娑氫沪閸撗勫櫗缂備椒鑳舵晶妤呭Φ閸曨垰鍗抽柣鏂挎惈閳峰矂鎮楃憴鍕;闁告鍟块锝嗙鐎e灚鏅濋梺闈涚墕濞村倸危缁嬪簱鏀介柣妯虹仛閺嗏晛鈹戦鑺ュ唉鐎规洘鍔栫换婵嗩潩椤掍浇绶㈤梻浣瑰濞叉牠宕愯ぐ鎺撳亗婵炲棙鍔戞禍婊堟煛瀹ュ骸浜滃ù鐘崇矊闇夋繝濠傛噹椤g厧菐閸パ嶈含闁瑰磭濮甸敍鎰攽閸℃﹩鍞查梻鍌欑閻ゅ洭锝炴径鎰瀭闁秆勵殔閺勩儵鏌涢弴銊ョ仩缂佲偓閸愵喗鐓忓┑鐐戝啯鍣烽柛瀣р偓鏂ユ斀闁挎稑瀚禍濂告煕婵炲灝鈧繂鐣烽姀掳鍋呴柛鎰╁妿椤ρ冣攽閳藉棗鐏熼悹鈧敃鍌氬惞闁哄洢鍨洪崑锝夋煕閵夛絽濡块柕鍫濈摠娣囧﹪骞撻幒鏂库叺闂佸搫鏈ú婵堢不濞戙垹鍗抽柣鎴濇缂嶅矂姊绘担绋挎毐闁圭⒈鍋婇獮濠呯疀濞戞瑥浜楅棅顐㈡处閹尖晠鎮㈤崱娑欏仯濡わ附瀵ч鐘差熆瑜庡ú鐔煎蓟濞戙垹绫嶉柍褜鍓熼獮鎰板箮閽樺鎽曞┑鐐村灟閸ㄧ懓螞濡崵绠鹃柛鈩冪懃娴滄儳螖閺冨倻纾介柛灞剧懄缁佹澘顪冪€涙ɑ鍊愭鐐村姈缁绘繂顫濋鍌ゅ數闂備礁鎲℃笟妤呭垂閹惰姤鍎楁繛鍡樻尭缁犲綊鎮楀☉娅虫垹浜搁鐏荤懓饪伴崼銏㈡毇闂佸搫鏈粙鎴﹀煘閹达箑绀嬫い鎰╁灩琚橀梻鍌欑劍濡炲潡宕㈡禒瀣濡わ絽鍟粻鐔兼煙闂傚鍔嶉柛瀣儔閺屾盯顢曢敐鍥╃暭闂佽崵鍠嗛崝鎴濐潖濞差亜浼犻柛鏇㈡涧閸擃喚绱撴担钘夌厫鐎光偓缁嬫鍤曞┑鐘崇閸嬪嫰鏌i幘铏崳妞わ富鍙冮幃宄扳堪閸愵亞顔婇梺杞扮贰閸犳牠鍩ユ径鎰潊闁挎稑瀚獮鎰版⒒娴e憡鍟炲〒姘殜瀹曟澘螖閸涱厾锛欓梺瑙勫婢ф鎮″☉銏″€堕柣鎰邦杺閸ゆ瑥鈹戦鐓庘偓鍧楀蓟閻旂⒈鏁婇柛婵嗗閸嬫挸鈹戦崱娆愭闂佸湱鍎ら崹鐔肺i崼鐔稿弿婵°倐鍋撴俊顐f⒒濡叉劙鏁撻敓锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚敐澶婄闁挎繂鎲涢幘缁樼厱濠电姴鍊归崑銉╂煛鐏炶濮傜€殿噮鍣e畷濂告偄閸涘⿴鍞堕梻鍌欒兌鏋い鎴濇楠炴劙宕滆閸ㄦ繃銇勯幘璺轰汗婵℃彃鐗婃穱濠囶敍濮橆厽鍎撶紓浣哄Ь椤曆囧煘閹达附鍊烽柛娆忣槴閺嬫瑦绻涚€涙ḿ鐭嬬紒顔芥崌楠炲啴鍨鹃弬銉︻潔闂侀潧楠忕槐鏇㈠储閸楃偐鏀介柣鎰綑閻忋儳鈧娲﹂崜鐔兼偘椤斿槈鐔沸ч崶锔剧泿闂備礁鎼崐鍦偓绗涘泚澶愬閳╁啫寮挎繝鐢靛Т閹冲繘顢旈悩缁樼厵闁荤喐婢橀顓炩攽閳╁啯鍊愬┑锛勫厴閺佸倿骞嗚缁嬪牓姊婚崒姘偓鐑芥嚄閸洖绠犻柟鎹愵嚙閸氬綊鏌″搴″箹缂佺媭鍨堕弻銊╂偆閸屾稑顏�
开发学院软件开发Java 开发者关于 JAX-RPC 的介绍,第 1 部分: 了解 JAX... 阅读

开发者关于 JAX-RPC 的介绍,第 1 部分: 了解 JAX-RPC 类型映射系统的各个方面

 2009-11-07 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨奸柟鐧哥秮閺岋綁顢橀悙鎼闂侀潧妫欑敮鎺楋綖濠靛鏅查柛娑卞墮椤ユ艾鈹戞幊閸婃鎱ㄩ悜钘夌;婵炴垟鎳為崶顒佸仺缂佸瀵ч悗顒勬⒑閻熸澘鈷旂紒顕呭灦瀹曟垿骞囬悧鍫㈠幍缂傚倷鐒﹂敋缂佹う鍥ㄧ厓鐟滄粓宕滈敃鍌氱煑闁告劦鐓堝ḿ鏍煕濠靛棗鐝旂憸鏂跨暦閹偊妲炬繛瀵稿Т閵堢ǹ顫忛搹瑙勫珰闁肩⒈鍓涢澶愭⒑閻撳海绉虹紒鐘崇墵楠炲啯銈i崘鈺佲偓濠氭煢濡警妲奸柟鑺ユ礋濮婃椽妫冨☉杈€嗘繝纰樷偓铏枠鐎规洏鍨介幃浠嬪川婵炵偓瀚奸梺鑽ゅ枑閻熴儳鈧氨鍏樺畷顖濈疀濞戞瑧鍘遍梺缁樏壕顓熸櫠閻㈠憡鐓忛柛鈩冾殔閳ь剙婀辩紓鎾寸鐎n亜绐涙繝鐢靛Т鐎氼剟鐛崼銉︹拺缁绢厼鎳庨ˉ宥夋煙濞茶绨芥俊鍙夊姍瀵挳鎮㈤崫鍕ㄥ彏闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥囧弲闂侀潧鐗嗗ú鐘诲磻閹炬剚娼╂い鎰╁灩缁侇噣姊虹紒妯圭繁闁革綇缍侀悰顕€骞掗幊铏閸┾偓妞ゆ帒鍊绘稉宥夋煥濠靛棙顥犵紒鈾€鍋撻梻鍌氬€搁悧濠勭矙閹达箑姹叉繛鍡楃贩閻熸壋鍫柛顐犲灮閺嗩偊姊洪崫鍕効缂傚秳鐒﹂幈銊╁焵椤掑嫭鐓冮柟顖滃绾偓绻濋埀顒佹綇閵娧呭骄闂佸搫娲ㄩ崰鎾跺姬閳ь剙鈹戦鏂や緵闁告﹢绠栧畷銏ゆ偨閸涘ň鎷虹紓鍌欑劍閿氬┑顕嗙畵閺屾盯骞橀弶鎴濇懙闂佽鍠楄摫婵炵厧绻樻俊鎼佸Χ閸モ晝鏆伴梻鍌欑濠€杈╁垝椤栨粍鏆滈柣鎰摠濞呯姵绻涢幋鐐寸殤缁炬崘鍋愮槐鎾存媴鐠愵垳绱板┑鐐村絻椤曨參鍩€椤掑喚娼愭繛鍙夌墪閻g兘顢楅崘顏冪胺闂傚倷绀侀幉锟犲礉閺囥垹鐤柣妯款嚙缁€鍫熺節闂堟稓澧涚€规洖寮剁换娑㈠箣閻愩劎绱伴梺鍝勬濡鍩為幋锔藉亹閺夊牜鍋勯崢锟犳⒑鏉炴壆鍔嶉柣妤佺矌濡叉劙骞樼€涙ê顎撴繛瀵稿Т椤戝懘骞楅悽鍛娾拺闁革富鍘介崵鈧┑鐐茬湴閸婃繈骞冩ィ鍐╁€婚柦妯侯槺椤斿﹪姊虹憴鍕剹闁告ü绮欏畷鎾绘偨閸涘ň鎷洪梺鑽ゅ枑濠㈡﹢骞冩笟鈧弻锝夊箳閻愮數鏆ら梺璇″枟椤ㄥ﹪鐛弽銊﹀闁稿繐顦扮€氳棄鈹戦悙鑸靛涧缂佹彃娼″畷鏇㈠Χ婢跺﹤鎯為梺閫炲苯澧存慨濠冩そ楠炴牠鎮欏ù瀣壕闁哄稁鍘介崑瀣煟濡灝鍚圭€规挷绶氶悡顐﹀炊閵娧€濮囬梺鍝勬噺閹倿寮婚妸鈺傚亞闁稿本绋戦锟�濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁樺灴婵$敻宕熼姘鳖啋闂佸憡顨堥崑鐔哥閼测晝纾藉ù锝呮惈椤庡矂鏌涢妸銉у煟鐎殿喛顕ч埥澶愬閻樼數鏉搁梻鍌氬€搁悧濠勭矙閹烘鍊堕柛顐犲劜閸婄敻鏌i悢鍝勵暭闁哥喓鍋熺槐鎺旀嫚閹绘帗娈绘繝纰夌磿閺佽鐣烽悢纰辨晬婵﹢纭搁崯瀣⒑鐠囨煡鍙勬繛浣冲洤绠烘繝濠傜墛閸嬧晛鈹戦崒姘暈闁抽攱鍨归惀顏堫敇閻愭潙顎涘┑鐐插悑閸旀牜鎹㈠☉銏″殤妞ゆ巻鍋撻柡瀣閵囧嫰顢曢姀銏㈩唺缂備浇椴哥敮鎺曠亽闂佸吋绁撮弲婊堝吹瀹€鍕拻濞撴埃鍋撻柍褜鍓涢崑娑㈡嚐椤栨稒娅犳い鏃囧亹閺嗗棝鏌ㄥ┑鍡欏闁告柨鐏氶妵鍕晜閻e苯寮ㄩ梺璇″櫙缁绘繃淇婇懜闈涚窞閻庯綆鍓欑敮楣冩⒒娴gǹ顥忛柛瀣噽閹广垽宕橀鑲╋紱濡炪倕绻愰幊鎰不閸撗€鍋撻悷鏉款棌闁哥姵娲滈懞杈ㄧ節濮橆剛鐣鹃梺缁樻煥閸氬鍩涢幋锔藉€甸柛锔诲幖鏍¢梺闈涙閸熸挳寮婚妶澶婄闁肩⒈鍓欓悡鐔兼倵鐟欏嫭绀冪紒璇茬墦瀵偊宕橀鑲╁姦濡炪倖甯掔€氀囧焵椤掍焦顥堢€规洘锕㈤、娆撳床婢诡垰娲﹂悡鏇㈡煃閳轰礁鏋ゆ繛鍫燂耿閺岋綁鎮㈢粙鍨潚濠殿喖锕ュ浠嬪箖閳╁啯鍎熼柍鈺佸暞閻︼綁姊绘担铏瑰笡闁绘娲熸俊鍓佺矙鐠恒劍娈鹃梺缁樺灦宀h法寮ч埀顒勬⒑閹肩偛鍔€闁告劑鍔庨妶顕€姊婚崒娆戠獢婵炰匠鍕垫闊洦娲橀~鏇㈡煛閸ャ儱鐏╅柛灞诲妽閵囧嫯绠涢幘璺侯杸闂佹娊鏀遍崹鍧楀蓟閻斿吋鍤冮柍杞版缁爼姊洪崨濠冣拹妞ゃ劌锕濠氭晸閻樻彃绐涘銈嗘閺侇喗鎱ㄩ崶鈺冪=濞达絿枪閳ь剙婀遍弫顕€鎮㈡俊鎾虫川閳ь剟娼ч幗婊呭婵傜ǹ绾ч柛顐g☉婵¤偐绱掑Δ浣侯暡缂佺粯鐩幃鈩冩償閿濆浂鍟嬮梻浣虹《閺備線宕滃┑瀣闁告稑鐡ㄩ悡銉╂倵閿濆懐浠涚紓宥嗩殜濮婂宕掑顑藉亾瀹勬噴褰掑炊瑜滃ù鏍煏婵炵偓娅嗛柛濠傛健閺屻劑寮撮悙娴嬪亾閸濄儳涓嶉柡灞诲劜閻撴洟鏌曟径妯烘灈濠⒀屽櫍閺岋紕鈧絺鏅濈粣鏃堟煛瀹€鈧崰鏍х暦濠婂棭妲鹃柣銏╁灡閻╊垶寮婚敓鐘插窛妞ゆ棁妫勯埀顒佸姍閺岋紕浠︾拠鎻掝潎闂佽鍠撻崐婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚敐澶婄闁挎繂鎲涢幘缁樼厱闁靛牆鎳庨顓㈡煛鐏炶鈧繂鐣烽锕€唯闁挎棁濮ら惁搴♀攽閻愬樊鍤熷┑顕€娼ч~婵嬪Ω瑜庨~鏇㈡煙閹规劦鍤欑痪鎯у悑缁绘盯宕卞Ο铏圭懆闂佸憡锕槐鏇犳閹惧鐟归柛銉戝嫮褰梻浣规偠閸斿矂鎮ラ崗闂寸箚闁圭虎鍠栫粈鍐┿亜閺冨倸甯剁紒鎰洴濮婃椽宕崟鍨ч梺鎼炲妼缂嶅﹤鐣烽姀鐘嗘椽顢旈崨顓涘亾閸偒娈介柣鎰皺娴犮垽鏌涢弮鈧喊宥夊Φ閸曨垱鏅滈悹鍥皺娴犳悂鎮楃憴鍕┛缂佺粯绻堥悰顔芥償閵婏箑娈熼梺闈涳紡閸愩劌顩梻鍌氬€搁オ鎾磻閸曨個娲晝閳ь剛鍙呴梺鍝勭Р閸斿孩鏅堕敓鐘斥拻闁稿本鐟︾粊鐗堛亜閺囧棗鎳夐崑鎾诲垂椤愩垺璇為悗瑙勬礃缁捇骞冮姀锛勯檮濠㈣泛顑囩粙渚€姊绘担鐟板姢缂佺粯鍔曢敃銏℃綇閳轰緡妫滈梺绋跨箻濡法鎹㈤崱妯镐簻闁哄秲鍔庨。鏌ユ煙椤栨氨澧涢柕鍥у椤㈡洟濮€閵忋垹濮辨繝娈垮枛閿曘儱顪冮挊澶屾殾闁绘垹鐡旈弫鍥ㄧ箾閹寸偟鎳冮柣婵嬩憾濮婄粯鎷呴崨闈涚秺椤㈡牠宕ㄩ鍥ㄧ☉閳规垹鈧綆浜為悾楣冩⒑闁偛鑻晶顖炴煏閸パ冾伂缂佺姵鐩獮妯尖偓鍨偠閸嬫劖绻濈喊妯活潑闁搞劍澹嗛埀顒佺濠㈡﹢锝炶箛鎾佹椽顢旈崟顏嗙倞闂備礁鎲″ú锕傚礈濮樿泛绠柛妤冨亹閺€浠嬫煟閹邦厼绲荤紒鐙欏啰鏆嗛柨婵嗘噺閸嬨儲顨ラ悙鏉戠伌濠殿喒鍋撻梺缁橈供閸嬪懘寮埀顒€鈹戦悩鍨毄濠殿喖顕埀顒佸嚬閸o絽顕i崼鏇炵濞达絽鍘滈幏娲⒑閸涘﹦绠撻悗姘煎幖椤斿繐鈹戦崱蹇旀杸濡炪倖姊归崕鎶藉储閹绢喗鐓欐い鏃囶嚙瀹撳棗鈹戦敍鍕幋闁糕晪绻濆畷鎺懳旀担鍓蹭紲濠电姷鏁搁崑鐘诲箵椤忓棗绶ゅù鐘差儏缁犺銇勯幇鈺佲偓鏍汲濠婂牊鍋i弶鐐村椤掔喖鏌i弬鎸庮棦闁哄矉缍侀幃銏犵暋閹殿喚娉块梻浣姐€€閸嬫捇鏌ゆ慨鎰偓妤冨婵傚憡鐓曢悘鐐靛亾閻ㄦ垹鈧稒绻傝灃婵°倕锕g花鐑芥煕濡も偓閸熷潡鎮鹃悜鑺ュ亗閹兼惌鍠楅崓鐢告⒑閹稿海绠撻柟鍐茬У缁旂喖寮撮姀鈾€鎷洪梺鍛婄箓鐎氼剟寮冲▎鎾寸厽婵°倐鍋撴俊顐g〒閸掓帡宕奸妷銉ь槰闂佸磭鎳撻妵妯艰姳婵犳碍顥婃い鎰╁灪閹兼劖绻涚€电ǹ鍘撮挊婵嬫煥閺囨浜鹃梻鍥ь槹缁绘繃绻濋崒婊冣叡闂佷紮绲惧浠嬪蓟閿涘嫪娌悹鍥ㄥ絻椤牓姊虹€圭媭娼愰柛銊ョ仢閻g兘宕¢悙鈺傤潔闂佺懓鍚€缁€浣圭閻愵兛绻嗛柕鍫濆€告禍鎯ь渻閵堝骸寮ㄩ柛搴☆煼绡撳〒姘e亾闁哄本鐩幃鈺佺暦閸パ€鎷版繝鐢靛Л閸嬫挸銆掑锝呬壕濠殿喖锕ㄥ▍锝囨閹烘嚦鐔煎即閻旈浼岄梺璇″枤閸忔ɑ淇婇悿顖fХ闂佺ǹ顑嗛幐鎼侊綖濠靛鍋傞幖娣灮娴滃墽绱撻崒娆戣窗闁哥姵姘ㄩ崚鎺楊敍閻愬弬褔鏌ㄥ┑鍡╂Ц缂佲偓閸愵喗鐓冮柛婵嗗閺嗘瑦顨ラ悙鑼濞e洤锕幃娆擃敂閸曘劌浜鹃柡宥庡幖缁€澶愭煙鏉堝墽鐣辩痪鎯х秺閺岋繝宕堕妷銉т患闂佸憡鍨规繛鈧鐐寸墪鑿愭い鎺嗗亾濠碘€茬矙閺岋綁骞樼捄鐑樼亪闂佺粯鎼╅崑濠傜暦閹偊妾ㄩ梺绋块缁绘﹢寮诲☉銏犵睄闁逞屽墰閸掓帡骞樼拠鑼舵憰闂佸搫娲㈤崹褰掓倷婵犲嫭鍠愮€广儱顦介弫鍌涖亜閹捐泛袥闁稿鎸搁埢鎾诲垂椤旂晫浜舵繝鐢靛仜閸氬鎮烽妸鈺傚€堕柟鐑橆殕閳锋垿鏌涘☉姗堝姛缂佺姵鎹囬幃妤€顫濋悡搴♀拤濡炪們鍊曢崐鍦崲濠靛牆鏋堝璺虹灱閿涚喖姊虹粙娆惧剱闁搞劌鐏濋悾鐑藉箛閺夎法顓洪梺鎸庢磵閸嬫捇鏌涢妸銉モ偓鍦崲濞戞﹩鍟呮い鏃囧吹閸戝綊姊虹粙娆惧劀缂佺粯绻堝璇差吋婢跺﹣绱堕梺鍛婃处閸撴瑥鈻嶉敐鍥╃=濞达絽鎼牎闂佺粯顨堟繛鈧€殿喛顕ч鍏煎緞婵犲嫬骞愬┑鐐舵彧缁蹭粙骞夐垾鏂ユ灁闁哄被鍎查埛鎴犵磼鐎n偄顕滈柟鐧哥秮閺屾盯鎮╁畷鍥р拰閻庢鍠栭…宄邦嚕閹绢喖顫呴柣姗€娼ч埀顒傚仱閹嘲饪伴崘顎倝鏌ゆウ鍧楀摵缂佺粯绻傞~婵嬵敇閻樻彃绠ラ梻鍌欑閹诧繝宕归鐐茬9闁哄稁鍋€閸嬫挸顫濋悙顒€顏�
核心提示:用于基于 XML 的远程过程调用的 Java API(JAX-RPC)在 Java 社区过程(Java Community Process)已经达了最终推荐阶段,被命名为 JSR 101,开发者关于 JAX-RPC 的介绍,第 1 部分: 了解 JAX-RPC 类型映射系统的各个方面,XML Web 服务供应商已经开始

用于基于 XML 的远程过程调用的 Java API(JAX-RPC)在 Java 社区过程(Java Community Process)已经达了最终推荐阶段,被命名为 JSR 101。XML Web 服务供应商已经开始把这个软件包作为一个核心 API,用以在 Java 平台上构建可互操作的 Web 服务。在这一系列文章中,我将使用样本代码在整个过程中对您进行指导,带您逐步了解该标准提供的主要功能。在这一系列文章的最后,您将熟悉 JAX-RPC 规范的核心功能;这些知识将有助于服务开发者、客户机开发者以及工具箱开发者设计尽可能可以互操作的 Web 服务。

对于这里的讨论,我将假定您熟悉基本的 Web 服务概念(如 SOAP、WSDL 和 XML)。您将要碰到的代码样本都是用 Apache Axis 测试版 3 和 Sun 的 Web Services Developer Pack 开发的 — 换言之,这些代码样本是用 JAX-RPC 规范的参考实现开发的。

本文是一个由两部分组成的系列文章的第一部分。我将从讨论 JAX-RPC 的最重要方面之一 — 即类型映射系统 — 开始讨论。这个系统使运行时系统能够将 WSDL 文档中定义的每种 XML 类型映射为 Java 服务接口所指定的相应 Java 类型,反之亦然。这是使 Web 服务可实现互操作的一个主要步骤。JAX-RPC 为一组已扩展的 XML 类型和 Java 类型指定可扩展的类型映射支持。JAX-RPC 运行时系统实现序列化框架以支持该类型映射。

在随后的一篇文章中,我将根据在此处已经建立的基础进行讨论,深入介绍该规范其余部分的具体细节。

基本的 JAX-RPC 概念


作为一名 Web 服务开发者,您应该已经熟悉 Web 服务标准(SOAP、WSDL、XML)所提供的优势和体系结构方面的灵活性了。Web 服务背后的概念帮助您使用抽象的接口设计松散耦合的服务,这样就可以把服务实现与服务定义分开。Web 服务社区面临的最重要的问题是可互操作的服务的开发。为了解决这个问题,各个标准小组(包括 WS-I、OASIS、W3C 以及 SOAPBuilders)正在非常努力地为互操作性定义标准。

JAX-RPC 是 Java 社区的工作成果,用于彻底解决这一问题,并为客户机端和服务器端的 Web 服务实现提供一个众所周知的应用程序编程接口(application programming interface,API)。通过采用一个面向 Web 服务的标准 API,JAX-RPC 旨在帮助服务用户(客户机)和服务实现者获得最大程度的灵活性,方法是通过把服务互操作性的重担转移到运行时基础架构。通过采用标准组织提供的全局标准、使用定义明确的概要文件(例如 WS-I)以及创建 IDE 和其他开发工具来与这些标准相匹配,运行时框架可以提供连接级别的互操作性。

就其本质而言,JAX-RPC 定义并使用了一种基于 XML 的远程过程调用机制。它使服务器(即服务提供者)能够用标准的 API 定义其服务并且能够用 WSDL 描述其服务;它使客户机(即服务消费者)能够用标准的 API 与服务器进行通信。

该规范内容详尽(大约 160 页)并且向 Java 开发者介绍了新的编程模式。下面就是我将在这一系列文章中讨论的概念的列表:

类型映射系统

服务端点

异常处理

服务端点上下文

消息处理程序

服务客户机和服务上下文

带附件的 SOAP

运行时服务

JAX-RPC 客户机调用模型

如上所述,这第一篇文章将仅着重介绍第一个概念:JAX-RPC 的类型映射系统。在后面的一篇文章中,我将探讨该规范的其他关键概念。

在我介绍每个主题时,我将用一个虚构的书店(以下称 Acme Booksellers)所提供的样本 Web 服务代码来阐述重点部分。


开发者关于 JAX-RPC 的介绍,第 1 部分: 了解 JAX-RPC 类型映射系统的各个方面

该书店提供伙伴可以以各种方式使用的服务:

消费者可以根据某个搜索标准(ISBN、作者姓名等)搜索书籍。

经批准的作者可以上载书籍的更新。

评论者可以撰写书籍评论。

大家都知道,进入 Web 服务体系结构和实现有两种体系结构方式:

自顶向下(即从 WSDL 入手)

自底向上(即从 Java 实现类入手)

我将用 Acme Booksellers 样本解释如何使用与 JAX-RPC 编程模型一致的自顶向下的设计和实现。您可以在 附录中看到用于样本服务的 WSDL 文件。一旦研究过其代码后,您就可以继续进行下一部分了。

JAX-RPC 的类型映射系统:介绍


JAX-RPC 规范最重要的成就之一就是它定义了一个标准,该标准用于将 WSDL 文档(它表示了服务描述)映射为其 Java 表示(服务端点、存根、绑定以及 Java 类型),反之亦然。以前这是一个主要的易引起混淆的地方,因为每个 Web 服务工具箱供应商对于相关的标准(WSDL、SOAP 和 XML)以及这些标准之间的关系都有自己的解释。因为这些标准并行发展并且尚未成熟到足可依赖的程度,所以更增加了这种混淆。

让我们深入讨论细节问题以了解 JAX-RPC 是如何通过定义一个公共编程模型来设法彻底解决这些问题的。请注意,这个标准化成就是建立在 WSDL 1.1 和 SOAP 1.1 的基础上的。

JAX-RPC 规范中关于 WSDL 到 Java 的映射那部分解决了下列问题:

将 XML 类型映射为 Java 类型

将抽象的 WSDL 定义(端口类型、操作和消息)映射为 Java 接口和 Java 类。

将具体的 WSDL 定义(端口、绑定和服务)映射为 Java 类。

我将逐个讨论这些问题中的每一个。

将 XML 类型映射为 Java 类型

简单类型


XML Schema 和 SOAP 1.1 编码所定义的大多数简单的 XML 数据类型被映射为其对应的 Java 类型。您可以在 JAX-RPC 规范的表 4-1 中看到这种映射的详细信息。

作为一名开发者,在映射简单 XML 类型时,您应该记住以下几点。首先,JAX-RPC 映射规范没有为 xsd:anyType 指定特定的 Java 映射。

其次,内建的简单 XML 数据类型的 nillable 属性被设置为 true 的元素声明被映射为一个对应的 Java 基本类型的 Java 包装器类。例如,下面的代码被映射为 java.lang.Integer 。

<xsd:element name="code" type="xsd:int" nillable="true" /> 

这就为类型系统设计提供了将空(null)对象映射为其对应的 XML 类型的灵活性。您可以在 JAX-RPC 规范的表 4-2 中看到这些映射的完整列表。

最后,SOAP 1.1 编码规范将其大多数的类型映射为 nillable 。JAX-RPC 使用 Java 封装的对象来映射这些类型。请参阅 JAX-RPC 规范的表 4-3 以获取更多信息。

元数据和 JSR 175

Java 社区中正在进行一些努力以解决 Java 语言中元数据信息的不可用性问题。JSR 175 中提出的元数据工具将使 Java 类、接口、方法和域能够用额外的属性标记。Web 服务领域中还有另一个项目(JSR 181)正在进行中,该项目使用这些元数据工具(属性)来扩展 Web 服务配置及部署模型。

复杂类型


XML Schema 复杂类型被映射为若干个带有 getter 和 setter 的 JavaBean 以访问复杂类型中的每个元素。当处理这些类型时,您需要记住几点。首先请注意,虽然复杂类型包含 xsd:sequence ,但是在这些 JavaBean 中没有保持元素的先后顺序,这一点很重要。

其次,元素属性 maxOccurs 值为正的复杂类型映射为一个相应类型的 Java 数组。这样一种类型并不定义 minOccurs 和 maxOccurs 所有可能的组合。对于那些试图映射所有与 XML Schema 相关联的语义的 Java 开发者来说,这可能是个问题。

最后,该映射的主要问题之一就是 XML 元素属性映射。因为没有与 Java 类相关联的元数据,所以当您试图将 JavaBean 转换为 WSDL 时,可能会碰到映射问题;因此,JAX-RPC 规范并未指出如何映射 xsd:attribute 。然而,在进行 SOAP 绑定时,您可以将 SOAPElement 用于此目的。Java 语言扩展将来可能会对此进行调整;请参阅标题为“ 元数据和 JSR 175”的侧栏以获取更多关于这方面的信息。

下面的 清单 1向您展示了复杂类型映射是如何进行的。

清单 1. 正在进行的复杂类型映射 <xsd:complexType name ="Book"> 
<sequence> 
 <element name="author" type="xsd:string" maxOccurs="10" /> 
 <element name="price" type="xsd:float" /> 
</sequence> 
<xsd:attribute name="reviewer" type="xsd:string" /> 
</xsd:complexType> 

在 清单 2中,您可以看到 清单 1中的类型如何被映射为带有 getter 和 setter 方法的 JavaBean。

清单 2. 来自清单 1 的类型的 Java 映射 Public class Book{ 
  private float price; 
  private String[] author; 
  private String reviewer; // attribute 
  //.... 
  public String[] getAuthor() {.......} 
  public setAuthor(String[] author) {.......} 
  public float getPrice() {.......} 
  public void setPrice(float price) {.......} 
  public String getReviewer() {.....} 
public void setReviewer(String reviewer) {.....} 
} 

数组


JAX-RPC 将 XML 数组映射为带操作符 [] 的 Java 数组。您可以在 WSDL 服务声明中找到几种不同种类的数组声明。

第一种类型是 restriction 使用 WSDL 1.1 指定的 wsdl:ArrayType 属性从 soapenc:Array 中派生出来的数组。

清单 3. 用 restriction 和 wsdl:ArrayType 定义数组 <complexType name = "ArrayOfString"> 
<complexContent> 
  <restriction base="soapenc:Array"> 
  <attribute ref="soapend:ArrayType" 
     wsdlArrayType="xsd:string[]"> 
  </restriction> 
</complexContent> 
</complexType> 

JAX-RPC 将这些复杂数组类型映射为 Java String[] , java.lang.String 作为数组中的元素。

下一种数组类型是 SOAP 1.1 规范所设置的 restriction 从 soapenc:Array 中派生出来的。

清单 4. 用 restriction 和 soapenc:Array 定义数组 <complexType name = "ArrayOfString"> 
<complexContent> 
  <restriction base="soapenc:Array"> 
  <sequence> 
     <element name="stringArray" type="xsd:string" 
       maxOccurs="unbounded" /> 
  </sequence> 
  </restriction> 
</complexContent> 
</complexType> 

JAX-RPC 将这些复杂数组类型映射为 Java String[] , java.lang.String 作为数组中的元素。

您在 WSDL 中可以找到的另一种数组声明如下所示。

<element name="myNumbers" type="soapenc:Array" /> 

清单 5展示了上述模式的一个实例。

清单 5. 映射为 Java Object 数组 <myNumbers soapend:arrayType="xsd:int[2]" > 
<number>1</number> 
<number>2</number> 
</myNumbers> 

该声明被映射为一个 Java Object 数组,这个数组中的各个元素对应于 XML Schema 类型。(此处它映射为 integer 。)

最后,您还可以找到由用户定义的 XML schema 类型构造而成的数组。清单 6 展示了这种类型的定义:

清单 6. 定义一种模式类型 <complexType name="Article"> 
  <all> 
   <element name="name" type="xsd:string"> 
   <element name="author" type="xsd:string"> 
  </all> 
</complexType> 

现在您需要定义一个 Article 类型的数组。

清单 7. 用用户定义的模式类型定义一个数组 <complexType name="ArrayOfArticles"> 
<complexContent> 
  <restriction base="soapenc:Array"> 
  <sequence> 
   <element name="article" type="tns:Article" 
     maxOccurs="unbounded" /> 
  </sequence> 
  </restriction> 
</complexContent> 
</complexType> 

WSDL 中的上述声明映射为一个 Article (Article[] article;) 类型的 Java 数组。

将抽象的 WSDL 类型映射为 Java 类型


既然您理解了如何将 XML 类型映射为 Java 类型,我就要考虑 WSDL 的特殊情况了。首先,我将快速讨论一下如何将抽象的 WSDL 类型映射为 Java 表示:

wsdl:porttype : 该类型被映射为服务端点接口;它扩展了 java.rmi.Remote 接口。在这一系列文章的下一篇文章中,我将讨论服务端点接口以及它们的要求。

wsdl:operation : 因为 WSDL 1.1 并没指明操作名称需要是唯一的,所以可以有多个名称相同但参数不同的操作。您还应该记住,JAX-RPC 规范仅支持 WSDL 规范定义的单向操作和请求-响应操作;JAX-RPC 规范不支持要求-响应(solicit-response)操作样式或通知操作样式。您可以用可选的 parameterOrder 属性指定 WSDL 中的参数顺序。

我们来看一下参数传递样式。从 表 1 可以看出,这些参数传递样式可以是 in 、 out 和 inout ,这取决于您要怎样处理参数。

表 1. 参数传递样式

定义参数的位置 参数样式 可能的 JAX-RPC 映射类 样本 JAX-RPC 映射类
wsdl:inputin包装器类或 JavaBeanjava.lang.Integer
wsdl:outputoutHolder 类 IntHolder 、 StringHolder 等
wsdl:input 和 wsdl:outputinoutHolder 类 IntHolder 、 StringHolder 等

如 表 1 所示,为了支持 out 参数和 inout 参数,定义了一个新的 Holder 类。服务客户机使用 Holder 类实例发送 out 参数或 inout 参数的值。 Holder 类的内容是通过远程方法调用修改的,且服务客户机在方法调用后可以使用这些修改过的内容。还要注意,JAX-RPC 规范定义了大量 Holder 类以支持基本类型。您可以定义自己的 Holder 类以支持从名为 Holder 的标准接口派生出来的复杂类型。

让我用一些样本代码来阐述这些要点。 清单 8包括一个样本 WSDL 定义。

清单 8. 样本 WSDL 定义   <xsd:complexType name="Authors"> 
  <xsd:all> 
  <xsd:element name="Authors" type="typens:AuthorArray"/> 
  </xsd:all> 
  </xsd:complexType> 
<message name="AuthorPresentRequest"> 
    <part name="Authors" type="typens:Authors"/> 
  </message> 
  <message name="AuthorPresentResponse"> 
    <part name="return" type="xsd:boolean"/> 
    <part name="Authors" type="typens:Authors"/> 
  </message> 
  <portType name="AcmeAuthorPresentPortType"> 
    <operation name="IsAuthorPresent"> 
      <input message="typens:AuthorPresentRequest"/> 
      <output message="typens:AuthorPresentResponse"/> 
    </operation> 
  </portType> 

您可以看到输入消息和输出消息包含 Authors 类型作为参数。这是参数传递的 inout 样式。这需要一个用于 Authors 类型的 Holder 类,如 清单 9所示。

清单 9. 为 Authors 类型创建一个样本 Holder 类 public final class AuthorsHolder implements javax.xml.rpc.holders.Holder { 
  public com.acme.www.Authors value; 
  public AuthorsHolder() {} 
  public AuthorsHolder(com.acme.www.Authors value) { 
    this.value = value; 
  } 
} 

最后, 清单 10展示了如何实现 Java 端点。

清单 10. Java 端点实现 public interface AcmeAuthorPresentPortType extends java.rmi.Remote { 
  public boolean isAuthorPresent(AuthorsHolder authors) throws java.rmi.RemoteException; 
} 

您需要理解服务端点接口的名称以及端点方法的签名是怎样派生的。它们可以从 wsdl.portType 的名称属性和操作定义中派生,或者从 wsdl.binding 名称和操作声明中派生。这是您要记住的重要一点,因为可以有不同样式的多个绑定(例如 RPC/文档)指向同一个 portType 。这种绑定样式上的差异可能会导致创建出带有不同名字和签名的不同端点。因此,您应该谨防这种有混淆的映射。

SOAP 消息样式和操作编码

您已经知道存在两种 SOAP 消息样式, 文档和 RPC,它们定义了 SOAP 消息正文的格式。还存在两种对操作的参数进行编码的模式,即 文字的(literal)和 编码的(encoded)。

表 2列出了 SOAP 消息样式和模式并说明了 JAX-RPC 是如何对其进行定义的。

将具体的 WSDL 类型映射为 Java 类型


现在请把您的注意力转到具体的 WSDL 元素以及它们的 Java 映射上。

wsdl:binding : JAX-RPC 没有为 wsdl.binding 定义任何标准的 Java 表示。这意味着运行时可以定义所需的绑定。至少,JAX-RPC 运行时系统应该为具有如下特征的 SOAP 绑定提供支持:

带有已编码的操作模式(RPC/编码的)的 RPC 样式。

带有文字的操作模式(文档/文字的)的文档样式。

在进行文字映射时,每个消息部件都被映射为一种 Java 类型,早些时候我在前面的 将 XML 类型映射为 Java 类型部分中已经描述过这一点。如果不存在这种映射,那么就使用一个 javax.xml.soap.SOAPElement Java 类来表示消息部件。这种映射的一个示例就是包含多个属性的复杂类型。因为没有为属性定义标准的映射,所以这种复杂类型就被表示为 SOAPElement 。

请参阅标题为 SOAP 消息样式和操作编码的侧栏以及 表 2以获取关于这些不同样式和模式的更多信息。

表 2. SOAP 消息样式和 JAX-RPC

样式(SOAP 消息正文格式) 模式(参数编码) JAX-RPC 相关信息
文档(用一种模式定义正文格式)文字的(对每种参数编码使用 XML Schema)必需的
文档编码的(使用 SOAP Section 5 编码)可选的
RPC(用 SOAP Section 7 规则定义正文格式)编码的必需的
RPC文字的可选的

wsdl:service : 这个 WSDL 具体定义对一组服务端点(或 wsdl:ports )进行分组。JAX-RPC 将 wsdl:service 映射为一个 Java 服务类。这个服务类实现 javax.xml.rpc.Service 接口或者一个生成的 Java 接口(该 Java 接口被映射为 wsdl.service 定义),它接着再实现 javax.xml.rpc.Service 。

这个服务类充当以下内容的工厂:

服务端点的动态代理(在这一系列文章的下一篇文章中对此有更多描述)。您可以在服务对象中使用 getPort(..) 方法创建动态代理。

一个 javax.xml.rpc.Call 类型的实例,它用于动态调用服务端点上的远程操作(在这一系列文章的下一篇文章中对此有更多描述)。该动态调用接口需要在运行时创建一个 Call 对象。为此,您可以使用服务类的 createCall(..) 操作。

一个生成的存根类实例(在这一系列文章的下一篇文章中对此有更多描述)。这些存根是由生成的类提供的,它们是由工具创建的。

实现 Service 接口是 JAX-RPC 运行时系统的责任。根据绑定要求可以存在不同的存根实现。还要注意, Service 实现类应该实现 java.io.Serializable 接口或 javax.naming.Referenceable 接口以支持 JNDI 名称空间中的注册。

将 Java 类型映射为 WSDL


当然,JAX-RPC 规范中相当大一部分讨论了如何将 Java 类型映射为 XML 类型以及如何将 Java 服务端点接口映射为 WSDL 定义。这样的映射类似于我在此处所介绍的映射,但过程相反。在此我不打算详细解释该过程。请参考 JAX-RPC 规范的第 5 节以获取更多信息。这是用于 Web 服务设计的自底向上体系结构,它主要用于将现有的、基于 Java 的应用程序转换为 Web 服务或者用于创建包装这些应用程序的包装器。

结束语以及展望


在本文中,我已经讨论了 JAX-RPC 对简单类型映射的支持。要获得 Web 服务实现间最大程度的互操作性,您需要理解这个核心概念。虽然当前的类型映射列表很详细,但它们还没详尽到足以支持数据类型的所有要求。因此,JAX- RPC 运行时实现者可以通过定制的序列化器自由支持其他可扩展的类型映射机制。

我希望这个关于 JAX-RPC 中的类型映射支持的讨论有助于您领会 JAX-RPC 系统如何处理 XML 类型和 Java 类型以及如何将这些类型中的每一种类型转换成其他类型而不丧失其语义这些基本概念。

在这一系列文章的下一部分中,我将讨论 JAX-RPC 规范的其他方面(包括服务实现、服务客户机以及其他的核心概念)。在那之前,请努力掌握此处所概述的类型映射信息。

Tags:开发者 关于 JAX

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接