J2EE 提供分層架構(Web、EJB、EIS),XML 提供跨層、跨系統的自描述數據格式。兩者結合形成「強大平台 + 靈活數據」的黃金組合。本文系統梳理 XML 在 J2EE 三大層面的應用模式及演進路線。
媒體資產元數據(圖片、視頻、文檔)以 XML 存儲/傳輸,需映射為 Java 領域對象 (MediaAsset)。
MediaParser)public class MediaParser implements ErrorHandler {
private final DOMParser parser = new org.apache.xerces.parsers.DOMParser();
public MediaParser() {
parser.setFeature("https://xml.org/sax/features/validation", true);
parser.setErrorHandler(this);
}
public Document parse(String url) throws SAXException, IOException {
parser.parse(url);
return parser.getDocument();
}
public Collection loadAssets(String url) throws SAXException, IOException {
Document doc = parse(url);
List list = new LinkedList<>();
NodeList nodes = doc.getElementsByTagName("media-asset");
for (int i = 0; i < nodes.getLength(); i++) {
list.add(new MediaAsset(nodes.item(i)));
}
return list;
}
// ErrorHandler 方法省略...
}
MediaAsset)構造函數接收 org.w3c.dom.Node,遍歷子節點填充字段,遇到嵌套 media-asset 遞歸構建子對象。
JMS TextMessage 對 XML 內容不透明,無法基於內容路由(如:僅推送視頻流給支援客戶端)。
TextMessage msg = session.createTextMessage();
msg.setText(xmlDocumentAsString); // 或用 DOM 輸出
msg.setStringProperty("mediaType", "video"); // 輔助路由
producer.send(msg);
<% MediaParser parser = new MediaParser();
Collection assets = parser.loadAssets("https://.../lecture14-assets.xml");
Iterator it = assets.iterator(); %>
<table><tr><th>Name</th><th>Type</th><th>URN</th></tr>
<% while (it.hasNext()) {
MediaAsset a = (MediaAsset) it.next(); %>
<tr><td><%= a.getName() %></td>
<td><%= a.getType() %></td>
<td><%= a.getUrn() %></td></tr>
<% } %>
</table>
<%@ taglib uri="https://javaschool.org/taglib" prefix="media" %>
<media:load url="https://.../lecture14-assets.xml" collectionName="assets" cursorName="asset"/>
<table>
<tr><th>Name</th><th>Type</th><th>URN</th></tr>
<c:forEach items="${assets}" var="asset">
<tr><td><%= asset.getName() %></td>...</tr>
</c:forEach>
</table>
優勢:邏輯封裝在 Tag Handler 類中,頁面乾淨,職責分離清晰。
Transformer。J2EE 1.3 引入 Filter,可攔截回應,根據 User-Agent 以 XSLT 將同一 XML 輸出為 HTML / WML / cHTML,實現「一份數據、多端呈現」。
| J2EE 版本 | XML 相關規範 |
|---|---|
| 1.2.1 | 僅 XML 部署描述符 |
| 1.3 | 強制內建 SAX2、DOM2、XSLT 處理器 |
| 1.4 / Java EE 5+ | JAXM (JSR 67)、JAX-RPC (JSR 101)、JAXB (JSR 31)、JAXR (JSR 93) 陸續納入 |
| Java EE 6/7/8 | JAX-WS、JAX-RS、JSON-P/B、WebSocket 等現代 API 取代早期 XML 中心棧 |
XML 在 J2EE 歷程中扮演了「數據通用語言」角色,推動了 EAI、Web Services、SOA 的興起。雖然微服務時代 JSON/Protobuf 逐漸取代 XML,但 XML 在文檔型數據、標準化交換 (ebXML、HL7、FpML)、工具鏈成熟度上仍具不可替代優勢。理解 XML 與 J2EE 各層的結合模式,有助於維護遺產系統、設計跨語言集成方案、並在適當場景選擇 XML 而非盲目跟風 JSON。