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 设计移动 Web 服务 在设计移动 Web 服务时需要考虑... 阅读

设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次

 2007-12-23 12:30:50 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨奸柟鐧哥秮閺岋綁顢橀悙鎼闂侀潧妫欑敮鎺楋綖濠靛鏅查柛娑卞墮椤ユ艾鈹戞幊閸婃鎱ㄩ悜钘夌;婵炴垟鎳為崶顒佸仺缂佸瀵ч悗顒勬⒑閻熸澘鈷旂紒顕呭灦瀹曟垿骞囬悧鍫㈠幍缂傚倷鐒﹂敋缂佹う鍥ㄧ厓鐟滄粓宕滈敃鍌氱煑闁告劦鐓堝ḿ鏍煕濠靛棗鐝旂憸鏂跨暦閹偊妲炬繛瀵稿Т閵堢ǹ顫忛搹瑙勫珰闁肩⒈鍓涢澶愭⒑閻撳海绉虹紒鐘崇墵楠炲啯銈i崘鈺佲偓濠氭煢濡警妲奸柟鑺ユ礋濮婃椽妫冨☉杈€嗘繝纰樷偓铏枠鐎规洏鍨介幃浠嬪川婵炵偓瀚奸梺鑽ゅ枑閻熴儳鈧氨鍏樺畷顖濈疀濞戞瑧鍘遍梺缁樏壕顓熸櫠閻㈠憡鐓忛柛鈩冾殔閳ь剙婀辩紓鎾寸鐎n亜绐涙繝鐢靛Т鐎氼剟鐛崼銉︹拺缁绢厼鎳庨ˉ宥夋煙濞茶绨芥俊鍙夊姍瀵挳鎮㈤崫鍕ㄥ彏闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥囧弲闂侀潧鐗嗗ú鐘诲磻閹炬剚娼╂い鎰╁灩缁侇噣姊虹紒妯圭繁闁革綇缍侀悰顕€骞掗幊铏閸┾偓妞ゆ帒鍊绘稉宥夋煥濠靛棙顥犵紒鈾€鍋撻梻鍌氬€搁悧濠勭矙閹达箑姹叉繛鍡楃贩閻熸壋鍫柛顐犲灮閺嗩偊姊洪崫鍕効缂傚秳鐒﹂幈銊╁焵椤掑嫭鐓冮柟顖滃绾偓绻濋埀顒佹綇閵娧呭骄闂佸搫娲ㄩ崰鎾跺姬閳ь剙鈹戦鏂や緵闁告﹢绠栧畷銏ゆ偨閸涘ň鎷虹紓鍌欑劍閿氬┑顕嗙畵閺屾盯骞橀弶鎴濇懙闂佽鍠楄摫婵炵厧绻樻俊鎼佸Χ閸モ晝鏆伴梻鍌欑濠€杈╁垝椤栨粍鏆滈柣鎰摠濞呯姵绻涢幋鐐寸殤缁炬崘鍋愮槐鎾存媴鐠愵垳绱板┑鐐村絻椤曨參鍩€椤掑喚娼愭繛鍙夌墪閻g兘顢楅崘顏冪胺闂傚倷绀侀幉锟犲礉閺囥垹鐤柣妯款嚙缁€鍫熺節闂堟稓澧涚€规洖寮剁换娑㈠箣閻愩劎绱伴梺鍝勬濡鍩為幋锔藉亹閺夊牜鍋勯崢锟犳⒑鏉炴壆鍔嶉柣妤佺矌濡叉劙骞樼€涙ê顎撴繛瀵稿Т椤戝懘骞楅悽鍛娾拺闁革富鍘介崵鈧┑鐐茬湴閸婃繈骞冩ィ鍐╁€婚柦妯侯槺椤斿﹪姊虹憴鍕剹闁告ü绮欏畷鎾绘偨閸涘ň鎷洪梺鑽ゅ枑濠㈡﹢骞冩笟鈧弻锝夊箳閻愮數鏆ら梺璇″枟椤ㄥ﹪鐛弽銊﹀闁稿繐顦扮€氳棄鈹戦悙鑸靛涧缂佹彃娼″畷鏇㈠Χ婢跺﹤鎯為梺閫炲苯澧存慨濠冩そ楠炴牠鎮欏ù瀣壕闁哄稁鍘介崑瀣煟濡灝鍚圭€规挷绶氶悡顐﹀炊閵娧€濮囬梺鍝勬噺閹倿寮婚妸鈺傚亞闁稿本绋戦锟�濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁樺灴婵$敻宕熼姘鳖啋闂佸憡顨堥崑鐔哥閼测晝纾藉ù锝呮惈椤庡矂鏌涢妸銉у煟鐎殿喛顕ч埥澶愬閻樼數鏉搁梻鍌氬€搁悧濠勭矙閹烘鍊堕柛顐犲劜閸婄敻鏌i悢鍝勵暭闁哥喓鍋熺槐鎺旀嫚閹绘帗娈绘繝纰夌磿閺佽鐣烽悢纰辨晬婵﹢纭搁崯瀣⒑鐠囨煡鍙勬繛浣冲洤绠烘繝濠傜墛閸嬧晛鈹戦崒姘暈闁抽攱鍨归惀顏堫敇閻愭潙顎涘┑鐐插悑閸旀牜鎹㈠☉銏″殤妞ゆ巻鍋撻柡瀣閵囧嫰顢曢姀銏㈩唺缂備浇椴哥敮鎺曠亽闂佸吋绁撮弲婊堝吹瀹€鍕拻濞撴埃鍋撻柍褜鍓涢崑娑㈡嚐椤栨稒娅犳い鏃囧亹閺嗗棝鏌ㄥ┑鍡欏闁告柨鐏氶妵鍕晜閻e苯寮ㄩ梺璇″櫙缁绘繃淇婇懜闈涚窞閻庯綆鍓欑敮楣冩⒒娴gǹ顥忛柛瀣噽閹广垽宕橀鑲╋紱濡炪倕绻愰幊鎰不閸撗€鍋撻悷鏉款棌闁哥姵娲滈懞杈ㄧ節濮橆剛鐣鹃梺缁樻煥閸氬鍩涢幋锔藉€甸柛锔诲幖鏍¢梺闈涙閸熸挳寮婚妶澶婄闁肩⒈鍓欓悡鐔兼倵鐟欏嫭绀冪紒璇茬墦瀵偊宕橀鑲╁姦濡炪倖甯掔€氀囧焵椤掍焦顥堢€规洘锕㈤、娆撳床婢诡垰娲﹂悡鏇㈡煃閳轰礁鏋ゆ繛鍫燂耿閺岋綁鎮㈢粙鍨潚濠殿喖锕ュ浠嬪箖閳╁啯鍎熼柍鈺佸暞閻︼綁姊绘担铏瑰笡闁绘娲熸俊鍓佺矙鐠恒劍娈鹃梺缁樺灦宀h法寮ч埀顒勬⒑閹肩偛鍔€闁告劑鍔庨妶顕€姊婚崒娆戠獢婵炰匠鍕垫闊洦娲橀~鏇㈡煛閸ャ儱鐏╅柛灞诲妽閵囧嫯绠涢幘璺侯杸闂佹娊鏀遍崹鍧楀蓟閻斿吋鍤冮柍杞版缁爼姊洪崨濠冣拹妞ゃ劌锕濠氭晸閻樻彃绐涘銈嗘閺侇喗鎱ㄩ崶鈺冪=濞达絿枪閳ь剙婀遍弫顕€鎮㈡俊鎾虫川閳ь剟娼ч幗婊呭婵傜ǹ绾ч柛顐g☉婵¤偐绱掑Δ浣侯暡缂佺粯鐩幃鈩冩償閿濆浂鍟嬮梻浣虹《閺備線宕滃┑瀣闁告稑鐡ㄩ悡銉╂倵閿濆懐浠涚紓宥嗩殜濮婂宕掑顑藉亾瀹勬噴褰掑炊瑜滃ù鏍煏婵炵偓娅嗛柛濠傛健閺屻劑寮撮悙娴嬪亾閸濄儳涓嶉柡灞诲劜閻撴洟鏌曟径妯烘灈濠⒀屽櫍閺岋紕鈧絺鏅濈粣鏃堟煛瀹€鈧崰鏍х暦濠婂棭妲鹃柣銏╁灡閻╊垶寮婚敓鐘插窛妞ゆ棁妫勯埀顒佸姍閺岋紕浠︾拠鎻掝潎闂佽鍠撻崐婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚敐澶婄闁挎繂鎲涢幘缁樼厱闁靛牆鎳庨顓㈡煛鐏炶鈧繂鐣烽锕€唯闁挎棁濮ら惁搴♀攽閻愬樊鍤熷┑顕€娼ч~婵嬪Ω瑜庨~鏇㈡煙閹规劦鍤欑痪鎯у悑缁绘盯宕卞Ο铏圭懆闂佸憡锕槐鏇犳閹惧鐟归柛銉戝嫮褰梻浣规偠閸斿矂鎮ラ崗闂寸箚闁圭虎鍠栫粈鍐┿亜閺冨倸甯剁紒鎰洴濮婃椽宕崟鍨ч梺鎼炲妼缂嶅﹤鐣烽姀鐘嗘椽顢旈崨顓涘亾閸偒娈介柣鎰皺娴犮垽鏌涢弮鈧喊宥夊Φ閸曨垱鏅滈悹鍥皺娴犳悂鎮楃憴鍕┛缂佺粯绻堥悰顔芥償閵婏箑娈熼梺闈涳紡閸愩劌顩梻鍌氬€搁オ鎾磻閸曨個娲晝閳ь剛鍙呴梺鍝勭Р閸斿孩鏅堕敓鐘斥拻闁稿本鐟︾粊鐗堛亜閺囧棗鎳夐崑鎾诲垂椤愩垺璇為悗瑙勬礃缁捇骞冮姀锛勯檮濠㈣泛顑囩粙渚€姊绘担鐟板姢缂佺粯鍔曢敃銏℃綇閳轰緡妫滈梺绋跨箻濡法鎹㈤崱妯镐簻闁哄秲鍔庨。鏌ユ煙椤栨氨澧涢柕鍥у椤㈡洟濮€閵忋垹濮辨繝娈垮枛閿曘劌鈻嶉敐澶婄闁绘ḿ绮崵鎴炪亜閹烘垵浜為柛鐐额潐缁绘繂鈻撻崹顔界亶闁煎灕鍥ㄧ厱闁哄啠鍋撻柛銊ョ仢閻e嘲煤椤忓嫮鍔﹀銈嗗笂闂勫秵绂嶅⿰鍫熺厵闁告繂瀚倴濡炪倧璁g粻鎾诲蓟濞戙垹围閹肩补鈧枼鎷梻浣告惈閺堫剟鎯勯鐐靛祦婵☆垰鍚嬪畷澶愭煟閹寸偍缂氶柍褜鍓濋褔鈥旈崘顔嘉ч幖绮光偓鑼泿缂傚倷鑳剁划顖炲礉濡ゅ懎鐭楅柛娑卞弾濞撳鏌曢崼婵囧櫧缂佺姳鍗抽幃妤€顫濋悡搴♀拫闂佽鍠楅〃濠囥€佸鈧幃婊堝幢濡櫣妲i梻鍌欑窔濞佳囨偋閸℃あ娑樷枎閹寸姷鐒奸梺閫炲苯澧存慨濠冩そ閹兘寮堕幐搴㈢槪闂傚倷绀佹惔婊呭緤娴犲鍋╃€瑰嫭澹嬮崼顏堟煕閺囥劌浜介柛銈冨€濋弻锝嗘償閵忊懇濮囬柤瑁ゅ€濋弻鐔兼煥鐎n偁浠㈠┑顔硷功缁垳绮悢鐓庣倞鐟滃瞼鑺辨禒瀣拺缂佸顑欓崕鎰版煟閳哄﹤鐏︽鐐诧躬閹垻鍠婃潏銊︽珫婵犵數鍋為崹鍫曟偡閿曞倹鍋熺€瑰嫰鍋婂〒濠氭煏閸繃顥為柣鎾卞劚椤儻顦撮柡鍜佸亝缁旂喖寮撮姀鈥充簵闁瑰吋鎯岄崰姘跺船閻㈠憡鐓熼柣妯煎劋椤忕娀鎮樿箛瀣鐎规洘绻堥幃銏ゆ惞閸︻叏绱插┑鐘灱濞夋稓鈧稈鏅犻、鏃堟偐缂佹ḿ鍘撻悷婊勭矒瀹曟粌顫濇0婵囨櫓闂佸搫绋侀崢鑲╃玻濡ゅ懏鐓涚€广儱楠搁獮鎰版煃瑜滈崜銊х不閹捐钃熼柕濞р偓閸嬫捇鏁愰崒娑欑彇缂備胶濮甸懝楣冨煘閹达富鏁婇柣锝呯灱閻g敻姊哄ú璇插箹闁绘妫楀畵鍕⒑缂佹ê鐏卞┑顔哄€濋崺娑㈠箣閻樼數锛滈柣搴秵閸嬫帡宕曢妷鈺傜厱閹兼番鍨规慨宥夋煛瀹€鈧崰鏍箖閻戣姤鍋嬮柛顐ゅ枑閸婄兘姊洪幑鎰惞闁稿鍊濆璇测槈閵忕姷鐤€闂佸疇妗ㄧ粈浣告暜濠电姷顣介崜婵娿亹閸愵喗鍋嬪┑鐘插瀹曞弶绻涢幋娆忕仼妤犵偑鍨烘穱濠囧Χ閸涱厽娈跺銈嗘煥椤︻垶鍩為幋锔藉€烽柤纰卞墮椤も偓闂備焦瀵уú蹇涘垂瑜版帪缍栭煫鍥ㄦ礈绾惧吋淇婇婵愬殭妞ゅ孩鎸绘穱濠囨倷瀹割喖鍓扮紓浣靛姀閸嬫劙骞夋导鏉戝耿婵炲棙鍨归敍婵嬫⒑缁嬫寧婀版慨妯稿姀閳敻姊绘担鍛靛綊顢栭崱娑樼闁煎鍊栧畷鍙夌箾閹寸偛鐒归柛瀣尭閳藉鈻庣€n剛绐楅梻浣规た閸樺綊宕愬┑瀣摕婵炴垯鍨圭粻濠氭偣閾忕懓鍔嬮柣蹇撶墦閹鎲撮崟顒傤槰濠碉紕鍋樼划娆忕暦濞差亜鐒垫い鎺嶉檷娴滄粓鏌熼崫鍕ф俊鎯у槻闇夋繝濠傚閻帡鏌″畝鈧崰鏍箖濠婂吘鐔兼惞闁稒妯婇梻鍌欑窔閳ь剛鍋涢懟顖涙櫠椤斿墽纾界€广儱鎷戝銉︺亜閺囶亞绉鐐叉捣缁數鈧綆鍋呭▍宀勬⒒娴e憡鍟炴繛璇х畵瀹曟粌鈽夐姀鐘插亶闂備緡鍓欑粔鐢告偂閻旂厧绠归柟纰卞幖閻忥絿绱掓径鎰锭闂囧绻濇繝鍌涘櫣闁告ɑ鎸抽弻锝夊箼閸愩劌鈷嬪銈冨灪椤ㄥ﹤鐣烽幒鎳虫棃鍩€椤掍胶顩插Δ锝呭暞閸嬧剝绻涢崱妤冪妞ゅ浚浜為惀顏堝箚瑜滈悡濂告煛鐏炲墽鈽夐摶鏍煃瑜滈崜鐔风暦椤栫偛閿ゆ俊銈咃攻閺咁亪姊洪幐搴g畵妞わ富鍨虫竟鏇°亹閹烘挾鍘介梺鍝勬处濮樸劑宕濆澶嬵棄閻庯綆鍠楅埛鎺楁煕鐏炲墽鎳呮い锔肩畵閺岀喓鍠婇崡鐐扮盎闁捐崵鍋ら幃妤呮濞戞瑦鍠愭繛鎴炴尭缁夊綊寮婚悢鐓庣闁逛即娼у▓顓㈡⒑閽樺鏆熼柛鐘崇墵瀵寮撮悢铏诡啎闂佺粯鍔﹂崜姘舵偟閺囥垺鈷戠紒瀣儥閸庡繑淇婇锝囩疄鐎殿喛顕ч埥澶婎潩椤愶絽濯伴梻浣告啞閹稿棝鍩€椤掆偓鍗遍柛顐g箥濞撳鏌曢崼婵囧殗闁绘稒绮撻弻鐔煎礄閵堝棗顏�
