XML和J2EE的组合技术 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
当前,Java 2平台企 工具,可扩展标记语言(XM 者逐渐变得有吸引力,并开 也很诱人。因为这将是强大
|
业版(J2EE)架构在厂商市场和 L)简化了数据交换、进程间消 始流行起来。自然,在J2EE架构 系统架构同高度灵活的数据管理
|
开发者社区中倍受推崇。作为一种 息交换这一类的事情,因而对开发 中访问或集成XML解决方案的想法 方案的结合。
|
XML的应用似乎是无穷无尽的,但它们大致上可以分为三大类: |
* 简单数据的表示和交 ,不同的文档类型定义(DT
|
换(针对XML的简单API(SAX) Ds)和概要(schemas))
|
和文档对象模型(DOM)语法解析
|
* 面向消息的计算(XM
|
L-RPC(远程过程调用),SOAP
|
协议,电子化业务XML(ebXML))
|
* 用户界面相关、表示相关的上下文 换(XSLT))
|
(可扩展样式表语言(XSL),可扩展样式表语言转
|
这几类应用在J2EE架构中恰好有天然 化服务(persistence services)的一部 理,而界面表示正是Java服务器页面(JS
|
的对应:数据表示和交换功能是EJB组件模型中持久 分,基于消息的通讯由Java消息服务(JMS)API来处 P)和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)> |
以下是一个基于上述媒体DTD的XML文档,描述了与某个课程讲座相关的内容: |
<?xml version="1.0" ?><!DOCTYPE media-asset PUBLIC "-//Jim Farley//DTD Media Assets//EN" "http://localhost/Articles/Sun/dtds/media.dtd"> |
<desc>与第14讲相关的所有内容</desc> |
<!-- 内容对象"lecture 14"的一套子组件 --> |
<desc>MS PowerPoint</desc> |
<mime-type>application/vnd.ms-powerpoint</mime-type> |
<urn> http://javatraining.org/jaf/E123/lecture -14/slides.ppt</urn> |
<desc>RealPlayer streaming video</desc> |
<mime-type>video/vnd.rn-realvideo</mime-type> |
<urn> http://javatraining.org/jaf/E123/lecture -14/lecture.rv</urn> |
<urn> http://javatraining.org/jaf/E123/lecture -14/index.jsp</urn> |
从Web或者企业级应用 度的可移动性,使我们与元 、某种活动媒体服务器或者 Java应用中,我们可以从当 一个DOM文档,最后遍历文
|
的角度看,能以这种方式访问数 数据的实际资源本身隔离。这些 Web服务器上的一个静态XML文档 前众多的Java语言XML解析器中 档,将所有这些数据转换到我们
|
据真是一种福音,因为它体现了高 资源可能来自一个关系数据库系统 ,等等。如果想把这些数据加载到 选用一个,通过它将XML数据装入 应用系统的对象模型中。
|
下面是个简单的基于DO Apache Xerces:
|
M的解析程序,可对上述的媒体D
|
TD进行解析。解析器用的是
|
import java.io.IOException; |
public class MediaParser impleme
|
nts ErrorHandler {
|
/** 使用Apache Xerces解析器 */ |
org.apache.xerces.parsers.DOMPar
|
ser mParser =
|
new org.apache.xerce
|
s.parsers.DOMParser();
|
mParser.setFeature(
|
" http://xml.org/sax/feature
|
s/validation ", true);
|
System.out.println("Error settin
|
g validation on parser:");
|
mParser.setErrorHandler(this); |
public Document pars
|
e(String url) throws SAXExce
|
ption, IOException {
|
Document mediaDoc =
|
mParser.getDocument();
|
/** 解析指定URL的XML文档,将内容转换成 MediaAsset 对象 |
public Collection loadAssets(Str
|
ing url) throws SAXException, IOException {
|
Document doc = parse(url); |
Collection assets = new LinkedList(); |
NodeList assetNodes
|
= doc.getElementsByTagName("
|
media-asset");
|
for (int i = 0; i < assetNode
|
s.getLength(); i++) {
|
Node assetNode = assetNodes.item(i); |
MediaAsset asset = n
|
ew MediaAsset(assetNode);
|
MediaParser类的构造 哪个URL去找XML源,然后得 源加载文档,然后为文档中
|
函数初始化了一个Xerces DOM解 到结果文档并返回。loadAssets 找到的每个“media-asset”节
|
析器。parse()方法告诉解析器到 ()方法调用parse()方法从某个XML 点创建一个MediaAsset对象。
|
public class MediaAsset { |
private String mName = ""; |
private String mDesc = ""; |
private Collection mChildren = n
|
ew LinkedList();
|
private Vector mTypes = new Vector(); |
private String mUrn = ""; |
protected MediaAsset
|
(org.w3c.dom.Node assetNode)
|
{
|
因为篇幅的关系省略了MediaAsset类 类遍历文档的节点,当它碰到不同的子节 它发现了一个嵌套的子资源节点,它只需 的数据填充到新对象的成员数据中。
|
的详细代码,但应用模式依然是清晰的。MediaAsset 点时,它用子节点的内容填充自己的成员数据。如果 要创建一个新的MediaAsset对象,然后将子资源节点
|
实现上述处理的方法数不胜数。我们 API for XML Parsing (JAXP)。除了使用 类似的程序也可用来产生XML数据——前 ),它可将其相应的XML实体插入到DOM中 Socket,或者一个HTTP连接...)。还有 程进一步自动化(或简化)。例如,使用 动地将满足某个XML 概要的XML数据转变 ExoLab小组管理的一个开放源代码项目的 这一处理过程的底层模型。
|
还可以使用其他的解析器或解析器架构,如Java DOM模型外,事件驱动的SAX模型也可用于解析XML。 提是允许产生新的数据对象(在本例中是MediaAsset ,然后将DOM输出到一个流中(诸如一个文件,一个 其他更高层次的标准,可将XML映射到Java对象的过 XML概要(Schema)和XML绑定处理引擎,您可以半自 成Java数据对象。代表性的引擎是Castor,是由 产物。上述使用Xerces DOM的简单例子仅仅是演示了
|
上述示例表明,在Java 式化为XML的数据可以从应 量。但我们能否以一种更为
|
环境中解析或产生XML是非常方 用程序的任何层次流入或输出, 直接的方式将XML数据源集成到J
|
便的,这与J2EE没有必然关联。格 这使得与外部系统的集成性无可限 2EE架构中去呢?
|
J2EE架构包含了对JMS 1.2.1版只需JMS API即可, 务器提供一个JMS API Prov 所代表的同步交互)被证明 的请求或回答来实现,即: 消息发出者重新在线时,确
|
(Java消息服务)API的访问, 在J2EE 1.3版中JMS基本定型, ider)。这一类的异步交互(与 在某些应用环境中是非常有用的 在某些情况下,发出消息后不可 保他能收到答复信息。
|
以实现面向消息的通信(J2EE 此时必须由某个兼容J2EE平台的服 之相对的是:本地或远程方法调用 。某些时候,交互只需要通过间接 能立即收到答复,但我们仍希望当
|
面向消息系统的实际应用之一就是企 代的文档交换,两个企业由于业务的需要 CORBA、DCOM之类的远程方法交互而在两 许双方交换基于JMS API的消息载荷,前 。当前仍然存在的困难是:双方是否能尊
|
业之间的松散集成。类似于EDI(电子文档交换)时 而交换消息,此时通常不能为了使用RPC或者RMI、 者之间进行紧密集成。象JMS API这样的消息系统允 提是双方在会话的时候均能提供兼容的JMS API服务 从相同的格式或协议。
|
这正是XML大显身手的时候。XML明确 “面向消息的概要表”(Message-Orient 方认同的DTD或schema,用XML格式来交换
|
地被设计来解决此类数据交换问题——灵丹妙药就是 ed Communication Scheme),实质就是基于一个双 消息载荷。
|
JMS API支持好几种消 XML消息交换方案是,在一 解析程序(如前面的MediaP 既可以用JMS API支持的公 发送XML消息。
|
息,其中的TextMessage代表文 端将我们的XML文档插入TextMes arser)解开数据并(可选地) 开预订的消息模型,也可以用JM
|
本消息载荷。一个简单而有效的 sage,然后在另一端用自制的XML 将其转换成Java对象。这使得我们 S API支持的点对点的消息模型来
|
上述方法有一些局限, ,JMS API允许使用基于特 内容采取不同走向时。例如 定的内容传送给那些预订了 的人。为了发挥JMS API的 中解析出关键信息,然后在 XML信息我们就得额外地写
|
因为对于JMS运行时处理而言,X 定消息头的路由。这很容易理解 在我们的MediaAsset例子中,我 课程的人,或传送给那些表明可 价值,以便实现上述基于内容的 构造标准JMS API消息头时插入 很多代码(交换消息的双方均如
|
ML的内容基本上是不透明的。例如 ,尤其当我们希望XML消息根据其 们希望公开讲座内容,但只想把特 以接受某些媒体格式(如视频流) 消息路由,我们有必要从XML数据 这些信息。这是可行的,但要实现 此)。
|
为了在XML和JMS API之 消息机制。例如,BEA系统 XMLMessage子类,允许用XP 消息的双方必须都能处理这
|
间架起桥梁,一些厂商提供了自 公司基于J2EE的WebLogic应用服 ath表达式来过滤XML消息。不过 类消息。
|
定义的JMS扩展,以便直接支持XML 务器特别为TextMessage提供了 这是一种专有的扩展,这要求交换
|
为此,Sun公司目前正 别的标准服务,以实现基于 息映射到适当的物理消息系
|
在开发用于XML消息的Java API ebXML的消息的合成与传送。一 统(诸如JMS API)中去。
|
(JAXM)。其目标是提供一个高级 个JAXM服务提供程序可以将这类消
|
将XML同Web系统的用户 是基于还是不基于Web,都 种“易消化”的格式存放数 我们就可看到这一点。不过 展。
|
界面进行集成显然是一种有益的 是将数据进行转换,然后用易读 据将简化上述工作,同时它还大 首先要大书一笔的是,XML在Web
|
尝试。绝大多数的界面程序,无论 的格式展现给用户。用诸如XML这 大提高了内容的可管理性,接下来 界面层的应用得益于JSP技术的发
|
一直以来大家都希望能清晰地区分We 这些努力之中(包括早期JHTML尝试)。J 以实现动态内容,又不必经常修改Java S 过JSP标记(JSP Tags),这些标记以XML 端JavaBeans组件、在服务器端触发特定 。当某个用户通过浏览器请求JSP页面时 一个Java Servlet,然后执行该Servlet
|
b应用程序的表示层与底层对象模型,JSP框架诞生于 SP框架允许将Java代码嵌入到HTML内容中,这样既可 ervlets的代码。在页面中包含Java技术的途径是通 风格出现。在JSP中,Java程序以代码片段、服务器 操作的不透明标记(标准的或自定义的)等形式存在 ,一个Java应用服务器解析该JSP页面,将其编译成 以产生答复页面。
|
一种直接将XML数据源 如同我们在MediaAsset例子
|
集成到JSP的界面中去的方法是 中所做的),然后在JSP中直接
|
,将XML加载到JavaBeans组件中( 引用这些JavaBeans组件。
|
<%@ page import="jaf.xml.*" %> |
<center><H3>Media Assets for Lecture 14:</H3></center> |
<jsp:useBean class="jaf.xml.MediaAsset" id="asset" /> |
<% MediaParser pa
|
rser = new MediaParser();
|
Collection assets = parser.loadA
|
ssets(" http://javaschool.org
|
/jaf/E162/lecture14-assets.xml"); |
Iterator iter = assets.iterator(); |
<tr><th>Name</th><th>Type</th><th>URN</th></tr> |
asset = (MediaAsset)iter.next(); |
<tr><td><jsp:getProperty name="asset" property="name" /></td> |
<td><jsp:getProperty name="asset" property="type" /></td> |
<td><jsp:getProperty name="asset" property="URN" /></td> |
其中粗体部分为JSP代码片断和标记,其余部分是标准的HTML文本。 |
上述程序还有一种更简 页面中剔出代码段,只使用 析器、加载资源数据到集合 工作。以下是例子:
|
洁的写法,那就是使用自定义JS JavaBeans组件和自定义的JSP标 中的那段代码,我们可创建一个
|
P页面标记。这样我们就可以从JSP 记即可。比如说,为了去掉创建解 自己的标记,由它在幕后完成这些
|
<%@ page import="jaf.xml.*" %> |
<center><H3>Media Assets for Lecture 14:</H3></center> |
<%@ taglib uri=" http://javaschool.org/taglib " prefix="media" %> |
<media:load url=" http://java
|
school.org/jaf/E162/lecture14 -assets.xml"
|
collectionName="assets" cursorName="asset" /> |
使用自定义标记的最大 是指在“类”中),易于管 修改代码所造成的影响是可
|
好处是使我们的程序代码集中在 理。这样可以将程序中对象层同 以预测和管理的。
|
一个地方(对Java技术而言,一般 界面层的集成关系定义得很清晰,
|
直接将XML数据转换成W 数据映射成HTML(或WML等 每个特定XML数据实体应该 构中,XSL转换只能应用于 某个XSLT处理程序。这方面 。
|
eb显示内容的另一种方法是使用 )的逻辑由XSL样式表(XSL Sty 怎样转换成界面数据实体(如HT 特定的XML数据源,最理想的是 的典型示例请参考java.sun.com
|
XSL和XSLT。在这种方案中,将XML leSheet)来定义。样式表描述了 ML表格、内联标记等)。在JSP架 采用一套自定义的JSP标记并引用 中关于XML同JSP构架集成的白皮书
|
同前面那个JSP自定义标记加XML解析 且具有更好的可管理性。在这种情形下, 在Java代码中。这意味着当需要修改界面 受影响。不过在决定选用何种方案之前, 那么就得有人负责维护这些XSL样式表( 既像内容,又像程序,因此双方都不能把 弄得矛盾百出。从这点上考虑,采用自定 有吸引力,因为这样软件工程师只考虑Ja
|
器组件的方案相比,XSLT方案的伸缩性要好一些,而 我们的转换逻辑是编写在一个XSL样式表中,而不是 时,大多数情况下只是编辑样式表或者HTML,代码不 还是要根据实际状况仔细权衡。如果选用XSLT方案, 要么是负责界面的人,要么是编写程序的人)。XSLT 责任推给对方,结果大家可能都被这不伦不类的XSLT 义标记并由界面开发者将其嵌入表示层的方法似乎更 va代码,而内容工程师也只操心内容标记。
|
Java servlet过滤器是 写入某个资源或者从某个资 内容信息。这里所说的资源 滤器的确很“酷”,因为它 并加以重用。当需要通过XS 器尤其有用。
|
J2EE 1.3版在其Web层最新发布 源中读取回答信息时,过滤器可 可以是一个Java servlet、一个 允许开发人员从转换内容的代码 LT方式将XML数据转换到不同的X
|
的一种Web组件。当Sevelet将请求 以非常方便地转换其中的头信息和 JSP页面,甚至一个静态Web页。过 中分离出生成内容的那部分代码, ML应用目标时,Java servlet过滤
|
在J2EE应用程序中使用Java servlet 呼之欲出。servlet过滤器能够侦测到来 叫,并且将答复内容转换成WML(无线标 无线客户的呼叫,并将其转变成cHTML( 出传统的HTML浏览器客户的请求,并用正
|
过滤器转换其输出,以便兼容任何类型客户端的前景 自使用WAP协议(无线应用协议)的移动客户端的呼 记语言)格式。servlet过滤器也能检测到来自iMode 紧凑HTML)格式。当然,servlet过滤器也能够分辨 确的格式进行回复。
|
在J2EE 1.2.1规范中,XML“集成” 1.3规范中,对XML的支持被扩展为要求具 台上提供XSLT转换处理程序。您可以毋庸 XML特性,因为J2EE规范的定义者们会认 的渴求呼声。例如,JSR(Java定义请求 承诺在J2EE后续规范中集成进JAXM。可以 化。J2EE平台中上述组件的变革,将使Ja ),发挥出更大的威力。
|
仅指组件或应用程序的XML格式的部署描述。在J2EE 备SAX 2和DOM 2解析器,以及在兼容J2EE的服务器平 置疑地相信,将来在J2EE架构中还会集成进更多的 真倾听开发者社区中对在企业级应用中使用更多XML )处理小组中与JAXM规范相关的部分(JSR 000067) 预见,在JSP架构、EJB和JDBC规范中均会有类似的变 va技术开发者目前用的XML更为规范化(以及标准化
|
Java 2 平台,企业版
|
(http://java.sun.com/j2ee/)
|
Java Servlet技术 (http://java.su
|
n.com/products/servlet/)
|
JSR 000067, Java APIs for XML Me
|
ssaging (JAXM) 1.0
|
(http://java.sun.com/aboutJava/c
|
ommunityprocess/jsr/jsr_067_jaxm.html)
|
JSR 000005, XML解析(JAXP)规范 |
(http://java.sun.com/aboutJava/c
|
ommunityprocess/jsr/jsr_005_xml.html)
|
JSR 000063, Java API for XML处理
|
(JAXP) 1.1
|
(http://java.sun.com
|
/aboutJava/communityprocess/
|
jsr/jsr_063_jaxp11.html)
|
JSR 000031, XML数据帮定(JAXB)规范 |
(http://java.sun.com
|
/aboutJava/communityprocess/
|
jsr/jsr_031_xmld.html)
|
Java消息服务API (http://java.sun
|
.com/products/jms/)
|
JMS、XML和异构企业:使用JMS和XML以提高企业级应用的互操作性 |
(http://www-106.ibm.com/develope eous/index.html?dwzone=java)
|
rworks/library/heterogen
|
(http://www.javaworld.com/javawo
|
rld/jw-02-2000/jw-02-jmsxml.html)
|
JSP和XML:用JSP技术开发XML解决方案(白皮书) |
(http://java.sun.com/products/js
|
p/pdf/JSPXML.pdf)
|
(http://java.sun.com
|
/products/jsp/whitepaper.htm
|
l)
|
|
|
|
|
|