XML和J2EE的完美结合 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
当前,Java 2平台企业 具,可扩展标记语言(XML 逐渐变得有吸引力,并开始 很诱人。因为这将是强大系
|
版(J2EE)架构在厂商市场和开 )简化了数据交换、进程间消息 流行起来。自然,在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 hypo
|
thetical media management sy
|
stem -->
|
<!-- Media assets a
|
re the root of the object hi
|
erarchy. Assets are also
|
hierarchical - they
|
can contain other assets. --
|
>
|
<!ELEMENT media-asset (name, de
|
sc?, 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 P
|
UBLIC "-//Jim Farley//DTD
|
Media Assets//EN" "h
|
ttp://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://javatr
|
aining.org/jaf/E123/lecture-
|
|
<desc>RealPlayer s
|
treaming video</desc>
|
<mime-type>video/vnd.rn-realvi
|
deo</mime-type>
|
<urn>http://javatr
|
aining.org/jaf/E123/lecture-
|
|
<urn>http://javatraining.org/j
|
af/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.pa
|
rsers.DOMParser mParser =
|
new org.apache.xerces.parsers.DO
|
MParser();
|
mParser.setFeature( "http://xml.
|
org/sax/features/validation",
|
System.out.println("
|
Error setting validation on
|
parser:");
|
mParser.setErrorHandler(this); |
public Document pars
|
e(String url) throws SAXExce
|
ption, IOException {
|
Document mediaDoc = mParser.getD
|
ocument();
|
/** 解析指定URL的XML文档,将内容转换成 MediaAsset 对象 |
public Collection loadAssets(Str
|
ing url) throws SAXException,
|
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 = n
|
ew MediaAsset(assetNode);
|
MediaParser类的 器到哪个URL去找XML源,然 个XML源加载文档,然后为 。
|
构造函数初始化了一个Xerces D 后得到结果文档并返回。loadAs 文档中找到的每个“media-asse
|
OM解析器。parse()方法告诉解析 sets()方法调用parse()方法从某 t”节点创建一个MediaAsset对象
|
public class MediaAsset { |
private String mName = ""; |
private String mDesc = ""; |
private Collection m
|
Children = new LinkedList();
|
|
private Vector mTypes = new Vector(); |
private String mUrn = ""; |
protected MediaAsset(org.w3c.dom
|
.Node assetNode) {
|
因为篇幅的关系省略了 类遍历文档的节点,当它碰 它发现了一个嵌套的子资源 的数据填充到新对象的成员
|
MediaAsset类的详细代码,但应 到不同的子节点时,它用子节点 节点,它只需要创建一个新的Me 数据中。
|
用模式依然是清晰的。MediaAsset 的内容填充自己的成员数据。如果 diaAsset对象,然后将子资源节点
|
实现上述处理的方法数 API for XML Parsing (JAX 类似的程序也可用来产生XM ),它可将其相应的XML实 Socket,或者一个HTTP连接 程进一步自动化(或简化) 自动地将满足某个XML 概要 ExoLab小组管理的一个开放 这一处理过程的底层模型。
|
不胜数。我们还可以使用其他的 P)。除了使用DOM模型外,事件 L数据——前提是允许产生新的 体插入到DOM中,然后将DOM输出 ...)。还有其他更高层次的标 。例如,使用XML概要(Schema 的XML数据转变成Java数据对象 源代码项目的产物。上述使用Xe
|
解析器或解析器架构,如Java 驱动的SAX模型也可用于解析XML。 数据对象(在本例中是MediaAsset 到一个流中(诸如一个文件,一个 准,可将XML映射到Java对象的过 )和XML绑定处理引擎,您可以半 。代表性的引擎是Castor,是由 rces DOM的简单例子仅仅是演示了
|
上述示例表明,在Java环境中解析或 式化为XML的数据可以从应用程序的任何 量。但我们能否以一种更为直接的方式将
|
产生XML是非常方便的,这与J2EE没有必然关联。格 层次流入或输出,这使得与外部系统的集成性无可限 XML数据源集成到J2EE架构中去呢?
|
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大显身手的 是“面向消息的概要表”( 双方认同的DTD或schema,
|
时候。XML明确地被设计来解决 Message-Oriented Communicati 用XML格式来交换消息载荷。
|
此类数据交换问题——灵丹妙药就 on Scheme),实质就是基于一个
|
JMS API支持好几种消 XML消息交换方案是,在一 解析程序(如前面的MediaP 既可以用JMS API支持的公 发送XML消息。
|
息,其中的TextMessage代表文 端将我们的XML文档插入TextMes arser)解开数据并(可选地) 开预订的消息模型,也可以用JM
|
本消息载荷。一个简单而有效的 sage,然后在另一端用自制的XML 将其转换成Java对象。这使得我们 S API支持的点对点的消息模型来
|
上述方法有一些局限,因为对于JMS 如,JMS API允许使用基于特定消息头的 其内容采取不同走向时。例如在我们的Me 特定的内容传送给那些预订了课程的人, )的人。为了发挥JMS API的价值,以便 据中解析出关键信息,然后在构造标准JM 现XML信息我们就得额外地写很多代码(
|
运行时处理而言,XML的内容基本上是不透明的。例 路由。这很容易理解,尤其当我们希望XML消息根据 diaAsset例子中,我们希望公开讲座内容,但只想把 或传送给那些表明可以接受某些媒体格式(如视频流 实现上述基于内容的消息路由,我们有必要从XML数 S API消息头时插入这些信息。这是可行的,但要实 交换消息的双方均如此)。
|
为了在XML和JMS API之 消息机制。例如,BEA系统 XMLMessage子类,允许用XP 消息的双方必须都能处理这
|
间架起桥梁,一些厂商提供了自 公司基于J2EE的WebLogic应用服 ath表达式来过滤XML消息。不过 类消息。
|
定义的JMS扩展,以便直接支持XML 务器特别为TextMessage提供了 这是一种专有的扩展,这要求交换
|
为此,Sun公司目前正在开发用于XML 的标准服务,以实现基于ebXML的消息的 映射到适当的物理消息系统(诸如JMS AP
|
消息的Java API(JAXM)。其目标是提供一个高级别 合成与传送。一个JAXM服务提供程序可以将这类消息 I)中去。
|
将XML同Web系统的用户界面进行集成 是基于还是不基于Web,都是将数据进行 种“易消化”的格式存放数据将简化上述 我们就可看到这一点。不过首先要大书一 展。
|
显然是一种有益的尝试。绝大多数的界面程序,无论 转换,然后用易读的格式展现给用户。用诸如XML这 工作,同时它还大大提高了内容的可管理性,接下来 笔的是,XML在Web界面层的应用得益于JSP技术的发
|
一直以来大家都希望能 于这些努力之中(包括早期 可以实现动态内容,又不必 通过JSP标记(JSP Tags) 器端JavaBeans组件、在服 在。当某个用户通过浏览器 成一个Java Servlet,然后
|
清晰地区分Web应用程序的表示 JHTML尝试)。JSP框架允许将Ja 经常修改Java Servlets的代码 ,这些标记以XML风格出现。在J 务器端触发特定操作的不透明标 请求JSP页面时,一个Java应用 执行该Servlet以产生答复页面
|
层与底层对象模型,JSP框架诞生 va代码嵌入到HTML内容中,这样既 。在页面中包含Java技术的途径是 SP中,Java程序以代码片段、服务 记(标准的或自定义的)等形式存 服务器解析该JSP页面,将其编译 。
|
一种直接将XML数据源集成到JSP的界 同我们在MediaAsset例子中所做的),然
|
面中去的方法是,将XML加载到JavaBeans组件中(如 后在JSP中直接引用这些JavaBeans组件。
|
|
|
|
|
|