当前位置:天才代写 > tutorial > JAVA 教程 > XML和J2EE的组合技能

XML和J2EE的组合技能

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:554

副标题#e#

当前,Java 2平台企业版(J2EE)架构在厂商市场和开拓者社区中倍受推崇。作为一种东西,可扩展标志语言(XML)简化了数据互换、历程间动静互换这一类的工作,因而对开拓者逐渐变得有吸引力,并开始风行起来。自然,在J2EE架构中会见或集成XML办理方案的想法也很诱人。因为这将是强大系统架构同高度机动的数据打点方案的团结。

XML的应用好像是无穷无尽的,但它们大抵上可以分为三大类:

* 简朴数据的暗示和互换(针对XML的简朴API(SAX)和文档工具模子(DOM)语法理会,差异的文档范例界说(DTDs)和提要(schemas))

* 面向动静的计较(XML-RPC(长途进程挪用),SOAP协议,电子化业务XML(ebXML))

* 用户界面相关、暗示相关的上下文(可扩展样式表语言(XSL),可扩展样式表语言转换(XSLT))

这几类应用在J2EE架构中刚好有天然的对应:数据暗示和互换成果是EJB组件模子中耐久化处事(persistence services)的一部门,基于动静的通讯由Java动静处事(JMS)API来处理惩罚,而界面暗示正是Java处事器页面(JSP)和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>


#p#副标题#e#

从Web可能企业级应用的角度看,能以这种方法会见数据真是一种福音,因为它浮现了高度的可移动性,使我们与元数据的实际资源自己断绝。这些资源大概来自一个干系数据库系统、某种勾当媒体处事器可能Web处事器上的一个静态XML文档,等等。假如想把这些数据加载到Java应用中,我们可以从当前浩瀚的Java语言XML理会器中选用一个,通过它将XML数据装入一个DOM文档,最后遍历文档,将所有这些数据转换到我们应用系统的工具模子中。

下面是个简朴的基于DOM的理会措施,可对上述的媒体DTD举办理会。理会器用的是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();
   /** 结构函数 */
   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 parse(String url) throws SAXException, IOException {
     mParser.parse(url);
     Document mediaDoc = mParser.getDocument();
     return mediaDoc;
    }
   /** 理会指定URL的XML文档,将内容转换成 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;
    }
   /**
    * 错误处理惩罚代码(为简捷起见省略了)
    */
   }

#p#副标题#e#

#p#分页标题#e#

MediaParser类的结构函数初始化了一个Xerces DOM理会器。parse()要领汇报理会器到哪个URL去找XML源,然后获得功效文档并返回。loadAssets()要领挪用parse()要领从某个XML源加载文档,然后为文档中找到的每个“media-asset”节点建设一个MediaAsset工具。

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

package jaf.xml;
   import java.util.*;
   public class MediaAsset {
    // 资源元数据
    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) {
     // 为简捷起见省略后头代码
     .
     .
     .
    }
   }

因为篇幅的干系省略了MediaAsset类的具体代码,但应用模式依然是清晰的。MediaAsset类遍历文档的节点,当它遇到差异的子节点时,它用子节点的内容填充本身的成员数据。假如它发明白一个嵌套的子资源节点,它只需要建设一个新的MediaAsset工具,然后将子资源节点的数据填充到新工具的成员数据中。

实现上述处理惩罚的要领数不胜数。我们还可以利用其他的理会器或理会器架构,如Java API for XML Parsing (JAXP)。除了利用DOM模子外,事件驱动的SAX模子也可用于理会XML。雷同的措施也可用来发生XML数据——前提是答允发生新的数据工具(在本例中是MediaAsset),它可将其相应的XML实体插入到DOM中,然后将DOM输出到一个流中(诸如一个文件,一个Socket,可能一个HTTP毗连…)。尚有其他更高条理的尺度,可将XML映射到Java工具的进程进一步自动化(或简化)。譬喻,利用XML提要(Schema)和XML绑定处理惩罚引擎,您可以半自动地将满意某个XML 提要的XML数据转酿成Java数据工具。代表性的引擎是Castor,是由ExoLab小组打点的一个开放源代码项目标产品。上述利用Xerces DOM的简朴例子仅仅是演示了这一处理惩罚进程的底层模子。

上述示例表白,在Java情况中理会或发生XML长短常利便的,这与J2EE没有一定关联。名目化为XML的数据可以从应用措施的任何条理流入或输出,这使得与外部系统的集成性无可限量。但我们可否以一种更为直接的方法将XML数据源集成到J2EE架构中去呢?