核心提示:从何时选择移动 Web 服务到总体设计指导原则再到用于移动 Web 服务的值类型,本文提出了在设计用于移动设备的 Web 服务时需要考虑的许多设计事项,设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次,文中还介绍了许多设计移动 Web 服务方面的最佳实践,从本文中,她对无线技术和 Web 服务非
从何时选择移动 Web 服务到总体设计指导原则再到用于移动 Web 服务的值类型,本文提出了在设计用于移动设备的 Web 服务时需要考虑的许多设计事项。文中还介绍了许多设计移动 Web 服务方面的最佳实践。从本文中,您可以了解如何决定何时使用 Web 服务、在设计 Web 服务时需要考虑什么事项,以及在规划移动 Web 服务时必须谨记哪些问题。

Web 服务是一种集成技术。在集成异构系统时 Web 服务的价值可以得到最好的证明,因为其支持许多类型的编程语言、运行时环境和网络。当需要从不兼容的环境连接应用程序时,Web 服务就有了用武之地。通过 Web 服务,您可以将业务应用程序从 java™ 2 Platform EnterPRise Edition (J2EE) 连接到 .NET。您还可以使用某个运行在 linux™ 中的应用程序将一个应用程序集成在 Windows™ 操作环境中。在本文中,我提供了一些针对移动 Web 服务的重要设计考虑事项,并且向您介绍了一些与之有关的最佳实践。

