首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java SE 6 新特性:XML 處理框架 (JAXP/StAX/JAXB) 與 Web 服務 (JAX-WS) 全景解析

     編輯:Java 相關知識

從 XML 解析到 Web 服務標準化:Java SE 6 企業級 XML 技術棧深度剖析

Java SE 6 大幅增強 XML 處理能力:引入 StAX (Pull Parsing)、標準化 JAXB 2.0、重構 Web 服務為 JAX-WS 2.0 (JSR 224),並統一採用 Service Provider 機制 (SPI) 實現廠商中立。本文系統梳理 SAX/DOM/StAX/XSLT 四大解析模型、JAXB 物件綁定、JAX-WS 註解驅動開發全流程,附效能基準與代碼範例。

Service Provider 機制 (SPI):廠商中立的基石

三層架構:

  • Application API:開發者面向介面 (如 SAXParserFactory)
  • Service Provider Interface:廠商實作抽象類 (如 SAXParserFactoryImpl)
  • Provider 實作:具體產品 (如 Xerces、Crimson)

運作流程:SAXParserFactory.newInstance() → 讀取 jaxp.properties / META-INF/services/ → 載入廠商實作 → 回傳介面型別實例。
SPI 組件結構
XML 包 SPI 交互細節

優勢:零代碼切換 XML 處理器、編譯期面向介面、運行期動態綁定、效率與彈性平衡。

四大 XML 解析模型對比

模型API 套件核心特徵記憶體速度上下文感知適用場景
SAXjavax.xml.parsers事件推送極低最快無 (需自行維護)大檔、單向流式處理、記憶體受限
DOMjavax.xml.parsers樹狀物件模型高 (全載入)較慢完整需隨機存取、修改結構、混合內容文檔
StAXjavax.xml.stream拉取迭代器低中等有 (迭代器可前瞻)大檔且需上下文、雙向導航、效能敏感
XSLTjavax.xml.transform聲明式轉換視輸入而定視複雜度支援格式轉換 (XML↔HTML/文本)、報表生成

代碼範例:三種解析器解析同一 XML


// XML 內容
String xml = ""
  + "Shanghai200020"
  + "632622991581344454"
  + "Mr. Wang";

SAX (事件回調)


SAXParserFactory f = SAXParserFactory.newInstance();
SAXParser p = f.newSAXParser();
p.parse(new ByteArrayInputStream(xml.getBytes()), new DefaultHandler() {
    public void startElement(String uri, String local, String qName, Attributes attrs) {
        System.out.println("SAX Start: " + qName);
    }
    public void characters(char[] ch, int start, int len) {
        String text = new String(ch, start, len).trim();
        if (!text.isEmpty()) System.out.println("  Text: " + text);
    }
});

DOM (樹導航)


DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
DocumentBuilder b = f.newDocumentBuilder();
Document doc = b.parse(new ByteArrayInputStream(xml.getBytes()));
// 隨機存取: doc.getElementsByTagName("Location").item(0).getTextContent()

StAX (拉取迭代)


XMLInputFactory f = XMLInputFactory.newInstance();
XMLEventReader r = f.createXMLEventReader(new ByteArrayInputStream(xml.getBytes()));
while (r.hasNext()) {
    XMLEvent e = r.nextEvent();
    if (e.isStartElement()) System.out.println("StAX Element: " + e.asStartElement().getName());
    if (e.isCharacters() && !e.asCharacters().isWhiteSpace())
        System.out.println("  Text: " + e.asCharacters().getData());
}

SAX 流程圖
DOM 物件模型
XSLT 依賴關係

效能基準測試 (10,000 次解析同一小型 XML)


// 測試代碼見原文清單 8
// 結果 (毫秒):
2734  // StAX
4953  // SAX
6516  // DOM

結論:小檔案 SAX 最快,StAX 次之且具上下文優勢,DOM 適合結構操作而非純解析。

JAXB 2.0:XML ↔ Java 物件雙向綁定

Schema → Java (xjc)


