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數據,然後把結果發回前面注冊的一個事件監聽器中。比 如說,當語法分析程序遇到一個起始標記,如<Html>,那麼事件監聽器將接收 一個事件,通知它這個情況,並且向它傳遞任何所需的信息。相對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客戶端的各種技術, 對於企業應用系統的集成具有一定的推廣價值。