驾御动静

J2EE架构包括了对JMS(Java动静处事)API的会见,以实现面向动静的通信(J2EE 1.2.1版只需JMS API即可,在J2EE 1.3版中JMS根基定型,此时必需由某个兼容J2EE平台的处事器提供一个JMS API Provider)。这一类的异步交互(与之相对的是:当地或长途要领挪用所代表的同步交互)被证明在某些应用情况中长短常有用的。某些时候,交互只需要通过间接的请求或答复来实现,即:在某些环境下,发出动静后不行能当即收到复原,但我们仍但愿当动静发出者从头在线时,确保他能收到复原信息。

面向动静系统的实际应用之一就是企业之间的松散集成。雷同于EDI(电子文档互换)时代的文档互换,两个企业由于业务的需要而互换动静,此时凡是不能为了利用RPC可能RMI、CORBA、DCOM之类的长途要领交互而在两者之间举办细麋集成。象JMS API这样的动静系统答允两边互换基于JMS API的动静载荷,前提是两边在会话的时候均能提供兼容的JMS API处事。当前仍然存在的坚苦是:两边是否能尊从沟通的名目或协议。

#p#分页标题#e#

这正是XML大显身手的时候。XML明晰地被设计来办理此类数据互换问题——灵丹灵药就是“面向动静的提要表”(Message-Oriented Communication Scheme),实质就是基于一个两边认同的DTD或schema,用XML名目来互换动静载荷。

JMS API支持好几种动静,个中的TextMessage代表文本动静载荷。一个简朴而有效的XML动静互换方案是,在一端将我们的XML文档插入TextMessage,然后在另一端用廉价的XML理会措施(如前面的MediaParser)解开数据并(可选地)将其转换成Java工具。这使得我们既可以用JMS API支持的果真预订的动静模子,也可以用JMS API支持的点对点的动静模子来发送XML动静。

上述要领有一些范围,因为对付JMS运行时处理惩罚而言,XML的内容根基上是不透明的。譬喻,JMS API答允利用基于特定动静头的路由。这很容易领略,尤其当我们但愿XML动静按照其内容采纳差异走向时。譬喻在我们的MediaAsset例子中,我们但愿果真讲座内容,但只想把特定的内容传送给那些预订了课程的人,或传送给那些表白可以接管某些媒体名目(如视频流)的人。为了发挥JMS API的代价,以便实现上述基于内容的动静路由,我们有须要从XML数据中理会出要害信息,然后在结构尺度JMS API动静头时插入这些信息。这是可行的,但要实现XML信息我们就得特别地写许多代码(互换动静的两边均如此)。

为了在XML和JMS API之间架起桥梁,一些厂商提供了自界说的JMS扩展,以便直接支持XML动静机制。譬喻,BEA系统公司基于J2EE的WebLogic应用处事器出格为TextMessage提供了XMLMessage子类,答允用XPath表达式来过滤XML动静。不外这是一种专有的扩展,这要求互换动静的两边必需都能处理惩罚这类动静。

为此,Sun公司今朝正在开拓用于XML动静的Java API(JAXM)。其方针是提供一个高级此外尺度处事,以实现基于ebXML的动静的合成与传送。一个JAXM处事提供措施可以将这类动静映射到适当的物理动静系统(诸如JMS API)中去。

#p#副标题#e#

让XML看得见

将XML同Web系统的用户界面举办集成显然是一种有益的实验。绝大大都的界面措施,无论是基于照旧不基于Web,都是将数据举办转换,然后用易读的名目揭示给用户。用诸如XML这种“易消化”的名目存放数据将简化上述事情,同时它还大大提高了内容的可打点性,接下来我们就可看到这一点。不外首先要大书一笔的是,XML在Web界面层的应用得益于JSP技能的成长。

一直以来各人都但愿能清晰地域分Web应用措施的暗示层与底层工具模子,JSP框架降生于这些尽力之中(包罗早期JHTML实验)。JSP框架答允将Java代码嵌入到HTML内容中,这样既可以实现动态内容,又不必常常修改Java Servlets的代码。在页面中包括Java技能的途径是通过JSP标志(JSP Tags),这些标志以XML气势气魄呈现。在JSP中,Java措施以代码片断、处事器端JavaBeans组件、在处事器端触发特定操纵的不透明标志(尺度的或自界说的)等形式存在。当某个用户通过欣赏器请求JSP页面时,一个Java应用处事器理会该JSP页面,将其编译成一个Java Servlet,然后执行该Servlet以发生复原页面。