首先,我将讨论在开始之前 需要考虑哪些事项。

开始之前

在开始设计整个系统的体系结构之前,您必须做出如下决定——何时使用移动 Web 服务以及何时不使用移动 Web 服务。

对于移动设备,Web 服务是利用工作站的强大计算功能的一种最佳方式。Java Specification Request 172 (JSR-172) 定义了用于 Java 2 Platform Micro Edition (J2ME) 平台的 Web 服务 API。由于移动服务主要从客户端的角度进行编程并且是服务使用者,因此本文只需要介绍一部分远程服务调用 API (JAX-RPC) 和 JAXP (Java API for xml Parsing)。

设计移动 Web 服务的主要目的在于使嵌入式设备能够使用由服务器提供的服务,换句话说,移动 Web 服务是从 Web 服务使用者的角度进行设计的,目的在于支持轻量级设备共享服务器的计算功能和数据库

移动 Web 服务无缝地集成了运行在不同平台上的两种不同的应用程序,并且提供了它们之间的互操作性。通常,在考虑移动设备的参与时,有三种类型的集成技术可以运用:

  • 套接字通信
  • Web 服务
  • 消息传递技术(如 WebSphere® MQ Everyplace)

与套接字通信和消息传递技术相比,Web 服务有一些突出的优势。Web 服务使用可扩展标记语言 (XML) 来传输消息(包括结构良好的数据信息),使用简单对象访问协议 (SOAP) 来传输对象。如果您使用的是套接字通信,则必须完全负责定义要传输的数据结构。而且,如果客户端和服务器是用不同的编程语言编写的(例如 C++ 和 Java 编程语言),则您的工作量将大大增加——您必须负责数据传输和 C++ 和 Java 编程中的编码细节。

