程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 解析用於J2ME 開發平台的 Web 服務 API

解析用於J2ME 開發平台的 Web 服務 API

編輯:JAVA編程入門知識
  用於 Java 2 平台袖珍版 (Java 2 Platform, Micro Edition,J2ME) 的 Web 服務 API (WSA) 是由 Java Community Process 為 Java 規范請求 172 (JSR 172) 而定義的,這些 API 是兩個相互獨立的可選包,用於遠程服務調用和 XML 解析。
  
  他們是針對基於連接設備配置 (Connected Device Configuration,CDC) 和有限連接設備配置 (Connected Limited Device Configuration,CLDC 1.0 和 CLDC 1.1) 的框架的。為什麼用戶應該關注這些呢?因為 JSR 172 在設備層為遠程服務調用和 XML 解析提供了支持,也就意味著開發人員不用將這項功能嵌入到每一個應用程序中。本文介紹了遠程服務調用可選包 API。
  
  J2ME 中的 Web 服務
  
  Java 2 平台袖珍版 (J2ME) 平台中的 Web 服務是由 Java 規范請求 172 (JSR 172) 定義的,它與標准 Web 服務遵循同樣的規范、結構以及調用模型。我們往返顧一下清單。
  
  與標准 Web 服務的比較 JSR 172 Web 服務 API (WSA) 遵循下面這些核心 Web 服務規范:
  
  簡單對象訪問協議 (SOAP) 1.1,定義傳輸和數據編碼。
  Web 服務定義語言 (WSDL) 1.1,定義如何描述遠程服務。
  XML 1.0,定義 XML 標記語言。
  XML Schema,毫無疑問,定義 XML 模式。
  注重 JSR 172 不支持統一描述、發現和集成 (UDDI) 2.0 規范,該規范定義了如何發現遠程服務。
  
  由於有相當多的與 Web 服務相關並且涵蓋了不同技術的規范出台,而且越來越多,Web 服務互操作組織 (WS-I) 定義了 WS-I 基本概要 1.0 (WS-I Basic Profile,Version 1.0) 來定義 Web 服務規范的最小集,和一致性規則一樣,所有的基礎 Web 服務提供者和消費者都必須遵守該概要。JSR 172 規范也遵守 WS-I 基本概要。
  
  與標准 Web 服務具有相同的體系結構:
  
  JSR 172 WSA 從客戶端訪問 Web 服務,從服務-消費者的角度來看,WSA 提供遠程服務調用 API (JAX-RPC) 以及運行時環境,從而答應 J2ME 應用程序在 Web 上消費服務,而不是作為服務生產者(端點)來運行。除了這一點差別之外,JSR 172 WSA 體系結構的其它部分與 Web 服務的標准體系結構/組織一致,如下圖所示:
  
 

  
圖 1 - WSA 高級體系結構

  
  該高級體系結構組織如下:
  
  客戶端,Web 服務消費者:它是 J2ME 應用程序,例如 MIDP 或個人版基於框架的應用程序,JSR 172 存根和支持類,以及 JSR 172 運行時。
  
  網絡:指的是無線和有線網絡以及通信協議,無線和有線網絡是 Internet 的一部分。注重 JSR 172 本身沒有規定在設備上使用 XML 編碼方法,而答應執行程序(只要它們對消費者和生產者是透明的)使用更有效的編碼方法,例如在設備和無線網關之間使用二進制協議。
  
  服務器,Web 服務生產者:它是一個 Web 服務器,通常位於防火牆和/或代理網關的後面。該服務器可以訪問後台資源。
  
  調用模型和數據流與標准 Web 服務相同: J2ME 應用程序通過 JSR 172 存根和運行時調用遠程服務,通常要通過 HTTP 和 SOAP 來進行傳輸。存根和運行時將與遠程服務調用相關的復雜部分都隱藏起來了,包括輸入值和返回值如何編碼並解碼,以及與服務器進行網絡通信的治理。方法調用遵循同步請求-應答模型,如下圖所示:
  
 

  
圖 2 - JSR 172 調用模型

  
  由於調用是按模塊進行的,所以您應該把這些調用分派到不同的執行線程中。
  
  消費 Web 服務
  
  要消費 Web 服務,您必須首先創建服務調用存根。讓這些存根來執行任務,例如對輸入值和返回值進行編碼和解碼、與 JSR 172 運行時交互來調用遠程服務端點。存根通過運行時的服務提供者接口 (SPI) 與運行時進行交互,這樣通過概述運行時執行的具體情況,使存根在不同廠商之間的執行更便捷。
  
  存根通常是用工具生成的,該工具讀取一個 WSDL XML 文檔,文檔描述了將要使用到的 Web 服務。同樣的,WSDL 文檔通常也是通過工具生成的,該工具讀取接口定義,例如 Java 接口產生了 WSDL 文檔。
  
  從我們移動開發的角度來看,需要消費的 WSDL 文檔通常已經存在,您需要做的僅僅是生成 JSR 172 WSA 存根。要生成這些存根,您應該使用例如 J2ME Wireless Toolkit 2.1 存根生成器這樣的工具,如下圖所示:
  

  
