![使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第1頁](http://file4.renrendoc.com/view/39548b688159eadfcd3155f71cf686e3/39548b688159eadfcd3155f71cf686e31.gif)
![使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第2頁](http://file4.renrendoc.com/view/39548b688159eadfcd3155f71cf686e3/39548b688159eadfcd3155f71cf686e32.gif)
![使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第3頁](http://file4.renrendoc.com/view/39548b688159eadfcd3155f71cf686e3/39548b688159eadfcd3155f71cf686e33.gif)
![使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第4頁](http://file4.renrendoc.com/view/39548b688159eadfcd3155f71cf686e3/39548b688159eadfcd3155f71cf686e34.gif)
![使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第5頁](http://file4.renrendoc.com/view/39548b688159eadfcd3155f71cf686e3/39548b688159eadfcd3155f71cf686e35.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
使用gsoap進(jìn)行webservice開發(fā)總結(jié)1.概述webservice是創(chuàng)建可互操作的分布式應(yīng)用程序的新平臺(tái)。webservice的主要目標(biāo)是跨平臺(tái)的可互操作性。為了達(dá)到這一目標(biāo),webservice是完全基于xml、xsd等獨(dú)立于平臺(tái)、獨(dú)立于軟件供應(yīng)商的標(biāo)準(zhǔn)的。webservice在應(yīng)用程序跨平臺(tái)和跨網(wǎng)絡(luò)進(jìn)行通信的時(shí)候是非常有用的。webservice適用于應(yīng)用程序集成、b2b集成、代碼和數(shù)據(jù)重用,以及通過web進(jìn)行客戶端和服務(wù)器的通信的場(chǎng)合。南京內(nèi)容與資源管理中心需要為第三方提供dna識(shí)別的接口,由于第三方可能位于不同的局域網(wǎng)中,運(yùn)行于不同的平臺(tái),以及第三方形式多樣化,為此提供一種通用的接口至關(guān)重要。鑒于webservice在跨平臺(tái),跨網(wǎng)絡(luò)方面的出色表現(xiàn),南京內(nèi)容與資源管理中心需要采用webservice為第三方提供dna識(shí)別接口。南京內(nèi)容與資源管理中心采用c/c++實(shí)現(xiàn),如何快速的實(shí)現(xiàn)webservice接口呢。開源項(xiàng)目gsoap為此提供了很好的解決方案。2.gsoap介紹gsoap是一個(gè)綁定soap/xml到c/c++語言的工具,使用它可以簡(jiǎn)單快速地開發(fā)出soap/xml的服務(wù)器端和客戶端。由于gsoap具有相當(dāng)不錯(cuò)的兼容性,通過gsoap,我們就可以調(diào)用由java,.net,delhpi,php等語言開發(fā)的soap服務(wù),或者向它們提供soap服務(wù)。gsoap的編譯器能夠自動(dòng)的將用戶定義的本地化的c或c++數(shù)據(jù)類型轉(zhuǎn)變?yōu)榉蟲ml語法的數(shù)據(jù)結(jié)構(gòu),反之亦然。這樣,只用一組簡(jiǎn)單的api就將用戶從soap細(xì)節(jié)實(shí)現(xiàn)工作中解脫了出來,可以專注與應(yīng)用程序邏輯的實(shí)現(xiàn)工作了。gsoap編譯器可以集成c/c++和fortran代碼(通過一個(gè)fortran到c的接口),嵌入式系統(tǒng),其他soap程序提供的實(shí)時(shí)軟件的資源和信息;可以跨越多個(gè)操作系統(tǒng),語言環(huán)境以及在防火墻后的不同組織。2.1gsoap常用工具介紹為了便于開發(fā),gsoap提供了兩個(gè)常用工具。wsdl2h和soapcpp2。這兩個(gè)工具主要用來根據(jù)wsdl文件生成開發(fā)過程使用的c/c++文件。wsdl2h和soapcpp2選項(xiàng)很多,可以滿足不同的需要,詳細(xì)了解可以通過wsdl2h–h和soapcpp2–h命令獲取wsdl2h解析wsdl文件生成c/c++語法結(jié)構(gòu)的頭文件,假設(shè)生成的頭文件為add.h。add.h不能用于編碼,供soapcpp2生成客戶端和服務(wù)端框架使用。soapcpp2根據(jù)wsdl2h生成的頭文件,生成客戶端和服務(wù)端程序框架的頭文件和源文件,生成文件直接用于客戶端和服務(wù)端的開發(fā)。以add.h為例,一般會(huì)生成如下文件,客戶端:addclient.c,addh.h,addstub.h,add.nsmap,addc.c;服務(wù)端:addserver.c,addc.c,addh.h,addstub.h,add.nsmap。addclient.c:主要實(shí)現(xiàn)客戶端遠(yuǎn)程調(diào)用接口的實(shí)現(xiàn)addc.c:主要實(shí)現(xiàn)soap協(xié)議的底層封裝,消息通信等addstub.h:遠(yuǎn)程接口定義addh.h:soap底層實(shí)現(xiàn)的相關(guān)定義add.nsmap:名字空間定義addserver.c:處理客戶端soap請(qǐng)求開發(fā)過程中使用到的接口基本上都是在***stub.h中定義的,例如:注意:1>addc.c,addstub.h,addh.h,add.nsmap客戶端和服務(wù)端在編碼時(shí)都需要2>客戶端和服務(wù)端的代碼框架可以通過選項(xiàng)控制分開生成2.2gsoap開發(fā)方法使用gsoap開發(fā)通常有兩種方法。方法1先編寫wsdl文件,然后使用wsdl2h生成soapcpp2需要的頭文件,最后再使用soapcpp2生成客戶端和服務(wù)端需要的框架代碼。方法2直接編寫soapcpp2需要的頭文件,然后使用soapcpp2生成客戶端和服務(wù)端需要的框架代碼。編寫頭文件時(shí),必須遵循下面的規(guī)則:頭文件開頭必須包含下面的內(nèi)容//gsoapnsservicename:add//gsoapnsservicenamespace:http://localhost/add.wsdl//gsoapnsservicelocation:http://localhost//gsoapnsserviceexecutable:add.cgi//gsoapnsserviceencoding:encoded//gsoapnsschemanamespace:urn:add接口名必須為ns__xxxx的格式,ns(命名空間前綴)可以根據(jù)實(shí)際需要修改,命名空間前綴和函數(shù)名之間必須為兩個(gè)下劃線。接口返回參數(shù)必須為int類型。返回值僅表示soap調(diào)用是否成功接口的最后一個(gè)參數(shù)為輸出參數(shù)如果有多個(gè)輸出參數(shù),則必須定義為結(jié)構(gòu),以結(jié)構(gòu)的方式返回結(jié)構(gòu)命名必須和接口在同一個(gè)命名空間。比如定義intns__add(inta,ns__addresult*rst),ns__addresult定義為結(jié)構(gòu),命名必須以ns__開頭,否則客戶端和服務(wù)端無法正常工作。(如果不一致,在編譯和程序啟動(dòng)時(shí)都不會(huì)出錯(cuò),但是在消息交互時(shí)會(huì)導(dǎo)致消息格式錯(cuò)誤)方法1主要是wsdl編寫起來可能比較麻煩,特別是之前沒有使用過,會(huì)覺得有些難度。方法2相對(duì)來說編寫起來比較簡(jiǎn)單,主要難點(diǎn)在于編寫頭文件的規(guī)則比較嚴(yán)謹(jǐn),同時(shí)目前也缺少詳細(xì)規(guī)則介紹?;旧铣鰡栴}都是因?yàn)榫帉懙念^文件不符合soapcpp2的要求。方法1由于是通過wsdl2h生成,基本上避免了這個(gè)問題。3.gsoap開發(fā)實(shí)例本章以dna識(shí)別接口為例,詳細(xì)介紹gsoap的開發(fā)流程和主要函數(shù)的使用。dna識(shí)別接口開發(fā)采用直接編寫頭文件的方法。3.1dna識(shí)別接口頭文件定義按照頭文件編寫的規(guī)則編寫接口。如下://gsoapnsservicename:dnaidentify//gsoapnsservicenamespace:http://localhost/dnaidentify.wsdl//gsoapnsservicelocation:http://localhost//gsoapnsserviceexecutable:dnaidentify.cgi//gsoapnsserviceencoding:encoded//gsoapnsschemanamespace:urn:dnaidentifystructns__dnaidentifyreq{chartransactionid[36];charinfohash[44];charcontenthash[44];intreqcontenttype;charformat[12];};structns__dnaidentifyrsp{intresult;charinfohash[44];charcontenthash[44];charcontentname[256];intcontenttype;intsimilarity;chardnatype[64];intdnaid;charftpserver[48];charftpuser[24];charftppswd[24];charftppath[255];};intns__dnaidentify(structns__dnaidentifyreqreq,structns__dnaidentifyrsp*rsp);3.2生成客戶端和服務(wù)端開發(fā)框架soapcpp2-n-pdnaidentify-c-b-ldna_identify.h使用到的命令選項(xiàng)介紹如下:-n使用業(yè)務(wù)名稱重命名函數(shù)和命名空間表-p使用新的前綴替代soap-c生成純c的代碼-b字符數(shù)組序列化為string對(duì)象-l不生成soapclientlib/soapserverlib生成的文件如下:dnaidentifyc.c,dnaidentifyclient.c,dnaidentifyh.h,dnaidentify.nsmap,dnaidentifyserver.c,dnaidentifystub.h。按照2.1的介紹,分別拷貝客戶端和服務(wù)端需要的文件到各自的工程中。同時(shí)需要拷貝gsoap安裝目錄下的stdsoap2.c(pp),stdsoap2.h到客戶端和服務(wù)端的工程中。stdsoap2.c和stdsoap2.cpp內(nèi)容完全相同,如果是c++開發(fā),則拷貝stdsoap2.cpp,如果是c開發(fā),則拷貝stdsoap2.c。3.3客戶端開發(fā)介紹客戶端的開發(fā)比較簡(jiǎn)單,main函數(shù)中核心代碼只有幾行:structsoapdna_idt_soap;//定義一個(gè)soap類型的對(duì)象soap_init(&dna_idt_soap);//調(diào)用soap_init初始化soap_set_namespaces(&dna_idt_soap,namespaces);//設(shè)置命名空間soap_call_ns__dnaidentify(&dna_idt_soap,server,"",req,rsp);//調(diào)用服務(wù)端提供接口,server為服務(wù)地址,包含端口,req是輸入?yún)?shù),rsp是輸出參數(shù)soap_end(&dna_idt_soap);soap_done(&dna_idt_soap);3.4服務(wù)端開發(fā)介紹服務(wù)端的開發(fā)也比較簡(jiǎn)單,考慮到多線程的時(shí)候比較復(fù)雜。3.4.1服務(wù)端使用單線程main函數(shù)中主要代碼如下:structsoapdna_soap_server;//定義一個(gè)soap類型的對(duì)象soap_init(&dna_soap_server);//調(diào)用soap_init初始化soap_set_namespaces(&dna_soap_server,namespaces);soap_bind(&dna_soap_server,null,8080,100);//服務(wù)端口綁定soap_accept(&dna_soap_server);//接受客戶端的請(qǐng)求dnaidentify_serve(&dna_soap_server);//調(diào)用服務(wù)端的dna識(shí)別服務(wù),此方法是soapcpp自動(dòng)生成的,最終會(huì)調(diào)用dna_identify.h中定義的ns__dnaidentify方法,此方法需要服務(wù)端實(shí)現(xiàn)。soap_end(&dna_soap_server);soap_down(&dna_soap_server);3.4.2服務(wù)端使用多線程多線程實(shí)現(xiàn)時(shí),采用隊(duì)列來保存客戶端的請(qǐng)求,同時(shí)啟動(dòng)多個(gè)線程處理隊(duì)列中的請(qǐng)求消息,并且對(duì)隊(duì)列進(jìn)行保護(hù)。定義全局變量:pthread_mutex_tqueue_cs;//隊(duì)列鎖pthread_cond_tqueue_cv;//條件變量soap_socketqueue[max_queue];///數(shù)組隊(duì)列inthead=0,tail=0;//隊(duì)列頭和隊(duì)列尾定義函數(shù)void*dna_identify_process(void*soap);//線程入口函數(shù)intenqueue(soap_socketss);//入隊(duì)列函數(shù)soap_socketdequeue(void);//出隊(duì)列函數(shù)main函數(shù)中主要代碼structsoapdna_soap_server;//定義一個(gè)soap類型的對(duì)象soap*dna_soap[max_pid];soap_init(&dna_soap_server);//調(diào)用soap_init初始化soap_set_namespaces(&dna_soap_server,namespaces);soap_bind(&dna_soap_server,null,8080,100);//服務(wù)端口綁定//創(chuàng)建服務(wù)線程for(i=0;isocket=dequeue;……dnaidentify_serve(tsoap);soap_destroy(tsoap);soap_end(tsoap);……}……}詳細(xì)代碼請(qǐng)參考dna_identify.cpp文件。4.其他注意點(diǎn)總的來說,使用gsoap開發(fā)webservice還是很簡(jiǎn)單的,gsoap已經(jīng)實(shí)現(xiàn)了底層soap消息的封裝,并且給應(yīng)用層提供相當(dāng)簡(jiǎn)單的接口。在開發(fā)中只要遵循其規(guī)則即可。除了上面涉及到頭文件定義規(guī)則,gsoap開發(fā)的過程中還需要注意一下問題:注意include頭文件的位置gsoap開發(fā)時(shí)需要包含三個(gè)文件xxxxh.h,xxxxstub.h,xxxx.nsmap,其必須放到其它頭文件之后,比如:#include“headfile1.h”#include“headfile2.h”#include“headfile3.h”#include"xxxxh.h"#include"xxxxstub.h"#include"xxxx.nsmap"編碼時(shí)如果把headfile3.h放到最后,則編譯時(shí)此條include語句不生效,報(bào)在headfile3.h中的定義無法找到。這一點(diǎn)比較特殊,在gsoap相關(guān)文檔中有說明。最好采用g++編譯、鏈接。特別注意接口名,類名,結(jié)構(gòu)體命名需要在同一個(gè)命名空間中。接口參數(shù)類型中現(xiàn)在不支持union。gsoap1.x版本不支持多線程本次開發(fā)僅用到gsoap的很小一部分的特性,gsoap還是博大精深的,由于沒有使用到,開發(fā)過程中就沒有去學(xué)習(xí)和研究,本次總結(jié)也就沒有涉及。第二篇:webservice基礎(chǔ)總結(jié)webservice是一種跨編程語言和跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù)所謂跨編程語言和跨操作平臺(tái),就是說服務(wù)端程序采用java編寫,客戶端程序則可以采用其他編程語言編寫,反之亦然??绮僮飨到y(tǒng)平臺(tái)則是指服務(wù)端程序和客戶端程序可以在不同的操作系統(tǒng)上運(yùn)行。除了webservice外,常見的遠(yuǎn)程調(diào)用技術(shù)還有rmi(remotemethodinvoke)和corba,由于webservice的跨平臺(tái)和跨編程語言特點(diǎn),因此比其他兩種技術(shù)應(yīng)用更為廣泛,但性能略低。webservice使用soap協(xié)議實(shí)現(xiàn)跨編程語言和跨操作系統(tǒng)平臺(tái)webservice采用http協(xié)議傳輸數(shù)據(jù),采用xml格式封裝數(shù)據(jù)(即xml中說明調(diào)用遠(yuǎn)程服務(wù)對(duì)象的哪個(gè)方法,傳遞的參數(shù)是什么,以及服務(wù)對(duì)象的返回結(jié)果是什么)。webservice通過http協(xié)議發(fā)送請(qǐng)求和接收結(jié)果時(shí),發(fā)送的請(qǐng)求內(nèi)容和結(jié)果內(nèi)容都采用xml格式封裝,并增加了一些特定的http消息頭,以說明http消息的內(nèi)容格式,這些特定的http消息頭和xml內(nèi)容格式就是soap協(xié)議(simpleobjectaccessprotocol,簡(jiǎn)單對(duì)象訪問協(xié)議)。soap協(xié)議=http協(xié)議+xml數(shù)據(jù)格式http協(xié)議和xml是被廣泛使用的通用技術(shù),各種編程語言對(duì)http協(xié)議和xml這兩種技術(shù)都提供了很好的支持,webservice客戶端與服務(wù)器端使用什么編程語言都可以完成soap的功能,所以,webservice很容易實(shí)現(xiàn)跨編程語言,跨編程語言自然也就跨了操作系統(tǒng)webservice客戶端要調(diào)用一個(gè)webservice服務(wù),首先要有知道這個(gè)服務(wù)的地址在哪,以及這個(gè)服務(wù)里有什么方法可以調(diào)用,所以,webservice務(wù)器端首先要通過一個(gè)wsdl文件來說明自己家里有啥服務(wù)可以對(duì)外調(diào)用,服務(wù)是什么(服務(wù)中有哪些方法,方法接受的參數(shù)是什么,返回值是什么),服務(wù)的網(wǎng)絡(luò)地址用哪個(gè)url地址表示,服務(wù)通過什么方式來調(diào)用。wsdl(webservicedescriptionlanguage)是基于xml格式的,它是webservice客戶端和服務(wù)器端都能理解的標(biāo)準(zhǔn)格式,其中描述的信息可以分為what,where,how等部分。wsdl文件保存在web服務(wù)器上,通過一個(gè)url地址就可以訪問到它??蛻舳艘{(diào)用一個(gè)webservice服務(wù)之前,要知道該服務(wù)的wsdl文件的地址。webservice服務(wù)提供商可以通過兩種方式來暴露它的wsdl文件地址:?注冊(cè)到uddi服務(wù)器,以便被人查找?直接告訴給客戶端調(diào)用者,例如,在自己網(wǎng)站給出信息或郵件告訴。第三篇:rfc_webservice總結(jié)rfc發(fā)布webservice1建立rfc參考文檔rfcprogramminginabap.pdf2創(chuàng)建webservice2.1調(diào)用創(chuàng)建命令在rfc界面點(diǎn)擊utitiles->moreutitiles->createwebservice->fromthefunctionmodule圖2-1調(diào)用創(chuàng)建命令2.2定義webservice2.2.1objecttype定義service的名稱,service說明及指定type。圖2-2objecttype2.2.2chooseendpoint指定rfc名稱,選中映射關(guān)系。圖2-3chooseendpoint2.2.3configureservice設(shè)定安全模式,這里默認(rèn)安全模式為最低。圖2-4configureservice2.2.4enterpackage/request指定開發(fā)包及request,也可以選中為本地模式。圖2-5enterpackage/request2.2.5complete提示webservice已創(chuàng)建。圖2-6complete3修改系統(tǒng)配置文件3.1配置文件路徑加入服務(wù)器ipc:\windows\system32\drivers\etc\hosts3.2用寫字板打開hosts添加下屬內(nèi)容2020erpkf01如下圖所示:圖3-1添加ip信息4發(fā)布webservice4.1調(diào)用webservice配置在sap中輸入事務(wù)代碼soamanager,激活ie瀏覽器,如下圖所示:圖4-1點(diǎn)擊登錄,輸入sap用戶名及密碼。圖4-2輸入用戶名密碼成功登錄后進(jìn)入如下界面:圖4-3soamanagemant4.2點(diǎn)擊配置鏈接圖4-4點(diǎn)擊配置鏈接4.3選擇定義的webservice圖4-5選擇定義的webservice4.4選中點(diǎn)擊applyselection圖4-6applyselection4.5編輯定義的webservice圖4-7編輯webservice4.6輸入用戶名密碼圖4-8輸入用戶名密碼save保存后返回。4.7測(cè)試wsdl接口圖4-9測(cè)試wsdl接口第四篇:關(guān)于bslc的工作總結(jié)(android+webservice)寫在前面:這篇是我暑假以及開學(xué)之后的一段時(shí)間里,在開發(fā)bslc(同城物物交換系統(tǒng))的工作總結(jié)。因?yàn)槲乙彩莻€(gè)android的初學(xué)者,所以遇到的很多問題估計(jì)也是android初學(xué)者可能會(huì)遇到的問題。當(dāng)然,如果你是個(gè)android高手,那么此文估計(jì)對(duì)你的幫助不大。另外,有很多朋友和老師問我,你做的這個(gè)東西亮點(diǎn)在哪里呢。憑什么得獎(jiǎng)呢。我想說,誰不想做出有新意的東東呢。可是對(duì)于從零開始的我們,僅僅靠著模仿前人的東西,就已經(jīng)是要了老命了。哈哈。好吧,說這話確實(shí)有點(diǎn)不上進(jìn)。給準(zhǔn)備或者剛開始學(xué)習(xí)android的朋友的一點(diǎn)小建議:有可能的話,跟這有實(shí)際開發(fā)經(jīng)驗(yàn)(這個(gè)經(jīng)驗(yàn)不只是指android開發(fā)的能力經(jīng)驗(yàn),還有正規(guī)開發(fā)軟件的規(guī)范和過程的經(jīng)驗(yàn))的前輩,會(huì)讓你更快更好更輕松的前進(jìn)。。。(當(dāng)然這里的輕松也是相對(duì)而言的輕松,學(xué)習(xí)之事,即使有興趣做動(dòng)力,也多半是痛苦之事,所以,強(qiáng)大的心理是必要的,要學(xué)會(huì)苦中作樂,認(rèn)真負(fù)責(zé),團(tuán)隊(duì)合作,不恥下問??)好了,話不多說,下面是我整理出來的技術(shù)總結(jié):有對(duì)內(nèi)容的疑問或者質(zhì)疑,歡迎大家與我交流。企鵝號(hào):947840486android與webservice開發(fā)技術(shù)總結(jié)(eclipse&visualstudio2008)雖然開始得有點(diǎn)晚,但總也好過一直不開始。從今天起,開始整理自己在android——webservice開發(fā)過程中遇到的各種問題,以及解決的過程。真心覺得有必要做個(gè)每日總結(jié),為了紀(jì)念也好,為了以后用到的時(shí)候方便查看也好(估計(jì)希望不大),總之,專業(yè)的程序員都會(huì)寫技術(shù)總結(jié)。這幾天一直在整圖片上傳下載的問題。從最初的不知所措,到現(xiàn)在的略有了解,個(gè)人理解的原理是,通過把圖片轉(zhuǎn)換成base64編碼,存放在字節(jié)流中,通過對(duì)字節(jié)流的讀取、存放,來實(shí)現(xiàn)最終對(duì)圖片的操作。難點(diǎn)是,如何在android下和c#的webservice中分別實(shí)現(xiàn),以及數(shù)據(jù)的交互。最初找了很多資料來看,開始選擇的是ksoap2+base64遇到的細(xì)節(jié)問題:圖片路徑。/sdcard/###.pngandroidapp只能讀取模擬器上的文件(圖片),而且不能在系統(tǒng)文件里讀取圖片(root權(quán)限問題),所以,最后還是把測(cè)試的圖片放到了/sdcard下。最初想先用.net發(fā)布web服務(wù)的調(diào)試功能,手動(dòng)傳圖片??墒呛髞碓趯W(xué)長(zhǎng)的提醒下,明白其實(shí)不是直接傳路徑,(而且轉(zhuǎn)換后的字節(jié)流),所以,基本上沒法手動(dòng)調(diào)試。ksoap2不支持傳遞byte[]類型的參數(shù),后來試著傳base64編碼后的string類型,在web服務(wù)端再解碼,但是不知道哪里出錯(cuò),還是產(chǎn)生異常。唉,難道要換別的方法。。。。已解決,問題還是出在了服務(wù)端。是文件最后的存儲(chǔ)路徑不對(duì),不能寫絕對(duì)路徑(估計(jì)是我的格式不對(duì)),改成(~/xxx/)相對(duì)路徑就ok了。只是這是一個(gè)簡(jiǎn)單的demo,只能上傳單個(gè)的固定的文件。不過,可以比較容易改進(jìn),難點(diǎn)是最終我們的項(xiàng)目要求是一次返回多組圖片數(shù)據(jù),有待完善。8月17日?qǐng)D片上傳整合到bslc中。進(jìn)展比較緩慢。第一個(gè)對(duì)調(diào)用系統(tǒng)相冊(cè)的解決過程。查了很多資料,最后還是找到一個(gè)比較詳細(xì)的,通過intent.createchooser,可以選擇調(diào)用多個(gè)activity。難點(diǎn)是,需要在這多個(gè)被調(diào)用的activity在androidmanifest注冊(cè)的時(shí)候加上intent-filter,貌似這里是用來區(qū)分那些是屬于intent.action_get_content類型里的。這樣的話,也就不再是調(diào)用系統(tǒng)默認(rèn)的intent了吧。。。=0){}stringuploadbuffer=newlog.i("uploadbuffer","uploadbuffer:"+uploadbuffer);//byte[]image=baos.tobytearray;booleanflag=connectwebservice(uploadbuffer,filename);if(flag){{}returnfalse;returntrue;}elsebaos.write(buffer,0,count);string(base64.encode(baos.tobytearray));}catch(exceptione)}}publicstaticstringgetfilepathfromuri(contextcontext,uriuri,string[]{}cursorcursor=context.getcontentresolver.query(uri,projection,intindex=cursor.movetofirst;stringpath=cursor.getstring(index);cursor.close;cursor=null;returnpath;projection,stringselection,string[]selectionargs,stringsortorder)selection,selectionargs,sortorder);cursor.getcolumnindexorthrow(mediastore.images.media.data);privatebooleanconnectwebservice(stringimage,stringfilename)throwsioexception,xmlpullparserexception{envelope.bodyout=rpc;system.out.println("post:"+rpc);envelope.dotnet=true;envelope.setoutputsoapobject(rpc);soapserializationenvelopeenvelope=newsoapserializationenvelope(soapenvelope.ver11);httptransportseht=newhttptransportse(url);ht.debug=false;rpc.addproperty("id",session.id);rpc.addproperty("image",image);rpc.addproperty("filename",filename);log.i("send:",image+""+filename);soapobjectrpc=newsoapobject(namespace,methodname);stringurl="http://1:8082/service.asmx";stringnamespace="http:///";stringmethodname="uploadimage";stringsoap_action="http://1:8082/service.asmx。op=uploadimage";}ht.call(soap_action,envelope);objectresult=(object)envelope.getresponse;system.out.println("result:"+result);if(result.tostring.equals("true")){{}returnfalse;returntrue;}else//這是出現(xiàn)從本地選擇圖片的activitypackagecom.photos;importjava.io.filenotfoundexception;importcom.setting01.add01;importcom.flogin.session;importandroid.app.activity;ent;importandroid.graphics.bitmap;importandroid.graphics.bitmapfactory;.uri;importandroid.os.bundle;importandroid.util.log;importandroid.view.view;publicclassdoselectimagefromloacalextendsactivity{/*用來標(biāo)識(shí)請(qǐng)求照相功能的activity*/privatestaticfinalintcamera_with_data=1001;/*用來標(biāo)識(shí)請(qǐng)求gallery的activity*/privatestaticfinalintphoto_picked_with_data=1002;privatebitmapbitmap;//用來保存圖片privatebooleanhasimage;//是否已經(jīng)選擇了圖片publicstaticuriselectedimageuri=null;publicvoidoncreate(bundlesavedinstancestate){}startactivityforresult(localintent,photo_picked_with_data);super.oncreate(savedinstancestate);intentlocalintent=newintent;localintent.settype("image/*");localintent.setaction("ent.action.get_content");protectedvoidonactivityresult(intrequestcode,intresultcode,intentdata){log.i("doselectimagefromloacal:","doselectimagefromloacal:start。。。。。。。。。。。。。。。。。。。。。。。。。。");if(bitmap。=null&&。bitmap.isrecycled){bitmap.recycle;}selectedimageuri=data.getdata;session.doselectimagecontext=this;session.imageuri=selectedimageuri;//把對(duì)應(yīng)圖片的在數(shù)據(jù)庫中的uri讀取給log.i("log.i","selectedimageuri:"+selectedimageuri.tostring);if(selectedimageuri。=null){try{bitmap=if(resultcode。=result_ok)return;switch(requestcode){casephoto_picked_with_data://從本地選擇圖片sessionbitmapfactory.decodestream(getcontentresolver.openinputstream(selectedimageuri));casecamera_with_data://拍照bundlebundle=data.getextras;bitmap=(bitmap)bundle.get("data");if(bitmap。=null)bitmap.recycle;}catch(filenotfoundexceptione){e.printstacktrace;}//下面這兩句是對(duì)圖片按照一定的比例縮放,這樣就可以完美地顯示出來。有關(guān)圖片的//intscale=imagethumbnail.reckonthumbnail(bitmap.getwidth,//bitmap=imagethumbnail.piczoom(bitmap,(int)(bitmap.getwidthadd01.imageview.setimagebitmap(bitmap);add01.imageview.setvisibility(view.visible);doselectimagefromloacal.this.finish;//結(jié)束當(dāng)前activityhasimage=true;}break;處理將重新寫文章來介紹。bitmap.getheight,500,600);/scale),(int)(bitmap.getheight/scale));}bitmap=(bitmap)data.getextras.get("data");add01.imageview.setimagebitmap(bitmap);add01.imageview.setvisibility(view.visible);hasimage=true;break;}}如何動(dòng)態(tài)顯示listview中綁定的數(shù)據(jù)。嘗試失敗現(xiàn)在嘗試靜態(tài)顯示,事先把listview顯示出來成功了。。。雖然還是有些小bug需要改進(jìn),不過都不是大問題。原來問題是xml文件沒寫好,要使用線性布局,使用關(guān)聯(lián)布局會(huì)只在listview里顯示一個(gè)item。bslc依然存在的問題。收信箱里的收到的信件重復(fù)讀取的問題,需要有個(gè)已讀和未讀的區(qū)別屬性。.socketexception:connectionresetbypeer沒有解決,在模擬器上測(cè)試時(shí)不再出現(xiàn)此問題,但是還是需要用到異步加載圖片,不然幾乎沒有適合的用戶體驗(yàn)下一步工作:之前的code都沒有調(diào)試(本身有點(diǎn)發(fā)燒,狀態(tài)不好,先到這里把)由物品的詳細(xì)信息界面跳轉(zhuǎn)到交換引導(dǎo)界面還需要擴(kuò)增webservice:比如刪除我的寶貝和交換籃里的物品信息技術(shù)方面,還沒想好怎么動(dòng)態(tài)刷新搜索物品界面;還有異步加載(試著寫了,但是沒調(diào)試。)感覺要完善還有很長(zhǎng)的路要走。唉,今天基本上都干這個(gè)了。已閱和未閱的標(biāo)記刷新搜索物品我離個(gè)差好混亂啊邏輯上的混亂調(diào)試bug一大堆唉唉下一步工作:信件的閱讀標(biāo)記;搜索物品功能的局部刷新的實(shí)現(xiàn)bug:交換-》選擇我的寶貝(改變時(shí)報(bào)錯(cuò)java.lang.nullpointerexception)這里有待改進(jìn);;;;加入交換藍(lán),功能沒實(shí)現(xiàn);;;;(webservice返回false)從錯(cuò)誤中恢復(fù)時(shí)(沒有重新運(yùn)行apk),session里的id會(huì)置空,(如果能加一個(gè)判斷,讀取之前保存的用戶和密碼就好了)下一步工作。設(shè)置信件閱讀標(biāo)志繼續(xù)完善,修復(fù)bug。如果服務(wù)器返回值的類型是byte[]的時(shí)候,使用objectobject=envelope.getresponse;和soapobjectresult=(soapobject)envelope.bodyin;都不會(huì)發(fā)生錯(cuò)誤現(xiàn)象,但是在使用objectobject=envelope.getresponse;取回來的值在使用base64進(jìn)行解碼和編碼的時(shí)候會(huì)報(bào)出錯(cuò)誤。如果使用soapobjectresult=(soapobject)envelope.bodyin;就可以完整的將byte[]進(jìn)行解碼和編碼android系統(tǒng)默認(rèn)給textview插入圖片提供了三種方式:1、imagespan2、html.imagegetter3、textview.setcompounddrawables(left,top,right,bottom)1、textview使用imagespan顯示圖片imagespanspan=newimagespan(this,r.drawable.ic_launcher);spannablestringspanstr=newspannablestring("http://");spanstr.setspan(span,spanstr.length-1,spanstr.length,spannable.span_inclusive_exclusive);mtvtext.settext(spanstr);3、在textview四周顯示圖片mtvtext.settext("setcompounddrawables");drawabled=getresources.getdrawable(r.drawable.ic_launcher);d.setbounds(0,0,50,50);//必須設(shè)置圖片大小,否則不顯示mtvtext.setcompounddrawables(d,null,null,null);有時(shí)我們的軟件界面中有退出的功能,不能用activity中的finish了事,因?yàn)橛袝r(shí)你的應(yīng)用中有多個(gè)activity,我在網(wǎng)上搜了如何完全退出應(yīng)用,不外乎三種方法:1使用activitymanager的killbackgroundprocesses方法,這種方法還要加應(yīng)用權(quán)限,且不是所有版本sdk中通用,相關(guān)代碼如下:activitymanagermanager=(activitymanager)context.getsystemservice(context.activity_service);manager.killbackgroundprocesses("package");2殺進(jìn)程:(cess.mypid);或者system.exit(0);3還是使用activitymanager的restartpackage方法:manager.restartpackage("package");不知道為何,我都是不成功,后來使用廣播機(jī)制終于可以了,如果有朋友也和我一樣,以上方法都不靈,試試廣播機(jī)制,也不需要什么權(quán)限。做法奉上。1、先寫一個(gè)父類繼承activity,其他的activity都繼承此父類,重要的兩個(gè)方法如下。。privatebroadcastreceiverbroadcastreceiver=newbroadcastreceiver{@overridepublicvoidonreceive(contextarg0,intentarg1){//todoauto-generatedmethodstubfinish;}};@overrideprotectedvoidonresume{//todoauto-generatedmethodstubsuper.onresume;intentfilterfilter=newintentfilter;filter.addaction("exitapp");this.registerreceiver(broadcastreceiver,filter);}當(dāng)然你也可以每個(gè)activity都寫以上的代碼。1、然后在需要退出的activity中添加如下方法。。//發(fā)送廣播通知所有窗體關(guān)閉publicvoidclose{intentintent=newintent;intent.setaction("exitapp");this.sendbroadcast(intent);super.finish;}需要退出時(shí)調(diào)用一下。web應(yīng)用中防止用戶重復(fù)登錄的簡(jiǎn)單實(shí)現(xiàn)方法主要使用application,listener,把用戶id和用戶對(duì)象放到concurrenthashmap中,再存入application中1、登錄時(shí)把id和對(duì)象放到application中2、登出時(shí)把remove掉3、listenersessiondestroyed的時(shí)候,把對(duì)象session的key從application中去掉一、登錄時(shí)//2009.10.29防止多處登錄objectonlineusersobject=session.getservletcontext.getattribute(constants.online_users_key);("onlineuserobjectisnull:{}",null==onlineusersobject);if(null。=onlineusersobject){//不為空,說明有用戶在線。maponlineusersmap=(map)onlineusersobject;("----------001、打印在線用戶id列表(檢查用戶是否已經(jīng)在列表中)---");for(longid:onlineusersmap.keyset){(string.valueof(id));}("-----------------------------------------");for(longid:onlineusersmap.keyset){if(id.equals(userinfo.getid)){("{}=={}",id,userinfo.getid);msg=super.getmessage(request,"login.failed.username.hadlogined");super.renderjavascript(response,"window.onload=function{alert('"+msg+"');location.href='login.do"+querystring+"'}");returnnull;}}}//2009.10.29防止多處登錄//objectonlineusersobject=session.getservletcontext.getattribute(constants.online_users_key);if(null。=onlineusersobject){maponlineusersmap=(map)onlineusersobject;onlineusersmap.put(ui.getid,ui);}else{maponlineusersmap=new(constants.online_users_key,onlineusersmap);}("----------002、登錄后打印在線用戶列表-------------");for(longid:((map)(constants.online_users_key)).keyset){(string.valueof(id));}("-----------------------------------------");二、登出時(shí)httpsessionsession=request.getsession(false);userinfoui=(userinfo)session.getattribute(constants.user_info);//在application中刪除已經(jīng)注銷的用戶objectonlineusersobject=session.getservletcontext.getattribute(constants.online_users_key);if(null。=onlineusersobject){maponlineusersmap=(map)onlineusersobject;("userisnull。{}",ui);if(null。=ui){onlineusersmap.remove(ui.getid);}("------003、手動(dòng)注銷前打印在線用戶列表-------------");for(longid:onlineusersmap.keyset){(string.valueof(id));}("-----------------------------");}if(null。=session){session.removeattribute(constants.user_info);session.invalidate;}if(null。=onlineusersobject){maponlineusersmap=(map)onlineusersobject;onlineusersmap.remove(ui);("------004、手動(dòng)注銷后打印在線用戶列表-------------");for(longid:onlineusersmap.keyset){(string.valueof(id));}("-----------------------------");}三、onlinesessionlistenerpublicvoidsessiondestroyed(httpsessioneventhttpsessionevent){httpsessionsession=httpsessionevent.getsession;("sessiondestroyed:{};sessionidis{}",session,session.getid);objectonlineusersobject=session.getservletcontext.getattribute(constants.online_users_key);userinfouserinfo=(userinfo)session.getattribute(constants.user_info);("userinfoisnull:{}",null==userinfo);if(null。=onlineusersobject&&null。=userinfo){maponlineusersmap=(map)onlineusersobject;("---------------從在線列表中移除超時(shí)用戶id前打印在線用戶列表-------------");for(longid:onlineusersmap.keyset){(string.valueof(id));}("-----------------------------");for(longid:onlineusersmap.keyset){if(id.equals(userinfo.getid)){(string.valueof(id));onlineusersmap.remove(id);}}("---------------從在線列表中移除超時(shí)用戶id后打印在線用戶列表-------------");for(longid:onlineusersmap.keyset){(string.valueof(id));}("-----------------------------");}進(jìn)程的異常:java.lang.runtimeexception:can'tcreatehandlerinsidethreadthathasnotcalledlooper.prepare已解決:在thread的run里加入一個(gè)語句looper.prepare;根據(jù)androidsdkapi文檔說明invalidate方法是用來更新視圖(view)的方法,不過這東西的用法比較古怪invalidate方法如果你直接在主線程中調(diào)用,是看不到任何更新的。如果跟線程結(jié)合使用的話比如在下面的代碼中就會(huì)拋出異常uithreadimplementsrunnable{publicvoidrun{invalidate;}}上面的代碼會(huì)拋出onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews。怎么樣解決上面的問題呢,如果你有兩個(gè)view,你需要一個(gè)view用來顯示當(dāng)前的狀態(tài),一個(gè)thread去下載網(wǎng)絡(luò)數(shù)據(jù)或者是讀取文件等,這些數(shù)據(jù)讀取完畢后你要更新view到當(dāng)前屏幕上怎么辦呢。看看下面的代碼,也許可以幫助你第一種解決方案是:classuiupdatethreadimplementsrunnable{publicvoidrun{try{thread.sleep(1000*5);mhandler.post(mupdateresults);}catch(interruptedexceptione){e.printstacktrace;}}finalhandlermhandler=newhandler;finalrunnablemupdateresults=newrunnable{publicvoidrun{invalidate;//更新視圖}};}你必須實(shí)現(xiàn)一個(gè)handler.然后再你下載數(shù)據(jù)的線程中放上一個(gè)mhandler.post(mupdateresults);這樣就可以了。第2中方案比較簡(jiǎn)單loaddatathreadimplementsrunnable{publicvoidrun{doloaddata;mhandler.sendmessage(mhandler.obtainmessage);//這里系統(tǒng)會(huì)自動(dòng)調(diào)用handlemessage;這樣就可以更新視圖了}}handlermhandler=newhandler{@overridepublicvoidhandlemessage(messagemsg){super.handlemessage(msg);//這里處理視圖需要更新的代碼。}};有時(shí)我們的程序需要運(yùn)行一些耗費(fèi)時(shí)間的操作,當(dāng)進(jìn)行這些操作時(shí),我們不能讓界面假死,不然用戶會(huì)以為是死機(jī)或者卡住了。這時(shí)候,我們就需要通過運(yùn)行一個(gè)progressdialog來告訴用戶:“你看,我沒死,我還活著,我還能轉(zhuǎn)?!?。當(dāng)然,還要有thread的配合,才能完成這個(gè)任務(wù)。下面是一開始我自己寫的代碼,雖然思路對(duì)了,但是有些繁瑣:[java]//聲明變量privateprogressdialogpdialog=null;booleanstartview=false;privatehandlerhandler;privatethreadmthread;publicvoidoncreate(bundlesavedinstancestate){super.oncreate(savedinstancestate);setcontentview(r.layout.main);//顯示dialogpdialog=newprogressdialog(this);pdialog.setprogressstyle(progressdialog.style_spinner);pdialog.setmessage("loading….");pdialog.show;//定義handler對(duì)象handler=newhandler{publicvoidhandlemessage(messagemsg){startview=msg.getdata.getboolean("start");if(startview){//關(guān)閉dialogpdialog.dismiss;}}};//啟動(dòng)線程mthread=newthread(this);mthread.start;}//在下面的線程中運(yùn)行耗時(shí)方法publicvoidrun{//耗時(shí)方法longtimemethod;//handler傳回“準(zhǔn)備好”的信息messagemsg=handler.obtainmessage;bundledata=newbundle;data.putboolean("start",true);msg.setdata(data);handler.sendmessage(msg);}[/java]這樣寫的好處是message可以傳回不同類型的值,可以應(yīng)對(duì)不同需要。后來在網(wǎng)上看見了一種簡(jiǎn)便方法,頓時(shí)覺得自己這只菜鳥還要好好學(xué)習(xí)啊。代碼是這樣的。[java]//聲明變量privatebuttonb1;privateprogressdialogpd;//定義handler對(duì)象privatehandlerhandler=newhandler{@override//當(dāng)有消息發(fā)送出來的時(shí)候就執(zhí)行handler的這個(gè)方法publicvoidhandlemessage(messagemsg){super.handlemessage(msg);//只要執(zhí)行到這里就關(guān)閉對(duì)話框pd.dismiss;}};publicvoidoncreate(bundlesavedinstancestate){super.oncreate(savedinstancestate);setcontentview(r.layout.main);}privatevoidprocessthread{//構(gòu)建一個(gè)下載進(jìn)度條pd=progressdialog.show(mainhandler.this,"load","loading…");newthread{publicvoidrun{//在新線程里執(zhí)行長(zhǎng)耗時(shí)方法longtimemethod;//執(zhí)行完畢后給handler發(fā)送一個(gè)空消息handler.sendemptymessage(0);}}.start;}[/java]這樣的寫法比較簡(jiǎn)潔,運(yùn)行效率也高。第五篇。webservice客戶端代碼生成方式總結(jié)一、webservice可以使用的框架很多。axis、cxf、jax、xfire,這些框架都可以根據(jù)wsdl文件生成ws的服務(wù)器和客戶端代碼。二、ws的調(diào)用方式有三種,httppost、httpget、soappost。本人建議使用httppost,他訪問遠(yuǎn)程ws接口的速度比使用soappost要快些。象使用axis框架實(shí)現(xiàn)soappost方式來說,簡(jiǎn)單的接口還好,對(duì)于使用了大量代理類及帶有soaphead的ws,且還要在本地生成一大堆java類來和服務(wù)端對(duì)應(yīng)。特別如下這種情況,axis好像無法實(shí)現(xiàn)。soaphead如下003943445467677象這種只能根據(jù)org.apache.axis.client.call.addhead(elementsoaphead)來增加報(bào)頭。但這個(gè)報(bào)頭沒有根元素,無法創(chuàng)建一個(gè)這種element。下面就如何書寫客戶端代碼詳細(xì)講解下。1.通過發(fā)送httppost請(qǐng)求來調(diào)用ws。soapui是個(gè)不錯(cuò)的工具,他可以根據(jù)wsdl文件生成測(cè)試?yán)印A硗庵匾氖?,它可以生成wsdl對(duì)應(yīng)的請(qǐng)求報(bào)文和響應(yīng)報(bào)文。這樣我們?cè)谡{(diào)用別人寫的ws時(shí),不管多復(fù)雜的ws都可以簡(jiǎn)單的調(diào)用。首先按照soapui顯示的請(qǐng)求報(bào)文格式拼裝我們的請(qǐng)求報(bào)文,使用.httpurlconnection對(duì)象來發(fā)送httppost請(qǐng)求。然后使用輸出流、輸出流獲得響應(yīng)報(bào)文,再用element解析報(bào)文得到要取的數(shù)據(jù)。示例代碼如下:java類soapinvoke:packagetest;importjava.io.inputstream;importjava.io.outputstream;.httpurlconnection;.url;publicclasssoapinvoke{publicstaticvoidmain(string[]args){}try{}soapspecialconnection;e.printstacktrace;}catch(exceptione){publicstaticvoidsoapspecialconnectionthrowsexception{//拼裝soap請(qǐng)求報(bào)文stringbuildersb=newstringbuilder;stringbuildersoapheader=newstringbuilder;soapheader.append("");soapheader.append("");soapheader.append("zhouyun");soapheader.append("123");soapheader.append("");soapheader.append("");soapheader.append("");soapheader.append("");soapheader.a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 融資融券業(yè)務(wù)操作方法及技巧介紹
- 2025年全球及中國自主機(jī)器人街道吸塵器行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國微波波導(dǎo)衰減器行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025下水道施工合同
- 2025韶關(guān)市項(xiàng)目移交合作協(xié)議終止合同
- 2025亞糧集團(tuán)宿州市埇橋區(qū)農(nóng)產(chǎn)品智慧物流園區(qū)項(xiàng)目投資合同書
- 監(jiān)控安裝工程施工合同
- 2025樹苗栽培承包合同
- 2025年外研版選修3歷史下冊(cè)月考試卷含答案
- 職業(yè)經(jīng)理人合作合同協(xié)議書范本
- 《中國心力衰竭診斷和治療指南(2024)》解讀完整版
- 《檔案管理課件》課件
- 2025年中考物理終極押題猜想(新疆卷)(全解全析)
- 脛骨骨折的護(hù)理查房
- 抽水蓄能電站項(xiàng)目建設(shè)管理方案
- 電動(dòng)工具培訓(xùn)課件
- 《智能網(wǎng)聯(lián)汽車智能傳感器測(cè)試與裝調(diào)》電子教案
- 視頻會(huì)議室改造方案
- 【中考真題】廣東省2024年中考語文真題試卷
- GB/T 32399-2024信息技術(shù)云計(jì)算參考架構(gòu)
- 2025年湖南省長(zhǎng)沙市中考數(shù)學(xué)模擬試卷(附答案解析)
評(píng)論
0/150
提交評(píng)論