消息传递软件可能是一种解决方案,但如果您所关注的是性能,并且不担心事务和安全级别,则消息传递软件真的不是一个非常好的选择。如果使用消息传递软件,您将花大量的时间和精力解决安全问题,并且您的客户很有可能站在您的门口问:“为什么这么慢?”

我不准备告诉您正确的选择应该是什么,而给出一些理由来说明为什么 Web 服务可能是一个好的选择。

其中的一个理由可能是服务器端编程。即使是像 Web 服务这样好的机制,也仍然由于 XML 处理以及传输和接收 SOAP 消息的开销的原因而不能满足严格的实时处理需求。因此在设计时需要考虑两个问题:

  • 与普通的 HTTP 访问和专用的消息传递方法相比,每次 Web 服务调用的开销都比较大,所以当您主要考虑性能时,您可能需要首先选择另一项技术。
  • 由于开销的原因,如果您只需要在应用程序的各层之间进行通信,就不必选择 Web 服务。例如,不要将 Web 服务放在应用程序的视图层和控制器层之间。

现在,我假定您已经决定使用 Web 服务。那么,在总体设计方面需要考虑哪些问题?


设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图一)
设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二) 设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二)



在决定使用 Web 服务之后

您需要考虑的下一个问题是 Web 服务的总体设计。可以运用下列通用设计指导原则:

  • 管理 Web 服务的粒度。
  • 首先定义 Web 服务接口,然后加以实现。
  • 使用 Document/literal 作为编码样式。
  • 优先选择 JavaBean 组件而不是 Enterprise JavaBean (EJB) 组件作为服务提供者。
  • 避免 XML 元素嵌套太深,因为这可能大大延长解析、封送处理和取消封送处理的时间。

下面详细介绍这些设计考虑事项。

管理 Web 服务粒度

关于粒度管理需要谨记以下几点:

  • 始终优先考虑粗粒度的 Web 服务;决不要在分布式系统之间使用细粒度 Web 服务调用。
  • Web 服务是一个很好的工具集,但是当您以细粒度的方式使用 Web 服务时,它可能对应用程序的性能有很大的影响,因为 XML 解析、序列化和反序列化的开销很高;这种开销可能占处理时间的百分之三十。

在本文中,我以 Task Management 系统中的登录功能为例。驱动程序首先登录到系统,如果登录成功,则有两列任务显示在屏幕上。

对于此登录问题有两种解决方案:

  • 一种解决方案是首先调用登录方法,然后当该方法调用返回 true 时,调用一个方法来获取相应的任务。
  • 其他的事情将在一步中完成。如果驱动程序登录到 Task Management 系统,则返回驱动程序的角色以及分配的任务和启动的任务。如果登录失败,则返回指示驱动程序未登录到该系统的信息。

对于第一种解决方案,它是细粒度登录系统,而显示任务列表需要两次调用 Web 服务;这可能带来很大的延迟。第二种解决方案是粗粒度登录系统,它返回您在一次调用中需要的所有信息,并确保由于网络延迟和系统 I/O 带来的影响最小。

首先定义 Web 服务接口,然后进行实现。

这不仅从移动 Web 服务的角度来看是适用的,而且从 Web 服务设计和(更高的层次)面向对象的软件设计来看也是适用的。正如您所知道的,接口是客户端和服务提供程序之间的契约,而且保持稳定非常重要(因为正如您所知道的,实现容易改变)。

定义功能接口非常直接和直观——只需考虑:

  • 您的目标
  • 您需要获取什么信息
  • 您需要将何种结果返回到客户端

然后,您应该将该接口的相关要点写下来,并在这些要点的指导下完成所有实现细节。

这是一条简单的设计指导原则。了解您的目标非常重要,目标可以驱动您编写测试用例,并且指导您编写功能实现,这也是为什么测试驱动开发 (TDD) 广泛地应用于各种开发技术的原因。

使用 Document/literal 作为编码样式

目前,JAX-RPC 支持三种操作模式:

  • RPC/encoded。其优点在于简单,接收方可以轻松地将消息发送到操作的实现。其缺点在于类型编码信息的开销较大,这会降低吞吐量性能。
  • RPC/literal。其优点与 RPC/encoded 相同,而且 遵循 WS-I 组织制定的规范(请参阅参考资料)。
  • Document/literal。其优点在于没有类型编码信息,任何 XML 验证器都可以验证消息。其缺点在于 SOAP 消息中缺少操作名,所以发送消息很难甚至不可能。

在一些资料中,您还可能发现名为 Document/encoded(使用这种模式的人不多)和 Document/literal wrapped(由 Microsoft 定义,但是没有相关规范,其缺点在于比其他模式复杂)的模式。对这些操作模式的详细解释可以在参考资料中的“Which style of WSDL should I use?”内找到。

在这些模式中,WS-I 标准仅支持 RPC/literal 和 Document/literal。对于移动 Web 服务,JAX-RPC 实现必须使用 Document/literal 将基于 Web 服务描述语言 (WSDL) 的服务描述映射到相应的 Java 表示形式。因此,如果您只使用 Document/literal 作为编码样式,则您是最安全的

优先选择 JavaBeanser 组件而不是 EJB 组件作为服务提供程序

在使用 Java 编程语言公开服务时,需要考虑两种类型的服务提供程序:

  • 从 JavaBean 组件生成 Web 服务
  • 使用无状态会话 EJB 组件

虽然在某些情况下,EJB 组件非常有用,但是 JavaBeans 组件常常是更好的选择,特别是在开发移动 Web 服务时。实现使用 JavaBean 组件生成的服务提供程序比较简单和容易,而且与相应的会话 EJB 组件相比,JavaBean 组件更稳定。但是,如果您需要从使用 EJB 组件开发的现有 J2EE 应用程序公开 Web 服务,则请使用 EJB 组件。

避免 XML 元素嵌套太深

如果数组的数组、复杂类型的数组或包含另一个自定义复杂类型的复杂类型等嵌套太深,则将大大影响 Web 服务的性能。清单 1 显示一个 XML 描述示例——一个自定义数据类型 Task 类的数组:



清单 1. 自定义数据类型
import java.io.Serializable;

public class Task implements Serializable {
    /**
     * The id of the task
     */
    private int taskID = 0;

    /**
     * Owner name of the task
     */
    private String ownerName;

    /**
     * public default non-argument constrUCtor
     *  
     */
    public Task() {

    }

    /**
     * Constructor of the Task class
     * 
     * @param taskID
     *            id of the task
     * @param ownerName
     *            owner name of the task
     */
    public Task(int taskID, String ownerName) {
        this.taskID = taskID;
        this.ownerName = ownerName;
    }

    /**
     * @return Returns the ownerName.
     */
    public String getOwnerName() {
        return ownerName;
    }

    /**
     * @param ownerName
     *            The ownerName to set.
     */
    public void setOwnerName(String ownerName) {
        this.ownerName = ownerName;
    }

    /**
     * @return Returns the taskID.
     */
    public int getTaskID() {
        return taskID;
    }

    /**
     * @param taskID The taskID to set.
     */
    public void setTaskID(int taskID) {
        this.taskID = taskID;
    }
}


如果一个方法返回如 清单 1 中定义的 Task 的数组,则该方法的源代码包含在下面的清单中,方法 getTasks() 返回一个由五个 Task 对象组成的数组,如清单 2 所示。



清单 2. 返回自定义数据类型的数组的方法
    public Task[] getTasks(String name){
		Task[] tasks = new Task[5];

		for(int i=0; i<5; i++){
			tasks[i] = new Task(i, name);
		}
		return tasks;
	}

当使用 getTasks()(如清单 3 所示)所属的 JavaBean 组件公开 Web 服务时,Task 类映射到其中包含 Task 类的名称空间的 tn2:Task



清单 3. WSDL 定义中的 XML 数据类型
<complexType name="Task">
    <sequence
     <element name="ownerName" nillable="true" type="xsd:string"/>
     <element name="taskID" type="xsd:int"/>
    </sequence>
</complexType>

同时,数据类型 Task[] 映射到 ArrayOf_tn2_TaskArrayOf_tn2_Task 的 XML 描述如清单 4 所示:



清单 4. ArrayOf_tn2_Task 的 XML 描述
<complexType name="ArrayOf_tns2_Task">
    <sequence>
     <element maxOccurs="unbounded" minOccurs="0" name="Task" 
       nillable="true" type="tns2:Task"/>
    </sequence>
   </complexType>

清单 4 所示,为单个自定义复杂类型数组生成的 XML 描述很长。相反,Java 语言中的单个 String 类型映射到 xsd:string,而没有生成 complexType 元素;诸如 booleanintbyte 这样的基元类型分别映射到 xsd:booleanxsd:intxsd:byte

您可能已经注意到 XML 元素的嵌套(避免嵌套太深)和粒度考虑(使用粗粒度)之间的冲突。在实际运用中,嵌套和粒度之间应该有一个平衡。如果您更关注应用程序的性能,则应该仔细地权衡这两个考虑事项,以获得一个更好的解决方案。


设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图一)
设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二) 设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二)


移动 Web 服务的设计考虑事项

我已经讨论了设计 Web 服务的指导原则,现在我将把重点放在移动 Web 服务的考虑事项上。在大多数情况下,当将 JAX-RPC 值类型用于移动 Web 服务时需要考虑一些事情。JAX-RPC 值类型(遵循 JSR-101)是 Java 类,其值可以在服务客户端和服务端点之间移动。为了获得一致的值类型,必须遵循一系列规则。我只列出其中的几条,与本文关系最大的规则是:

  • 您必须具有公共缺省构造器。
  • 您必须具有用于需要在网络上传输的字段的 setter 和 getter 方法。
  • 在处理数据集合时您应该使用数组。
  • 移动 Web 服务中有一些首选的数据类型。
  • 在处理输入和输出参数时注意可能出现的问题。

