国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看
打開APP
未登錄
開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服
開通VIP
首頁
好書
留言交流
下載APP
聯(lián)系客服
XML和J2EE的完美結(jié)合
白帆
>《JAVA技術(shù)》
2005.09.25
關(guān)注
當(dāng)前,Java 2平臺企業(yè)版(J2EE)架構(gòu)在廠商市場和開發(fā)者社區(qū)中倍受推崇。作為一種工具,可擴(kuò)展標(biāo)記語言(XML)簡化了數(shù)據(jù)交換、進(jìn)程間消息交換這一類的事情,因而對開發(fā)者逐漸變得有吸引力,并開始流行起來。自然,在J2EE架構(gòu)中訪問或集成XML解決方案的想法也很誘人。因?yàn)檫@將是強(qiáng)大系統(tǒng)架構(gòu)同高度靈活的數(shù)據(jù)管理方案的結(jié)合。
XML的應(yīng)用似乎是無窮無盡的,但它們大致上可以分為三大類:
●簡單數(shù)據(jù)的表示和交換(針對XML的簡單API(SAX)和文檔對象模型(DOM)語法解析,不同的文檔類型定義(DTDs)和概要(schemas))
●面向消息的計(jì)算(XML-RPC(遠(yuǎn)程過程調(diào)用),SOAP協(xié)議,電子化業(yè)務(wù)XML(ebXML))
●用戶界面相關(guān)、表示相關(guān)的上下文(可擴(kuò)展樣式表語言(XSL),可擴(kuò)展樣式表語言轉(zhuǎn)換(XSLT))
這幾類應(yīng)用在J2EE架構(gòu)中恰好有天然的對應(yīng):數(shù)據(jù)表示和交換功能是EJB組件模型中持久化服務(wù)(persistence services)的一部分,基于消息的通訊由Java消息服務(wù)(JMS)API來處理,而界面表示正是Java服務(wù)器頁面(JSP)和Java Servlets的拿手好戲。
在本文中,我們將看到當(dāng)今基于J2EE的應(yīng)用里,XML是如何在上述幾個(gè)方面進(jìn)行應(yīng)用的,以及在相關(guān)標(biāo)準(zhǔn)的未來版本中這些應(yīng)用將會如何發(fā)展。
基礎(chǔ):數(shù)據(jù)的表示和交換
原型化的XML應(yīng)用(假設(shè)有的話)的內(nèi)容通常是:數(shù)據(jù)以XML格式存放,為了進(jìn)行顯示、修改甚至寫入某個(gè)XML文檔而經(jīng)常被讀入到某個(gè)對象模型中。作為例子,假定我們正處理多種類型的媒體(圖品、視頻、文本文檔等等),并且用下面這個(gè)簡單的XML DTD來描述這些媒體的元數(shù)據(jù):
<!ELEMENT media-asset (name, desc?, type*, media-asset*, urn)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT desc (#PCDATA)>
<!ELEMENT type (desc, mime-type?)>
<!ELEMENT mime-type (#PCDATA)>
<!ELEMENT urn (#PCDATA)>
以下是一個(gè)基于上述媒體DTD的XML文檔,描述了與某個(gè)課程講座相關(guān)的內(nèi)容:
<?xml version="1.0" ?><!DOCTYPE media-asset PUBLIC "-//Jim Farley//DTD
Media Assets//EN" "http://localhost/Articles/Sun/dtds/media.dtd">
<media-asset>
<name>第14講</name>
<desc>與第14講相關(guān)的所有內(nèi)容</desc>
<media-asset>
<name>講座的幻燈片</name>
<type>
<desc>MS PowerPoint</desc>
<mime-type>application/vnd.ms-powerpoint</mime-type>
</type>
<urn>http://javatraining.org/jaf/E123/lecture-
14/slides.ppt</urn>
</media-asset>
<media-asset>
<name>講座的視頻片斷</name>
<type>
<desc>RealPlayer streaming video</desc>
<mime-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或者企業(yè)級應(yīng)用的角度看,能以這種方式訪問數(shù)據(jù)真是一種福音,因?yàn)樗w現(xiàn)了高度的可移動(dòng)性,使我們與元數(shù)據(jù)的實(shí)際資源本身隔離。這些資源可能來自一個(gè)關(guān)系數(shù)據(jù)庫系統(tǒng)、某種活動(dòng)媒體服務(wù)器或者Web服務(wù)器上的一個(gè)靜態(tài)XML文檔,等等。如果想把這些數(shù)據(jù)加載到Java應(yīng)用中,我們可以從當(dāng)前眾多的Java語言XML解析器中選用一個(gè),通過它將XML數(shù)據(jù)裝入一個(gè)DOM文檔,最后遍歷文檔,將所有這些數(shù)據(jù)轉(zhuǎn)換到我們應(yīng)用系統(tǒng)的對象模型中。
下面是個(gè)簡單的基于DOM的解析程序,可對上述的媒體DTD進(jìn)行解析。解析器用的是
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();
/** 構(gòu)造函數(shù) */
public MediaParser() {
// 告訴解析器驗(yàn)證并解析文檔
try {
mParser.setFeature( "http://xml.org/sax/features/validation",
true);
}
catch (SAXException e) {
System.out.println("Error setting validation on parser:");
e.printStackTrace();
}
// 設(shè)置解析器的錯(cuò)誤處理句柄
mParser.setErrorHandler(this);
}
/** 解析指定的URL,返回找到的XML文檔
*/
public Document parse(String url) throws SAXException, IOException {
mParser.parse(url);
Document mediaDoc = mParser.getDocument();
return mediaDoc;
}
/** 解析指定URL的XML文檔,將內(nèi)容轉(zhuǎn)換成 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;
}
/**
* 錯(cuò)誤處理代碼(為簡潔起見省略了)
*/
}
MediaParser類的構(gòu)造函數(shù)初始化了一個(gè)Xerces DOM解析器。parse()方法告訴解析器到哪個(gè)URL去找XML源,然后得到結(jié)果文檔并返回。loadAssets()方法調(diào)用parse()方法從某個(gè)XML源加載文檔,然后為文檔中找到的每個(gè)“media-asset”節(jié)點(diǎn)創(chuàng)建一個(gè)MediaAsset對象。
以下是一個(gè)使用MediaAsset類的例子:
package jaf.xml;
import java.util.*;
public class MediaAsset {
// 資源元數(shù)據(jù)
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) {
// 為簡潔起見省略后面代碼
.
.
.
}
}
因?yàn)槠年P(guān)系省略了MediaAsset類的詳細(xì)代碼,但應(yīng)用模式依然是清晰的。MediaAsset類遍歷文檔的節(jié)點(diǎn),當(dāng)它碰到不同的子節(jié)點(diǎn)時(shí),它用子節(jié)點(diǎn)的內(nèi)容填充自己的成員數(shù)據(jù)。如果它發(fā)現(xiàn)了一個(gè)嵌套的子資源節(jié)點(diǎn),它只需要?jiǎng)?chuàng)建一個(gè)新的MediaAsset對象,然后將子資源節(jié)點(diǎn)的數(shù)據(jù)填充到新對象的成員數(shù)據(jù)中。
實(shí)現(xiàn)上述處理的方法數(shù)不勝數(shù)。我們還可以使用其他的解析器或解析器架構(gòu),如Java API for XML Parsing (JAXP)。除了使用DOM模型外,事件驅(qū)動(dòng)的SAX模型也可用于解析XML。類似的程序也可用來產(chǎn)生XML數(shù)據(jù)——前提是允許產(chǎn)生新的數(shù)據(jù)對象(在本例中是MediaAsset),它可將其相應(yīng)的XML實(shí)體插入到DOM中,然后將DOM輸出到一個(gè)流中(諸如一個(gè)文件,一個(gè)Socket,或者一個(gè)HTTP連接...)。還有其他更高層次的標(biāo)準(zhǔn),可將XML映射到Java對象的過程進(jìn)一步自動(dòng)化(或簡化)。例如,使用XML概要(Schema)和XML綁定處理引擎,您可以半自動(dòng)地將滿足某個(gè)XML 概要的XML數(shù)據(jù)轉(zhuǎn)變成Java數(shù)據(jù)對象。代表性的引擎是Castor,是由ExoLab小組管理的一個(gè)開放源代碼項(xiàng)目的產(chǎn)物。上述使用Xerces DOM的簡單例子僅僅是演示了這一處理過程的底層模型。
上述示例表明,在Java環(huán)境中解析或產(chǎn)生XML是非常方便的,這與J2EE沒有必然關(guān)聯(lián)。格式化為XML的數(shù)據(jù)可以從應(yīng)用程序的任何層次流入或輸出,這使得與外部系統(tǒng)的集成性無可限量。但我們能否以一種更為直接的方式將XML數(shù)據(jù)源集成到J2EE架構(gòu)中去呢?
駕馭消息
J2EE架構(gòu)包含了對JMS(Java消息服務(wù))API的訪問,以實(shí)現(xiàn)面向消息的通信(J2EE 1.2.1版只需JMS API即可,在J2EE 1.3版中JMS基本定型,此時(shí)必須由某個(gè)兼容J2EE平臺的服務(wù)器提供一個(gè)JMS API Provider)。這一類的異步交互(與之相對的是:本地或遠(yuǎn)程方法調(diào)用所代表的同步交互)被證明在某些應(yīng)用環(huán)境中是非常有用的。某些時(shí)候,交互只需要通過間接的請求或回答來實(shí)現(xiàn),即:在某些情況下,發(fā)出消息后不可能立即收到答復(fù),但我們?nèi)韵M?dāng)消息發(fā)出者重新在線時(shí),確保他能收到答復(fù)信息。
面向消息系統(tǒng)的實(shí)際應(yīng)用之一就是企業(yè)之間的松散集成。類似于EDI(電子文檔交換)時(shí)代的文檔交換,兩個(gè)企業(yè)由于業(yè)務(wù)的需要而交換消息,此時(shí)通常不能為了使用RPC或者RMI、CORBA、DCOM之類的遠(yuǎn)程方法交互而在兩者之間進(jìn)行緊密集成。象JMS API這樣的消息系統(tǒng)允許雙方交換基于JMS API的消息載荷,前提是雙方在會話的時(shí)候均能提供兼容的JMS API服務(wù)。當(dāng)前仍然存在的困難是:雙方是否能尊從相同的格式或協(xié)議。
這正是XML大顯身手的時(shí)候。XML明確地被設(shè)計(jì)來解決此類數(shù)據(jù)交換問題——靈丹妙藥就是“面向消息的概要表”(Message-Oriented Communication Scheme),實(shí)質(zhì)就是基于一個(gè)雙方認(rèn)同的DTD或schema,用XML格式來交換消息載荷。
JMS API支持好幾種消息,其中的TextMessage代表文本消息載荷。一個(gè)簡單而有效的XML消息交換方案是,在一端將我們的XML文檔插入TextMessage,然后在另一端用自制的XML解析程序(如前面的MediaParser)解開數(shù)據(jù)并(可選地)將其轉(zhuǎn)換成Java對象。這使得我們既可以用JMS API支持的公開預(yù)訂的消息模型,也可以用JMS API支持的點(diǎn)對點(diǎn)的消息模型來發(fā)送XML消息。
上述方法有一些局限,因?yàn)閷τ贘MS運(yùn)行時(shí)處理而言,XML的內(nèi)容基本上是不透明的。例如,JMS API允許使用基于特定消息頭的路由。這很容易理解,尤其當(dāng)我們希望XML消息根據(jù)其內(nèi)容采取不同走向時(shí)。例如在我們的MediaAsset例子中,我們希望公開講座內(nèi)容,但只想把特定的內(nèi)容傳送給那些預(yù)訂了課程的人,或傳送給那些表明可以接受某些媒體格式(如視頻流)的人。為了發(fā)揮JMS API的價(jià)值,以便實(shí)現(xiàn)上述基于內(nèi)容的消息路由,我們有必要從XML數(shù)據(jù)中解析出關(guān)鍵信息,然后在構(gòu)造標(biāo)準(zhǔn)JMS API消息頭時(shí)插入這些信息。這是可行的,但要實(shí)現(xiàn)XML信息我們就得額外地寫很多代碼(交換消息的雙方均如此)。
為了在XML和JMS API之間架起橋梁,一些廠商提供了自定義的JMS擴(kuò)展,以便直接支持XML消息機(jī)制。例如,BEA系統(tǒng)公司基于J2EE的WebLogic應(yīng)用服務(wù)器特別為TextMessage提供了XMLMessage子類,允許用XPath表達(dá)式來過濾XML消息。不過這是一種專有的擴(kuò)展,這要求交換消息的雙方必須都能處理這類消息。
為此,Sun公司目前正在開發(fā)用于XML消息的Java API(JAXM)。其目標(biāo)是提供一個(gè)高級別的標(biāo)準(zhǔn)服務(wù),以實(shí)現(xiàn)基于ebXML的消息的合成與傳送。一個(gè)JAXM服務(wù)提供程序可以將這類消息映射到適當(dāng)?shù)奈锢硐⑾到y(tǒng)(諸如JMS API)中去。
讓XML看得見
將XML同Web系統(tǒng)的用戶界面進(jìn)行集成顯然是一種有益的嘗試。絕大多數(shù)的界面程序,無論是基于還是不基于Web,都是將數(shù)據(jù)進(jìn)行轉(zhuǎn)換,然后用易讀的格式展現(xiàn)給用戶。用諸如XML這種“易消化”的格式存放數(shù)據(jù)將簡化上述工作,同時(shí)它還大大提高了內(nèi)容的可管理性,接下來我們就可看到這一點(diǎn)。不過首先要大書一筆的是,XML在Web界面層的應(yīng)用得益于JSP技術(shù)的發(fā)展。
一直以來大家都希望能清晰地區(qū)分Web應(yīng)用程序的表示層與底層對象模型,JSP框架誕生于這些努力之中(包括早期JHTML嘗試)。JSP框架允許將Java代碼嵌入到HTML內(nèi)容中,這樣既可以實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容,又不必經(jīng)常修改Java Servlets的代碼。在頁面中包含Java技術(shù)的途徑是通過JSP標(biāo)記(JSP Tags),這些標(biāo)記以XML風(fēng)格出現(xiàn)。在JSP中,Java程序以代碼片段、服務(wù)器端JavaBeans組件、在服務(wù)器端觸發(fā)特定操作的不透明標(biāo)記(標(biāo)準(zhǔn)的或自定義的)等形式存在。當(dāng)某個(gè)用戶通過瀏覽器請求JSP頁面時(shí),一個(gè)Java應(yīng)用服務(wù)器解析該JSP頁面,將其編譯成一個(gè)Java Servlet,然后執(zhí)行該Servlet以產(chǎn)生答復(fù)頁面。
一種直接將XML數(shù)據(jù)源集成到JSP的界面中去的方法是,將XML加載到JavaBeans組件中(如同我們在MediaAsset例子中所做的),然后在JSP中直接引用這些JavaBeans組件。
下面是一個(gè)嵌入Java代碼片斷的例子:
<html>
<head>
<title>第14講的媒體資源</title>
</head>
<body>
<%@ page import="jaf.xml.*" %>
Media Assets for Lecture 14:
<jsp:useBean class="jaf.xml.MediaAsset" id="asset" />
<% MediaParser parser = new MediaParser();
Collection assets = parser.loadAssets("http://javaschool.org
/jaf/E162/lecture14-assets.xml");
Iterator iter = assets.iterator();
%>
Name
Type
URN
<%
while (iter.hasNext()) {
asset = (MediaAsset)iter.next();
%>
<jsp:getProperty name="asset" property="name" />
<jsp:getProperty name="asset" property="type" />
<jsp:getProperty name="asset" property="URN" />
<%
}
%>
</body>
</html>
其中粗體部分為JSP代碼片斷和標(biāo)記,其余部分是標(biāo)準(zhǔn)的HTML文本。
上述程序還有一種更簡潔的寫法,那就是使用自定義JSP頁面標(biāo)記。這樣我們就可以從JSP頁面中剔出代碼段,只使用JavaBeans組件和自定義的JSP標(biāo)記即可。比如說,為了去掉創(chuàng)建解析器、加載資源數(shù)據(jù)到集合中的那段代碼,我們可創(chuàng)建一個(gè)自己的標(biāo)記,由它在幕后完成這些工作。以下是例子:
.
.
.
<%@ page import="jaf.xml.*" %>
Media Assets for Lecture 14:
<%@ taglib uri="http://javaschool.org/taglib" prefix="media" %>
<media:load url="http://javaschool.org/jaf/E162/lecture14-assets.xml"
collectionName="assets" cursorName="asset" />
.
.
.
使用自定義標(biāo)記的最大好處是使我們的程序代碼集中在一個(gè)地方(對Java技術(shù)而言,一般是指在“類”中),易于管理。這樣可以將程序中對象層同界面層的集成關(guān)系定義得很清晰,修改代碼所造成的影響是可以預(yù)測和管理的。
直接將XML數(shù)據(jù)轉(zhuǎn)換成Web顯示內(nèi)容的另一種方法是使用XSL和XSLT。在這種方案中,將XML數(shù)據(jù)映射成HTML(或WML等)的邏輯由XSL樣式表(XSL StyleSheet)來定義。樣式表描述了每個(gè)特定XML數(shù)據(jù)實(shí)體應(yīng)該怎樣轉(zhuǎn)換成界面數(shù)據(jù)實(shí)體(如HTML表格、內(nèi)聯(lián)標(biāo)記等)。在JSP架構(gòu)中,XSL轉(zhuǎn)換只能應(yīng)用于特定的XML數(shù)據(jù)源,最理想的是采用一套自定義的JSP標(biāo)記并引用某個(gè)XSLT處理程序。這方面的典型示例請參考java.sun.com中關(guān)于XML同JSP構(gòu)架集成的白皮書。
同前面那個(gè)JSP自定義標(biāo)記加XML解析器組件的方案相比,XSLT方案的伸縮性要好一些,而且具有更好的可管理性。在這種情形下,我們的轉(zhuǎn)換邏輯是編寫在一個(gè)XSL樣式表中,而不是在Java代碼中。這意味著當(dāng)需要修改界面時(shí),大多數(shù)情況下只是編輯樣式表或者HTML,代碼不受影響。不過在決定選用何種方案之前,還是要根據(jù)實(shí)際狀況仔細(xì)權(quán)衡。如果選用XSLT方案,那么就得有人負(fù)責(zé)維護(hù)這些XSL樣式表(要么是負(fù)責(zé)界面的人,要么是編寫程序的人)。XSLT既像內(nèi)容,又像程序,因此雙方都不能把責(zé)任推給對方,結(jié)果大家可能都被這不倫不類的XSLT弄得矛盾百出。從這點(diǎn)上考慮,采用自定義標(biāo)記并由界面開發(fā)者將其嵌入表示層的方法似乎更有吸引力,因?yàn)檫@樣軟件工程師只考慮Java代碼,而內(nèi)容工程師也只操心內(nèi)容標(biāo)記。
Java servlet過濾器是J2EE 1.3版在其Web層最新發(fā)布的一種Web組件。當(dāng)Sevelet將請求寫入某個(gè)資源或者從某個(gè)資源中讀取回答信息時(shí),過濾器可以非常方便地轉(zhuǎn)換其中的頭信息和內(nèi)容信息。這里所說的資源可以是一個(gè)Java servlet、一個(gè)JSP頁面,甚至一個(gè)靜態(tài)Web頁。過濾器的確很“酷”,因?yàn)樗试S開發(fā)人員從轉(zhuǎn)換內(nèi)容的代碼中分離出生成內(nèi)容的那部分代碼,并加以重用。當(dāng)需要通過XSLT方式將XML數(shù)據(jù)轉(zhuǎn)換到不同的XML應(yīng)用目標(biāo)時(shí),Java servlet過濾器尤其有用。
在J2EE應(yīng)用程序中使用Java servlet過濾器轉(zhuǎn)換其輸出,以便兼容任何類型客戶端的前景呼之欲出。servlet過濾器能夠偵測到來自使用WAP協(xié)議(無線應(yīng)用協(xié)議)的移動(dòng)客戶端的呼叫,并且將答復(fù)內(nèi)容轉(zhuǎn)換成WML(無線標(biāo)記語言)格式。servlet過濾器也能檢測到來自iMode無線客戶的呼叫,并將其轉(zhuǎn)變成cHTML(緊湊HTML)格式。當(dāng)然,servlet過濾器也能夠分辨出傳統(tǒng)的HTML瀏覽器客戶的請求,并用正確的格式進(jìn)行回復(fù)。
結(jié)束語
在J2EE 1.2.1規(guī)范中,XML“集成”僅指組件或應(yīng)用程序的XML格式的部署描述。在J2EE 1.3規(guī)范中,對XML的支持被擴(kuò)展為要求具備SAX 2和DOM 2解析器,以及在兼容J2EE的服務(wù)器平臺上提供XSLT轉(zhuǎn)換處理程序。您可以毋庸置疑地相信,將來在J2EE架構(gòu)中還會集成進(jìn)更多的XML特性,因?yàn)镴2EE規(guī)范的定義者們會認(rèn)真傾聽開發(fā)者社區(qū)中對在企業(yè)級應(yīng)用中使用更多XML的渴求呼聲。例如,JSR(Java定義請求)處理小組中與JAXM規(guī)范相關(guān)的部分(JSR 000067)承諾在J2EE后續(xù)規(guī)范中集成進(jìn)JAXM??梢灶A(yù)見,在JSP架構(gòu)、EJB和JDBC規(guī)范中均會有類似的變化。J2EE平臺中上述組件的變革,將使Java技術(shù)開發(fā)者目前用的XML更為規(guī)范化(以及標(biāo)準(zhǔn)化),發(fā)揮出更大的威力。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)
。
打開APP,閱讀全文并永久保存
查看更多類似文章
猜你喜歡
類似文章
j2ee規(guī)范
j2ee的13種核心技術(shù)
J2EE平臺的13種核心技術(shù) - 51CTO.COM
java面試筆試題大匯總之八-J2EE及MVC方面
Java入門--討論 Java 技術(shù)新手入門
J2EE規(guī)范
更多類似文章 >>
生活服務(wù)
首頁
萬象
文化
人生
生活
健康
教育
職場
理財(cái)
娛樂
藝術(shù)
上網(wǎng)
留言交流
回頂部
聯(lián)系我們
分享
收藏
點(diǎn)擊這里,查看已保存的文章
導(dǎo)長圖
關(guān)注
一鍵復(fù)制
下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!
聯(lián)系客服
微信登錄中...
請勿關(guān)閉此頁面
先別劃走!
送你5元優(yōu)惠券,購買VIP限時(shí)立減!
5
元
優(yōu)惠券
優(yōu)惠券還有
10:00
過期
馬上使用
×