一种直接将XML数据源集成到JSP的界面中去的要领是,将XML加载到JavaBeans组件中(如同我们在MediaAsset例子中所做的),然后在JSP中直接引用这些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 parser = new MediaParser();
Collection assets = parser.loadAssets("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文本。

#p#分页标题#e#

上述措施尚有一种更简捷的写法,那就是利用自界说JSP页面标志。这样我们就可以从JSP页面中剔出代码段,只利用JavaBeans组件和自界说的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://javaschool.org/jaf/E162/lecture14-assets.xml"
collectionName="assets" cursorName="asset" />
<table border=0>
.
.
.

利用自界说标志的最大长处是使我们的措施代码会合在一个处所(对Java技能而言,一般是指在“类”中),易于打点。这样可以将措施中工具层同界面层的集成干系界说得很清晰,修改代码所造成的影响是可以预测和打点的。

直接将XML数据转换成Web显示内容的另一种要领是利用XSL和XSLT。在这种方案中,将XML数据映射成HTML(或WML等)的逻辑由XSL样式表(XSL StyleSheet)来界说。样式表描写了每个特定XML数据实体应该奈何转换成界面数据实体(如HTML表格、内联标志等)。在JSP架构中,XSL转换只能应用于特定的XML数据源,最抱负的是回收一套自界说的JSP标志并引用某个XSLT处理惩罚措施。这方面的典范示例请参考java.sun.com中关于XML同JSP构架集成的白皮书。

同前面谁人JSP自界说标志加XML理会器组件的方案对比,XSLT方案的伸缩性要好一些,并且具有更好的可打点性。在这种景象下,我们的转换逻辑是编写在一个XSL样式表中,而不是在Java代码中。这意味着当需要修改界面时,大大都环境下只是编辑样式表可能HTML,代码不受影响。不外在抉择选用何种方案之前,照旧要按照实际状况仔细衡量。假如选用XSLT方案,那么就得有人认真维护这些XSL样式表(要么是认真界面的人,要么是编写措施的人)。XSLT既像内容,又像措施,因此两边都不能把责任推给对方,功效各人大概都被这不正经的XSLT弄得抵牾百出。从这点上思量,回收自界说标志并由界面开拓者将其嵌入暗示层的要领好像更有吸引力,因为这样软件工程师只思量Java代码,而内容工程师也只劳神内容标志。

Java servlet过滤器是J2EE 1.3版在其Web层最新宣布的一种Web组件。当Sevelet将请求写入某个资源可能从某个资源中读取答复信息时,过滤器可以很是利便地转换个中的头信息和内容信息。这里所说的资源可以是一个Java servlet、一个JSP页面,甚至一个静态Web页。过滤器简直很“酷”,因为它答允开拓人员从转换内容的代码中疏散出生成内容的那部门代码,并加以重用。当需要通过XSLT方法将XML数据转换到差异的XML应用方针时,Java servlet过滤器尤其有用。

在J2EE应用措施中利用Java servlet过滤器转换其输出,以便兼容任何范例客户端的前景呼之欲出。servlet过滤器可以或许侦测到来自利用WAP协议(无线应用协议)的移动客户端的呼唤,而且将复原内容转换成WML(无线标志语言)名目。servlet过滤器也能检测到来自iMode无线客户的呼唤,并将其转酿成cHTML(紧凑HTML)名目。虽然,servlet过滤器也可以或许判别出传统的HTML欣赏器客户的请求,并用正确的名目举办回覆。

竣事语

在J2EE 1.2.1类型中,XML“集成”仅指组件或应用措施的XML名目标陈设描写。在J2EE 1.3类型中,对XML的支持被扩展为要求具备SAX 2和DOM 2理会器,以及在兼容J2EE的处事器平台上提供XSLT转换处理惩罚措施。您可以毋庸置疑地相信,未来在J2EE架构中还集中成进更多的XML特性,因为J2EE类型的界说者们会当真倾听开拓者社区中对在企业级应用中利用更多XML的渴求呼声。譬喻,JSR(Java界说请求)处理惩罚小组中与JAXM类型相关的部门(JSR 000067)理睬在J2EE后续类型中集成进JAXM。可以预见,在JSP架构、EJB和JDBC类型中均会有雷同的变革。J2EE平台中上述组件的厘革,将使Java技能开拓者今朝用的XML更为类型化(以及尺度化),发挥出更大的威力。

 

    关键字:

天才代写-代写联系方式