您必须具有公共缺省构造器

在反序列化的过程中,SOAP 运行时环境使用缺省构造器来构造对象。如果您试图在没有公共缺省构造器的情况下编写值类型(也称为数据传输对象),在当 JAX-RPC 运行时尝试序列化和反序列化数据对象时可能会遇到错误。对于像 IBM Rational® application Developer (RAD) 6.0 这样的 IDE,将不为该数据类型生成序列化和反序列化 Helper 类(由 RAD 通过前缀 _Helper_Ser_Deser 生成),所以在调用与自定义数据类型相关的方法时会出现序列化错误。不带参数的构造器确保可以根据序列化状态远程构造对象。

您必须具有用于网络传输字段的 setter 和 getter 方法


首先,看一看清单 5 中的类 FailTask 的源代码:



清单 5. FailTask 类的定义
public class FailTask {
    /**
     * The owner of the task
     */
    private int ownerid;
    /**
     * The name of the task
     */
    private String name;
    
    /**
     * Default public non-argument constructor 
     *
     */
    public FailTask(){
    	
    }
    /**
     * Constructor of FailTask class
     * @param ownerid Owner of the task
     * @param name Name of the task
     */
    public FailTask(int ownerid, String name){
    	this.ownerid = ownerid;
    	this.name = name;
    }
    
    /**
     * Getter method
     * @return the ownerid of the task
     */
    public int getOwnerid(){
    	return ownerid;
    }
    
    /**
     * Setter method
     * @param ownerid the ownerid to be set
     */
    public void setOwnerid(int ownerid){
    	this.ownerid = ownerid;
    }
  }

您可以将清单 6 中所示的方法添加到 Web 服务中,该方法将返回单个 FailTask 对象。



清单 6. 返回 FailTask 对象的方法
public FailTask getFailTask(int ownerid, String name){
		return new FailTask(ownerid, name);
	}

当使用 RAD 6.0 附带的 Universal Test Client 中的 1Rachel 参数调用 getFailTask() 方法时,所得到的响应如图 1 中所示。



图 1. Universal Test Client 中的响应视图
设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图三)

name 字段在哪里?它不在这里,因为我没有通过 getter 和 setter 方法提供 name 字段。Setter 和 getter 方法是必须提供的两个方法。和 FailTask_Ser 类中一样,name 字段 getter 方法用于将 name 字段值写入 SOAP 消息。在 FailTask_Deser 类中,name 字段 setter 方法用于设置反序列化的 FailTask 对象的 name 值。

在处理数据集合时您应该使用数组

为了有效地使用 Web 服务,您必须或多或少地使用数据集合。但是,必须提醒:当处理许多值类型时,事情会变得比较麻烦,因此需要考虑以下问题。

当需要动态长度的数组时,请考虑 ArrayList。您已经反复听说过,如果不考虑同步,则 ArrayListVector 更有效。但遗憾的是,JSR-101 JAX-RPC 规范没有强制要求支持 Java Collection 类型。有些 Web 服务引擎可能没有为 ArrayList 提供支持。例如,IBM Web 服务引擎只正式支持 Java Collection Framework 中的一小部分类,包括 java.util.Vectorjava.util.HashTablejava.util.HashMap

那么,尝试一下另一个动态数组 Vector 会如何呢?如果在相同平台上生成存根文件,它将正常工作。但是,如果在不同的平台上生成存根文件,则将遇到一些问题。例如,在 Web 服务描述语言 (WSDL) 文件中,Vector 或其他 Collection 类型映射到 ArrayOfAnyType。其他平台可能不知道将其映射到哪个 Collection 类型,而且 Vector 中包含的数据元素也映射到 WSDL 中的 AnyType。(这里存在的一个大问题是,其他的平台不知道 AnyType 代表什么类型。)有关该主题的详细信息,请参阅参考资料中的“ Web services programming tips and tricks: Improve the interOperability between J2EE and .NET ”。

使用数组的最后一个原因是,移动 Web 服务不支持 Java Collection 类型,这使得所有其他的解释都显得没有必要。这意味着您可能无法从形式良好的 WSDL 文件为移动 Web 服务生成存根文件。

移动 Web 服务中的首选的一些数据类型


使用基元类型 long 传输 Date 或 Calendar 表示形式

对于标准 JAX-RPC 运行时实现,有两种支持的标准类型映射:

  • Java 类型到 XML 数据类型
  • XML 数据类型到 Java 类型

在 JAX-RPC 子集规范中,只需要第二种映射。表 1 显示了从支持的 XML 数据类型到 Java 类型的映射的简要列表;有关详细信息,请参阅 JSR-172。



表 1. 从 XML 数据类型到 Java 类型的映射
简单 XML 类型 Java 类型 xsd:string java.lang.String xsd:int int xsd:long long xsd:short short xsd:boolean boolean xsd:byte byte xsd:float java.lang.Stringfloat xsd:double java.lang.Stringdouble xsd:QName javax.xml.namespace.QName xsd:base64Binary byte[] xsd:hexBinary byte[]

表 1 中您可以清楚地看出,该列表中不存在像 xsd:dateTimexsd:datexsd:time 这样的元素,而在标准 JAX-RPC 规范中,这三个元素确实是映射到 java.util.Calendar 的 XML 类型。请注意,在 JAX-RPC1.1 中定义的 Java 据类型映射到 XML 类型的映射中,java.util.Date 映射到 xsd:dateTime

那么,在尝试传输日期或时间表示形式时,您应该使用什么?改为使用 long 类型的时间。long 类型的日期格式与不同时区的时间表示形式无关,并且因为它是基元类型,所以比其他类型的 Java 对象更有效。

