js|xml|互動
XML和JSP互動技術
XML和JSP都是近兩年才出現的技術,目前已經成為了很多程式員的熱點話題。XML(可擴充的標記語言)是用來定義文檔標記語言的架構,主要用來儲存和發送資料資訊,以便各種基於WEB的應用之間能更方便的交換資料。而Jsp是伺服器端程式動態設計語言,可以用來設計伺服器端各種程式如B2B、B2C等各種系統,由於其物件導向、編譯執行、健壯等特性,也得到了越來越多的應用。
一個很實用的技術就是如何將XML和JSP結合起來,所幸的是我們不用去寫底支援層東西了,因為很多廠商如SUN、IBM等都發布了自己的支援XML的API,其中SUN公司提供了一個支援在Java下使用XML的API-JAXP(JAVATM API for XML Processing Optional Package),這部分API提供了基本的讀寫、操作XML文檔的功能,通過它我們可以很方便的將XML整合到Java應用程式中來。
目前JAXP的版本是1.1,除了基本XML支援外還支援SAX 2.0 、DOM 2和XSL技術。SUN公司提供的JAXP可以在SUN公司的首頁http://java.sun.com/xml 下載。
一、 JAXP的安裝
1、安裝前請確認您用的是JDK 1.1.8 以上版本的Java環境。
2、在http://java.sun.com/xml 下載JAXP1.1的zip版本,解壓到硬碟中,假定解壓目錄為#JAXP11,解壓後發現有三個jar檔案jaxp.jar crimson.jar xalan.jar,這就是JAXP的核心了。
3、修改系統的CLASSPATH變數,在Windows平台下添加這樣一行:
#JAXP11\jaxp.jar; #JAXP11\crimson.jar; #JAXP11\xalan.jar
在Unix/Linux系統下添加下面一行:
#JAXP11/jaxp.jar: #JAXP11/crimson.jar: #JAXP11/xalan.jar alan.jar
如果你使用的是Java2的話,有一種更簡單的方法,將上面的三個檔案直接拷貝到JDK的Lib擴充目錄中去,如#JAVA_HOME/jre/lib/ext(#JAVA_HOME代表JDK目錄),這樣就不用修改CLASSPATH了。
4、好了,安裝完成了,下一步就是編寫程式然後運行了。
二、 簡單的XML例子
XML (EXtensible Markup Language )是一種類似HTML的語言,和HTML不同,XML主要用來描述結構化資料,通過XML格式我們可以很方便的在各種應用程式之間交換資料,而這些都是傳統技術需要花費很大精力才能做到的。
讓我們來看一個簡單的XML文檔例子,這個例子儲存了部分個人檔案,請將它儲存為personal.xml檔案,因為後面我們的Jsp檔案還會調用它中間的資料。
是不是很類似於HTML檔案,如HTML中的元素"你好"等等,因為XML和HTML一樣都是標準SGML的子集合,所以有類似之處。但也有很多不同之處需要注意,比如XML檔案必須有成對地標記而且大小寫敏感,而這些在HTML中都是預設允許的。
第一行是必須的XML聲明, 我們可以看到聲明是在之間的,中間可以定義部分屬性,version="1.0"表示文檔將使用XML1.0的規範,encoding="gb2312"表示採用中文字元集,這樣我們在下面對於資料就可以使用中文了。
接著就是<個人檔案>標記了,這是XML檔案中的根項目,也是不可缺少的,而且必須有一個對應的結束標記,在開始和結束標記之間我們就可以定義自己的資料描述了。
嵌套在<個人檔案>標記如"<姓名>劉玉鋒"就是具體的資料描述了,同根項目一樣必須是成對的標記,在標記中間可以是標記對應具體的數值。這種表示方法有點類似於資料庫中的記錄了,欄位名字為"姓名"、"性別"等,上面的XML檔案就相當於一個只有一條記錄的表"個人檔案"。當然在XML檔案中可以進行多層嵌套,但這就不在本文的討論範圍了。
當然,這裡只是一個特別簡單能代表XML的例子,XML的相關內容特別多,如果想更多瞭解XML的話建議還是看相關的書籍。
三、JSP和XML互動
前面已經說過了,Jsp通過SUN公司的API-JAXP可以實現和XML的互動,那麼具體實現主要有兩種方法,一種是採用DOM2 API,另外一種是採用SAX2 API。
在這裡我們主要討論JAXP中的SAX(Simple API for XML Parsing)技術,DOM2技術可以看SUN公司相關的文檔。
1)關於SAX模型
SAX模型是一種處理XML檔案的方法,它是事件驅動的,有些類似於AWT中的事件驅動機制,通過事件驅動來識別XML文檔的內容。在API中關於SAX的主要有下面的幾個包:
oorg.xml.sax
oorg.xml.sax.helpers
oorg.xml.sax.ext
在前台的Java程式或者是Jsp程式中通過調用這幾個包中的API就可以很好地實現Java和XML的互動。
2)關於HandlerBase介面
我們知道在AWT中一般是通過實施ActionListener等介面實現事件的處理的,同樣的在SAX中SUN也提供了一個類似的介面HandlerBase來處理XML解析的功能,通過將HandlerBase和XML檔案關聯可以很好的來處理XML檔案。
在實施介面中我們主要重載三個HandlerBase的方法startElement(String tag, AttributeList attrs)、characters(char[] ch, int start, int length)、endElement(String name)。
startElement()在讀取一行XML資料的開始標記時候觸發,子類必須覆蓋這個方法,這樣就可以在處理XML節點前先進行自己的處理(比如開始讀取或者寫入XML檔案中的節點時候)。
public void startElement (String name, AttributeList attributes)
throws SAXException
{
// no op
}
參數name代表XML節點名字,attributes代表預設或者特殊的屬性,這個方法拋出一個違例org.xml.sax.SAXException。
characters()方法主要用來處理和之間具體的資料,在處理節點資料時候觸發,我們可以覆蓋這個方法來進行資料操作的處理,可以添加代碼讀取節點資料值或者是寫入節點資料值。
public void characters (char ch[], int start, int length)
throws SAXException
{
// no op
}
參數ch[]代表一個字元數組,start代表字元數組的開始位置,length代表要取的字元數組中ch[]中的元素個數,同樣的這個方法拋出一個違例org.xml.sax.SAXException。
endElement()方法在處理節點元素結束的時候觸發,也就是碰到標記的時候,我們可以覆蓋這個方法來進行資料的收尾工作,比如將節點資料寫入到檔案中。
public void endElement (String name)
throws SAXException
{
// no op
}
參數name代表XML節點名字,這個方法拋出一個違例org.xml.sax.SAXException
從上面我們也可以看出,三個方法在XML事件處理中的順序依次為:
startElement()àcharacters()àendElement(String name)
也許還不好理解,不要緊在下面我們將會寫一個類myHandler類實現HandlerBase介面,並且覆蓋這三個主要的方法來實現我們的XML檔案讀取操作。
3)關於雜湊表
由於程式用到了雜湊表,所以在這裡先簡單的介紹一下雜湊表的基本文法以便大家能更好的理解下面的程式。
雜湊表HashTable是從Dictionary派生出來的,裡面具有一系列的關鍵字和數值,一個關鍵字對應一個數值,識別主要是通過對象的雜湊碼hashCode識別。
我們程式中用到的方法如下:
put(Object key,Object value)添加一對關鍵字/數值到雜湊表中
get(Object key)根據關鍵字得到它的值
keys()取得所有關鍵字並返回一個集合Enumeration
此外,雜湊表還具有其他很多有用的方法如長度size()、是否為空白empty()、是否重複containsKey()等等,限於篇幅在這裡就不進行介紹了。
XML和JSP互動技術(3)
4) 實施HandlerBase介面