圖 3 - 生成 JSR 172 WSA 存根

  
  該生成器生成存根 Java 文件,以及相關的支持類。如下一部分所描述的,它還考慮到了 WSDL 到 Java 的數據類型映射。
  
  一旦生成了 JSR 172 JAX-RPC 存根和支持文件,您的應用程序就已經被編譯並部署到啟用了 JSR 172 的設備上了,消費 Web 服務是很簡單的而且幾乎是透明的。您很快就會看到,調用遠程方法幾乎和調用本地方法一樣簡單。
  
  JSR 172 JAX-RPC 子集 API JSR 172 遠程方法調用 API 是以基於 XML 的 RPC 的 J2SE Java API (JAX-RPC 1.1) 的子集為基礎的。它同樣遵守 WS-I 基本概要。下面來具體研究一下 JSR 172 JAX-RPC 子集 API:
  
  它支持:
  
  SOAP 1.1。 任何可以傳送 SOAP 消息的傳輸,例如 HTTP 1.1,都有一個定義好的用於 SOAP 1.1 的協議綁定。 SOAP 消息的文字表示代表一個 RPC 調用或應答。下面(是)數據類型和相應的 Java 映射:
  
  xsd:boolean 到 boolean 或 Boolean。
  xsd:byte 到 byte 或 Byte。
  xsd:short 到 short 或 Short。
  xsd:int 到 int 或 Integer。
  xsd:long 到 long 或 Long。
  xsd:float 到 float,或 Float。對基於 CLDC 1.0 的平台,該數據類型映射到 String。
  xsd:double 到 double,或 Double。對基於 CLDC 1.0 的平台,該數據類型映射到 String。
  xsd:string 到 String。
  xsd:base64Binary 到 byte[]。
  xsd:hexBinary 到 byte[]。
  xsd:complexType 到基本類型和類類型序列。
  xsd:QName 到 javax.xml.namespace.QName。
  以 XML 數組模式為基礎的基本類型和復雜類型(結構中包含基本類型或復雜類型)數組。
  
  它不支持:
  
  帶附件的 SOAP 消息。
  SOAP 消息處理器。
  SOAP 消息的編碼表示。
  服務端點(不是 Web 服務生產者)。
  服務發現支持 (UDDI)。
  設備端沒有規定 XML 編碼方法。這樣做是通過答應執行程序使用更有效的數據編碼方法來幫助減少網絡傳輸,例如在設備和無線網關間使用二進制協議(只要這樣編碼對消費者和生產者是透明的)。
  
  JSR 172 遠程調用 API 包括下面這些包:
  
  javax.microedition.xml.rpc
  javax.xml.namespace
  javax.xml.rpc
  java.rmi (包括確保 JAX-RPC 相關型)
  注重這些 API(有一些異常 API,例如 RemoteException)不是直接由應用程序調用,相反,應用程序調用生成的存根。上面的 API 主要是供存根使用的。
  
  使用 JSR 172 JAX-RPC 調用遠程服務一旦生成、編譯並部署了 JSR 172 JAX-RPC 存根和支持文件,消費遠程服務就很輕易了。事實上,除了導入 RemoteException,完成最少量的 JAX-RPC 細節初始化工作,您的應用程序不光是看上去,而且運行起來也和非 Web 服務消費者應用程序一樣。由於有 JSR 172 存根和運行時,實現這種簡單的應用程序是可能的,正如前面提到的,JSR 172 存根和運行時把與遠程調用相關的大部分細節都隱藏了。
  
  要調用遠程服務,您首先需要實例化存根,完成最少的存根初始化工作,然後就是如何編寫調用存根方法。下面的代碼片斷顯示了如何使用 JSR 172 JAX-RPC 調用遠程服務。
  
  清單 1:調用遠程服務
  
  package j2medeveloper.wsasample
  
  // MIDP
  import javax.microedition.midlet.MIDlet;
  import javax.microedition.lcdui.Display;
  import javax.microedition.lcdui.Form;
  
  ...
  
  Form form = new Form("Employee Info");
  
  ...
  
  // JAX-RPC
  import java.rmi.RemoteException;
  String serviceURL = "www.j2medeveloper.com/webservicesample";
  
  ...
  
  /**
   * Entry point to MIDlet, from start or restart states.
   * @throws javax.microedition.midlet.MIDletStateChangeException
   */
  public void startApp() throws MIDletStateChangeException {
  // Instantiate the service stub.
  EmployeeService_Stub service = new EmployeeService_Stub();
  // Initialize the stub/service.
  service._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
  serviceURL);
  service._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new
  Boolean(true));
  ...
  display.setCurrent(mainScreen);
  }
  
  /**
   * Paused state. Release resources (connection, threads, etc).
   */
  public void pauseApp() {
  ...
  }
  
  /**
   * Destroy state. Release resources (connection, threads, etc).
   * @param UC If true when t
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved