js|xml|互動
在這裡我們編寫一個myHandler的類,它用來實施HandlerBase介面,並且覆蓋介面的三個主要方法startElement(String tag, AttributeList attrs)、characters(char[] ch, int start, int length)、endElement(String name)以便能對XML檔案進行操作。
為了儲存資料以便外部程式能夠調用本類中的資料,我們採用了雜湊表結構來儲存解析XML檔案後的所有節點名字以及節點的資料值,startElement()方法主要用來讀取XML檔案中的節點名稱,characters()方法主要用來根據節點名稱讀取節點資料,endElement()方法主要是在一個XML節點處理完畢後將這對節點名稱和節點資料儲存在雜湊表中。
在外部程式中我們只需要調用getTable()方法返回一個雜湊表對象就可以讀取所有的節點和節點資料值了。
代碼不多,而且我在下面添加了很多注釋,應該很好看懂了。
myHandler.java檔案
file://檔案放置在包com.jsp21.www中
package com.jsp21.www;
file://匯入相關的java API
import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.util.Hashtable;
import java.util.Enumeration;
// myHandler類實現HandlerBase介面;
public class myHandler extends HandlerBase {
private String myElement = null; file://XML檔案中的標記名稱;
private String myValue = null; file://XML檔案中標記對應的值;
private Hashtable mytable = new Hashtable(); file://用來儲存XML檔案中所有的資料;
file://得到儲存有XML資料的雜湊表Hashtable;
public Hashtable getTable() {
return mytable;
}
file://覆蓋HandlerBase介面中的startElement方法,讀取一行XML資料的開始標記時候執行此方法;
// tag代表XML中的標記,如前面XML檔案中的NAME AGE等;
public void startElement(String tag, AttributeList attrs)
throws SAXException {
myElement = tag;
}
file://覆蓋HandlerBase介面中的characters方法,主要用來得到和之間具體的資料;
// 當對應myElement的標記發現值後,也就是startElement方法執行完畢後,就會觸發這個characters方法來得到具體的數值;
file://如myElement="姓名"時候,myValue就會等於"劉玉鋒";
public void characters(char[] ch, int start, int length)
throws SAXException {
myValue = new String(ch, start, length);
}
file://覆蓋HandlerBase介面中的endElement方法,主要用來在一行XML資料讀取完畢後進行自己的處理;
// 當XML檔案中一行標記讀取完畢後,觸發此endElement方法;
file://如果存在對應的結束標記,就將前面得到的標記myElement和值myValue
file://放入到mytable雜湊表中;
public void endElement(String name) throws SAXException {
if ( myElement.equals(name) ) {
mytable.put(myElement, myValue);
}
}
}
好了,編譯這個class,並把myHandler.class檔案放置在CLASSPATH能找到的路徑中,比如Tomcat中應用程式的Web-inf\classes\com\jsp21\www目錄下。
XML和JSP互動技術(4)
5)Jsp程式調用XML
在這裡,我們寫了一個比較簡單的Jsp程式來調用前面的myHandler類,並通過這個類來讀取personal.xml檔案中的內容,最後顯示在Jsp頁面中。
首先我們建立一個SAXParserFactory的執行個體saxpF,然後通過這個執行個體來建立一個SAXParser的執行個體saxpser(可以用來解析XML檔案內容),當然還要建立myHandler類的執行個體,最後通過saxpser.parse()方法將XML檔案和myHandler類執行個體關聯起來(這樣會執行myHandler中的幾個事件處理方法)。
(說明:SAXParserFactory是一個抽象類別,定義了一個factory API可以讓Java應用程式配置或者是獲得一個SAX的解析器(SAX parser)。SAXParser也是一個抽象類別,通過這個類應用程式可以解析XML檔案的內容。)
到這時候XML所有內容都儲存在了myHandler類執行個體中的雜湊表中,最後通過getTable()方法得到這個雜湊表對象,將雜湊表中的鍵儲存在集合Enumeration中,使用一個迴圈來讀取哈系表中的資料並顯示在Jsp頁面上。我們用集合的目的在於使這個Jsp程式盡量通用,傳遞一個XML檔案名稱字就可以讀出所有內容,當然你也可以不使用集合而使用(String)hshTable.get("姓名")這樣的方法來讀取特定的節點值。
下面是Jsp檔案代碼,請儲存為jspxml.jsp檔案
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page language="java" import="com.jsp21.www.*,java.io.*" %>
<%@ page language="java" import="org.w3c.dom.*,org.xml.sax.*" %>
<%@ page language="java" import="javax.xml.parsers.SAXParser" %>
<%@ page language="java" import="javax.xml.parsers.SAXParserFactory" %>
<%@ page language="java" import="java.util.*" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
這是一個XML+JSP的例子,讀取XML檔案中的內容
try {
file://得到用戶端請求的file檔案名稱字
String newFile=request.getParameter("file");
file://如果沒有file值,列印資訊並返回
if(newFile==null||newFile.equals(""))
{out.println("請使用參數如jspxml.jsp?file=e:\\\\personal.xml");
return;
}
String xmlFile ="file:" + new File(newFile);
file://建立一個SAXParserFactory的執行個體saxpF
SAXParserFactory saxpF = SAXParserFactory.newInstance();
file://通過saxpF建立一個SAXParser的執行個體saxpser
SAXParser saxpser = saxpF.newSAXParser();
file://建立一個myHandler對象的執行個體
myHandler handler = new myHandler();
// 將XML檔案和handler事件關聯起來,利用handler來解析XML檔案中的內容