|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
用java开发web只要两本书:一本是关于java基础的,一本是关于jsp、servlet的就可以了。开发周期长,我就来讲句题外话,现在有很多思想都是通过java来展现。技能在我的旧书《JavaandXSLT》中先容了Java与XSLT的手艺组合。这篇文章从书当选出了我以为十分主要的10条技能。但实践上这无限的10条只是大略的形貌了甚么是大概的。个中年夜多半都会合在Java与XSLT的组合上,而不是在XSLT(可扩大款式表转换)手艺标准。而更具体的信息,在文章开头处指出了一些有代价的资本。
基础的XSL转换长短常复杂的:一个或多个包括着指令的XSLT款式表,这些指令界说了怎样把XML数据转换成其他格局。XSLT处置器完成实践的事情;Sun微体系的JavaAPIforXMLProcessing(JAXP)为分歧品种的处置器供应了一套尺度的Java接口。这里有一个用JAXP的API实行XSL转换的复杂例子:
importjavax.xml.transform.Source;
importjavax.xml.transform.Transformer;
importjavax.xml.transform.TransformerFactory;
importjavax.xml.transform.stream.StreamSource;
importjavax.xml.transform.stream.StreamResult;
importjava.io.*;
publicclassTransform{
/**
*PerformsanXSLTtransformation,sendingtheresults
*toSystem.out.
*/
publicstaticvoidmain(String[]args)throwsException{
if(args.length!=2){
System.err.println("Usage:javaTransform[xmlfile][xsltfile]");
System.exit(1);
}
FilexmlFile=newFile(args[0]);
FilexsltFile=newFile(args[1]);//JAXPreadsdatausingtheSourceinterface
SourcexmlSource=newStreamSource(xmlFile);
SourcexsltSource=newStreamSource(xsltFile);
//thefactorypatternsupportsdifferentXSLTprocessors
TransformerFactorytransFact=TransformerFactory.newInstance();
Transformertrans=transFact.newTransformer(xsltSource);
trans.transform(xmlSource,newStreamResult(System.out));
}
}
你能够点击这里下载一个很小的ZIP文件,这个文件包括了这个例子和响应的XSLT款式表和XML数据文件。个中的README文件注释了如何编译和运转这个例子。
这个这个例子是使用StreamSource从文件中读取数据,JAXP还能从SAX注释器或DOM树来读取XML数据。上面顺次先容我保举的10条技能:
1、尽量利用缓存。
实行XSLT转换是很泯灭CPU和内存的,以是在任什么时候候举行大概的优化都是很成心义的。利用由XSLT驱动的Web使用,进步它的及时运转功能体现的最好办法之一就是利用各类范例的缓存手艺。
图一举例申明了一个典范的利用XSL对数据库举行转换的Web使用。
、典范的XSL转换
与静态天生的XML分歧,XSLT款式表是静态存储在文件中的。因为这些文件很少被修改,就能够用JAXP的javax.xml.transform.Templates接口把它们剖析好了进内存里缓存起来。上面这个程序片段注释了这个历程是如何完成的:
SourcexsltSource=newStreamSource(xsltFile);
TransformerFactorytransFact=TransformerFactory.newInstance();
TemplatescachedXSLT=transFact.newTemplates(xsltSource);
Transformertrans=cachedXSLT.newTransformer();
当XSLT款式表经由过程Templates接口缓存进了内存中,如今它就能够被反复用于良多分歧的转换里。最主要的优点是,如许就制止了反复把XSLT剖析进内存。它也给了XSLT处置器一个时机来优化转换指令,就象编译器优化软件那样。
有人大概会想是不是能够把XML数据也缓存进内存中。关于那些高度静态和个别化的使用,XML数据是跟着每个客户哀求而静态天生的并随时都在变更。关于这类使用,缓存是不实践的。关于良多别的范例的使用,XML数据大概改动的不是很频仍。当数据改动不是很频仍时,相对缓存XML数据,将转换后的了局缓存大概更成心义。这是一种最快的可行性办理计划,保举在任何可行的情形下利用。
2、部署前做测试。
在开辟Web使用项目选择XML和XSLT的关头在于能够分明的把数据、程序逻辑和表达分隔。Java代码与背景数据源交互并天生XML数据,XSLT款式表把XML数据转换为XHTML(或WML,或别的),然后扫瞄器显现了局。
这类布局的一个共同的,但是经常被疏忽的优点是它撑持主动单位测试的才能。象JUnit如许的工具勉励程序员往写合适主动单位测试的套件。这些测试年夜年夜的削减了在体系中到场新特征时所发生的毛病。思索一下一个典范的Java+XML+XSLT网站的这些组件:
用Java完成贸易逻辑。因为Java代码没有和表达逻辑混在一同,就能够象其他任何Java代码一样测试它。
把使用数据转换为XML。这一步是出格简单的。只需天生XML然后用一个DTD或一个XMLSchema考证它就好了。
把XML转换为XHTML。一样的,天生的XHTML能够用一个XHTMLDTD来考证。固然如许做不克不及证实信息是准确的,可是切实其实能包管XHTML被准确的天生并且是无效的。
与良多别的的Web开辟手艺分歧,测试这些单位中的任何一个都不必将其部署到Web服务器上。这使主动单位测试更简单被完成,主动单位测试也是极限编程(XP)手艺的一个关头构成部分。
3、只管让XSLT款式表复杂。
最少有两个来由要坚持XSLT款式表复杂。第一,XSLT并非一个象Java那样丰厚的编程言语。固然XSLT擅于转换,可是在款式表中嵌进太多的使用逻辑会使它变得相称庞大。由于这个缘故原由,就应当在创立XML之前用Java完成尽量多的贸易逻辑。然后再用XSLT转换XML就应当复杂很多了。
第二个坚持款式表复杂的来由是XSLT的语法不简单被读懂。XML标签使XSLT很简单剖析和便利的做程序化的处置,但一切的那些XML标签也使得款式表不简单被读懂。有几个小技能能够匡助程序员更简单读懂和处置XSLT款式表:
利用具有语法辨别功效的编纂器,如Altova的XMLSpy。
为每个XSLT模板增加有区分的正文。如许就有助于冲破那种在年夜堆被括在<和>的字符串里搜刮时的单调。
对最高层的变量和款式表参数接纳必定的定名划定规矩。
把通用的办法掏出来放进第二个款式表中,用<xsl:import>来重用代码。
4、和XSLT一同利用CSS。
这条技能是和上一条接洽在一同的,它也能够年夜年夜的削减XSLT款式表的庞大水平。
XSLT和CSS分离实行分歧的义务并互相增补。XSLT把XML转换为其他的格局,如XHTML或WML,而CSS只是界说表达的款式。作为天生的XHTML的一部分,偶然XSLT也能够天生一些款式元从来使线条变含混。
倡议写一些自力的CSS文件,来取代在XSLT款式表中嵌进大批关于字体、色彩和别的的款式元素。XSL转换发生的XHTML只是包括这些自力的CSS文件。这就使XHTML更小,同时简化了XSLT,也使得扫瞄器下载页面时速率更快。
一样的手艺也合用于JavaScript,应当寄存一些自力的文件而不是把它们间接嵌进到转换中往。
5、当心处置不中断空格。
作者提醒:作为对读者的回应,我已重写了这条技能,到场了我比来学到的关于不中断空格的新常识。感激宽大读者的反应。[编者提醒:我们已在文件的尾部为附加批评到场了一个读者反应链接。]
不中断空格关于XHTML来讲是一个很有效的特征,它能够制止扫瞄器在笔墨中引进换行符。它同时使得强制两个以上一连的空格成为大概;由于扫瞄器老是把一般的空格(和其他的白空格字符)序列处置成一个空格。这里是一个包括不中断空格的XHTML的例子:
AidanBurke
当人们创立XHTML网页时,他们一般是象下面显现的那样在他们的源文件中拔出""字符。一切的扫瞄器城市把这个字符序列翻译成一个不中断空格并准确显现。但是,当用XSLT天生XHTML时,处置的办法就分歧了。
XSLT款式表必需是格局准确的XML。由于""不是XML事后界说好的五个标签,它不克不及间接被包括在款式表中。好比,接上去的这个XSLT片就不论用:
<!--wontwork...-->
<xsl:text>AidanBurke</xsl:text>
这类特性使XSLT程序员必需用一种稍微分歧的办法来利用这类特征:
<xsl:text>Aidan Burke</xsl:text>
了局标明,一切的案例都事情得很好。当款式表的输入办法是"html"时,像Xalan如许的处置器会主动的把字符实体" "转换为序列""。从收集扫瞄器的角度来看,这看起来和别的的不中断空格没甚么两样。
这里有一个完全的XSLT款式表的例子就是如许做的
<?xmlversion="1.0"encoding="UTF-8"?>
<xsl:stylesheetversion="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:outputmethod="html"encoding="UTF-8"/>
<xsl:templatematch="/">
<xsl:text>Aidan Burke</xsl:text>
</xsl:template>
</xsl:stylesheet>
当用Xalan时,这个转换的输入看起来是如许的:
AidanBurke
这很好,由于扫瞄器晓得怎样显现""。但很不幸,XSLT标准并没有请求XSLT处置器把" "转换为""。你必需在碰到这个成绩的任什么时候候,对你利用的XSLT处置器举行这项测试。
有些程序员不喜好必需记着"160"代表不中断空格。以是他们在XSLT款式表的DTD子会合界说如许一个实体:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPExsl:stylesheet[
<!ENTITYnbsp" ">
]>
<xsl:stylesheetversion="1.0"...
如今,能够用""来取代" "。由于XML剖析器在XSLT处置""之前就把这个实体转换成了" ",这也就便利了款式表的作者。提示一句:有些XML相干的工具会在见到DOCTYPE时试着考证XSLT款式表。由于DTD子集没有包括一切XSLT元素的界说,考证就会呈报毛病。
假如盛行的XSLT处置器会主动把" "转换为"",会有甚么成绩呢?成绩就是,当款式表的输入是"xml"而不是"html"时就会呈现毛病。
当XSLT输入办法是"html"时,年夜多半XSLT处置器修正它们的输入并供应给收集扫瞄器。好比,象"<br/>"如许的标签,是一个无效的XML,大概会被转换为"<br>"。这更合用于在对照老的扫瞄器,但却不是格局准确的XML。
XHTML是今朝被国际互联网同盟所保举的用于誊写网页的格局。由于XHTML文档必需是格局准确的XML,XSLT款式表作者极可能但愿在天生XHTML时用"xml"的输入格局而不是"html"。这是一个天生XHTML的XSLT款式表的第一部分:
<?xmlversion="1.0"encoding="UTF-8"?>br>
<xsl:stylesheetversion="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:outputmethod="xml"
doctype-public="-//W3C//DTDXHTML1.0Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
encoding="UTF-8"/>
<xsl:templatematch="/">
<htmlxmlns="http://www.w3.org/1999/xhtml">
...remainderomitted
当输入办法是"xml"时,Xalan不会把" "转换为""。相反,它会在了局树中拔出一个160的字符码。这在有些时分会引发成绩。好比,是运转在Windows2000上的IE5.5扫瞄器的一张截图。注重在风趣的字母"A"上有一个标记:
下载这个例子试一下了局。
的下半部分显现了一个在年夜多半情形的都能一般事情的互换手艺。上面先容了它怎样事情:
<xsl:textdisable-output-escaping="yes"></xsl:text>
disable-output-escaping="yes"使XSLT处置器在天生了局树时不再把""转换为字符码160。相反,它将字符序列""保存而稳定化。如许扫瞄器就能够准确的显现不中断空格。
我必需提示你注重的是XSLT标准并没有请求XSLT处置器撑持disable-output-escaping,以是任何人在利用这个手艺之前,请先用特别的工具测试一下。
,用"xml"输入办法(上方)和用disable-output-escaping办法(下方)的了局对照
上面对下面提到的这些手艺做个总结:
用" "字符实体来代表不中断空格。由于年夜多半的XSLT会把这个实体转换为字符序列"",以是当输入办法是"html"时,这是能够准确事情的。XSLT标准并没有请求如许做,但Xalan如许做了。
界说一个""实体并利用它。这和上一点有一样的效力,但关于款式表作者来讲看起来更好一点。但是,某些工具大概会试图用不存在的DTD来考证款式表,这时候大概会呈现成绩。
用<xsl:textdisable-output-escaping="yes"></xsl:text>作为" "的第二个选择。这在输入办法是"xml"时出格有效。XSLT标准其实不请求处置器撑持disable-output-escaping。
6、写XML天生器类。
为了使用XSL转换,就必需要把Java对象转换成必定的XML数据。这能够用以下的几个路子来完成:
1)为每一个类增添一个getXML()办法。
2)写一个晓得怎样将特定对象转换为XML的XML天生器。
3)用一个熟知的Java-to-XMLAPI来主动的转换为XML。
第一种路子看起来大概象上面如许:
publicclassCustomer{
publicElementgetXML(Documentdoc){
//usetheDOMAPItocreateanElement
//representingthisobject
...
}
...
}
这类路子很简单注释和了解,但却有一个关头的计划弱点。关头的成绩在于特定的XML暗示办法和每一个类牢牢的绑在了一同。当必要一个新的XML暗示时,就必需写新的办法。这意味着当到场愈来愈多的XML"视图"时,类也会越变越年夜。
不难设想如许的情形,就是但愿关于一个对象有多于一个的XML暗示。在一份显现有成百上千的客户提要报表中,只要每一个客户的很少几个关头字段呈现在XML数据中。而在一个客户的具体报表中,XML数据应当包括关于这个客户的一切信息。
第二种路子把XML的天生代码分别出来放在几个工具类里。一个关于客户的XML天生器看起来大概象上面如许的:
publicclassCustomerDOMProducer{
publicstaticElementtoXML(Customercust,Documentdoc){
...usetheDOMAPItocreateafragmentofXML
}
}
复杂的从Customer类中把XML天生代码往失落;要增添新的XML表达时就只是复杂的写附加的XXXDomProducer类就好了。如许乃至大概改成用象JDOM如许的non-DOMAPIs,也不必要对Customer代码作任何改动了。
-----------------------------------------------------------------------------------------------------------------------
更多关于JDOM的信息,不要错过BrettMcLaughlin比来刊行的《Java&XML,2ndEdition》。
-----------------------------------------------------------------------------------------------------------------------
第三种路子也值得提一下,是用一种产物把Java对象转换为XML。固然这些范例的工具关于延续和与使用程序举行数据互换方面很好,但他们在XSL转换方面大概不是很幻想。这是由于天生的XML大概比手写代码计划供应的庞大很多,潜伏的也就招致了更加庞大的XSLT款式表。
7、假定Cookie是被克制的。
ServletAPI撑持用HttpSession来跟踪会话。这使象购物车那样的手艺成为大概。这个类的默许举动是依托扫瞄器的cookie来判别每一个用户,可是用户能够克制cookie。
当扫瞄器的cookie被克制时,我们的使用就必需依托其他某种机制来判别用户。URL重写就是servletAPI用到的这一手艺。由于各类缘故原由,URL重写并非主动产生的。为了在cookie被克制时撑持会话跟踪,程序员必需记着对使用程序收回的每个URL举行编码。这能够靠给每个超链接、表单举措、或重定向URL加上一个jsessionid=nnnnn来完成。上面的表枚举了有和没有考证标志的URL:
一般URL编码后的URL
<ahref="mylink"><ahref="mylink;jsessionid=129j2fjs87l156">
<formaction="mylink"><formaction="mylink;jsessionid=129j2fjs871156">
当用户点击一个编码的超链接或提交一个编码的表单时,servlet容器能够经由过程反省jsessionid的值来断定他或她的身份。
在用XSLT天生XHTML时,因为考证标识是静态的并且每一个用户的身份都分歧,以是这个会话标识应当被嵌进到每页中,它应当作为一个款式表的参数被传送。上面是如何在每一个XSLT款式表顶部界说这个参数的例子:
<xsl:stylesheetversion="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
*********************************************************
**global.sessionID:UsedforURL-rewritingtoimplement
**sessiontrackingwithoutcookies.
*********************************************************
-->
<xsl:paramname="global.sessionID"/>
...
在一个servlet真个使用程序中,Java代码用JAXP的Transformer类把这个会话标识传给XSLT处置器。它很伶俐,只在cookie不起感化的情形下才如许做:
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseres)
throwsIOException,ServletException{
Transformertrans=...//obtainTransformerfromJAXP
HttpSessionsession=req.getSession(true);
//allowcookielesssessiontracking
if(!req.isRequestedSessionIdFromCookie()){
StringsessionID=session.getId();
trans.setParameter("global.sessionID",";jsessionid="+sessionID);
}
回到XSLT真个使用程序中,这个global.sessionID参数能够在天生每页时被加到超链接和表单举措中。这个手艺在《JavaandXSLT》的第8章"AdditionalTechniques"中作了完全的解说。
8、把XSLT作为一个代码天生器利用。
固然XSLT一般是用来做基于Web的转换,但它并非被范围于用作XHTML的输入。XSLT能够将XML转换为恣意的文本格局,这就使它成为良多范例代码的天生器和其他开辟工具的一个幻想的选择。
当用XSLT作为一个基础的代码天生器时,将它会合在反复的和高度布局化的使用上是最好的。良多跟EJB相干的使用是高度布局化和有点反复的,使的XSLT成为代码天生的一个幻想的选择。
-------------------------------------------------------------------------------------------------------------------------
等候OReilly的《EnterpriseJavaBeans》第三版,由于9月就会刊行。
-------------------------------------------------------------------------------------------------------------------------
9、关于i18n用<xsl:import>
显现了如何将XSLT款式表模块化来撑持国际化:
、XSLT国际化
这是使用<xsl:import>特性的一个风趣的秘诀。用<xsl:import>,一个款式表能够导进一个或多个别的的款式表。假如款式表"A"导进款式表"B",款式表"A"中界说的模块和变量优先于在款式表"B"中找到的。
特定言语的款式表看起来多是如许的:
<?xmlversion="1.0"encoding="UTF-8"?>
<xsl:stylesheetversion="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:importhref="common.xslt"/>
<xsl:variablename="lang.pageTitle">WelcometoXSLT!</xsl:variable>
</xsl:stylesheet>
通用的款式表多是如许的:
<?xmlversion="1.0"encoding="UTF-8"?>
<xsl:stylesheetversion="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:outputmethod="html"encoding="UTF-8"/>
<xsl:templatematch="/">
<html>
<head>
<title><xsl:value-ofselect="$lang.pageTitle"/></title>
</head>
...etc
就象这里显现的一样,通用的款式内外不写给用户显现的详细文本(如页面题目)。相反,它依托在特定言语的款式表中界说的变量。用这类体例,增添新的言语撑持就只是创立一个新言语的款式表。
这十分相似于"ordinaryJava"国际化,是用分歧的属性文件界说言语相干的文本。
10、设立StreamSource来剖析相干的URI。
看一看上面的JAXP代码(被夸大的是有成绩的部分):
//StreamcontainingXMLdata
InputStreamxmlStream=...
//StreamcontainingXSLTstylesheet
InputStreamxsltStream=...
SourcexmlSource=newStreamSource(xmlStream);
SourcexsltSource=newStreamSource(xsltStream);
TransformerFactorytransFact=
TransformerFactory.newInstance();
Transformertrans=transFact.newTransformer(xsltSource);
trans.transform(xmlSource,newStreamResult(System.out));
如今假定这个XSLT款式表导进了别的一个款式表,以下所示:
<xsl:importhref="formatName.xslt"/>
当XSLT处置器不晓得到那里往找formatName.xslt时就会引发成绩。在XML数据中包括了对其他文件的援用时,一样的成绩也会产生。这段代码能够经由过程改动StreamSource对象的机关来办理:
SourcexmlSource=newStreamSource(xmlStream,"file:///C:/data/xml/");
SourcexsltSource=newStreamSource(xsltStream,"file:///C:/data/xslt/);
第二个参数供应了包括有XML和XSLT文件的URI。如今,当XSLT处置器剖析XML数据和XSLT款式表中的URI援用时,就晓得到那里往寻觅了。
更多常识
XSLT并非一门很难的言语,固然它事情的体例与Java年夜不不异。专一写款式表多是克制初学时的坚苦的最好办法。这里有一些关于XSLT的附加资本:
javaxslt_example.zip:下载一个XSLT款式表、XML文件和复杂的JAXP转换程序的例子。
ThelatestXSLTspecification国际互联网同盟的最新XSLT标准。
SunsJavaAPIforXMLProcessing(JAXP)site:为分歧品种的XML剖析器和XSLT处置器供应了一套尺度的Java接口
AltovasXMLSpy:一个撑持XSL转换的XML编纂器。
TheSAXONXSLTprocessor:来自MichaelKay的XSLT处置器。
TheXalanXSLTprocessor:来自Apache构造的XSLT处置器。
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 |
|