|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。xml|对象|数据在这个由四部分构成的系列文章的第一部分,我们将弄清甚么是数据绑定,与在Java使用程序中处置XML数据的别的办法比拟它有甚么上风,和怎样入手下手利用它。这一部分将考察为何利用数据绑定,和怎样为各类束缚创建模子,使XML文档能转换成Java对象。同时还涵盖用于天生数据绑定类的输出和输入。
您但愿在您的Java使用程序中利用XML吗?那末好,同不计其数的其别人一同上这条船吧。当您深切懂得XML今后,大概您会发明DOM和SAXAPI(请参阅参考材料)不外是唬人的工具。您大概以为一定存在某种复杂办法能够获得XML文档,并经由过程Java使用程序会见它,对吗?不用经由过程回调或庞大的树状布局,而是利用像setOwner(Stringowner)和intgetNumOrders()如许的办法,对吗?假如您已经沿着这一思绪思索成绩,那末数据绑定就是您要寻觅的办理计划。
剖析各类选择
现今各类XML和XML主义正众多成灾(XSL、RDF、定名空间、RSS、XMLSchema、XSLT...),您大概以为如今会有良多办法往会见Java使用程序中的XML数据。使人惊奇的是,假如您追本溯源,实践只存在三种会见XML数据的办法。没错--只要三种办法,个中的一种仍是比来随一种新的JavaAPI才呈现的。
应当如许来对待这一成绩:选择局限小使您更容易于选出合适于您的办法。
回调
回调是作为一种事务驱动模子事情的。当剖析XML文档时,某些事务--如文档的肇端和某个元素中的字符数据的肇端--将触发还调办法。经由过程利用实行逻辑所需的数据,您能够完成这些事务的Java代码。要弄清这类办法不克不及端赖直觉;开辟职员一般要消费一段工夫来了解和把握回调模子的利用。SAX,用于XML的一种复杂API,是这类XML利用办法的现实上的尺度。
树
更罕见、更盛行的是这类API,它们获得一个XML文档,然后创立数据的树状布局。XML文档成为树首,充任一种容器。它有多少子级,如根元素。根元素又有其附加的子级,依此类推,直到(在某种意义上)取得XML数据的一幅图为止。由于几近每一个年夜先生在某个阶段一定都处置过树状布局,以是这便可用作暗示XML数据的一种十分直不雅的办法。
用于XML文档树状暗示的最盛行的API就是W3C的保举尺度,即文档对象模子(DOM)。一种更新的API,JDOM(这不是首字母缩写词)比来也正一向在推行并盛行开来。(固然这个计划是我和JasonHunter创建的,但我还得说假话。)别的,DOM和JDOM都是Spinnaker计划计划的基础请求,Spinnaker是一种新的XML剖析器,它作为ApacheXML计划的一部分正在开辟当中。
固然树状API看起来比事务驱动的SAX更容易于利用,但它们其实不老是符合的。十分年夜的文档大概必要大批的内存(特别是利用DOM时);当对树布局实行转换(XSLT)时,体系大概中断运转乃至完全溃散。固然更新的API(如JDOM)能处置这些成绩,但假如您必需处置极大批的数据,它们仍将是一个成绩。而且,偶然开辟职员宁肯将XML文档中的数据建模为一个复杂的带有值的读写办法的Java对象,而不必树状模子事情。比方,开辟职员会宁肯不往会见名为skuNumber的子节点并设置该节点的文本值,而只想挪用setSkuNumber("mySKU")并持续举行。
术语注释
数据绑定:从Java使用程序外部会见XML数据的一种新办法,利用仍在开辟中的一种API,JSR-031。
JSR-031:Sun仍在开辟中的一种新的Java标准哀求,计划用于将XML文档编译成一个或多个Java类,而在Java使用程序中能够便利地利用这些Java类。
打包:将Java对象转换为XML暗示,具有以后值。
解包:依据XML对象创立Java对象,一般是依据打包天生一个Java对象。
用Java代码会见XML数据的最新办法要依附于一套新的Java办法和相干的API,这些API仍在开辟当中。数据绑定是由Sun构建的一种“Java标准请求”(JSR-031,见参考材料),它计划用于使Java对象绑定到XML文档加倍便利,如许就使一种格局可以简单地转换为另外一种格局,反之亦然。绑定援用一个具有读写办法的Java对象,读写办法城市影响究竟层的XML文档,而且也都间接映照为XML文档中的元素及特性的称号。当您进进到本系列文章下一部分中的某些细节时,这一申明会更成心义,但在今朝,只说一点就够了:如许做使XML文档特性name可以经由过程一个称为setName()的办法,来变动它的值,就像我下面表示的那样。
数据绑定
这类会见体例正在失掉提高,而且当在XML文档中存储设置信息时出格有效。很多开辟职员发明,它十分便于间接会见所需的参数,而不必利用更庞大的树状布局。固然这类会见关于文档转换或动静传送没有甚么用途,但它关于复杂数据处置是极为便利的。它是我们在本文及本系列文章中存眷的第三种利用XML的办法。
(固然,任何办法随后城市引出一系列新的术语,以是请检察术语注释以懂得这些新的行话。)
是不是任何XML文档都能够转换为Java对象?仍是唯一某些范例的XML文档才能够?问得好!您极可能只但愿将满意一组束缚前提的文档转换为Java对象。这与界说Java接口的办法相似:您确保只实例化和利用顺应该接口的对象,同意就怎样操纵该对象作出假定。一样,您只同意将满意一组束缚前提的XML对象转换成Java对象;这使您可以按但愿的体例来利用所创立的对象。
束缚数据
在研讨代码之前,您必要回覆几个有关怎样暗示XML数据的成绩。这是数据绑定的最具应战性的方面之一。是为每一个文档创立一个新类,仍是创立某个现有类的一个实例?您要利用哪一个现有类?而且最主要的是,您正在处置的文档是不是合适转换为Java对象?
那是一年夜堆成绩,但您将在这里找到全体谜底。将这些成绩看做一系列决议点,一系列选择。起首,您必需断定您可否从该XML文档创立Java对象(如后面所会商的那样)。假如能,您就要决意转换应当以新Java类的情势呈现,仍是仅以现有类的一个实例的情势呈现。最初,假如选择了现有类,那末利用哪一个类呢?了局就是林林总总的决议树。
假如我们考查清单1中所示的一个示例XML文档,然后再来处置这些成绩,则决议树的意义就加倍分明了。此示例文档暗示EnhydraApplicationServer中某个服务(详细说就是一个web容器)的设置。
清单1.一个用于设置Enhydra中的web容器的XML文档<?xmlversion="1.0"?>
<webServiceConfigurationversion="1.0"name="MyWebContainer">
<portnumber="80"protocol="http"protected="false"/>
<documentroot="/usr/local/enhydra/html"index="*.html,*.xml"error="error.html"/>
</webServiceConfiguration>
此设置文档包括有关服务自己的版本和称号的信息,和几个嵌套的项目,每一个项目都暗示有关该web容器服务的一些附加信息。它给出了有关端口的具体信息(包含端标语、协定和平安性),也给出了文档服务信息(包含文档根、用于索引页的默许扩大名和毛病页)。一切这些合在一同,就是设置一个新的web容器服务所需的全体信息。
记着这个示例,您就能够入手下手回覆数据暗示的各个成绩了。
是不是合适转换?
相对合适!只需看一看清单1中的XML文档就会发明,它暗示一个对象(整体设置对象),具有多少特性或变量。个中某些变量又是别的的对象(端口和文档),这些对象又具有它们本人的特性。实践上,这是合适转换为Java对象的XML文档的一个极好例子。为了进一步包管此对象是可用的,稍后我将向您展现一种办法来束缚文档中的数据。可是,仍是先让我们持续沿着决议树往下走。
转换成类仍是实例?
办理合适性成绩今后,如今就能够作出决意,是将每一个XML设置文档都变成一个全新的Java类呢,仍是复杂地将其变成某个现有类的一个新实例。换句话说,就是究竟应当天生新代码,仍是使用现有的代码。照如许来看,这就酿成了一个复杂的可重用性成绩。更简单且更明智的做法是,为每一个XML文档天生现有类的新实例。假如您必定要实验一下从每一个文档创立一个新的Java类,则失掉的各个类之间大概没有兼容性--即两个完整不异的文档大概招致两个分歧的Java类!
不必这个大概引发凌乱的办法,您能够接纳一组XML束缚前提(由一个DTD或XML计划暗示,将鄙人面报告),并依据这些束缚前提来天生一个Java类(或多个类,依据必要)。这个天生的类将暗示切合这些束缚前提的任何XML文档;这些XML文档中的每个都将被解包到天生的类的一个实例中。在这类情形下,就能够为暗示web服务设置的文档界说束缚前提。这些束缚前提将被映照为一个Java类,我们将称之为WebServiceConfiguration。然后您就能够取得任何一种暗示特定web服务设置的XML文档,并假定此文档切合我们的束缚前提,由它而创立出后面天生的类的一个实例。这将同意使用程序将分歧的XML文档用作不异范例的对象,只需这些文档中的数据关于该对象计划时要到达目标来讲是无效的便可。
新类仍是现有的类?
如今您也已有前提回覆下一个成绩了:您但愿创立一个现有类即WebServiceConfiguration类的一个实例。剩下必要弄清的全体事变是,这个类是怎样事后天生的。以是,如今请将您的注重力会合在如许一个成绩上:怎样取得一组束缚前提,用XML完成它们,并包管文档切合这些束缚?再一个成绩就是,您怎样再从这些束缚前提天生一个可重用的Java类?
使用文档束缚前提
既然您晓得此文档将转换成一个Java实例,这就发生了另外一个成绩:要思索到必需以某种体例包管可将此文档准确地解包到一个选定的Java类中。短少变量或数据范例不准确都大概招致在解包过程当中堕落--大概乃至在客户机会见设置毛病的容器时呈现运转时非常。
最好的情形是,在实践的解包历程入手下手之前,文档的作者可以包管,设置文档关于他们选择用来暗示数据的类是“正当的”。浏览到这一计划的XML人士说不定就会动弹他们的眼睛并嘀咕说,“好吧,固然您将利用XML文档束缚前提。”确认数据对选定类的正当性能够经由过程援用DTD(文档范例界说)或XML计划来完成。
经由过程利用一组用内部DTD或计划文件暗示的束缚前提,文档作者就能够在这些数据的“接口”上测试设置数据。换句话说,您能够如许来创建使用程序,使之可以对比所需的数据来反省包括在XML实例文档中的数据,而所需数据则是在文档束缚前提的内部文件中指定的。如许,您就能够为数据创立一个接口。
在利用DTD计划仍是利用XML计划之间作出决议是一种相称复杂的选择:由于Java言语是高度范例化的,以是我们但愿能在XML文档中撑持范例化。比方,数据接口应当可以考证,为web容器的端标语供应的是整数,而不是字符串,后者在服务启动时将引发毛病。DTD不撑持范例反省,以是我们无疑应当选择XML计划。固然XML计划在标准的范畴在有一点不断定性,但它在很年夜水平上已趋于不乱,并可看在年内定型。我们能够在一个XML计划中编写数据束缚前提,然后用这个计划考证大概的实例文档,以确保解包能在这些实例文档长进行。上面的XML计划暗示我们的web容器服务的数据接口。
清单2.暗示一个web容器设置文档的数据接口的XML计划<?xmlversion="1.0"?>
<schematargetNamespace="http://www.enhydra.org"xmlns="http://www.w3.org/1999/xmlSchema"xmlns:enhydra="http://www.enhydra.org">
<complexTypename="ServiceConfiguration">
<attributename="name"type="string"/>
<attributename="version"type="float"/>
</complexType>
<elementname="serviceConfiguration"type="ServiceConfiguration"/>
<complexTypename="WebServiceConfiguration"baseType="ServiceConfiguration"derivedBy="extension">
<elementname="port">
<complexType>
<attributename="protocol"type="string"/>
<attributename="number"type="integer"/>
<attributename="protected"type="string"/>
</complexType>
</element>
<elementname="document">
<complexType>
<attributename="root"type="string"/>
<attributename="index"type="string"/>
<attributename="error"type="string"/>
</complexType>
</element>
</complexType>
<elementname="webServiceConfiguration"type="WebServiceConfiguration"/>
</schema>
清单2中的XML计划界说了几个分歧的数据对象,它们合起来暗示一个web服务的设置对象。起首,界说了一个中心服务设置(serviceConfiguration),它包括版本和称号。这可用作一切服务(如负载平衡服务、EJB容器,固然另有我们的web服务)的基础对象。然后,作为此基础服务的扩大,又界说了web服务设置(webServiceConfiguration)。请注重,Java成型以后,计划就已为数据接口创建了模子。我们将附加的web服务属性port和document增加到version和name基础属性中。这些属性自己都是对象,具有它们本人的属性(protocol、root、error等)。
在此计划的界说体例中,特性代表复杂的Java范例,一般是原始(primitive)范例。如许,name和version就分离成为范例String和float的Java原始范例。port和document如许的元素成为Java对象,它们能够有本人的属性,仍是用特性来暗示。如许就呈现了递回征象:元素酿成新对象,并对它的每一个属性举行反省。假如属性是一个特性,就为此对象创立一个复杂的Java原始成员变量;假如属性是元素,则创立一个新的对象,并作为一个成员变量将其增加,然后在这个新对象上又入手下手一样的历程,直到全体类都已创立为止。
从萝卜...嗯...XML取得Java
一旦创立了XML计划,您就必要从这个计划中提掏出必须的信息,来断定应当创立哪些Java类。这个历程的第一步是检察XML计划,并严厉断定输入应当是甚么。关于复杂的serviceConfiguration对象,界说了两个Java原始属性:name和version。关于如许一个复杂的对象,断定所需的接口其实不难。只需将被界说范例的称号的首字母年夜写,并将这些Java属性增加到接口中便可,如清单3所示。
清单3.为ServiceConfiguration接口而从XML计划天生的Java代码publicinterface
ServiceConfiguration{
publicvoidsetVersion(floatversion);
publicfloatgetVersion();
publicvoidsetName(Stringname);
publicStringgetName();
}
这是相称分明易懂的;清单3中的接口为XML计划中界说的属性供应读办法和写办法。别的,您将必要天生一个完成类来界说此接口的各个成员变量,并完成此接口中的每一个办法。这类使接口从完成平分离出来的办法使我们可以为特定的必要提中供多种完成。比方,某个特定的服务大概必要实行盘算,而不但是承受从写办法中收到的值。如今思索那种更庞大的情形另有点为时髦早,但我将在后续文章中从头提到它。但是,一样平常说来,您仍能够断定完成类应当像甚么模样,如清单4所示。
清单4.为ServiceConfiguration完成而从XML计划天生的Java代码publicclass
ServiceConfigurationImplimplementsServiceConfiguration{
privateStringname;
privatefloatversion;
publicvoidsetVersion(floatversion){
this.version=version;
}
publicfloatgetVersion(){
returnversion;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetName(){
returnname;
}
}
不异的准绳也合用于XML计划中界说的别的对象。您能够鄙人面检察到别的Java类(由于它们都是应当天生的):
PortType.java
PortTypeImpl.java
DocumentType.java
DocumentTypeImpl.java
WebServiceConfiguration.java
WebServiceConfigurationImpl.java
总结
到今朝为止,您应当对数据绑定的各个方面都对照熟习了。我已开端先容了您应当利用数据绑定的缘故原由,特别是在设置信息的局限内,并概述了为完成此办法您所必要懂得的一些基础观点。
手机用到的是用j2me所编出来的小程序。 |
|