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

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

XML和J2EE的完美結合

2019-11-18 12:49:01
字體:
來源:轉載
供稿:網友

  當前,java 2平臺企業版(J2EE)架構在廠商市場和開發者社區中倍受推崇。作為一種工具,可擴展標記語言(xml)簡化了數據交換、進程間消息交換這一類的事情,因而對開發者逐漸變得有吸引力,并開始流行起來。自然,在J2EE架構中訪問或集成XML解決方案的想法也很誘人。因為這將是強大系統架構同高度靈活的數據治理方案的結合。
  XML的應用似乎是無窮無盡的,但它們大致上可以分為三大類:
  ●簡單數據的表示和交換(針對XML的簡單API(SAX)和文檔對象模型(DOM)語法解析,不同的文檔類型定義(DTDs)和概要(schemas))
  ●面向消息的計算(XML-RPC(遠程過程調用),SOAP協議,電子化業務XML(ebXML))
  ●用戶界面相關、表示相關的上下文(可擴展樣式表語言(XSL),可擴展樣式表語言轉換(XSLT))
  這幾類應用在J2EE架構中恰好有天然的對應:數據表示和交換功能是EJB組件模型中持久化服務(persistence services)的一部分,基于消息的通訊由Java消息服務(JMS)API來處理,而界面表示正是Java服務器頁面(jsp)和Java Servlets的拿手好戲。
  在本文中,我們將看到當今基于J2EE的應用里,XML是如何在上述幾個方面進行應用的,以及在相關標準的未來版本中這些應用將會如何發展。
  基礎:數據的表示和交換
  原型化的XML應用(假設有的話)的內容通常是:數據以XML格式存放,為了進行顯示、修改甚至寫入某個XML文檔而經常被讀入到某個對象模型中。作為例子,假定我們正處理多種類型的媒體(圖品、視頻、文本文檔等等),并且用下面這個簡單的XML DTD來描述這些媒體的元數據:
  <!-- DTD for a hypothetical media management system -->
 ?。?-- Media assets are the root of the object hierarchy. Assets are also
  hierarchical - they can contain other assets. -->
 ?。?ELEMENT media-asset (name, desc?, type*, media-asset*, urn)>
  <!-- Metadata about the asset -->
 ?。?ELEMENT name (#PCDATA)>
  <!ELEMENT desc (#PCDATA)>
 ?。?ELEMENT type (desc, mime-type?)>
 ?。?ELEMENT mime-type (#PCDATA)>
 ?。?ELEMENT urn (#PCDATA)> 
   以下是一個基于上述媒體DTD的XML文檔,描述了與某個課程講座相關的內容:
 ?。?xml version="1.0" ?><!DOCTYPE media-asset PUBLIC "-//Jim Farley//DTD
  Media Assets//EN" "http://localhost/Articles/Sun/dtds/media.dtd">
  <media-asset>
 ?。糿ame>第14講</name>
 ?。糳esc>與第14講相關的所有內容</desc>
 ?。?-- 內容對象"lecture 14"的一套子組件 -->
 ?。糾edia-asset>
 ?。糿ame>講座的幻燈片</name>
 ?。紅ype>
 ?。糳esc>MS Powerpoint</desc>
 ?。糾ime-type>application/vnd.ms-powerpoint</mime-type>
  </type>
 ?。紆rn>http://javatraining.org/jaf/E123/lecture-
  14/slides.PPT</urn>
  </media-asset>
 ?。糾edia-asset>
  <name>講座的視頻片斷</name>
 ?。紅ype>
 ?。糳esc>RealPlayer streaming video</desc>
 ?。糾ime-type>video/vnd.rn-realvideo</mime-type>
 ?。?type>
  <urn>http://javatraining.org/jaf/E123/lecture-
  14/lecture.rv</urn>
 ?。?media-asset>
 ?。?-- 講座開始 -->
  <urn>http://javatraining.org/jaf/E123/lecture-14/index.jsp</urn>
 ?。?media-asset> 
  從Web或者企業級應用的角度看,能以這種方式訪問數據真是一種福音,因為它體現了高度的可移動性,使我們與元數據的實際資源本身隔離。這些資源可能來自一個關系數據庫系統、某種活動媒體服務器或者Web服務器上的一個靜態XML文檔,等等。假如想把這些數據加載到Java應用中,我們可以從當前眾多的Java語言XML解析器中選用一個,通過它將XML數據裝入一個DOM文檔,最后遍歷文檔,將所有這些數據轉換到我們應用系統的對象模型中。
  下面是個簡單的基于DOM的解析程序,可對上述的媒體DTD進行解析。解析器用的是Apache Xerces:  
  package jaf.xml;
  import java.util.*;
  import java.io.IOException;
  import org.w3c.dom.*;
  import org.xml.sax.*;
  // XML文檔解析程序,使用上述媒體DTD.
  public class MediaParser implements ErrorHandler {
  /** 使用Apache Xerces解析器 */
  org.apache.xerces.parsers.DOMParser mParser =
  new org.apache.xerces.parsers.DOMParser();
  /** 構造函數 */
  public MediaParser() {
  // 告訴解析器驗證并解析文檔
  try {
  mParser.setFeature( "http://xml.org/sax/features/validation",
  true);
  }
  catch (SAXException e) {
  System.out.  e.printStackTrace();
  }
  // 設置解析器的錯誤處理句柄
  mParser.setErrorHandler(this);
  }
  /** 解析指定的URL,返回找到的XML文檔
  */
  public Document parse(String url) throws SAXException, IOException {
  mParser.parse(url);
  Document mediaDoc = mParser.getDocument();
  return mediaDoc;
  }
  /** 解析指定URL的XML文檔,將內容轉換成 MediaAsset 對象
  */
  public Collection loadAssets(String url) throws SAXException,
  IOException {
  Document doc = parse(url);
  Collection assets = new LinkedList();
  NodeList assetNodes = doc.getElementsByTagName("media-asset");
  for (int i = 0; i < assetNodes.getLength(); i++) {
  Node assetNode = assetNodes.item(i);
  MediaAsset asset = new MediaAsset(assetNode);
  assets.add(asset);
  }
  return assets;
  }
  /**
  * 錯誤處理代碼(為簡潔起見省略了)
  */
  } 
  
  MediaParser類的構造函數初始化了一個Xerces DOM解析器。parse()方法告訴解析器到哪個URL去找XML源,然后得到結果文檔并返回。loadAssets()方法調用parse()方法從某個XML源加載文檔,然后為文檔中找到的每個“media-asset”節點創建一個MediaAsset對象。
  
  以下是一個使用MediaAsset類的例子:
  
  package jaf.xml;
  import java.util.*;
  public class MediaAsset {
  // 資源元數據
  private String mName = "";
  private String mDesc = "";
  private Collection mChildren = new LinkedList();
  private Vector mTypes = new Vector();
  private String mUrn = "";
  protected MediaAsset(org.w3c.dom.Node assetNode) {
  // 為簡潔起見省略后面代碼
  .
  .
  .
  }
  } 
  因為篇幅的關系省略了MediaAsset類的具體代碼,但應用模式依然是清楚的。MediaAsset類遍歷文檔的節點,當它碰到不同的子節點時,它用子節點的內容填充自己的成員數據。假如它發現了一個嵌套的子資源節點,它只需要創建一個新的MediaAsset對象,然后將子資源節點的數據填充到新對象的成員數據中。
  實現上述處理的方法數不勝數。我們還可以使用其他的解析器或解析器架構,如Java API for XML Parsing (JAXP)。除了使用DOM模型外,事件驅動的SAX模型也可用于解析XML。類似的程序也可用來產生XML數據——前提是答應產生新的數據對象(在本例中是MediaAsset),它可將其相應的XML實體插入到DOM中,然后將DOM輸出到一個流中(諸如一個文件,一個Socket,或者一個HTTP連接...)。還有其他更高層次的標準,可將XML映射到Java對象的過程進一步自動化(或簡化)。例如,使用XML概要(Schema)和XML綁定處理引擎,您可以半自動地將滿足某個XML 概要的XML數據轉變成Java數據對象。代表性的引擎是Castor,是由ExoLab小組治理的一個開放源代碼項目的產物。上述使用Xerces DOM的簡單例子僅僅是演示了這一處理過程的底層模型。
  上述示例表明,在Java環境中解析或產生XML是非常方便的,這與J2EE沒有必然關聯。格式化為XML的數據可以從應用程序的任何層次流入或輸出,這使得與外部系統的集成性無可限量。但我們能否以一種更為直接的方式將XML數據源集成到J2EE架構中去呢?
  駕馭消息
  J2EE架構包含了對JMS(Java消息服務)API的訪問,以實現面向消息的通信(J2EE 1.2.1版只需JMS API即可,在J2EE 1.3版中JMS基本定型,此時必須由某個兼容J2EE平臺的服務器提供一個JMS API Provider)。這一類的異步交互(與之相對的是:本地或遠程方法調用所代表的同步交互)被證實在某些應用環境中是非常有用的。某些時候,交互只需要通過間接的請求或回答來實現,即:在某些情況下,發出消息后不可能立即收到答復,但我們仍希望當消息發出者重新在線時,確保他能收到答復信息。
  面向消息系統的實際應用之一就是企業之間的松散集成。類似于EDI(電子文檔交換)時代的文檔交換,兩個企業由于業務的需要而交換消息,此時通常不能為了使用RPC或者RMI、CORBA、DCOM之類的遠程方法交互而在兩者之間進行緊密集成。象JMS API這樣的消息系統答應雙方交換基于JMS API的消息載荷,前提是雙方在會話的時候均能提供兼容的JMS API服務。當前仍然存在的困難是

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 腾冲县| 霞浦县| 芜湖市| 宜兰市| 桂平市| 大城县| 福州市| 大渡口区| 多伦县| 吉首市| 铁岭市| 荣成市| 舞阳县| 莱阳市| 雅安市| 革吉县| 定结县| 巴中市| 育儿| 西乌珠穆沁旗| 井研县| 彭水| 庆阳市| 美姑县| 繁峙县| 保康县| 开阳县| 洪雅县| 琼海市| 宜宾市| 宜城市| 台前县| 郧西县| 余干县| 勐海县| 安西县| 云阳县| 南和县| 漠河县| 北碚区| 龙川县|