|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。j2ee|xml以后,Java2平台企业版(J2EE)架构在厂商市场和开辟者社区中倍受推许。作为一种工具,可扩大标志言语(XML)简化了数据互换、历程间动静互换这一类的事变,因此对开辟者渐渐变得有吸引力,并入手下手盛行起来。天然,在J2EE架构中会见或集成XML办理计划的设法也很诱人。由于这将是壮大体系架构同高度天真的数据办理计划的分离。
XML的使用仿佛是无量无尽的,但它们大抵上能够分为三年夜类:
*复杂数据的暗示和互换(针对XML的复杂API(SAX)和文档对象模子(DOM)语法剖析,分歧的文档范例界说(DTDs)和提要(schemas))
*面向动静的盘算(XML-RPC(远程历程挪用),SOAP协定,电子化营业XML(ebXML))
*用户界面相干、暗示相干的高低文(可扩大款式表言语(XSL),可扩大款式表言语转换(XSLT))
这几类使用在J2EE架构中刚好有自然的对应:数据暗示和互换功效是EJB组件模子中耐久化服务(persistenceservices)的一部分,基于动静的通信由Java动静服务(JMS)API来处置,而界面暗示恰是Java服务器页面(JSP)和JavaServlets的特长好戏。
在本文中,我们将看到现今基于J2EE的使用里,XML是怎样在上述几个方面举行使用的,和在相干尺度的将来版本中这些使用将会怎样开展。
基本:数据的暗示和互换
原型化的XML使用(假定有的话)的内容一般是:数据以XML格局寄存,为了举行显现、修正乃至写进某个XML文档而常常被读进到某个对象模子中。作为例子,假定我们正处置多品种型的媒体(图品、视频、文本文档等等),而且用上面这个复杂的XMLDTD来形貌这些媒体的元数据:
<!--DTDforahypotheticalmediamanagementsystem-->
<!--Mediaassetsaretherootoftheobjecthierarchy.Assetsarealso
hierarchical-theycancontainotherassets.-->
<!ELEMENTmedia-asset(name,desc?,type*,media-asset*,urn)>
<!--Metadataabouttheasset-->
<!ELEMENTname(#PCDATA)>
<!ELEMENTdesc(#PCDATA)>
<!ELEMENTtype(desc,mime-type?)>
<!ELEMENTmime-type(#PCDATA)>
<!ELEMENTurn(#PCDATA)>
以下是一个基于上述媒体DTD的XML文档,形貌了与某个课程讲座相干的内容:
<?xmlversion="1.0"?><!DOCTYPEmedia-assetPUBLIC"-//JimFarley//DTDMediaAssets//EN""http://localhost/Articles/Sun/dtds/media.dtd";>
<media-asset>
<name>第14讲</name>
<desc>与第14讲相干的一切内容</desc>
<!--内容对象"lecture14"的一套子组件-->
<media-asset>
<name>讲座的幻灯片</name>
<type>
<desc>MSPowerPoint</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>RealPlayerstreamingvideo</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大概企业级使用的角度看,能以这类体例会见数据真是一种福音,由于它表现了高度的可挪动性,使我们与元数据的实践资本自己断绝。这些资本大概来自一个干系数据库体系、某种举动媒体服务器大概Web服务器上的一个静态XML文档,等等。假如想把这些数据加载到Java使用中,我们能够从以后浩瀚的Java言语XML剖析器当选用一个,经由过程它将XML数据装进一个DOM文档,最初遍历文档,将一切这些数据转换到我们使用体系的对象模子中。
上面是个复杂的基于DOM的剖析程序,可对上述的媒体DTD举行剖析。剖析器用的是ApacheXerces:
packagejaf.xml;
importjava.util.*;
importjava.io.IOException;
importorg.w3c.dom.*;
importorg.xml.sax.*;
//XML文档剖析程序,利用上述媒体DTD.
publicclassMediaParserimplementsErrorHandler{
/**利用ApacheXerces剖析器*/
org.apache.xerces.parsers.DOMParsermParser=
neworg.apache.xerces.parsers.DOMParser();
/**机关函数*/
publicMediaParser(){
//告知剖析器考证并剖析文档
try{
mParser.setFeature("http://xml.org/sax/features/validation";,true);
}
catch(SAXExceptione){
System.out.println("Errorsettingvalidationonparser:");
e.printStackTrace();
}
//设置剖析器的毛病处置句柄
mParser.setErrorHandler(this);
}
/**剖析指定的URL,前往找到的XML文档
*/
publicdocument.nbsp;parse(Stringurl)throwsSAXException,IOException{
mParser.parse(url);
document.nbsp;mediaDoc=mParser.getdocument.);
returnmediaDoc;
}
/**剖析指定URL的XML文档,将内容转换成MediaAsset对象
*/
publicCollectionloadAssets(Stringurl)throwsSAXException,IOException{
document.nbsp;doc=parse(url);
Collectionassets=newLinkedList();
NodeListassetNodes=doc.getElementsByTagName("media-asset");
for(inti=0;i<assetNodes.getLength();i++){
NodeassetNode=assetNodes.item(i);
MediaAssetasset=newMediaAsset(assetNode);
assets.add(asset);
}
returnassets;
}
/**
*毛病处置代码(为简便起见省略了)
*/
}
MediaParser类的机关函数初始化了一个XercesDOM剖析器。parse()办法告知剖析器到哪一个URL往找XML源,然后失掉了局文档并前往。loadAssets()办法挪用parse()办法从某个XML源加载文档,然后为文档中找到的每一个“media-asset”节点创立一个MediaAsset对象。
以下是一个利用MediaAsset类的例子:
packagejaf.xml;
importjava.util.*;
publicclassMediaAsset{
//资本元数据
privateStringmName="";
privateStringmDesc="";
privateCollectionmChildren=newLinkedList();
privateVectormTypes=newVector();
privateStringmUrn="";
protectedMediaAsset(org.w3c.dom.NodeassetNode){
//为简便起见省略前面代码
.
.
.
}
}
由于篇幅的干系省略了MediaAsset类的具体代码,但使用形式仍然是明晰的。MediaAsset类遍历文档的节点,当它碰着分歧的子节点时,它用子节点的内容添补本人的成员数据。假如它发明了一个嵌套的子资本节点,它只必要创立一个新的MediaAsset对象,然后将子资本节点的数据添补到新对象的成员数据中。
完成上述处置的办法不可胜数。我们还可使用其他的剖析器或剖析器架构,如JavaAPIforXMLParsing(JAXP)。除利用DOM模子外,事务驱动的SAX模子也可用于剖析XML。相似的程序也可用来发生XML数据――条件是同意发生新的数据对象(在本例中是MediaAsset),它可将其响应的XML实体拔出到DOM中,然后将DOM输入到一个流中(诸如一个文件,一个Socket,大概一个HTTP毗连...)。另有其他更高条理的尺度,可将XML映照到Java对象的历程进一步主动化(或简化)。比方,利用XML提要(Schema)和XML绑定处置引擎,您能够半主动地将满意某个XML提要的XML数据变化成Java数据对象。代表性的引擎是Castor,是由ExoLab小组办理的一个开放源代码项目标产品。上述利用XercesDOM的复杂例子仅仅是演示了这一处置历程的底层模子。
上述示例标明,在Java情况中剖析或发生XML长短常便利的,这与J2EE没有一定联系关系。格局化为XML的数据能够从使用程序的任何条理流进或输入,这使得与内部体系的集成性无可限量。但我们可否以一种更加间接的体例将XML数据源集成到J2EE架构中往呢?
把握动静
J2EE架构包括了对JMS(Java动静服务)API的会见,以完成面向动静的通讯(J2EE1.2.1版只需JMSAPI便可,在J2EE1.3版中JMS基础定型,此时必需由某个兼容J2EE平台的服务器供应一个JMSAPIProvider)。这一类的异步交互(与之绝对的是:当地或远程办法挪用所代表的同步交互)被证实在某些使用情况中长短常有效的。某些时分,交互只必要经由过程直接的哀求或回覆来完成,即:在某些情形下,收回动静后不成能当即收到回复,但我们仍但愿当动静收回者从头在线时,确保他能收到回复信息。
面向动静体系的实践使用之一就是企业之间的松懈集成。相似于EDI(电子文档互换)时期的文档互换,两个企业因为营业的必要而互换动静,此时一般不克不及为了利用RPC大概RMI、CORBA、DCOM之类的远程办法交互而在二者之间举行严密集成。象JMSAPI如许的动静体系同意两边互换基于JMSAPI的动静载荷,条件是两边在会话的时分均能供应兼容的JMSAPI服务。以后仍旧存在的坚苦是:两边是不是能尊从不异的格局或协定。
这恰是XML大显神通的时分。XML明白地被计划来办理此类数据互换成绩――灵丹灵药就是“面向动静的提要表”(Message-OrientedCommunicationScheme),本色就是基于一个两边认同的DTD或schema,用XML格局来互换动静载荷。
JMSAPI撑持好几种动静,个中的TextMessage代表文本动静载荷。一个复杂而无效的XML动静互换计划是,在一端将我们的XML文档拔出TextMessage,然后在另外一端用便宜的XML剖析程序(如后面的MediaParser)解开数据并(可选地)将其转换成Java对象。这使得我们既能够用JMSAPI撑持的公然预订的动静模子,也能够用JMSAPI撑持的点对点的动静模子来发送XML动静。
上述办法有一些范围,由于关于JMS运转时处置而言,XML的内容基础上是不通明的。比方,JMSAPI同意利用基于特定动静头的路由。这很简单了解,特别当我们但愿XML动静依据其内容接纳分歧走向时。比方在我们的MediaAsset例子中,我们但愿公然讲座内容,但只想把特定的内容传送给那些预订了课程的人,或传送给那些标明能够承受某些媒体魄式(如视频流)的人。为了发扬JMSAPI的代价,以便完成上述基于内容的动静路由,我们有需要从XML数据中剖析出关头信息,然后在机关尺度JMSAPI动静头时拔出这些信息。这是可行的,但要完成XML信息我们就得分外地写良多代码(互换动静的两边均云云)。
为了在XML和JMSAPI之间架起桥梁,一些厂商供应了自界说的JMS扩大,以便间接撑持XML动静机制。比方,BEA体系公司基于J2EE的WebLogic使用服务器出格为TextMessage供应了XMLMessage子类,同意用XPath表达式来过滤XML动静。不外这是一种专有的扩大,这请求互换动静的两边必需都能处置这类动静。
为此,Sun公司今朝正在开辟用于XML动静的JavaAPI(JAXM)。其方针是供应一个初级其余尺度服务,以完成基于ebXML的动静的分解与传送。一个JAXM服务供应程序能够将这类动静映照到得当的物理动静体系(诸如JMSAPI)中往。
让XML看得见
将XML同Web体系的用户界面举行集成明显是一种无益的实验。尽年夜多半的界面程序,不管是基于仍是不基于Web,都是将数据举行转换,然后用易读的格局展示给用户。用诸如XML这类“易消化”的格局寄存数据将简化上述事情,同时它还年夜年夜进步了内容的可办理性,接上去我们便可看到这一点。不外起首要年夜书一笔的是,XML在Web界面层的使用得益于JSP手艺的开展。
一向以来人人都但愿能明晰区域分Web使用程序的暗示层与底层对象模子,JSP框架出生于这些勉力当中(包含初期JHTML实验)。JSP框架同意将Java代码嵌进到HTML内容中,如许既能够完成静态内容,又不用常常修正JavaServlets的代码。在页面中包括Java手艺的路子是经由过程JSP标志(JSPTags),这些标志以XML作风呈现。在JSP中,Java程序以代码片断、服务器端JavaBeans组件、在服务器端触发特定操纵的不通明标志(尺度的或自界说的)等情势存在。当某个用户经由过程扫瞄器哀求JSP页面时,一个Java使用服务器剖析该JSP页面,将其编译成一个JavaServlet,然后实行该Servlet以发生回复页面。
一种间接将XML数据源集成到JSP的界面中往的办法是,将XML加载到JavaBeans组件中(好像我们在MediaAsset例子中所做的),然后在JSP中间接援用这些JavaBeans组件。
上面是一个嵌进Java代码片段的例子:
<html>
<head>
<title>第14讲的媒体资本</title>
</head>
<body>
<!--引进我们的类-->
<%@pageimport="jaf.xml.*"%>
<center><H3>MediaAssetsforLecture14:</H3></center>
<!--界说一个资本对象,以便用于显现-->
<jsp:useBeanclass="jaf.xml.MediaAsset"id="asset"/>
<!--从一个先前界说的地位装载资本-->
<%MediaParserparser=newMediaParser();
Collectionassets=parser.loadAssets("http://javaschool.org
/jaf/E162/lecture14-assets.xml");
Iteratoriter=assets.iterator();
%>
<tableborder=0>
<tr><th>Name</th><th>Type</th><th>URN</th></tr>
<%
while(iter.hasNext()){
asset=(MediaAsset)iter.next();
%>
<tr><td><jsp:getPropertyname="asset"property="name"/></td>
<td><jsp:getPropertyname="asset"property="type"/></td>
<td><jsp:getPropertyname="asset"property="URN"/></td>
</tr>
<%
}
%>
</table>
</body>
</html>
个中粗体部分为JSP代码片段和标志,其他部分是尺度的HTML文本。
上述程序另有一种更简便的写法,那就是利用自界说JSP页面标志。如许我们就能够从JSP页面中剔出代码段,只利用JavaBeans组件和自界说的JSP标志便可。好比说,为了往失落创立剖析器、加载资本数据到汇合中的那段代码,我们可创立一个本人的标志,由它在幕后完成这些事情。以下是例子:
.
.
.
<!--引进我们的类-->
<%@pageimport="jaf.xml.*"%>
<center><H3>MediaAssetsforLecture14:</H3></center>
<!--加载我们自界说的标志库-->
<%@tagliburi="http://javaschool.org/taglib";prefix="media"%>
<!--从一个先前界说的地位装载资本-->
<media:loadurl="http://javaschool.org/jaf/E162/lecture14-assets.xml";
collectionName="assets"cursorName="asset"/>
<tableborder=0>
.
.
.
利用自界说标志的最年夜优点是使我们的程序代码会合在一个中央(对Java手艺而言,通常为指在“类”中),易于办理。如许能够将程序中对象层同界面层的集成干系界说得很明晰,修正代码所酿成的影响是能够展望和办理的。
间接将XML数据转换成Web显现内容的另外一种办法是利用XSL和XSLT。在这类计划中,将XML数据映照成HTML(或WML等)的逻辑由XSL款式表(XSLStyleSheet)来界说。款式表形貌了每一个特定XML数据实体应当如何转换成界面数据实体(如HTML表格、内联标志等)。在JSP架构中,XSL转换只能使用于特定的XML数据源,最幻想的是接纳一套自界说的JSP标志并援用某个XSLT处置程序。这方面的典范示例请参考java.sun.com中关于XML同JSP构架集成的白皮书。
同后面谁人JSP自界说标志加XML剖析器组件的计划比拟,XSLT计划的伸缩性要好一些,并且具有更好的可办理性。在这类情况下,我们的转换逻辑是编写在一个XSL款式表中,而不是在Java代码中。这意味着当必要修正界面时,年夜多半情形下只是编纂款式表大概HTML,代码不受影响。不外在决意选用何种计划之前,仍是要依据实践情况细心衡量。假如选用XSLT计划,那末就得有人卖力保护这些XSL款式表(要末是卖力界面的人,要末是编写程序的人)。XSLT既像内容,又像程序,因而两边都不克不及把义务推给对方,了局人人大概都被这不三不四的XSLT弄得冲突百出。从这点上思索,接纳自界说标志并由界面开辟者将其嵌进暗示层的办法仿佛更有吸引力,由于如许软件工程师只思索Java代码,而内容工程师也只费心内容标志。
Javaservlet过滤器是J2EE1.3版在其Web层最新公布的一种Web组件。当Sevelet将哀求写进某个资本大概从某个资本中读取回覆信息时,过滤器能够十分便利地转换个中的头信息和内容信息。这里所说的资本能够是一个Javaservlet、一个JSP页面,乃至一个静态Web页。过滤器切实其实很“酷”,由于它同意开辟职员从转换内容的代码平分离出身成内容的那部分代码,并加以重用。当必要经由过程XSLT体例将XML数据转换到分歧的XML使用方针时,Javaservlet过滤器特别有效。
在J2EE使用程序中利用Javaservlet过滤器转换其输入,以便兼容任何范例客户真个远景呼之欲出。servlet过滤器可以侦测到来自利用WAP协定(无线使用协定)的挪动客户真个呼唤,而且将回复内容转换成WML(无线标志言语)格局。servlet过滤器也能检测到来自iMode无线客户的呼唤,并将其变化成cHTML(松散HTML)格局。固然,servlet过滤器也可以分辩出传统的HTML扫瞄器客户的哀求,并用准确的格局举行复兴。
停止语
在J2EE1.2.1标准中,XML“集成”仅指组件或使用程序的XML格局的部署形貌。在J2EE1.3标准中,对XML的撑持被扩大为请求具有SAX2和DOM2剖析器,和在兼容J2EE的服务器平台上供应XSLT转换处置程序。您能够无庸置疑地信任,未来在J2EE架构中还会合成进更多的XML特征,由于J2EE标准的界说者们会仔细聆听开辟者社区中对在企业级使用中利用更多XML的渴求呼声。比方,JSR(Java界说哀求)处置小组中与JAXM标准相干的部分(JSR000067)答应在J2EE后续标准中集成进JAXM。能够预感,在JSP架构、EJB和JDBC标准中均会有相似的变更。J2EE平台中上述组件的厘革,将使Java手艺开辟者今朝用的XML更加规
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。 |
|