歡迎您光臨本站 註冊首頁

詳解基於J2ME平台下SOAP協議的應用

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

J2ME作為嵌入式系統應用平台得到了迅速的發展,JAVA語言固有的平台無關性是的基於J2ME平台的嵌入式應用系統具有廣闊的前景.受限於嵌入式設備及消費類電器硬體條件的限制,J2ME平台提供的功能有限,如何能夠在有限的資源下拓展J2ME的功能,是的J2ME平台能夠處理SOAP協議是本文研究的重點.

目前企業應用正在向面向WEB服務的SOA架構轉變,嵌入式系統與企業應用系統的連接目前還處於TCP/IP協議、HTTP協議等比較初級的階段.隨著企業應用系統提供的WEB服務日益廣泛和成熟,需要J2ME平台提供處理SOAP協議的需求也越來越多.

SOA架構是目前企業應用系統廣泛部署的架構,實現SOA的關鍵問題之一就是對SOAP協議的支持.本文分析了在J2ME平台中實現SOAP協議處理遇到的問題,提出了相應的解決方案.

一、J2ME介紹

J2ME(Java 2 Platform Micro Edition)是為無線電子市場所設計的JAVA平台,包括JVM規範和API規範.J2ME 定義了一套類庫和虛擬機技術,這些技術可以使用戶、服務提供商和設備製造商通過物理(有線)連接或無線連接,按照需要隨時使用豐富的應用程序.J2ME同時提供了Java語言一貫的跨平台性和安全性.

為了支持用戶和嵌入式市場提出的靈活性和可定製性要求,J2ME被設計得更加模塊化和可縮放化.J2ME在設備原有的操作系統上建造了3層軟體來實現這種要求:

1.JVM層:這層基於宿主操作系統,按照某一種J2ME的配置實現了JVM.

2.配置層:這層對於用戶可見度要低一些,但對簡表層非常重要.它針對不同市場的需求,定義了Java虛擬機的最小功能集合和Java類庫的最小集合.在J2ME設備中,JVM與配置層緊密相連,它們體現了每一類設備的基本功能.

3.簡表層:這層對於用戶和應用程序提供者來說是最常見的.它針對特定市場的需求,定義了Java虛擬機的最小功能集合和Java類庫的最小集合.

J2ME組件都圍繞一個中心,這些中心被稱為configuration(配置),它們中間的每一個都是用於消費電子和嵌入設備的特別的類.目前配置分為CLDC和CDC兩種.

Connected limited device configuration(有限連接設備配置,簡稱 CLDC)定義支持「devices that you hold in your hand(握在手中的設備)」的應用程序介面和技術,這類設備的代表是PDA.Connected device configuration(連接設備配置 CDC )定義支持「devices that you plug into plug into the wall(插入牆的設備)」的應用程序介面和技術,這類設備的代表是機頂盒.

這兩種配置不同的地方就在於它們應用於的裝置的能力,CLDC設備的處理器能力有限 (與台式機系統比較 ),並且存儲器大小一般也只在128 KB到 512 KB之間.CDC系統不同,它可能有32位或64位處理器,以及有限的存儲容量,不過它的下限也得超過512K.

此主題相關圖片如下:

上圖解釋配置和簡表的體系結構.J2ME的體系結構被橫向地分成三層,縱向分成兩部分.配置包括一個控制配置核心類的虛擬機,具體的簡表位於每個配置之上.

簡表為相同消費電子設備的不同的生產商提供了標準化的 Java類庫,現在五個已知簡表已經有了規範:

Mobile information devices profile (MIDP) 行動電話和呼叫器 CLDC

Personal digital assistant profile Palm和Handspring的PDA 設備 CLDC

Foundation profile 用於所有不需要GUI的CDC設備的標準簡表 CDC

Personal profile 替代PersonalJava的Foundation完善的簡表 CDC

RMI profile 提供RMI的Foundation完善的簡表 CDC

二、SOAP協議介紹

SOAP(簡單對象訪問協議)是一種利用XML編碼數據的數據傳輸協議.它是同類協議中要求最低的一個規範,只定義了協議所要求的最關鍵的部分,有意地忽略了垃圾收集、對象激活等方面的細節.像TCP/IP協議一樣,SOAP協議也包括客戶端和伺服器兩個部分.

SOAP客戶端是一種創建XML文檔的程序,該XML文檔包含在分散式系統遠程調用方法所需的信息.SOAP客戶端不是傳統意義上的程序,它除了用作普通的桌面應用程序外,還可以是一種Web伺服器或基於伺服器的應用程序.來自SOAP客戶端的消息和請求一般是通過HTTP發送的.因而,SOAP文檔可以穿過幾乎所有的防火牆,從而能跨越不同的平台交換信息.

SOAP伺服器只是用於監聽SOAP消息的特殊代碼,它可用作SOAP文檔的分配器和解釋器.外部Web服務可以與基於J2EE技術的應用程序伺服器交互,這種應用程序伺服器可以處理多種客戶端的SOAP請求.

SOAP定義了數據編碼規則,稱為基準編碼或「Section 5」編碼,它是出自SOAP規範中描述數據編碼規則的內容.SOAP編碼可以簡短地描述成簡單值或複合值的集合.簡單值可以是簡單類型,如整型、浮點型和字元型,或者是XML架構規範第2部中定義的內置類型,包括各種數據類型,如位元組型數組和枚舉.複合值包括結構、數組和XML架構制定組定義的複雜類型.

