帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > JAVA编程
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)>                 
  <!ELEMENT urn (#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">
  <media-asset>                                                   
  <name>第14讲</name>                                           
  <desc>与第14讲相关的所有内容</desc>                           
  <!-- 内容对象"lecture 14"的一套子组件 -->               
  <media-asset>                                                   
  <name>讲座的幻灯片</name>                                       
  <type>                                                                 
  <desc>MS PowerPoint</desc>                         
  <mime-type>application/vnd.ms-
powerpoint</mime-type>
  </type>                                                               
  <urn>http://javatr
aining.org/jaf/E123/lecture-

  14/slides.ppt</urn>                                       
  </media-asset>                                                 
  <media-asset>                                                   
  <name>讲座的视频片断</name>                                     
  <type>                                                                 

  <desc>RealPlayer s
treaming video</desc>
  <mime-type>video/vnd.rn-realvi
deo</mime-type>
  </type>                                                               
  <urn>http://javatr
aining.org/jaf/E123/lecture-

  14/lecture.rv</urn>                                       
  </media-asset>                                                 
  <!-- 讲座开始 -->                                                   
  <urn>http://javatraining.org/j
af/E123/lecture-14/index.jsp</urn>
  </media-asset>                                               
  从Web或者企业级应用
度的可移动性,使我们与元
、某种活动媒体服务器或者
Java应用中,我们可以从当
一个DOM文档,最后遍历文
的角度看,能以这种方式访问数
数据的实际资源本身隔离。这些
Web服务器上的一个静态XML文档
前众多的Java语言XML解析器中
档,将所有这些数据转换到我们
据真是一种福音,因为它体现了高
资源可能来自一个关系数据库系统
,等等。如果想把这些数据加载到
选用一个,通过它将XML数据装入
应用系统的对象模型中。
  下面是个简单的基于DO
Apache Xerces:  
M的解析程序,可对上述的媒体D

TD进行解析。解析器用的是

  package jaf.xml;                                             
  import java.util.*;                                       
  import java.io.IOException;                       
  import org.w3c.dom.*;                                   
  import org.xml.sax.*;                                   
  // XML文档解析程序,使用上述媒体DTD.                               
  public class MediaParser impleme
nts ErrorHandler {
  /** 使用Apache Xerces解析器 */                           

  org.apache.xerces.pa
rsers.DOMParser mParser =
  new org.apache.xerces.parsers.DO
MParser();
  /** 构造函数 */                                                       
  public MediaParser() {                                 
  // 告诉解析器验证并解析文档                                               
  try {                                                                   
  mParser.setFeature( "http://xml.
org/sax/features/validation",
  true);                                                                 
  }                                                                           
  catch (SAXException e) {                             
  System.out.println("
Error setting validation on
parser:");
  e.printStackTrace();                                     
  }                                                                           
  // 设置解析器的错误处理句柄                                               
  mParser.setErrorHandler(this);                 
  }                                                                           
  /** 解析指定的URL,返回找到的XML文档                               
  */                                                                         
  public Document pars
e(String url) throws SAXExce
ption, IOException {
  mParser.parse(url);                                       
  Document mediaDoc = mParser.getD
ocument();
  return mediaDoc;                                             
  }                                                                           
  /** 解析指定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 <
assetNodes.getLength(); i++
) {
  Node assetNode = assetNodes.item(i);     

  MediaAsset asset = n
ew MediaAsset(assetNode);
  assets.add(asset);                                         
  }                                                                           
  return assets;                                                 
  }                                                                           
  /**                                                                       
  * 错误处理代码(为简洁起见省略了)                                         
  */                                                                         
  }                                                                         

    MediaParser类的
器到哪个URL去找XML源,然
个XML源加载文档,然后为

构造函数初始化了一个Xerces D
后得到结果文档并返回。loadAs
文档中找到的每个“media-asse

OM解析器。parse()方法告诉解析
sets()方法调用parse()方法从某
t”节点创建一个MediaAsset对象


    以下是一个使用MediaAsset类的例子:                             

  package jaf.xml;                                             
  import java.util.*;                                       
  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看得见                                                               
  将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组件。
  下面是一个嵌入Java代码片断的例子:                                       
  

  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·XML和J2EE的组合技术  (2005-04-02)
 ·XML和J2EE的完美结合  (2005-04-02)
 ·XML和Java:一个强大的组合  (2005-03-12)
 ·XML和JSP交互技术  (2005-03-12)
 ·Linux 是Java、XML和CORBA的最佳  (2005-03-12)
 ·XML和J2EE的组合技术  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·谈谈JDBC
·JDBC专题介绍
·JDBC接口技术
·利用weblogic的POOL(连接池)连接
·Jsp中调用Oracle存储过程的小例子
·JSP数据库操作例程
·JSP数据库连接大全
·用连接池提高Servlet访问数据库的效
·一种简单JDBC连接池的实现
·数据库连接池Java实现小结
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统