淺析基于J2ME平臺的SOAP協(xié)議研究與應(yīng)用論文
Soap協(xié)議即簡單對象訪問協(xié)議,是交換數(shù)據(jù)的一種協(xié)議規(guī)范,是一種輕量的、簡單的、基于XML(標(biāo)準通用標(biāo)記語言下的一個子集)的協(xié)議,它被設(shè)計成在WEB上交換結(jié)構(gòu)化的和固化的信息。以下是學(xué)習(xí)啦小編今天為大家精心準備的:淺析基于J2ME平臺的SOAP協(xié)議研究與應(yīng)用相關(guān)論文,內(nèi)容僅供參考,歡迎閱讀!
淺析基于J2ME平臺的SOAP協(xié)議研究與應(yīng)用全文如下:
摘 要:本文對于在J2ME平臺下,利用XML解析器開發(fā)SOAP協(xié)議的基本方法進行了研究,介紹了J2ME平臺和SOAP協(xié)議,其中重點探討了XML的開發(fā),提出了一種利用XML解析器在J2ME平臺上實現(xiàn)SOAP協(xié)議的方法,具有一定的推廣價值。
關(guān)鍵詞:J2ME SOAP XML嵌入式系統(tǒng)
1 引言
J2ME作為嵌入式系統(tǒng)應(yīng)用平臺得到了迅速的發(fā)展,JAVA語言固有的平臺無關(guān)性使得基于J2ME平臺的嵌入式應(yīng)用系統(tǒng)具有廣闊的前景。受限于嵌入式設(shè)備及消費類電器硬件條件的限制,J2ME平臺提供的功能有限,如何能夠在有限的資源下拓展J2ME的功能,使得J2ME平臺能夠處理SOAP協(xié)議是本文研究的重點。
目前企業(yè)應(yīng)用正在向面向WEB服務(wù)的SOA架構(gòu)轉(zhuǎn)變,嵌入式系統(tǒng)與企業(yè)應(yīng)用系統(tǒng)的連接目前還處于TCP/IP協(xié)議、HTTP協(xié)議等比較初級的階段。隨著企業(yè)應(yīng)用系統(tǒng)提供的WEB服務(wù)日益廣泛和成熟,需要J2ME平臺提供處理SOAP協(xié)議的需求也越來越多。
SOA架構(gòu)是目前企業(yè)應(yīng)用系統(tǒng)廣泛部署的架構(gòu),實現(xiàn)SOA的關(guān)鍵問題之一就是對SOAP協(xié)議的支持。本文分析了在J2ME平臺中實現(xiàn)SOAP協(xié)議處理遇到的問題,提出了相應(yīng)的解決方案。
2 j2ME介紹[1] [2] [3]
J2ME(Java 2 Platform Micro Edition)是為無線電子市場所設(shè)計的JAVA平臺,包括JVM規(guī)范和API規(guī)范。J2ME 定義了一套類庫和虛擬機技術(shù),這些技術(shù)可以使用戶、服務(wù)提供商和設(shè)備制造商通過物理(有線)連接或無線連接,按照需要隨時使用豐富的應(yīng)用程序。J2ME同時提供了Java語言一貫的跨平臺性和安全性。
為了支持用戶和嵌入式市場提出的靈活性和可定制性要求,J2ME被設(shè)計得更加模塊化和可縮放化。J2ME在設(shè)備原有的操作系統(tǒng)上建造了3層軟件來實現(xiàn)這種要求:
1.JVM層:這層基于宿主操作系統(tǒng),按照某一種J2ME的配置實現(xiàn)了JVM。
2.配置層:這層對于用戶可見度要低一些,但對簡表層非常重要。它針對不同市場的需求,定義了Java虛擬機的最小功能集合和Java類庫的最小集合。在J2ME設(shè)備中,JVM與配置層緊密相連,它們體現(xiàn)了每一類設(shè)備的基本功能。
3.簡表層:這層對于用戶和應(yīng)用程序提供者來說是最常見的。它針對特定市場的需求,定義了Java虛擬機的最小功能集合和Java類庫的最小集合。
J2ME組件都圍繞一個中心,這些中心被稱為configuration(配置),它們中間的每一個都是用于消費電子和嵌入設(shè)備的特別的類。目前配置分為CLDC和CDC兩種。
Connected limited device configuration(有限連接設(shè)備配置,簡稱 CLDC)定義支持“devices that you hold in your hand(握在手中的設(shè)備)”的應(yīng)用程序接口和技術(shù),這類設(shè)備的代表是PDA。Connected device configuration(連接設(shè)備配置 CDC )定義支持“devices that you plug into plug into the wall(插入墻的設(shè)備)”的應(yīng)用程序接口和技術(shù),這類設(shè)備的代表是機頂盒。
這兩種配置不同的地方就在于它們應(yīng)用于的裝置的能力,CLDC設(shè)備的處理器能力有限 (與臺式機系統(tǒng)比較 ),并且存儲器大小一般也只在128 KB到 512 KB之間。CDC系統(tǒng)不同,它可能有32位或64位處理器,以及有限的存儲容量,不過它的下限也得超過512K。
上圖解釋配置和簡表的體系結(jié)構(gòu)。J2ME的體系結(jié)構(gòu)被橫向地分成三層,縱向分成兩部分。配置包括一個控制配置核心類的虛擬機,具體的簡表位于每個配置之上。
簡表為相同消費電子設(shè)備的不同的生產(chǎn)商提供了標(biāo)準化的 Java類庫,現(xiàn)在五個已知簡表已經(jīng)有了規(guī)范:
Mobile information devices profile (MIDP) 移動電話和呼叫器 CLDC
Personal digital assistant profile Palm和Handspring的PDA 設(shè)備 CLDC
Foundation profile 用于所有不需要GUI的CDC設(shè)備的標(biāo)準簡表 CDC
Personal profile 替代PersonalJava的Foundation完善的簡表 CDC
RMI profile 提供RMI的Foundation完善的簡表 CDC
3 SOAP協(xié)議介紹
SOAP(簡單對象訪問協(xié)議)是一種利用XML編碼數(shù)據(jù)的數(shù)據(jù)傳輸協(xié)議。它是同類協(xié)議中要求最低的一個規(guī)范,只定義了協(xié)議所要求的最關(guān)鍵的部分,有意地忽略了垃圾收集、對象激活等方面的細節(jié)。像TCP/IP協(xié)議一樣,SOAP協(xié)議也包括客戶端和服務(wù)器兩個部分。
SOAP客戶端是一種創(chuàng)建XML文檔的程序,該XML文檔包含在分布式系統(tǒng)遠程調(diào)用方法所需的信息。SOAP客戶端不是傳統(tǒng)意義上的程序,它除了用作普通的桌面應(yīng)用程序外,還可以是一種Web服務(wù)器或基于服務(wù)器的應(yīng)用程序。來自SOAP客戶端的消息和請求一般是通過HTTP發(fā)送的。因而,SOAP文檔可以穿過幾乎所有的防火墻,從而能跨越不同的平臺交換信息。
SOAP服務(wù)器只是用于監(jiān)聽SOAP消息的特殊代碼,它可用作SOAP文檔的分配器和解釋器。外部Web服務(wù)可以與基于J2EE技術(shù)的應(yīng)用程序服務(wù)器交互,這種應(yīng)用程序服務(wù)器可以處理多種客戶端的SOAP請求。
SOAP定義了數(shù)據(jù)編碼規(guī)則,稱為基準編碼或“Section 5(第5節(jié))”編碼,它是出自SOAP規(guī)范中描述數(shù)據(jù)編碼規(guī)則的內(nèi)容。SOAP編碼可以簡短地描述成簡單值或復(fù)合值的集合。簡單值可以是簡單類型,如整型、浮點型和字符型,或者是XML架構(gòu)規(guī)范第2部中定義的內(nèi)置類型,包括各種數(shù)據(jù)類型,如字節(jié)型數(shù)組和枚舉。復(fù)合值包括結(jié)構(gòu)、數(shù)組和XML架構(gòu)制定組定義的復(fù)雜類型。
SOAP在標(biāo)準化消息格式環(huán)境中,可以做所有它能完成的工作。消息的主體部分是“text/xml”形式的MIME類型,并且包含一個SOAP封套。該封套是一個XML文檔。封套包含了報頭(可選的)和報文(必須有的)。封套的報文部分總是用于最終接收的消息,而報頭項目可以確定執(zhí)行中間處理的目標(biāo)節(jié)點。附件、二進制數(shù)字及其他項目可以附加到報文上。
SOAP提供了一種讓客戶端指定哪個中間處理節(jié)點必須處理報頭項目的方法。由于報頭與SOAP消息的主體內(nèi)容是互不相關(guān)的,所以可用它們給消息添加信息,而不會影響對消息報文的處理。
4 SOAP協(xié)議在J2ME平臺中的實現(xiàn)
如何真正地將移動設(shè)備融入到Web Services中去呢?這就需要使得PDA、手機等成為Web Services的客戶端,因此這些設(shè)備至少應(yīng)該具有處理XML信息的能力。在J2ME平臺中實現(xiàn)SOAP客戶端的功能,使得嵌入式設(shè)備能夠連接企業(yè)的WEB服務(wù)是企業(yè)應(yīng)用中比較常見的需求。J2ME的基本類庫中沒有提供SOAP的支持,所以需要在J2ME平臺中開發(fā)實現(xiàn)SOAP的處理功能。
實現(xiàn)SOAP協(xié)議客戶端的關(guān)鍵問題分為兩個方面:J2ME不同配置的數(shù)據(jù)類型不一樣,導(dǎo)致與SOAP協(xié)議封裝的數(shù)據(jù)類型不匹配;J2ME平臺沒有提供對XML文件進行處理的功能。
針對第一個問題,需要注意只能使用基本類型,對不匹配的數(shù)據(jù)類型采用使用基本類型復(fù)合的方式進行處理。針對第二個問題需要在J2ME中擴展對XML文件處理的功能。目前有有兩種方法對XML文件進行解析。一種是采用DOM的方式,另外一種是采用SAX的方式。操作DOM是一個與XML相互作用的簡單方法,通常這個XML是一棵完整的XML樹,被解析成一個存放在存儲器中的節(jié)點結(jié)構(gòu),你可以遍歷這棵樹。它非常簡單易用,但是因為整棵樹存在于存儲器中造成存儲器的負擔(dān),而對于嵌入式系統(tǒng)來說存儲器的資源是有限的,因此這種方法的使用具有一定局限性。第二種方法在捕捉語法分析事件中,每當(dāng)語法分析程序遇到數(shù)據(jù)中的特定結(jié)構(gòu),它就會遍歷XML數(shù)據(jù),然后把結(jié)果發(fā)回前面注冊的一個事件監(jiān)聽器中。比如說,當(dāng)語法分析程序遇到一個起始標(biāo)記,如,那么事件監(jiān)聽器將接收一個事件,通知它這個情況,并且向它傳遞任何所需的信息。相對DOM方式的處理,SAX方法對存儲器的要求比較低,但是效率要比DOM方式低。
Enhydra的KXML是一個只占很小存儲空間的XML語法分析程序,對于J2ME應(yīng)用程序非常適合。KXML支持DOM語法分析和操作,但是不支持SAX語法分析。取而代之,它使用一種稍微不同的稱為“Pull”的分析方法。
下面是KXML采用DOM的方式處理XML數(shù)據(jù)的例子:
1.Document doc = new Document();
2....
3.parser = new XmlParser(abc);
4.doc.parse( parser );
第一行創(chuàng)建了一個文檔對象,保存XML樹。第三行從一個名為abc的InputStreamReader中創(chuàng)建一個KXML語法分析程序。第四行傳送這個語法分析程序到文檔,然后讓文檔開始分析。XML被遞歸分析,直到到達文檔的結(jié)尾。當(dāng)分析調(diào)用退出時,整個文檔被裝入內(nèi)存,這時就可以對XML進行操作了。
1.Element root = doc.getRootElement();
2.int child_count = root.getChildCount();
3....
4.for (int i = 0; i < child_count ; i++ ) {
5....
6. Element kid = root.getElement(i);
7.
8. if (!kid.getName().equals("abc")) {
9. continue;
10. }
1.int address_item_count = kid.getChildCount();
2.
3. for (int j = 0; j < abc_item_count ; j++) {
4....
如果找到了abc子元素,開始遍歷它的子元素,并把這些子元素的內(nèi)容打印出來。
通過KXML對XML的處理,可以進一步實現(xiàn)對SOAP數(shù)據(jù)的處理,實現(xiàn)J2ME平臺對SOAP協(xié)議的支持。
J2ME Web Services規(guī)范(JSR172)的制訂給J2ME平臺增加兩大功能:一是使其能夠遠程訪問基于SOAP/XML的Web Services;二是使其具有解析XML數(shù)據(jù)的能力。目前JSR172的標(biāo)準已經(jīng)制定完成,為了實現(xiàn)這兩大功能,JSR172新定義了提供相應(yīng)功能的兩個可選包。這兩個包占用內(nèi)存非常少,XML-RPC部分大概需要25-30KB的空間,而XML解析器則需要35KB左右。
規(guī)范只對JAX-RPC的模型提供支持,也就是說僅支持同步的訪問方式,使用J2ME客戶端可以向服務(wù)器發(fā)送RPC請求和獲得RPC響應(yīng)。在JSR 172中實現(xiàn)的是SAX模式的解析器。能夠解析XML之前首先需要創(chuàng)建SAXParser的實例,
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
接下來要獲得XML文件的輸入流,并把它作為其中一個參數(shù)傳遞給saxParser的parse方法,
InputStream is = this.getClass().getResourceAsStream("phone.xml");
SaxParser.parse(is,new BasicHandler(this));
DefaultHandler是SAX2默認的事件處理器基類,用于處理XML解析事件的方法如下:
startDocument()
startElement(java.lang.String uri,
java.lang.String localName, java.lang.String qName, Attributes attributes)
characters(char[] ch, int start, int length)
endElement(java.lang.String uri,
java.lang.String localName, java.lang.String qName)
endDocument()
默認情況下,DefaultHandler的上述方法什么也不做,因此必須自己擴展DefaultHandler并且覆蓋上述的方法。程序中提供了一個BasicHandler用來處理xml文件。class BasicHandler extends DefaultHandler在BasicHandler類中有兩個成員變量
private Vector phones = new Vector();
private Stack tagStack = new Stack();
phones用來存儲我們已經(jīng)解析出來的Phone對象,tagStack則用來存放我們解析到的元素名稱,比如sonyericsson,phone,name,colour等。在文檔解釋結(jié)束后,也就是在endDocument()方法內(nèi)我們把解析的結(jié)果顯示在手機屏幕上,BasicHandler的幾個重要方法如下:
public void startDocument() throws SAXException {}
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.println("the qName is "+qName);
if(qName.equals("phone")) {
Phone phone = new Phone();
phones.addElement(phone);}
tagStack.push(qName);
System.out.println("the tag stack's length is "+tagStack.size());}
public void endElement(String uri, String localName, String qName) throws SAXException {System.out.println("the end qName is "+qName); tagStack.pop();}
5 結(jié)束語
通過擴充J2ME平臺對XML數(shù)據(jù)的處理,完成了J2ME平臺對SOAP協(xié)議的支持。通過SOAP協(xié)議能夠使得基于J2ME平臺的嵌入式設(shè)備無縫的連接到企業(yè)現(xiàn)有的應(yīng)用系統(tǒng),解決了嵌入式設(shè)備數(shù)據(jù)來源不足的問題,擴展了嵌入式系統(tǒng)的應(yīng)用范圍。本文從處理XML數(shù)據(jù)出發(fā),深入探討了在J2ME平臺中實現(xiàn)SOAP客戶端的各種技術(shù),對于企業(yè)應(yīng)用系統(tǒng)的集成具有一定的推廣價值。
參考文獻:
[1] Yuan,Michael Juntao. Enterprise J2ME. Pearson Education 2003
[2] 胡虛懷,楊志,李煥. J2ME移動設(shè)備程序設(shè)計. 清華大學(xué)出版社 2005
[3] 施錚. J2ME技術(shù)參考手冊. 電子工業(yè)出版社 2004
[4] 楊濤. SOAP:XML跨平臺Web Service開發(fā)技術(shù). 機械工業(yè)出版社 2002