注意 float 和 double 类型的使用

首先需要注意的一点是,正如您所知,CLDC 1.0 (Connected Limited Device Configuration) 并没有出于性能的原因而提供 float 和 double 本机类型,即使 CLDC 1.1 和 CDC 都为其提供了支持。那么,如果您必须使用针对 CLDC 1.0 的 Web 服务,您该如何做呢?JSR-172 为您提供了部分答案。

为了在 CLDC 1.0 中缺省支持 xsd:floatxsd:double,实现必须 生成代码来将这些类型映射到 java.lang.String。为了支持为 float 和 double 提供本机支持的配置和平台(CLDC 1.1 和 CDC),存根生成器实现也必须 生成代码来将这些类型映射到适当的本机 Java 类型。(详细信息,请参阅参考资料,以获得指向 JSR-172: J2ME Web 服务规范的链接。)

我将演示一个添加两个 float 数的简单 Web 服务(清单 7)。



清单 7. 添加两个 float 数
public class TaskWs {
    public TaskWs() {

    }

    /** 
     * Adding two float numbers and return their sum
     * @param a First number to add,
     * @param b Second number to add
     * @return The sum of a and b.
     */
    public float addTwo(float a, float b) {
        return a + b;
    }

}
}

所生成的 WSDL 定义中的 XML 数据类型定义如清单 8 所示。



清单 8. 与清单 7 对应的 WSDL 定义
 <wsdl:types>
  <schema targetNamespace="http://ws.test.ibm.com" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
  xmlns:impl="http://ws.test.ibm.com" xmlns:intf="http://ws.test.ibm.com" 
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <element name="addTwoResponse">
     <complexType>
      <sequence>
       <element name="addTwoReturn" type="xsd:float"/>
      </sequence>
     </complexType>
    </element>
    <element name="addTwo">
     <complexType>
      <sequence>
       <element name="a" type="xsd:float"/>
       <element name="b" type="xsd:float"/>
       <element name="b" type="xsd:float"/>
      </sequence>
     </complexType>
    </element>
  </schema>
  </wsdl:types>


对于针对 CLDC 1.0 的 Web 服务客户端,所生成的存根如清单 9 所示。



清单 9. 为 CLDC 1.0 生成的客户端存根
 public interface TaskWs extends java.rmi.Remote {
    public java.lang.String addTwo(java.lang.String _a, java.lang.String _b)
            throws java.rmi.RemoteException, javax.xml.rpc.JAXRPCException;
}

所以,当调用 CLDC 1.0 中的 Web 服务时,您必须使用 addTwo() 方法提供两个 String 参数,而对于针对平台 CLDC 1.1 的 Web 服务客户端,所生成的服务接口与清单 10 中所描述的类似:



清单 10. 为 CLDC 1.1 生成的客户端存根
public interface TaskWs extends java.rmi.Remote {
    public float addTwo(float _a, float _b) 
    throws java.rmi.RemoteException, javax.xml.rpc.JAXRPCException;
}

这将 xsd:float 映射到所生成的客户端存根中的 float 类型。看到 CLDC 1.0 和 CLDC 1.1 之间的不同之处了吗?

在为移动设备开发 Web 服务时,请注意 float 和 double 类型,因为 CLDC 1.0 虚拟机实现无法加载为 CLDC 1.1 生成的存根(使用到 float 和 double 的本机映射)。同时针对 CLDC 1.0 和 CLDC 1.1 的 Java 2 Platform Micro Edition (J2ME) 应用程序的开发人员应该使用到 java.lang.String 的缺省映射,以获得最好可重用性。

在处理输入和输出参数时注意可能出现的问题

JSR-172 指定了以副本的形式传送并以副本的形式创建返回值的所有参数。但是,当处理数据集合时,零数组 (返回零)和空数组 (返回其本身)需要密切关注。

我的建议是尽可能地避免使用空数组。当处理移动 Web 服务时,空数组可能是一个问题。

假定您需要返回任务对象数组。原始代码如清单 11 所示。



清单 11. 一个简单的值对象
public class SimpleTask {
    /**
     * The name of the task
     */
    private String name;

    /**
     * The default constructor
     *
     */
    public SimpleTask() {

    }

    /**
     * @return Returns the name of the task.
     */
    public String getName() {
        return name;
    }

    /**
     * @param name
     *            The name to set.
     */
    public void setName(String name) {
        this.name = name;
    }
}

Web 服务实现如清单 12 所示。



清单 12. 返回值对象的数组的方法
1  public SimpleTask[] getSimpleTasks(){
2       SimpleTask[] tasks = null;
3       /*
4        * Your code dealing with DB goes here
5        * ....
6        * tasks = ...
7        */
8       return tasks;
9	}

当生成 Web 服务存根和使用生成的存根测试 Web 服务时,本例中的每一个部分都将正常工作。但是,因为在结束一个阶段之前您需要使用 Jtest 进行完整的代码检查,所以当您对代码片段运行 Jtest 时,您将看到一条建议:“Return zero-length arrays instead of null”。在犹豫片刻之后后,您将赞同 Jtest 的建议。如果您返回零数组,该代码的客户端必须编写额外的代码来检查返回值是否为零(如清单 13 所示)。



清单13. 用于调用 Web 服务的客户端代码片段
   SimpleTask[] tasks = service.getSimpleTasks();
       if(tasks != null){
           int length = tasks.length;
           //do something here
       }

当您将 SimpleTask[] tasks = null;清单 12 中的第 2 行)修改为 SimpleTask[] tasks = new SimpleTasks[0]; 时,您只需将清单 13 编写为:

   SimpleTask[] tasks = service.getSimpleTasks();
           int length = tasks.length;


在修改之后,您会认为代码逻辑没有更改,并再次运行客户端来调用 Web 服务,但是现在却引发了异常。到目前为止,您已经根据 Jtest 的建议做了许多小的修补——您忘记修改了什么——这可能导致需要花额外的时间来努力找到发生错误的原因。这个过程真的漫长而乏味。

