帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > JAVA编程
XML和J2EE的组合技术
作者:佚名 发布时间:2005-04-02 来源:不详
 
  XML和J2EE的组合技术                                                    

   当前,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)>

  <!ELEMENT urn (#PCDATA)>


  以下是一个基于上述媒体DTD的XML文档,描述了与某个课程讲座相关的内容:    
  <?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讲相关的所有内容</desc>

  <!-- 内容对象"lecture 14"的一套子组件 -->

  <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或者企业级应用
度的可移动性,使我们与元
、某种活动媒体服务器或者
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.parsers.DOMPar
ser mParser =

  new org.apache.xerce
s.parsers.DOMParser();
  /** 构造函数 */                                                        
  public MediaParser() {                                  
  // 告诉解析器验证并解析文档                                                
  try {                                                                    
  mParser.setFeature(
" http://xml.org/sax/feature
s/validation ", true);
  }                                                                           
  catch (SAXException e) {                              
  System.out.println("Error settin
g 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.getDocument();
  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 < assetNode
s.getLength(); i++) {
  Node assetNode = assetNodes.item(i);      

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

  MediaParser类的构造
哪个URL去找XML源,然后得
源加载文档,然后为文档中
函数初始化了一个Xerces DOM解
到结果文档并返回。loadAssets
找到的每个“media-asset”节
析器。parse()方法告诉解析器到
()方法调用parse()方法从某个XML
点创建一个MediaAsset对象。

  以下是一个使用MediaAsset类的例子:                                  
  package jaf.xml;                                              
  import java.util.*;                                        
  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看得见


  将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组件。

  下面是一个嵌入Java代码片断的例子:                                        
  <html>

  <head>

  <title>第14讲的媒体资源</title>

  </head>

  <body>

  <!-- 引入我们的类 -->

  <%@ 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();          
  %>

  <table border=0>

  <tr><th>Name</th><th>Type</th><th>URN</th></tr>

  <%                                                                    
  while (iter.hasNext()) {                              
  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>

  </tr>

  <%                                                                    
  }                                                                            
  %>

  </table>

  </body>

  </html>

  其中粗体部分为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" />

  <table border=0>

  .                                                                            

  .                                                                            
  .                                                                            
  使用自定义标记的最大
是指在“类”中),易于管
修改代码所造成的影响是可
好处是使我们的程序代码集中在
理。这样可以将程序中对象层同
以预测和管理的。
一个地方(对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)

  JMS和XML:                                                             

  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


  JMS-XML教程                                                            
  (http://www.javaworld.com/javawo
rld/jw-02-2000/jw-02-jmsxml.html)

  JSP和XML:                                                             

  JSP和XML:用JSP技术开发XML解决方案(白皮书)                      
  (http://java.sun.com/products/js
p/pdf/JSPXML.pdf)

  JavaServer 页面技术 (白皮书)                                    
  (http://java.sun.com
/products/jsp/whitepaper.htm
l)

 
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·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实现小结
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统