傳統上, 我們利用JSP+Bean來開發用戶界面, 這裡介紹一種利用XML+XSLT的方法來替代JSP
動機:
1. JSP構造頁面太痛苦. 代碼嵌入頁面導致頁面臃腫, 邏輯復雜, 不易編輯.
2. 程序員和美工的接口必須精確定義. 復雜的嵌套輸出必須構造復雜的顯示類作為接口.
3. 調試JSP必須等到前端程序結束才能看到效果.
3. 調試JSP效率極低, 一點點小的修改都會引起JSP的重新編譯.
新的XML的解決方案:
1. 一個servlet做統一管理. 接受url請求, 映射到對應的程序bean.
2. 程序bean只產生XML, 由servlet統一用對應的XSL轉換為Html.
好處:
1. JDK1.4已經自帶XML API和XSLT, 並且支持XSLT 1.0標准. IE6也支持同樣標准.
2. 開發前先制作接口用的demo XML, 程序員的輸出必須符合此格式. 美工根據此格式制作XSL. 接口可視化, 明確定義.
3. 只要定義好接口XML, 兩邊幾乎不需要再聯合調試. 美工利用接口XML和IE6就可以直接看到效果.
4. 程序員只要保證輸出的XML的是否符合接口, 直觀的做文字性對比.
5. 大量頁面可重用的部分能方便的抽象出來, 在XSL文件中include/import進來. 高度重用, 標准化.
6. 寫XSL可大量采用template, 結構清晰, 修改方便, 寫頁面變成搭積木, 不再有JSP的層層嵌套.
7. 對於不同的終端設備, 可以定制不同的XSL, 很方便的就能夠支持手機, pda
8. 在程序中利用支持XML的工具, 比如sql2000, 可以直接生成XML結果, 無需復雜編程.
壞處:
1. 因為要進行XSLT轉換, 服務器工作量稍微增大.
以下是幾個關鍵環節的簡單示例:
◆servlet中的XML轉換
/** * XML是String * XSL從文件中讀取 * 直接寫入response */ //import javax.XML.transform.*; //import Javax.xml.transform.stream.*; StreamSource XML = new StreamSource
(new StringReader(XMLSource)); StreamSource xsl = new StreamSource(xslFileName); response.setContentType("text/Html; charset=UTF-8"); StreamResult result = new
StreamResult(response.getWriter()); Transformer trans = TransformerFactory.newInstance()
.newTransformer(xsl); trans.setOutputProperty("encoding","UTF-8"); trans.transform(XML, result);
◆接口XML文件樣本
<?xml version="1.0" encoding="UTF-8"?> <?XML:stylesheet type="text/xsl" href="xxx.xsl"?> <page> <output> <info>推廣UNICODE, 解決多語言問題.</info> </output> </page>
◆XSL文件樣本
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" XMLns:xsl=
"http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <Html> <head> <meta http-equiv="Content-Type"
content="text/html; charset=UTF-8"/> </head> <body> <p align="center"> <xsl:value-of select="page/output/info"/> </p> </body> </Html> </xsl:template> </xsl:stylesheet>
考慮:
1. 可以把XSLT轉換放在IE進行, IE6以下版本要安裝MSXML3, 對客戶端限制太多.
2. 在客戶端的XSLT轉換必須完全讀入XML+XSL, 在網速不高或者內容很多的時候反應相當遲鈍.
3. 手機, pda等設備不能進行XSLT轉換, 所以XSLT轉換還是放在服務器上比較合適.
4. 因為一般提交內容都比較簡單, 所以沒有采用XML處理, 在程序中也盡量少用XML, 避免影響速度.
5. 可以在servlet判斷特定參數, 比如發現有xml-vIEw參數時, 不做XSLT轉換, 直接輸出XML到浏覽器, 供程序調試用.