xjc workcontactinfo.xsd  // 生成 Java 類至 generated/ 目錄
javac generated/*.java

Java → XML (Marshalling)


JAXBContext ctx = JAXBContext.newInstance("generated");
ObjectFactory of = new ObjectFactory();
Workcontactinfo info = of.createWorkcontactinfo();
info.setLocation("Shanghai");
info.setPostal("200020");
Tel tel = of.createTel(); tel.setFix("123456"); tel.setMobile("1376666666");
info.setTel(tel); info.setAppellation("Mr. Wang");

Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(info, new FileOutputStream("output.xml"));

輸出標準 XML (見原文清單 13)。

JAX-WS 2.0:註解驅動 Web 服務開發

核心 JSR:JSR 224 (JAX-WS)、JSR 222 (JAXB)、JSR 181 (Web Service Metadata)

服務端:Endpoint 發布


@WebService
public class Hello {
    @WebMethod
    public String hello(String name) { return "Hello, " + name + "\n"; }

    public static void main(String[] args) {
        Endpoint.publish("https://localhost:8080/hello", new Hello());
    }
}
  1. apt -d sample Hello.java → 生成輔助類 (jaxws/ 目錄)
    apt 生成輔助類
  2. java -cp sample hello.Hello → 內建 HTTP Server 發布
  3. 驗證 WSDL:https://localhost:8080/hello?wsdl
    發布的 WSDL

客戶端:wsimport 生成存根


wsimport -p sample -keep https://localhost:8080/hello?wsdl
// 生成樣本目錄結構

wsimport 生成文件

客戶端調用


HelloService service = new HelloService();
Hello proxy = service.getHelloPort();
System.out.println(proxy.hello("developer works"));  // 輸出: Hello, developer works

客戶端調用結果

完整開發流程與套件對照

Web 服務開發流程中 XML 技術應用

階段工具/API關鍵套件產出
服務開發@WebService/@WebMethod + aptjavax.jws, javax.xml.wsEndpoint 類 + 輔助類
發布Endpoint.publish()javax.xml.ws.EndpointHTTP 端點 + WSDL
客戶端生成wsimportjavax.xml.bind (JAXB)Service/Proxy/DTO 類
調用Proxy 呼叫javax.xml.ws, javax.xml.bindSOAP 訊息交換

關鍵套件總表 (JDK 6 內建)

功能域JSR核心套件
XML 解析 (SAX/DOM)-javax.xml.parsers, org.w3c.dom, org.xml.sax
StAX-javax.xml.stream, javax.xml.stream.events, javax.xml.stream.util
XSLT-javax.xml.transform, .dom, .sax, .stax, .stream
JAXB 2.0222javax.xml.bind, .annotation, .annotation.adapters, .attachment, .helpers, .util
JAX-WS 2.0224javax.xml.ws, .handler, .handler.soap, .http, .soap, .spi
Web Service Metadata181javax.jws, javax.jws.soap

工具鏈

  • apt:註解處理 → 生成 JAX-WS 輔助類
  • wsgen:從服務端生成 WSDL/輔助類 (替代 apt)
  • wsimport:從 WSDL 生成客戶端存根
  • schemagen:從 Java 類生成 XML Schema
  • xjc:從 Schema 生成 Java 類 (JAXB)
  • 內建輕量 HTTP Server:開發測試用 (生產環境請部署至 Servlet 容器)

總結:Java SE 6 XML 技術棧的戰略價值

  1. 統一抽象層:SPI 讓應用解耦具體 XML 處理器
  2. 解析模型完備:SAX/DOM/StAX 覆蓋所有處理模式,StAX 彌補 SAX 無上下文與 DOM 記憶體高的缺口
  3. 綁定標準化:JAXB 2.0 成為 XML↔Java 事實標準,支援註解配置、泛型、週期引用
  4. Web 服務現代化:JAX-WS 2.0 + JAXB 2.0 + 註解驅動,消除手工 WSDL/存根維護,開發效率質變
  5. 工具鏈自動化:apt/wsgen/wsimport/xjc/schemagen 覆蓋全生命週期

對 XML 應用開發者:擁有更豐富、高效的工具箱。
對 Web 服務提供者:底層細節被屏蔽,專注業務邏輯。
對企業架構師:標準化技術棧降低廠商鎖定風險,支援異構互操作。


本文基於 Java SE 6 SDK 環境驗證。完整代碼範例可從文末下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved