第15章 用Servlet與XSL結(jié)合開發(fā)WEB應(yīng)用程序_第1頁
第15章 用Servlet與XSL結(jié)合開發(fā)WEB應(yīng)用程序_第2頁
第15章 用Servlet與XSL結(jié)合開發(fā)WEB應(yīng)用程序_第3頁
第15章 用Servlet與XSL結(jié)合開發(fā)WEB應(yīng)用程序_第4頁
第15章 用Servlet與XSL結(jié)合開發(fā)WEB應(yīng)用程序_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第15章用Servlet與XSL結(jié)合開發(fā)WEB應(yīng)用程序1頁主要內(nèi)容什么是JAXPXML解析器Servlet與XSL配合機(jī)制2頁15-1什么是JAXPJAXP是JavaAPIforXMLProcessing的英文字頭縮寫,中文含義是:用于XML文檔處理的使用Java語言編寫的編程接口。JAXP支持DOM、SAX、XSLT等標(biāo)準(zhǔn)。3頁15-2XML解析器直接讀寫XML文檔使用XmlDocument類使用TransformerFactory和Transformer類OutputKeys類使用XalanXMLSerializer4頁15-2-1直接讀寫XML文檔當(dāng)程序獲取DOMTree之后,應(yīng)用DOM模型的Node接口的各個方法對DOMTree進(jìn)行更新,下一步應(yīng)該對原始的XML文檔進(jìn)行更新了。我們可以運(yùn)用遞歸的辦法或者是應(yīng)用TreeWalker類,遍歷整個DOMTree,與此同時,將DOMTree的每一個節(jié)點(diǎn)/元素依次寫入到預(yù)先打開的原始XML文檔中,當(dāng)DOMTree被遍歷完全之后,DOMTree和原始的XML文檔就實現(xiàn)了同步更新。實際中,這個方法極少使用,不過如果你要編程實現(xiàn)自己的XML解析器,這種方法還是有可能用得上的。5頁15-2-2使用XmlDocument類在XmlDocument類中提供了下面三個write()方法(根據(jù)Crimson最新的版本------ApacheCrimson1.1.3):publicvoidwrite(OutputStreamout)throwsIOExceptionpublicvoidwrite(Writerout)throwsIOExceptionpublicvoidwrite(Writerout,Stringencoding)throwsIOException6頁Java程序代碼片斷Stringname="fancy";DocumentBuilderparser;DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();try{parser=factory.newDocumentBuilder();Documentdoc=parser.parse("user.xml");Elementnewlink=doc.createElement(name);doc.getDocumentElement().appendChild(newlink);((XmlDocument)doc).write(newFileOutputStream(newFile("xuser1.xml")));}catch(Exceptione){//tologit}7頁15-2-2使用XmlDocument類注意:ApacheCrimson的前身是SunProjectXParser,后來不知何故,由XParser演變?yōu)锳pacheCrimson,至今ApacheCrimson的很多代碼都是從XParser中直接移植過來的。比如上文用到的XmlDocument類,它在XParser中是com.sun.xml.XmlDocument,到了ApacheCrimson中搖身一變,就變成了org.apache.crimson.tree.XmlDocument類,其實它們的絕大部分代碼是一樣的,可能就package語句和import語句以及文件開頭的一段lience有所不同而已。早期的JAXP是和XParser捆綁在一起的,因此一些老的程序使用了com.sun.xml包,如果你現(xiàn)在重新編譯它們,有可能不能通過,肯定就是因為這個原因。后來的JAXP和ApacheCrimson捆綁在一起,比如JAXP1.1,如果你使用JAXP1.1,那么不需要額外下載ApacheCrimson,也能夠正常編譯運(yùn)行上面的例子(AddRecord.java)。最新的JAXP1.2EA(EarlyAccess)改弦更張,采用性能更好的ApacheXalan和ApacheXerces分別作為XSLT處理器和XML解析器,不能直接支持ApacheCrimson了,所以如果你的開發(fā)環(huán)境采用了JAXP1.2EA或者是JavaXMLPack(內(nèi)含JAXP1.2EA),那么將無法直接編譯運(yùn)行上面的例子(AddRecord.java),你需要額外下載并安裝ApacheCrimson。

8頁15-2-3使用TransformerFactory和Transformer類//首先創(chuàng)建一個DOMSource對象,該構(gòu)造函數(shù)的參數(shù)可以是一個Document對象

//doc代表更改后的DOMTree。

DOMSourcedoms=newDOMSource(doc);

//創(chuàng)建一個File對象,代表DOMTree所包含的數(shù)據(jù)的輸出介質(zhì),這是一個XML文件。

Filef=newFile("XMLOutput.xml");

//創(chuàng)建一個StreamResult對象,該構(gòu)造函數(shù)的參數(shù)可以取為File對象。

StreamResultsr=newStreamResult(f);//下面調(diào)用JAXP中的XSLT引擎來實現(xiàn)輸出DOMTree中的數(shù)據(jù)到XML文件中的功能。

//XSLT引擎的輸入為DOMSource對象,輸出為StreamResut對象。

Try{//首先創(chuàng)建一個TransformerFactory對象,再由此創(chuàng)建Transformer對象。Transformer//類相當(dāng)于一個XSLT引擎。通常我們使用它來處理XSL文件,但是在這里我們使

//用它來輸出XML文檔。9頁接上

TransformerFactorytf=TransformerFactory.newInstance();Transformert=tf.newTransformer();//關(guān)鍵的一步,調(diào)用Transformer對象(XSLT引擎)的transform()方法,該方法的第一

//個參數(shù)是DOMSource對象,第二個參數(shù)是StreamResult對象。

t.transform(doms,sr);}catch(TransformerConfigurationExceptiontce){System.out.println("TransformerConfigurationException\n-----");tce.printStackTrace();}catch(TransformerExceptionte){System.out.println("TransformerException\n---------");te.printStackTrace();}10頁15-2-4OutputKeys類//首先創(chuàng)建一個TransformerFactory對象,再由此創(chuàng)建Transformer對象。

TransformerFactorytf=TransformerFactory.newInstance();Transformert=tf.newTransformer();

//獲取Transformser對象的輸出屬性,亦即XSLT引擎的缺省輸出屬性,這是一個

//java.util.Properties對象。

Propertiesproperties=t.getOutputProperties();//設(shè)置新的輸出屬性:輸出字符編碼為GB2312,這樣可以支持中文字符,XSLT引擎所輸出

//的XML文檔如果包含了中文字符,可以正常顯示,不會出現(xiàn)所謂的"漢字問題"。

//請留意OutputKeys類的字符串常數(shù)OutputKeys.ENCODING。

properties.setProperty(OutputKeys.ENCODING,"GB2312");

/更新XSLT引擎的輸出屬性。

t.setOutputProperties(properties);//調(diào)用XSLT引擎,按照輸出屬性中的設(shè)置,輸出DOMTree中的內(nèi)容到輸出介質(zhì)中。

t.transform(DOMSource_Object,StreamResult_Object);11頁常用的輸出屬性ublicstaticfinaljava.lang.StringMETHOD可以設(shè)為"xml"、"html"、"text"等值。

publicstaticfinaljava.lang.StringVERSION所遵循規(guī)范的版本號,如果METHOD設(shè)為"xml",那么它的值應(yīng)該設(shè)為"1.0",如果METHOD設(shè)為"html",那么它的值應(yīng)該設(shè)為"4.0",如果METHOD設(shè)為"text",那么這個輸出屬性會被忽略。publicstaticfinaljava.lang.StringENCODING設(shè)置輸出時所采用的編碼方式,比如"GB2312"、"UTF-8"等等,如果將其設(shè)置為"GB2312",可以解決所謂的"漢字問題"。

publicstaticfinaljava.lang.StringOMIT_XML_DECLARATION設(shè)置輸出到XML文檔中時是否忽略XML聲明,亦即類似于:<?xmlversion="1.0"standalone="yes"encoding="utf-8"?>這樣的代碼。它可選的值有"yes"、"no"。

publicstaticfinaljava.lang.StringINDENTIDENT設(shè)定XSLT引擎在輸出XML文檔時,是否自動添加額外的空格,它可選的值為"yes"、"no"。

publicstaticfinaljava.lang.StringMEDIA_TYPEMEDIA_TYPE設(shè)定輸出文檔的MIME類型。12頁15-2-4OutputKeys類首先是獲取XSLT引擎(Transformer類)的缺省輸出屬性的集合,這需要使用Transformer類的getOutputProperties()方法,返回值是一個java.util.Properties對象。

Propertiesproperties=transformer.getOutputProperties();然后是設(shè)定新的輸出屬性,比如:properties.setProperty(OutputKeys.ENCODING,"GB2312");properties.setProperty(OutputKeys.METHOD,"html");properties.setProperty(OutputKeys.VERSION,"4.0");………最后是更新XSLT引擎(Transformer類)的缺省輸出屬性的集合,這需要使用Transformer類的setOutputProperties()方法,參數(shù)是一個java.util.Properties對象。13頁15-2-5使用XalanXMLSerializer//首先創(chuàng)建一個DOMSource對象,該構(gòu)造函數(shù)的參數(shù)可以是一個Document對象

//doc代表更改后的DOMTree。

DOMSourcedomSource=newDOMSource(doc);//創(chuàng)建一個DOMResult對象,臨時保存XSLT引擎的輸出結(jié)果。

DOMResultdomResult=newDOMResult();//下面調(diào)用JAXP中的XSLT引擎來實現(xiàn)輸出DOMTree中的數(shù)據(jù)到XML文件中的功能。

//XSLT引擎的輸入為DOMSource對象,輸出為DOMResut對象。

try{//首先創(chuàng)建一個TransformerFactory對象,再由此創(chuàng)建Transformer對象。Transformer//類相當(dāng)于一個XSLT引擎。通常我們使用它來處理XSL文件,但是在這里我們使

//用它來輸出XML文檔。

TransformerFactorytf=TransformerFactory.newInstance();Transformert=tf.newTransformer();//設(shè)置XSLT引擎的屬性(必不可少,否則會產(chǎn)生"漢字問題")。

Propertiesproperties=t.getOutputProperties();properties.setProperty(OutputKeys.ENCODING,"GB2312");t.setOutputProperties(properties);//關(guān)鍵的一步,調(diào)用Transformer對象(XSLT引擎)的transform()方法,該方法的第一();}14頁接上

//個參數(shù)是DOMSource對象,第二個參數(shù)是DOMResult對象。

t.transform(domSource,domResult);//創(chuàng)建缺省的XalanXMLSerializer,使用它將臨時存放在DOMResult對象

//(domResult)中的內(nèi)容以輸出流的形式輸出到輸出介質(zhì)中。

Serializerserializer=SerializerFactory.getSerializer(OutputProperties.getDefaultMethodProperties("xml"));//設(shè)置XalanXMLSerializer的輸出屬性,這一步必不可少,否則也可能產(chǎn)生

//所謂的"漢字問題"。

Propertiesprop=serializer.getOutputFormat();prop.setProperty("encoding","GB2312");serializer.setOutputFormat(prop);//創(chuàng)建一個File對象,代表DOMTree所包含的數(shù)據(jù)的輸出介質(zhì),這是一個XML文件。

Filef=newFile("xuser3.xml");//創(chuàng)建文件輸出流對象fos,請留意構(gòu)造函數(shù)的參數(shù)。

FileOutputStreamfos=newFileOutputStream(f);//設(shè)置XalanXMLSerializer的輸出流。

serializer.setOutputStream(fos);//串行化輸出結(jié)果。

serializer.asDOMSerializer().serialize(domResult.getNode());}catch(Exceptiontce){tce.printStackTrace15頁15-3Servlet與XSL配合機(jī)制Servlet負(fù)責(zé)產(chǎn)生相應(yīng)的XML,用對應(yīng)的XSL轉(zhuǎn)換為html。//依照DOM規(guī)范,構(gòu)造XML數(shù)據(jù)樹DocumentBuilderFactorydocumentbuilderfactory=DocumentBuilderFactory.newInstance();documentbuilderfactory.setNamespaceAware(true);DocumentBuilderdocumentbuilder=documentbuilderfactory.newDocumentBuilder();Documentdocument=documentbuilder.newDocument();//創(chuàng)建根節(jié)點(diǎn),在XML數(shù)據(jù)樹中惟一Elementroot=doc.createElement("root");doc.appendChild(root);response.setContentType("text/html");//獲取輸出流OutputStreamout=response.getOutputStream();//獲取客戶端支持的編碼方式16頁接上StringacceptEncoding=request.getHeader("Accept-Encoding");if(acceptEncoding==null){acceptEncoding="";}/*--開始檢查客戶端支持何種壓縮格式和設(shè)定回復(fù)編碼方式--*/if(acceptEncoding.indexOf("gzip")!=-1){//客戶端支持gzip壓縮格式response.setHeader("Content-Encoding","gzip");out=newGZIPOutputStream(out);}elseif((acceptEncoding.indexOf("compress")!=-1)){17頁接上//客

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論