基于J2ME平臺(tái)的SOAP協(xié)議研究與應(yīng)用
時(shí)間:2022-11-17 09:45:00
導(dǎo)語(yǔ):基于J2ME平臺(tái)的SOAP協(xié)議研究與應(yīng)用一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢(xún)客服老師,歡迎參考。
摘要:本文對(duì)于在J2ME平臺(tái)下,利用XML解析器開(kāi)發(fā)SOAP協(xié)議的基本方法進(jìn)行了研究,介紹了J2ME平臺(tái)和SOAP協(xié)議,其中重點(diǎn)探討了XML的開(kāi)發(fā),提出了一種利用XML解析器在J2ME平臺(tái)上實(shí)現(xiàn)SOAP協(xié)議的方法,具有一定的推廣價(jià)值。
關(guān)鍵詞:J2MESOAPXML嵌入式系統(tǒng)
1引言
J2ME作為嵌入式系統(tǒng)應(yīng)用平臺(tái)得到了迅速的發(fā)展,JAVA語(yǔ)言固有的平臺(tái)無(wú)關(guān)性使得基于j2me平臺(tái)的嵌入式應(yīng)用系統(tǒng)具有廣闊的前景。受限于嵌入式設(shè)備及消費(fèi)類(lèi)電器硬件條件的限制,J2ME平臺(tái)提供的功能有限,如何能夠在有限的資源下拓展J2ME的功能,使得J2ME平臺(tái)能夠處理soap協(xié)議是本文研究的重點(diǎn)。
目前企業(yè)應(yīng)用正在向面向WEB服務(wù)的SOA架構(gòu)轉(zhuǎn)變,嵌入式系統(tǒng)與企業(yè)應(yīng)用系統(tǒng)的連接目前還處于TCP/IP協(xié)議、HTTP協(xié)議等比較初級(jí)的階段。隨著企業(yè)應(yīng)用系統(tǒng)提供的WEB服務(wù)日益廣泛和成熟,需要J2ME平臺(tái)提供處理SOAP協(xié)議的需求也越來(lái)越多。
SOA架構(gòu)是目前企業(yè)應(yīng)用系統(tǒng)廣泛部署的架構(gòu),實(shí)現(xiàn)SOA的關(guān)鍵問(wèn)題之一就是對(duì)SOAP協(xié)議的支持。本文分析了在J2ME平臺(tái)中實(shí)現(xiàn)SOAP協(xié)議處理遇到的問(wèn)題,提出了相應(yīng)的解決方案。
2j2ME介紹[1][2][3]
J2ME(Java2PlatformMicroEdition)是為無(wú)線(xiàn)電子市場(chǎng)所設(shè)計(jì)的JAVA平臺(tái),包括JVM規(guī)范和API規(guī)范。J2ME定義了一套類(lèi)庫(kù)和虛擬機(jī)技術(shù),這些技術(shù)可以使用戶(hù)、服務(wù)提供商和設(shè)備制造商通過(guò)物理(有線(xiàn))連接或無(wú)線(xiàn)連接,按照需要隨時(shí)使用豐富的應(yīng)用程序。J2ME同時(shí)提供了Java語(yǔ)言一貫的跨平臺(tái)性和安全性。
為了支持用戶(hù)和嵌入式市場(chǎng)提出的靈活性和可定制性要求,J2ME被設(shè)計(jì)得更加模塊化和可縮放化。J2ME在設(shè)備原有的操作系統(tǒng)上建造了3層軟件來(lái)實(shí)現(xiàn)這種要求:
1.JVM層:這層基于宿主操作系統(tǒng),按照某一種J2ME的配置實(shí)現(xiàn)了JVM。
2.配置層:這層對(duì)于用戶(hù)可見(jiàn)度要低一些,但對(duì)簡(jiǎn)表層非常重要。它針對(duì)不同市場(chǎng)的需求,定義了Java虛擬機(jī)的最小功能集合和Java類(lèi)庫(kù)的最小集合。在J2ME設(shè)備中,JVM與配置層緊密相連,它們體現(xiàn)了每一類(lèi)設(shè)備的基本功能。
3.簡(jiǎn)表層:這層對(duì)于用戶(hù)和應(yīng)用程序提供者來(lái)說(shuō)是最常見(jiàn)的。它針對(duì)特定市場(chǎng)的需求,定義了Java虛擬機(jī)的最小功能集合和Java類(lèi)庫(kù)的最小集合。
J2ME組件都圍繞一個(gè)中心,這些中心被稱(chēng)為configuration(配置),它們中間的每一個(gè)都是用于消費(fèi)電子和嵌入設(shè)備的特別的類(lèi)。目前配置分為CLDC和CDC兩種。
Connectedlimiteddeviceconfiguration(有限連接設(shè)備配置,簡(jiǎn)稱(chēng)CLDC)定義支持“devicesthatyouholdinyourhand(握在手中的設(shè)備)”的應(yīng)用程序接口和技術(shù),這類(lèi)設(shè)備的代表是PDA。Connecteddeviceconfiguration(連接設(shè)備配置CDC)定義支持“devicesthatyouplugintoplugintothewall(插入墻的設(shè)備)”的應(yīng)用程序接口和技術(shù),這類(lèi)設(shè)備的代表是機(jī)頂盒。
這兩種配置不同的地方就在于它們應(yīng)用于的裝置的能力,CLDC設(shè)備的處理器能力有限(與臺(tái)式機(jī)系統(tǒng)比較),并且存儲(chǔ)器大小一般也只在128KB到512KB之間。CDC系統(tǒng)不同,它可能有32位或64位處理器,以及有限的存儲(chǔ)容量,不過(guò)它的下限也得超過(guò)512K。
上圖解釋配置和簡(jiǎn)表的體系結(jié)構(gòu)。J2ME的體系結(jié)構(gòu)被橫向地分成三層,縱向分成兩部分。配置包括一個(gè)控制配置核心類(lèi)的虛擬機(jī),具體的簡(jiǎn)表位于每個(gè)配置之上。
簡(jiǎn)表為相同消費(fèi)電子設(shè)備的不同的生產(chǎn)商提供了標(biāo)準(zhǔn)化的Java類(lèi)庫(kù),現(xiàn)在五個(gè)已知簡(jiǎn)表已經(jīng)有了規(guī)范:
Mobileinformationdevicesprofile(MIDP)移動(dòng)電話(huà)和呼叫器CLDC
PersonaldigitalassistantprofilePalm和Handspring的PDA設(shè)備CLDC
Foundationprofile用于所有不需要GUI的CDC設(shè)備的標(biāo)準(zhǔn)簡(jiǎn)表CDC
Personalprofile替代PersonalJava的Foundation完善的簡(jiǎn)表CDC
RMIprofile提供RMI的Foundation完善的簡(jiǎn)表CDC
3SOAP協(xié)議介紹[4]
SOAP(簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議)是一種利用XML編碼數(shù)據(jù)的數(shù)據(jù)傳輸協(xié)議。它是同類(lèi)協(xié)議中要求最低的一個(gè)規(guī)范,只定義了協(xié)議所要求的最關(guān)鍵的部分,有意地忽略了垃圾收集、對(duì)象激活等方面的細(xì)節(jié)。像TCP/IP協(xié)議一樣,SOAP協(xié)議也包括客戶(hù)端和服務(wù)器兩個(gè)部分。
SOAP客戶(hù)端是一種創(chuàng)建XML文檔的程序,該XML文檔包含在分布式系統(tǒng)遠(yuǎn)程調(diào)用方法所需的信息。SOAP客戶(hù)端不是傳統(tǒng)意義上的程序,它除了用作普通的桌面應(yīng)用程序外,還可以是一種Web服務(wù)器或基于服務(wù)器的應(yīng)用程序。來(lái)自SOAP客戶(hù)端的消息和請(qǐng)求一般是通過(guò)HTTP發(fā)送的。因而,SOAP文檔可以穿過(guò)幾乎所有的防火墻,從而能跨越不同的平臺(tái)交換信息。
SOAP服務(wù)器只是用于監(jiān)聽(tīng)SOAP消息的特殊代碼,它可用作SOAP文檔的分配器和解釋器。外部Web服務(wù)可以與基于J2EE技術(shù)的應(yīng)用程序服務(wù)器交互,這種應(yīng)用程序服務(wù)器可以處理多種客戶(hù)端的SOAP請(qǐng)求。
SOAP定義了數(shù)據(jù)編碼規(guī)則,稱(chēng)為基準(zhǔn)編碼或“Section5(第5節(jié))”編碼,它是出自SOAP規(guī)范中描述數(shù)據(jù)編碼規(guī)則的內(nèi)容。SOAP編碼可以簡(jiǎn)短地描述成簡(jiǎn)單值或復(fù)合值的集合。簡(jiǎn)單值可以是簡(jiǎn)單類(lèi)型,如整型、浮點(diǎn)型和字符型,或者是XML架構(gòu)規(guī)范第2部中定義的內(nèi)置類(lèi)型,包括各種數(shù)據(jù)類(lèi)型,如字節(jié)型數(shù)組和枚舉。復(fù)合值包括結(jié)構(gòu)、數(shù)組和XML架構(gòu)制定組定義的復(fù)雜類(lèi)型。
SOAP在標(biāo)準(zhǔn)化消息格式環(huán)境中,可以做所有它能完成的工作。消息的主體部分是“text/xml”形式的MIME類(lèi)型,并且包含一個(gè)SOAP封套。該封套是一個(gè)XML文檔。封套包含了報(bào)頭(可選的)和報(bào)文(必須有的)。封套的報(bào)文部分總是用于最終接收的消息,而報(bào)頭項(xiàng)目可以確定執(zhí)行中間處理的目標(biāo)節(jié)點(diǎn)。附件、二進(jìn)制數(shù)字及其他項(xiàng)目可以附加到報(bào)文上。
SOAP提供了一種讓客戶(hù)端指定哪個(gè)中間處理節(jié)點(diǎn)必須處理報(bào)頭項(xiàng)目的方法。由于報(bào)頭與SOAP消息的主體內(nèi)容是互不相關(guān)的,所以可用它們給消息添加信息,而不會(huì)影響對(duì)消息報(bào)文的處理。
4SOAP協(xié)議在J2ME平臺(tái)中的實(shí)現(xiàn)
如何真正地將移動(dòng)設(shè)備融入到WebServices中去呢?這就需要使得PDA、手機(jī)等成為WebServices的客戶(hù)端,因此這些設(shè)備至少應(yīng)該具有處理XML信息的能力。在J2ME平臺(tái)中實(shí)現(xiàn)SOAP客戶(hù)端的功能,使得嵌入式設(shè)備能夠連接企業(yè)的WEB服務(wù)是企業(yè)應(yīng)用中比較常見(jiàn)的需求。J2ME的基本類(lèi)庫(kù)中沒(méi)有提供SOAP的支持,所以需要在J2ME平臺(tái)中開(kāi)發(fā)實(shí)現(xiàn)SOAP的處理功能。
實(shí)現(xiàn)SOAP協(xié)議客戶(hù)端的關(guān)鍵問(wèn)題分為兩個(gè)方面:J2ME不同配置的數(shù)據(jù)類(lèi)型不一樣,導(dǎo)致與SOAP協(xié)議封裝的數(shù)據(jù)類(lèi)型不匹配;J2ME平臺(tái)沒(méi)有提供對(duì)XML文件進(jìn)行處理的功能。
針對(duì)第一個(gè)問(wèn)題,需要注意只能使用基本類(lèi)型,對(duì)不匹配的數(shù)據(jù)類(lèi)型采用使用基本類(lèi)型復(fù)合的方式進(jìn)行處理。針對(duì)第二個(gè)問(wèn)題需要在J2ME中擴(kuò)展對(duì)XML文件處理的功能。目前有有兩種方法對(duì)XML文件進(jìn)行解析。一種是采用DOM的方式,另外一種是采用SAX的方式。操作DOM是一個(gè)與XML相互作用的簡(jiǎn)單方法,通常這個(gè)XML是一棵完整的XML樹(shù),被解析成一個(gè)存放在存儲(chǔ)器中的節(jié)點(diǎn)結(jié)構(gòu),你可以遍歷這棵樹(shù)。它非常簡(jiǎn)單易用,但是因?yàn)檎脴?shù)存在于存儲(chǔ)器中造成存儲(chǔ)器的負(fù)擔(dān),而對(duì)于嵌入式系統(tǒng)來(lái)說(shuō)存儲(chǔ)器的資源是有限的,因此這種方法的使用具有一定局限性。第二種方法在捕捉語(yǔ)法分析事件中,每當(dāng)語(yǔ)法分析程序遇到數(shù)據(jù)中的特定結(jié)構(gòu),它就會(huì)遍歷XML數(shù)據(jù),然后把結(jié)果發(fā)回前面注冊(cè)的一個(gè)事件監(jiān)聽(tīng)器中。比如說(shuō),當(dāng)語(yǔ)法分析程序遇到一個(gè)起始標(biāo)記,如<html>,那么事件監(jiān)聽(tīng)器將接收一個(gè)事件,通知它這個(gè)情況,并且向它傳遞任何所需的信息。相對(duì)DOM方式的處理,SAX方法對(duì)存儲(chǔ)器的要求比較低,但是效率要比DOM方式低。
Enhydra的KXML是一個(gè)只占很小存儲(chǔ)空間的XML語(yǔ)法分析程序,對(duì)于J2ME應(yīng)用程序非常適合。KXML支持DOM語(yǔ)法分析和操作,但是不支持SAX語(yǔ)法分析。取而代之,它使用一種稍微不同的稱(chēng)為“Pull”的分析方法。
下面是KXML采用DOM的方式處理XML數(shù)據(jù)的例子:
1.Documentdoc=newDocument();
2....
3.parser=newXmlParser(abc);
4.doc.parse(parser);
第一行創(chuàng)建了一個(gè)文檔對(duì)象,保存XML樹(shù)。第三行從一個(gè)名為abc的InputStreamReader中創(chuàng)建一個(gè)KXML語(yǔ)法分析程序。第四行傳送這個(gè)語(yǔ)法分析程序到文檔,然后讓文檔開(kāi)始分析。XML被遞歸分析,直到到達(dá)文檔的結(jié)尾。當(dāng)分析調(diào)用退出時(shí),整個(gè)文檔被裝入內(nèi)存,這時(shí)就可以對(duì)XML進(jìn)行操作了。
1.Elementroot=doc.getRootElement();
2.intchild_count=root.getChildCount();
3....
4.for(inti=0;i<child_count;i++){
5....
6.Elementkid=root.getElement(i);
7.
8.if(!kid.getName().equals("abc")){
9.continue;
10.}
<abc>元素是根元素的直接子元素,可以遍歷根元素的子元素,尋找abc標(biāo)記,如果子元素不是一個(gè)abc標(biāo)記,則返回。
1.intaddress_item_count=kid.getChildCount();
2.
3.for(intj=0;j<abc_item_count;j++){
4....
如果找到了abc子元素,開(kāi)始遍歷它的子元素,并把這些子元素的內(nèi)容打印出來(lái)。
通過(guò)KXML對(duì)XML的處理,可以進(jìn)一步實(shí)現(xiàn)對(duì)SOAP數(shù)據(jù)的處理,實(shí)現(xiàn)J2ME平臺(tái)對(duì)SOAP協(xié)議的支持。
J2MEWebServices規(guī)范(JSR172)的制訂給J2ME平臺(tái)增加兩大功能:一是使其能夠遠(yuǎn)程訪(fǎng)問(wèn)基于SOAP/XML的WebServices;二是使其具有解析XML數(shù)據(jù)的能力。目前JSR172的標(biāo)準(zhǔn)已經(jīng)制定完成,為了實(shí)現(xiàn)這兩大功能,JSR172新定義了提供相應(yīng)功能的兩個(gè)可選包。這兩個(gè)包占用內(nèi)存非常少,XML-RPC部分大概需要25-30KB的空間,而XML解析器則需要35KB左右。
規(guī)范只對(duì)JAX-RPC的模型提供支持,也就是說(shuō)僅支持同步的訪(fǎng)問(wèn)方式,使用J2ME客戶(hù)端可以向服務(wù)器發(fā)送RPC請(qǐng)求和獲得RPC響應(yīng)。在JSR172中實(shí)現(xiàn)的是SAX模式的解析器。能夠解析XML之前首先需要?jiǎng)?chuàng)建SAXParser的實(shí)例,
SAXParserFactoryfactory=SAXParserFactory.newInstance();
SAXParsersaxParser=factory.newSAXParser();
接下來(lái)要獲得XML文件的輸入流,并把它作為其中一個(gè)參數(shù)傳遞給saxParser的parse方法,
InputStreamis=this.getClass().getResourceAsStream("phone.xml");
SaxParser.parse(is,newBasicHandler(this));
DefaultHandler是SAX2默認(rèn)的事件處理器基類(lèi),用于處理XML解析事件的方法如下:
startDocument()
startElement(java.lang.Stringuri,
java.lang.StringlocalName,java.lang.StringqName,Attributesattributes)
characters(char[]ch,intstart,intlength)
endElement(java.lang.Stringuri,
java.lang.StringlocalName,java.lang.StringqName)
endDocument()
默認(rèn)情況下,DefaultHandler的上述方法什么也不做,因此必須自己擴(kuò)展DefaultHandler并且覆蓋上述的方法。程序中提供了一個(gè)BasicHandler用來(lái)處理xml文件。classBasicHandlerextendsDefaultHandler在BasicHandler類(lèi)中有兩個(gè)成員變量
privateVectorphones=newVector();
privateStacktagStack=newStack();
phones用來(lái)存儲(chǔ)我們已經(jīng)解析出來(lái)的Phone對(duì)象,tagStack則用來(lái)存放我們解析到的元素名稱(chēng),比如sonyericsson,phone,name,colour等。在文檔解釋結(jié)束后,也就是在endDocument()方法內(nèi)我們把解析的結(jié)果顯示在手機(jī)屏幕上,BasicHandler的幾個(gè)重要方法如下:
publicvoidstartDocument()throwsSAXException{}
publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)
throwsSAXException{
System.out.println("theqNameis"+qName);
if(qName.equals("phone")){
Phonephone=newPhone();
phones.addElement(phone);
}
tagStack.push(qName);
System.out.println("thetagstack''''slengthis"+tagStack.size());
}
publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{
System.out.println("theendqNameis"+qName);
tagStack.pop();
}
5結(jié)束語(yǔ)
通過(guò)擴(kuò)充J2ME平臺(tái)對(duì)XML數(shù)據(jù)的處理,完成了J2ME平臺(tái)對(duì)SOAP協(xié)議的支持。通過(guò)SOAP協(xié)議能夠使得基于J2ME平臺(tái)的嵌入式設(shè)備無(wú)縫的連接到企業(yè)現(xiàn)有的應(yīng)用系統(tǒng),解決了嵌入式設(shè)備數(shù)據(jù)來(lái)源不足的問(wèn)題,擴(kuò)展了嵌入式系統(tǒng)的應(yīng)用范圍。本文從處理XML數(shù)據(jù)出發(fā),深入探討了在J2ME平臺(tái)中實(shí)現(xiàn)SOAP客戶(hù)端的各種技術(shù),對(duì)于企業(yè)應(yīng)用系統(tǒng)的集成具有一定的推廣價(jià)值。
參考文獻(xiàn)
[1]Yuan,MichaelJuntao.EnterpriseJ2ME.PearsonEducation2003
[2]胡虛懷,楊志,李煥.J2ME移動(dòng)設(shè)備程序設(shè)計(jì).清華大學(xué)出版社2005
[3]施錚.J2ME技術(shù)參考手冊(cè).電子工業(yè)出版社2004
[4]楊濤.SOAP:XML跨平臺(tái)WebService開(kāi)發(fā)技術(shù).機(jī)械工業(yè)出版社2002