那么,问题究竟出在什么地方呢?一般来说,对于零对象数组(如 SimpleTask),返回的 SOAP 消息如清单 14 所示。



清单 14. 返回零数组时的 SOAP 消息
<soapenv:Body>
<p147:getSimpleTasksResponse xmlns:p147="http://ws.test.ibm.com">
  <getSimpleTasksReturn xsi:nil="true" />
</p147:getSimpleTasksResponse>
</soapenv:Body>

对于空数组(如 SimpleTask[] tasks = new SimpleTask[0]),SOAP 消息如清单 15 所示。



清单 15. 返回空数组时的 SOAP 消息
<soapenv:Body>
<p147:getSimpleTasksResponse xmlns:p147="http://ws.test.ibm.com">
  <getSimpleTasksReturn />
 </p147:getSimpleTasksResponse>
 </soapenv:Body>

其不同之处在于 <getSimpleTasksReturn/><getSimpleTasksReturn xsi:nil = true> 之间。图 2 说明了空数组参数大部分时间是无效的。对于自定义的数据类型(包括另一个自定类型的数组),不要将类变量初始化为空数组——相反,要将其初始化为零数组,尽管所生成的空数组和零数组的 WSDL 定义是相同的。



图 2. 根据 JSR-172 编码零数组参数和空数组参数
设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图四)

设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图一)
设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二) 设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二)


结束语

在处理移动 Web 服务时,您需要更加谨慎,因为移动 Web 服务规范只支持部分 API。如果您计划开发移动 Web 服务,则当您处理值类型和集合类型时,我向您介绍了一些窍门。此外,我还提供了以下信息:

  • 设计前考虑事项,例如何时使用 Web 服务,以及如何分析使用 Web 服务、套接字或消息传递技术之间的利弊。
  • 在决定使用 Web 服务后需要考虑的设计事项,包括:
    1. 管理粒度
    2. 设计 Web 服务接口
    3. 使用 Document/literal 作为编码样式
    4. 为什么您应该使用 JavaBeans 组件而不是 EJB 技术作为您的服务提供程序
    5. 为什么您应该避免 XML 元素嵌套太深
    6. 嵌套和粒度之间的平衡
  • 在使用 JAX-RPC 值类型时需要考虑的移动 Web 服务设计事项,包括:
    1. 公共缺省构造器
    2. Setter 和 getter 方法
    3. 使用数组类型而不是 Java Collection 类型
    4. 确定首选数据类型
    5. 处理输入和输出参数

设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图一)
设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二) 设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二)


参考资料

学习
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • "Web 服务编程技巧及窍门: 改善 J2EE 与 .NET 之间的互操作性(developerWorks,2005 年 1 月)向您介绍在处理标准 Web 服务时如何管理集合、数组和原型数据类型。

  • JSR-172:J2ME Web 服务规范定义了一个可选的包,其提供了从 J2ME 到 Web 服务的标准访问。

  • "我应该采用哪一种 WSDL 样式?" (developerWorks,2005 年 5 月)描述了本文所提供的操作模式(以及另外两种模式):RPC/encoded、RPC/literal、Document/encoded、Document/literal 和 Document/literal wrapped 模式。

  • Web Services - Interoperability Organization (WS-I) 是一个开放的行业组织,旨在促进跨平台、操作系统和编程语言之间的互操作。

  • "Tips and tricks: XML does the job(developerWorks,2002 年 3 月)说明了如何使用 XML-RPC 来定义移动 Web 服务客户端。

  • "Cross-platform programming with Java technology and the IBM Web Services Toolkit for Mobile Devices(developerWorks,2003 年 2 月)帮助确保您的 Java 应用程序在不需要修改的情况下作为尽可能多的平台运行。

  • JSR-101: Java APIs for XML-based RPC 讨论了如何使用 JAX-RPC 值类型。

  • "Using Mobile Devices with the WSTK(developerWorks,2002 年 12 月)说明了 Web Services Tool Kit for Mobile Devices 如何帮助开发在小型移动设备上使用 Web 服务的应用程序。

  • "交付 Web 服务至移动式应用程序(developerWorks,2003 年 1 月)说明了如何使用支持 J2ME 的移动设备和 kSOAP 库访问 Web 服务。

  • "为移动设备开发 Web 服务客户端 (developerWorks,2003 年 3 月)指导您完成构建 J2ME MIDP 设备上的移动 Web 服务客户端的必要步骤。

  • Connected Limited Device Configuration 1.0(CLDC;JSR-30 和 JSR-139)定义了用于资源约束型设备的一组基本 API 和虚拟设备。提供了一个功能强大的 Java 平台,用于开发与 Mobile Information Device Profile (MIDP) 结合在具有有限内存、处理能力和图形功能的设备上运行的应用程序。

  • Best practices for Web services 系列(developerWorks,2002 年 10 月)详细介绍了 Web 服务设计考虑事项。

  • 请查阅 Safari eReference Bookstore,以找到许多特定于移动和其他技术的主题。

  • developerWorks Wireless technology 专区专门发布有关基于移动和普及计算的解决方案的各方面的文章。


获得产品和技术
  • Jtest 可以自动完成 Java 单元测试,从正在运行的应用程序自动生成 JUnit 测试用例,以及测试单个类或大型的复杂应用程序。

  • Web Services Tool Kit for Mobile Devices (alphaWorks) 是成熟的技术——弄清楚该技术的应用领域。


设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图一)
设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二) 设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二)



关于作者

设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二)

设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图五)

设计移动 Web 服务 在设计移动 Web 服务时需要考虑的三个设计层次(图二)

Shu Fang Rui 毕业于中国上海交通大学。她对无线技术和 Web 服务非常感兴趣。除了旅行之外,她还喜欢从事一些运动。

(出处:http://www.cncms.com)


Tags:设计 移动 Web

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