国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

解析用于J2ME 開發平臺的 Web 服務 API

2019-11-17 06:24:05
字體:
來源:轉載
供稿:網友

  用于 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 服務的標準體系結構/組織一致,如下圖所示:
  
 解析用于J2ME 開發平臺的 Web 服務 API(圖一)

  
圖 1 - WSA 高級體系結構

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

  
圖 2 - JSR 172 調用模型

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

  
圖 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 油尖旺区| 忻城县| 濮阳县| 广南县| 色达县| 岗巴县| 治县。| 龙泉市| 合川市| 潍坊市| 沙坪坝区| 聂荣县| 巴彦县| 福安市| 化州市| 通许县| 兴文县| 九龙坡区| 九龙坡区| 晋中市| 保山市| 上蔡县| 淳安县| 堆龙德庆县| 叶城县| 桂东县| 台中市| 涟水县| 肃宁县| 仙居县| 柘荣县| 陆丰市| 夹江县| 定结县| 盐源县| 讷河市| 察哈| 夏河县| 浮山县| 峨眉山市| 玉龙|