SOAP在標準化消息格式環境中,可以做所有它能完成的工作.消息的主體部分是「text/xml」形式的MIME類型,並且包含一個SOAP封套.該封套是一個XML文檔.封套包含了報頭(可選的)和報文(必須有的).封套的報文部分總是用於最終接收的消息,而報頭項目可以確定執行中間處理的目標節點.附件、二進位數字及其他項目可以附加到報文上.

SOAP提供了一種讓客戶端指定哪個中間處理節點必須處理報頭項目的方法.由於報頭與SOAP消息的主體內容是互不相關的,可用它們給消息添加信息,而不會影響對消息報文的處理.

三、SOAP協議在J2ME平台中的實現

如何真正地將移動設備融入到Web Services中去呢?這就需要是的PDA、手機等成為Web Services的客戶端,因此這些設備至少應該具有處理XML信息的能力.在J2ME平台中實現SOAP客戶端的功能,是的嵌入式設備能夠連接企業的WEB服務是企業應用中比較常見的需求.J2ME的基本類庫中沒有提供SOAP的支持,需要在J2ME平台中開發實現SOAP的處理功能.

實現SOAP協議客戶端的關鍵問題分為兩個方面:J2ME不同配置的數據類型不一樣,導致與SOAP協議封裝的數據類型不匹配;J2ME平台沒有提供對XML文件進行處理的功能.

針對第一個問題,需要注意只能使用基本類型,對不匹配的數據類型採用使用基本類型複合的方式進行處理.針對第二個問題需要在J2ME中擴展對XML文件處理的功能.目前有有兩種方法對XML文件進行解析.一種是採用DOM的方式,另外一種是採用SAX的方式.操作DOM是一個與XML相互作用的簡單方法,通常這個XML是一棵完整的XML樹,被解析成一個存放在存儲器中的節點結構,你可以遍歷這棵樹.它非常簡單易用,但是整棵樹存在於存儲器中造成存儲器的負擔,而對於嵌入式系統來說存儲器的資源是有限的,因此這種方法的使用具有一定局限性.第二種方法在捕捉語法分析事件中,每當語法分析程序遇到數據中的特定結構,它就會遍歷XML數據,然後把結果發回前面註冊的一個事件JianTingQi中.比如說,當語法分析程序遇到一個起始標記,如<html>,那麼事件JianTingQi將接收一個事件,通知它這個情況,並且向它傳遞任何所需的信息.相對DOM方式的處理,SAX方法對存儲器的要求比較低,但是效率要比DOM方式低.

Enhydra的KXML是一個只佔很小存儲空間的XML語法分析程序,對於J2ME應用程序非常適合.KXML支持DOM語法分析和操作,但是不支持SAX語法分析.取而代之,它使用一種稍微不同的稱為「Pull」的分析方法.

下面是KXML採用DOM的方式處理XML數據的例子:

1.Document doc = new Document();
2....
3.parser = new XmlParser(abc);
4.doc.parse( parser );

第一行創建了一個文檔對象,保存XML樹.第三行從一個名為abc的InputStreamReader中創建一個KXML語法分析程序.第四行傳送這個語法分析程序到文檔,然後讓文檔開始分析.XML被遞歸分析,直到到達文檔的結尾.當分析調用退出時,整個文檔被裝入內存,這時就可以對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. }

<abc>元素是根元素的直接子元素,可以遍歷根元素的子元素,尋找abc標記,如果子元素不是一個abc 標記,則返回.

1.int address_item_count = kid.getChildCount();
2.
3. for (int j = 0; j < abc_item_count ; j ) {
4....

如果找到了abc子元素,開始遍歷它的子元素,並把這些子元素的內容列印出來.

通過KXML對XML的處理,可以進一步實現對SOAP數據的處理,實現J2ME平台對SOAP協議的支持.

J2ME Web Services規範(JSR172)的制訂給J2ME平台增加兩大功能:一是使其能夠遠程訪問基於SOAP/XML的Web Services;二是使其具有解析XML數據的能力.目前JSR172的標準已經制定完成,為了實現這兩大功能,JSR172新定義了提供相應功能的兩個可選包.這兩個包佔用內存非常少,XML-RPC部分大概需要25-30KB的空間,而XML解析器則需要35KB左右.

規範只對JAX-RPC的模型提供支持,也就是說僅支持同步的訪問方式,使用J2ME客戶端可以向伺服器發送RPC請求和獲得RPC響應.在JSR 172中實現的是SAX模式的解析器.能夠解析XML之前需要創建SAXParser的實例,

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();

接下來要獲得XML文件的輸入流,並把它作為其中一個參數傳遞給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用來存儲我們已經解析出來的Phone對象,tagStack則用來存放我們解析到的元素名稱,比如sonyericsson,phone,name,colour等.在文檔解釋結束后,也就是在endDocument()方法內我們把解析的結果顯示在手機屏幕上,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();
}

結束語

通過擴充J2ME平台對XML數據的處理,完成了J2ME平台對SOAP協議的支持.通過SOAP協議能夠是的基於J2ME平台的嵌入式設備無縫的連接到企業現有的應用系統,解決了嵌入式設備數據來源不足的問題,擴展了嵌入式系統的應用範圍.本文從處理XML數據出發,深入探討了在J2ME平台中實現SOAP客戶端的各種技術,對於企業應用系統的集成具有一定的推廣價值.


[火星人 ] 詳解基於J2ME平台下SOAP協議的應用已經有777次圍觀

http://coctec.com/docs/java/show-post-61899.html